[No.155 IE SELECT後 .fireEventでJavaScriptのイベントを起動]
[No.156 TypeNameとShell.Applicationを使い起動済みのIEを探す]
[No.157 IE Element の 我流な探し方(AS Objectはキライ)]
[No.158 Access From 明細行の色を変化させたい]
[No.159 IE 認証ページへのアクセス、basci認証ページって?]
www.ken3.org(サイト内)から Google を利用して、

三流君 VBAで楽しくプログラミング(Excel/Access VBAの解説/サンプルです)
[VBA系のバックナンバー] [VBA系 TOP] [三流君 TOP]



No.155 2003/12/01
IE SELECT後 .fireEventでJavaScriptのイベントを起動
[ページTOPへ戻る]

<IE SELECT後 .fireEventでJavaScriptのイベントを起動>

どうも、三流プログラマーのKen3です。 今回は、前回の続きで、 IEでSELECT タグの操作を探ってみます。 今回の、サンプルファイルは、 http://www.ken3.org/vba/lzh/vba155.lzh にvba155.xls(Excel2000版)が保存されています。 ※自分でテストページを作ったりして、遊んでみてください。 関連項目、 VBAでInternetExplorer.Applicationを操作する(IE操作) http://www.ken3.org/cgi-bin/group/vba_ie.asp もヨロシクね。

/* * 1.今回のキッカケ */

VBA系の掲示板 http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi で、SELECTタグOPTIONの選択でJavaScriptが起動しない、 そんな問題にぶちあたりました。 もらった質問に対して、いつものように、違う方向に進んでいるんだけど。 下記がもらった質問です。 ---- <FORM name=form1 onsubmit="mai('s');return false;"> <TBODY> <TR> <TD><B>場名</B><BR> <DIV align=right><SELECT onchange=Rdp(); name=JYO> <OPTION value=0 selected>選択項目 </OPTION></SELECT></DIV></TD></TR> <TR> <TD><B>レース</B><BR> <DIV align=right><SELECT onchange=Hdp(); name=Race> <OPTION value=0 selected>選択項目 </OPTION></SELECT></DIV></TD></TR> <TR> あるサイトの一部ぬきだしました。 ここで、おそわったのを、まねして WB1.Document.form1.jyo.selectedIndex = 1 WB1.Document.form1.jyo.Options(1).selected = "selected" WB1.Document.form1.jyo.Options(1).selected = True と、やると、コンボに選択された文字がでました。成功!と おもいきや、つぎのレースの選択項目が、からっぽです。 ためしに、マウスでクリックすると、選択項目が、 ふくまれます。documentも、かわるようです。 どうやら、onchangeが、おきてないためらしい。 これについて、いろいろ、しらべたけど、わかりません。 疑問1:rdp()という関数は、どこにあるんでしょうか。      このhtmlの、最後に、なにか、      scriptが、あるのですが、(よめない)      どうも、それではないみたいです。 疑問2: onchangeを、vbから、起こしてやることは      できないでしょうか。 ---- それに対して、 http://www.ken3.org/vba/test153.html で、 テストで、下記のjavaScriptを書いてみました。 場名を選択すると、レース内容を変更する<br> <br> <FORM name=form1 onsubmit="mai('s');return false;"> <TABLE BORDER="1"> <TR> <TD><B>場名</B><BR> <DIV align=right> <SELECT onchange=Rdp(); name=JYO> <OPTION value=0 selected>選択項目 </OPTION> </SELECT></DIV></TD> </TR> <TR> <TD><B>レース</B><BR> <DIV align=right><SELECT onchange=Hdp(); name=Race> <OPTION value=0 selected>選択項目 </OPTION></SELECT></DIV></TD> </TR> <TR><TD><INPUT TYPE="submit" VALUE="送信"></TD></TR> </TABLE> </FORM> <script type="text/javascript"> //場名を初期化する document.form1.JYO.length = 5; //強引にオブジェクトを増やす(オイオイ) document.form1.JYO.options[1].text = "東京"; document.form1.JYO.options[2].text = "京都"; document.form1.JYO.options[3].text = "中山"; document.form1.JYO.options[4].text = "阪神"; //↑強引に選択肢を増やしてみた(笑) </script> <script type="text/javascript"> <!-- //ここからJavaの関数を書いてみる function Rdp(){ // Rdp 場所が選択されたらレース内容を変更する //レース内容を場所に合わせて変更 document.form1.Race.length = 3; //強引にオブジェクトを3にする(ホントは12R) var n = document.form1.JYO.selectedIndex //場名選択位置を代入 alert("開催選択後、Rdp呼ばれたよn="+n); switch (n) { case 1: //東京なら document.form1.Race.options[0].text = "9R 昇仙峡特別"; document.form1.Race.options[1].text = "10R 奥多摩ステークス"; document.form1.Race.options[2].text = "11R 霜月ステークス"; break; case 2: //京都なら document.form1.Race.options[0].text = "9R もみじステークス"; document.form1.Race.options[1].text = "10R古都ステークス"; document.form1.Race.options[2].text = "11Rマイルチャンピオンシップ(GI)"; break; case 3: //中山なら alert("開催してないよ"); break; case 4: //阪神なら alert("開催してないよ"); break; } } function Hdp(){ // Hdp レースが選択されたら次は?(今回は省略) alert("Hdp呼ばれたよ(レース選択後)"); } function mai(parapara){ // maiイベントのテスト // Submitボタンが押されると、ここが走るのでテストする alert("受け取ったのは"+parapara); } // --> </script> これで、テスト用のHTMLは完成したけど、 本題は、IEからの操作でした。

/* * 2..SelectedIndexを使って普通に選択してみる */

.SelectedIndex なんて方法を知ったので、 下記のように組んでみました。
Sub ie_test()

    Dim objIE    As Object  'IEオブジェクト参照用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")

    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ(テストのHTMLを表示する)
    objIE.Navigate "http://www.ken3.org/vba/test155.html"

    '表示終了まで待つ
     Do While objIE.Busy = True
         '何もしないループ(笑)
         DoEvents
     Loop

     '場名を選択する
     'SELECTタグに付いた名前(Name)がJYOの上から2番目(1)をテストでセット
     '.SelectedIndexに1をセット(012345で2番目となる)
     objIE.Document.all.JYO.SelectedIndex = 1
     
     'レースを選択する
     'Raceの上から3番目(2)をテストで選択する.SelectedIndexに2をセット
     objIE.Document.all.Race.SelectedIndex = 2

     '0からインデックスが始まるのがポイントです↑

End Sub
プログラムはエラーで止まらずに動作するが、 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <SELECT onchange=Rdp(); name=JYO> や <SELECT onchange=Hdp(); name=Race> が走らない。 Rdp()で、レース場単位でレース名を動的に切り替えているので、 これが起動しないと、データがセットできない。

/* * 3.JavaScriptの起動を調べてみる。発砲? */

SELECTタグかぁ・・・あまり気が進まないが、少しみてみる。 下記が、DHTMLのSELECTの説明ページです。 http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/select.asp ここみると、 Attributes/Properties Behaviors Collections Events Methods Objects Styles なんてあって、とても一発じゃ探せないんだけど(かなり時間かかったけど) Methods の中に、(Methodsを翻訳ソフトで調べると 方法/方式?だよね) fireEvent --- Fires a specified event on the object. (オブジェクトに指定された出来事を発砲します。) なんてのがあります。 おっ、これで指定したイベントを発生させることができそうですね。 ※発砲って表現を、発行に置き換えるとイベントらしいよね。 fireEvent http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/fireevent.asp をみてみると、使い方は、 Fires a specified event on the object. bFired = object.fireEvent(sEvent [, oEventObject]) Parameters sEvent Required. String that specifies the name of the event to fire. oEventObject Optional. Object that specifies the event object from which to obtain event object properties. よくわかんないけど、ストリングの文字列でイベントの名前渡せって? イベントの名前を渡すだけでいいのかぁ。 Return Value Boolean. Returns one of the following values: true Event fired successfully. false Event was cancelled. リターン値も返って来るんだね。※いつも手抜きで見てないけど。 コイツを組み込むと、しますか。(ここまでに何時間かかったんだよ・・・)
Sub ie_test()

    Dim objIE    As Object  'IEオブジェクト参照用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")

    objIE.Visible = True '見えるようにする(お約束)

    '文字列で指定したURLに飛ぶ(テストのHTMLを表示する)
    objIE.Navigate "http://www.ken3.org/vba/test155.html"

    '表示終了まで待つ
     Do While objIE.Busy = True
         '何もしないループ(笑)
         DoEvents
     Loop

     '場名を選択する
     'SELECTタグに付いた名前(Name)がJYOの上から3番目(2)をテストでセット
     '.SelectedIndexに2をセット(012345で2番目となる)
     objIE.Document.all.JYO.SelectedIndex = 2
     
     '選択後にonchangeのイベントを発生させる
     objIE.Document.all.JYO.fireEvent ("onchange")
     
     'レースを選択する
     'Raceの上から3番目(2)をテストで選択する.SelectedIndexに2をセット
     objIE.Document.all.Race.SelectedIndex = 2
     objIE.Document.all.Race.fireEvent ("onchange")  '変更時のイベントを発生させる

End Sub
あれ、こんな簡単に出来てしまった・・・

/* * 4.終わりの挨拶 */

今回は、 プログラムから値をセット後、 操作じゃないのでイベント発生しない、、 そんな時は、 .fireEventでJavaScriptのイベントを起動。そんな話でした。 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 いつも失敗?の負け組のKen3でした。 ~~~~~~~(↑オイオイ)

No.156 2004/01/01
TypeNameとShell.Applicationを使い起動済みのIEを探す
[ページTOPへ戻る]

<TypeNameとShell.Applicationを使い起動済みのIEを探す>

どうも、三流プログラマーのKen3です。 今回は、 起動しているIEを探してみます。 今回の、サンプルファイルは、 http://www.ken3.org/vba/lzh/vba156.lzh にvba156.xls(Excel2000版)が保存されています。 ※IEを起動したり、テストでファイルエクスプローラーを立ち上げたりして  遊んでみてください。 関連項目、 VBAでInternetExplorer.Applicationを操作する(IE操作) http://www.ken3.org/cgi-bin/group/vba_ie.asp もヨロシクね。

/* * 1.今回のキッカケ */

VBA系の掲示板 http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi で、 ---- excelvbaでIEを立ち上げて、ビジーかどうかを取得する方法はわかりましたが、IE のサブウィンドウがビジーかどうかを取得し、サブウィドウが表示されるまで待つ 、というのを作りたいんですがどうするのでしょう。 サブウィンドウのIDを取得してから Do While objIE.Busy = True DoEvents Loop とするのでしょうか。 サブウィンドウのIDはどう取得するのでしょう。 ---- と、質問をいただきました。 う〜ん、、、どうするんだろう? いままで、CreateObjectを使って新規にIEを起動したり、 例)IEのオブジェクトを作成 Dim objIE As Object 'IEオブジェクト参照用 'インターネットエクスプローラーのオブジェクトを作る objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True '見えるようにする(お約束) や、 フォームにWEBのコントロールを貼ったりして、IEをコントロールしてました。 自分のプログラムからオブジェクトを作成して、目的の動作、作業を行っていました。 ^^^^^^^^^^^^^^^^ 今回の開いた別IEを参照したい や よくある話で、IEでwebページを見ていたら、 ツールを起動して、作業したい、そんな要望もあると思います。 ※データをgetするツールを作ったとして、  自分のフォームや自分の起動したIEだけじゃなくて、  既に起動済みのIEに対して、何か処理を行いたい・・・など。

/* * 2.Shell.Applicationのウインドウをループで探る */

googleで探ると、いろいろと方法ありそうです。 チョット目を引いたのが、 Shell.Applicationのウインドウをループで探しているプログラムでした。 IEとShellは密接な関係があるのか?一部なのか? Shell.ApplicationからIEを探すことが出来るみたいです。 http://www.microsoft.com/JAPAN/developer/library/jptech/msdnnews/web.htm を見ると、なんとなく、そんな感じもしなくも無く (記事はフォルダーのカスタマイズで関係ない記事なんですが、) Shellが持っている(管理している)ウインドウを表示する。
Sub aaa()

    'オブジェクトを格納する変数
    Dim objShell As Object, objWindow As Object

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")
    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        MsgBox "タイプは:" & TypeName(objWindow.document)
        Debug.Print "タイプは:" & TypeName(objWindow.document)
    Next
    Set objShell = Nothing

End Sub
単純に、 For Each で objShell.Windows を指定して、回し、 初めて使った、TypeName関数で、オブジェクトのタイプを表示してみました。 IEやエクスプローラーを複数起動して、実行すると。 タイプは:IShellFolderViewDual2 タイプは:HTMLDocument タイプは:HTMLDocument タイプは:IShellFolderViewDual2 と、値が取れます。

/* * 3.見つけたObjectに対して、処理を行う */

タイプは:HTMLDocument コイツがアヤシイデス(原稿書いてる今は、確信してるんだけど(笑)) この、オブジェクトに対して、処理を行ってみます。
Sub aaa()

    'オブジェクトを格納する変数
    Dim objShell As Object, objWindow As Object

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")
    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        MsgBox "タイプは:" & TypeName(objWindow.document)
        Debug.Print "タイプは:" & TypeName(objWindow.document)
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
            'URLとタイトルを表示する
            MsgBox "IEみつけたよ" & objWindow.document.Title
            Debug.Print "タイトル:" & objWindow.document.Title
            Debug.Print "URL:" & objWindow.document.URL
        End If
    Next
    Set objShell = Nothing

End Sub
単純に、 TypeName(objWindow.document) = "HTMLDocument" だったら、 .Title や .URL と アクセスしてます。 使いやすいように、1つ変数を用意して、 ~~~~~~~~~~~~~~~~~ 見つけたオブジェクトを代入して、操作することも出来ます。
Sub bbb()

    'オブジェクトを格納する変数
    Dim objShell As Object, objWindow As Object
    Dim objIE As Object

    '見つけたか判断用のフラグ
    Dim nFLG  As Boolean
    nFLG = False

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")
    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        Debug.Print "タイプは:" & TypeName(objWindow.document)
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
            'オブジェクトを代入する
            Set objIE = objWindow
            nFLG = True '見つけたよ
            Exit For  '初めに見つけたオブジェクトを代入
        End If
    Next
    Set objShell = Nothing

    'フラグをチェックして、ページに飛ばす
    If nFLG = True Then
        'テストで日記ページに飛ばす
        objIE.Navigate "http://blog.melma.com/00034126/"
        '↑いつものように、使えることを確認
        If MsgBox("確認 IEを.QUITで閉じますか?", vbYesNo) = vbYes Then
            objIE.Quit   '.quitメソッドを使ってみた
        End If
    Else
        MsgBox "IEのオブジェクトを見つけられなかったです"
    End If

End Sub
手抜きで、IEを見つけたら、 Set objIE = objWindow と代入後、Exit Forしてますが、実際はURLやタイトルなどで、 目的のIEか?チェックしてください(複数IEが起動しているときを考慮してね) objIEに代入されているので、あとは、いつもの操作を行えばOKです。 好きに操作してください。 objIE.Navigate "http://blog.melma.com/00034126/" なんて感じで、指定ページに飛ばしたり、 objIE.Quit で、閉じたりしてます。

/* * 4.終わりの挨拶 */

今回は、 起動済みのIEをShellアプリケーションから探ってみました。 ポイントは、TypeName関数で、 Shellが持っている(管理している)ウインドウを1つ1つ オブジェクトの名前で判断してるところです。 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 いつも失敗?の負け組のKen3でした。 ~~~~~~~(↑オイオイ)

No.157 2004/02/01
IE Element の 我流な探し方(AS Objectはキライ)
[ページTOPへ戻る]

<IE Element の 我流な探し方(AS Objectはキライ)>

どうも、三流プログラマーのKen3です。 今回は、 IE Element の探し方 そんなお話です。 ※有料版で、2004/01/24発行した内容です。  今回の質問がタイムリーだったので、  サービス And 宣伝兼ねて、発行します。 http://www.ken3.org/pmagmag/ が有料メルマガのHPですが、  この内容で月400円は高いので、登録しないでね・・・ http://www.ken3.org/p/3/office-052.lzh に、 今回使用した、テストプログラム(Excel2000版)が圧縮されてます。 動かしてテストしてみてください。 関連項目、 VBAでInternetExplorer.Applicationを操作する(IE操作) http://www.ken3.org/cgi-bin/group/vba_ie.asp もヨロシクね。

/* * 1.今回のキッカケ */

有料版の読者よりメールで、(勝手に要約すると) AS Objectはキライなので、参照設定をして型指定をしたい そんな時、AS XXXXは?どうやったら調べるのですか? と質問をもらった。 う〜ん、AS OBJECTって私は好きなんだけどななぁ、チャントした人が多いのですね。 調べるとしたら、どうするのだろう? それに続き、下記の書き込みをHPから質問送信でいただく ---------- >質問なのですが、objIE.Document.formsの下にItem1とItem2があり、 >Item2の下のItem4のボタンをサブミットしたいのですが方法が分かりません。 >objIE.Document.allを見るとItem256までしか表示されておらず、以下が省略されて >おり、目的のボタンが表示されません。 >Vb_Scriptなどで使用するelement()も試してみましたが駄目でした。 ---------- こんな感じで、IE系の操作の質問が多いです。 ※その他、未処理の質問もかなり多いんだけど  (有料版読者、その次に答えられるのから解答しているので回答順がめちゃくちゃ) う〜ん、、、どうするんだろう?

/* * 2.TypeName(objTAG)で表示させてみる */

えっと、まず、私は(読者は)、IEのオブジェクトタイプがわかりません。 だって、今から調べたいんだから(笑) なので、調査プログラムは、何でもOKのObject型に入れます。 いつもの様に、 Dim objIE As Object 'IEオブジェクト参照用 Dim objTAG As Object 'インターネットエクスプローラーのオブジェクトを作る Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True '見えるようにする(お約束) で、IEのオブジェクトを作成します。 次に、URLを表示させ.allでループさせます。 '文字列で指定したURLに飛ぶ objIE.Navigate "http://www.ken3.org/" '表示終了まで待つ Do While objIE.Busy = True '何もしないループ(笑) DoEvents Loop 'データをループする For Each objTAG In objIE.document.all Debug.Print objTAG.tagName Next これだと、タグの名前はでるけど、オブジェクトの型がわかりません。 それを表示させたいので、TypeName関数を使ってみました。 'データをループする For Each objTAG In objIE.document.all Debug.Print objTAG.tagName & ":" & TypeName(objTAG) Cells(yline, "A") = objTAG.tagName Cells(yline, "B") = TypeName(objTAG) Cells(yline, "C") = objTAG.innerHTML yline = yline + 1 Next この探りのプログラムを起動すると、 セルにタグの名前とオブジェクトの型が表示されます。 B:HTMLPhraseElement BR:HTMLBRElement A:HTMLAnchorElement ・   ・ ・ A:HTMLAnchorElement A:HTMLAnchorElement HR:HTMLHRElement SCRIPT:HTMLScriptElement BR:HTMLBRElement IMG:HTMLImg HR:HTMLHRElement これで、オブジェクトの型がダイタイわかるので、 あとはマイクロソフトのHPやGoogleで探ってみます。 試しにGoogleでHTMLScriptElementを探ると、 http://www.google.co.jp/search?hl=ja&ie=UTF-8&oe=UTF-8&q=HTMLScriptElement&lr=lang_ja こんな感じで進めていくと、 型指定をしたコーディングやオブジェクトの探り方が楽だと思います。 ここから、プロパティやメソッド、サンプルプログラムを探っていくのが、 私がIE系でやっているやり方です。 ※IE操作系のまとまった書籍や参考本、まだ見かけていないので。  (もしかしたら出版されているかも知れませんが)

/* * 3.終わりの挨拶 */

今回は、解説はあまりなく、私流/我流/三流のオブジェクトの探り方でした。 TypeNameで型を表示させ探ったり、型宣言する、そんな話でした。 好みもあるけど、使ってみてください。 ※なんて言ってても、私は、ずっとAs Objectを使い続けたりして、、、 IEでHTMLの解析時やドキュメントに対してアクセスする時の参考となれば。 http://www.ken3.org/p/3/office-052.lzh に、 今回使用した、テストプログラム(Excel2000版)が圧縮されてます。 動かしてテストしてみてください。 プログラム作りは簡単で面白いなぁと感じるような 解説/メールマガジンを書きたいと思ってますが、 なかなか、うまくいってないです。(有料、無料とも上手くいってない・・・) 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 いつも失敗?の負け組のKen3でした。 ~~~~~~~(↑オイオイ)

No.158 2004/04/23
Access From 明細行の色を変化させたい
[ページTOPへ戻る]

<Access From 明細行の色を変化させたい>

どうも、三流プログラマーのKen3です。 今回は、 Access From 明細行の色を変化させたい そんなお話です。 http://www.ken3.org/vba/lzh/vba158.lzh にサンプル圧縮しておきます、Access2000版ですが使ってみてください。 関連項目、 Access UserForm/サブフォームを操作する http://www.ken3.org/cgi-bin/group/vba_access_userform.asp もヨロシクね。

/* * 1.今回のキッカケ */

掲示板に下記の質問をもらいました。 ---------- >フォームに10件のレコードが表示されていてテキストボックスにはすべて編集不可に >していて、レコード移動等も一切無い表形式フォームでレコードの項目が重複してい >る場合はどのようにすればよいのでしょうか? > >・クエリテーブル(部屋番号、名前) > >フォーム例(表形式) >-------------- >部屋番号 名前 >-------------- >101 A >102 B >102 C >103 D >-------------- う〜ん、、、どうするんだろう? 掲示板の返信には、 私も少し考えてみますが、他の掲示板も探っていてください。 ※若い頃、思い出して、お客さんに不可能と言われるとムツっと来てやってみるかな・ ・・期待しないで下さいね。。。。(もう若くないので、頭もやわらかくないし・・・) と書いてたけど(オイオイ、また他店の紹介ですか・・・)

/* * 2.表形式のフォーム、レコード移動時に色変えても無駄 */

よく言われる話なのですが、 金額がマイナスの時は、赤く表示してくれと言われます。 赤ですか・・・わかりました。それくらい楽勝だろうと軽く引き受ける。 レコード移動時のイベントで、明細行のプロパティ変えればイインダロ。 なんて感じで、安易に修正すると・・・ ID 氏名 金額 1 A子ちゃん \50,000 2 B子ちゃん \60,500 3 借金けんぞう -\200,000 とテスト1テーブルがあって、ここで金額がマイナスなら赤にしてみます。 まず普通にオートでフォームを作ります。 ↑普通に作ったフォーム ここのレコード移動時のイベントで色を変えてみます。
Private Sub Form_Current()
    '金額がマイナスかチェックして、バックカラーを赤にする
    If Me![金額].Value < 0 Then
        Me![金額].BackColor = RGB(&HFF, &H0, &H0)   '赤
    Else
        Me![金額].BackColor = RGB(&HFF, &HFF, &HFF) '白のまま
    End If
    
    MsgBox "色変えたよ確認してね"
    
End Sub
なんてやるが、結果は・・・駄目でした。 ↑全てが真っ赤の赤っ恥画面 原因は、表形式のフォームを作っても、 プロパティはそれぞれの明細にあるのではなく プロパティを変更すると明細行全てに変更がかかってしまうためです。 残念、レコードを見ながら、色って変えられないのね・・・・

/* * 3.よく聞く条件書式を使ってみます */

では、次に、よく耳にする条件書式を使ってみます。 と思ったら、レポートにしかないの?この条件書式って? ※勘違いかもしれないので、保留(オイオイ) Access2000はまだ無いのかなぁ・・・ みかけた条件書式のサンプルページは下記のページでした。 http://support.microsoft.com/default.aspx?scid=%2Fdirectory%2Fworldwide%2Fja%2Fkblight%2FT009%2F6%2F04.asp

/* * 4.気を取り直して、テキストボックスを2つ作成する */

さてと、気を取り直して、テキストボックスを2つ作成します。 よく、プラスだったら入金、マイナスだったら出金、そんな処理の時に、 ID 氏名 金額 1 A子ちゃん \50,000 2 B子ちゃん \60,500 3 借金けんぞう -\200,000 を 下記のように細工して表示したいとき、 ID 氏名 入金   出金 1 A子ちゃん \50,000 2 B子ちゃん \60,500 3 借金けんぞう \200,000 入金と出金のテキストボックスを作成します。 入金のコントロールソースには =IIf([金額]>=0,[金額],"") 出金のコントロールソースには =IIf([金額]<0,[金額],"") と IIfを使って細工して入力します。 ↑コントロールソースにIIFを使用した例 実行すると、無事1つの項目金額を2つのテキストボックスに振り分けれました。 ↑実行結果 まぁ、実行結果みると赤で-\200,000となっていますよね。 細かいこと気にする人は、 出金のコントロールソースで-1を*してください(マイナスをかけて+にしてね) =IIf([金額]<0,[金額]*-1,"") あとは、わかりましたよね? 次の小細工は、テキストボックスを重ねて、背景スタイルを透明にします。 するとこんな感じになります。 ↑小細工して2つのテキストボックスを重ねてみた IIfで1つの項目を2つのテキストボックスに振り分け、 背景色を透明にして、テキストボックスを重ねる。 こんな小細工をすると、ある条件で色を変えられそうです。 ※ここまでするかって感じだけど。

/* * 5.本題に戻って、複数のレコードの時を条件にする */

テストは、金額だったから、+や−の判断が簡単でした。 だから、質問は、上のレコードと一緒だったら色を変えたい、 そんな話でしょ。 でしたね、脱線しました。 本線に戻すと、上のレコードを見る、これもまた大変なので(オイオイまた逃げかよ) 同じコードのレコードの数を数えてみます。 ※1つクエリーにコードをカウントする項目を追加します。 予約テーブル(勝手に名前を付けました) 部屋番号 名前 -------------- 101 A 102 B 102 C 103 D -------------- のテーブルから下記のクエリーを作成します。 部屋番号 名前 部屋CNT: DCount("*","予約テーブル","部屋番号=" & [部屋番号]) と、 予約テーブルから部屋番号が一致する数を求めるフィールドを演算フィールドで作成。 ↑部屋番号の数を数えたクエリー すると、通常は1(自分自身の数)で重複している部屋は2〜となります。 あとは、この項目を利用して、テキストボックスを2つ作り、背景透明のセコ技を・・ ↑部屋番号の重複で色を変えたサンプル。

/* * 6.終わりの挨拶 */

ポイントは、上のデータを見るのが大変なので、 部屋番号の数を数える項目の設置 と テキストボックスを2つ作成して、1つは赤にする。 そのテキストボックスに重複データを振り分けて通常データと区別、 背景を透明にしてテキストボックスを重ねて表示、 そんな小細工でした。 プログラム作りは簡単で面白いなぁと感じるような 解説/メールマガジンを書きたいと思ってますが、 なかなか、うまくいってないです。(有料、無料とも上手くいってない・・・) 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 いつも失敗?の負け組のKen3でした。 ~~~~~~~(↑オイオイ)

No.159 2004/05/26
IE 認証ページへのアクセス、basci認証ページって?
[ページTOPへ戻る]

<IE 認証ページへのアクセス、basci認証ページって?>

どうも、三流プログラマーのKen3です。 今回は、 IEでbasci認証ページへアクセスしてみたいと思います。 http://www.ken3.org/vba/lzh/vba159.lzh にサンプルweb159.xlsを圧縮しておきます、 Excel2000版ですが使ってみてください。 関連項目、 三流君VBAでInternetExplorer.Applicationを操作する(IE操作) http://www.ken3.org/cgi-bin/group/vba_ie.asp もヨロシクね。

/* * 1.今回のキッカケ */

昔、掲示板に下記の質問をもらいました。 ---------- 投稿時間:2004/03/28(Sun) 20:59 投稿者名:kuma san タイトル:Basic認証のページ はじめまして 今Vbsにてプログラムを作っているのですが ここのページはよく参考にしています。 1つどうしてもできないことがあって質問致します。 Basic認証のページのHTMLを保存するプログラムを書こうと思っているのですが、 id,passをきかれて、そこでsendkeysで{enter}をおくりたいのですが、どうも送る ことができず困っています。 何かこういった場合特別な方法があるのでしょうか?? ---------- 投稿時間:2004/03/31(Wed) 13:49 投稿者名:Ken3 タイトル:Re: Basic認証のページ Basic認証のページ user名とパスワードを入力する、ダイアログのことですよね。 たしか、sendkeysを使わなくてもよい方法がどこかに載っていたと思うので、少し 見てみますね。 ですが、期待しないでね。 マシーン壊れて、今、復旧中なので少々お待ちを。 ---------- マシーンは復旧しただろ?って自己突込みは置いといて、 今回は基本認証のページについて少し探りながら遊んでみます。

/* * 2.認証ページって何? */

会員の限定ページや、パスワードで管理したい秘密のページ、 そんなページがあります。 ありますじゃなくって、パスワードで管理されたページを作ることができます。 私の借りているNTTのホスティングサービスでは、 ユーザ認証(アクセス制限)の設定について http://www.ocn.ne.jp/myhosting/howto/6-3e-1.html みたいな感じで、簡単に設定可能でした。 試しに、zzzとディレクトリを作成して、 ユーザー名 mailmaga パスワード guest と設定してみました。 ↑簡単な設定方法(用意されたコントロールパネルを使用してみた) テストの前にいつもの宣伝。(オイオイ、やりすぎるとクレーム来るぞ?) 通常、下記のようなページを表示できます。 http://www.kurokiya.sake-ten.jp/GAME/index.html ← ゲームの通販 http://www.kurokiya.sake-ten.jp/idol/index.html ← アイドル関係 http://www.kurokiya.sake-ten.jp/DVD/index.html ← DVDの販売 新たな通販ページを作成中・・・みんなが見なくてもロボットが 読んでくれる事を期待して、リンクを載せるセコい技(笑) なんて、いつもの宣伝はほとほどにスルーして(スルーしなくて見てもいいけど) 基本認証を設定したzzz下記にアクセスすると http://www.kurokiya.sake-ten.jp/zzz/ useridとpasswordの確認画面が表示されます。 ユーザー名 mailmaga パスワード guest と入力して、ログインすることができます。 ↑basic認証の画面 少し駆け足でしたが、認証ページの設定と動作でした。 ※会員制のページも簡単に作れそうですね。 --- 補足 ---- 通常は、下記のようなファイルを作るらしいけど、知識が無くて、 NTTが用意したホスティングのコントロールパネルから設定しました。 .htaccess AuthUserFile /u/zzz/.htpasswd AuthGroupFile /dev/null AuthName Protected Area AuthType Basic <Limit GET POST> require user mailmaga </Limit> と .htpasswd mailmaga:J***********E ←*は私がつぶしてます、通常はパスワードが設定されてます って感じのファイルを自分で作るには、私は正直まだ勉強不足です。 そんなんじゃ・・・と思いつつ、日々の在宅業務や派遣先でイジメラレテタリ。 その他日記 http://blog.melma.com/00034126/?word=%5betc%5d

/* * 3.自動巡回の壁 IDとパスワードを聞いて来る */

話を戻して、 自動巡回だとパスワードを求められるページで処理が止まってしまいます。 fromに入れるタイプなら、submitなんてできるけど、 今回みたいな基本認証のダイアログが表示されると、それをかわしたいですよね。 '下記、パスワード入力で止まっている問題のプログラム 'ID:mailmaga password:guestを入力すると、動き出しますが、、、
Sub aaaa()

    Dim objIE As Object 'IEオブジェクト参照用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True '見えるようにする(お約束)

    'テスト用の認証ページに飛ぶ
    objIE.navigate "http://www.kurokiya.sake-ten.jp/zzz/"

    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop

    'テストでHTMLソースを取出す
    Dim strhtml As String
    strhtml = objIE.Document.all(0).innerHTML  '変数に代入
    MsgBox "ソースは" & strhtml & "です"

End Sub
そこをなんとか回避したいんだよね。 そこで、いつもの手抜き、腐った方法は、 http(s)://username:password@server/xxxxxx.xxx とURLにユーザー名とパスワードを含める方法なんだけど、 Internet Explorer 用の累積的なセキュリティ修正プログラム (832894) (MS04-004) http://www.microsoft.com/japan/technet/security/bulletin/MS04-004.asp で、この機能は悪用される恐れがあるので、パッチで埋められているらしい。 >注 : この更新プログラムをインストールすると、 >既定で “username:password@server” 形式の URL をサポートしなくなります。 だってさ、、 あらら、この形式で逃げようと思ってたのに・・・・残念。 ※ちゃんとやるかな今回は。

/* * 4.ヘッダーに認証コードを埋め込み開きたい */

キーワードを 基本認証 InternetExplorer.application の2つでマイクロソフトのHPを探すと、 下記が見つかります。 基本認証と Internet Explorer のクライアントを使用すると、 Single-Signで ソリューションを実装します。 http://support.microsoft.com/default.aspx?scid=kb;JA;837104 を見ると、 Authorization: Basic TG9jYWxVc2VyOkxvY2FsUGFzc3dvcmQ=\r\n 認証コード付きのヘッダで開けばいいのね。 ヘッダの指定かぁ。。。 http://support.microsoft.com/default.aspx?scid=kb;JA;174923 の [VB6] WebBrowseコントロールのPostDataパラメータの使い方 を見ると、 Navigate の仕様 URL (Universal Resource Locator) で指定したリソース、 またはフル パスで指定したファイルに移動します。 構文 object.Navigate URL [Flags,] [TargetFrameName,] [PostData,] [Headers] となっていて、[Headers]ヘッダーの指定が可能みたいです。 Authorization: Basic BASE64で変換したusername:passwordをここに書く といいのかぁ。BASE64の変換かぁ。 とりあえずBASE64の変換、わからなかったので、ツールをダウンロードして、 設定したユーザーとパスワードの組み合わせ mailmaga:guest を変換すると、 bWFpbG1hZ2E6Z3Vlc3Q= になるので、 ヘッダーに "Authorization: Basic bWFpbG1hZ2E6Z3Vlc3Q=" を指定する。
Sub bbbb()

    Dim objIE As Object 'IEオブジェクト参照用

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True '見えるようにする(お約束)

    'テスト用の認証ページに飛ぶ
    Const strURL = "http://www.kurokiya.sake-ten.jp/zzz/"
    Const strHEAD = "Authorization: Basic bWFpbG1hZ2E6Z3Vlc3Q= " & vbCrLf

    objIE.navigate2 strURL, , , , strHEAD

    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop

    'テストでHTMLソースを取出す
    Dim strhtml As String
    strhtml = objIE.Document.all(0).innerHTML  '変数に代入
    MsgBox "ソースは" & strhtml & "です"

End Sub
これで、無事に基本認証のページを開くことができました。 ※ですが、リンクをクリックするとまたパスワードを聞いてくるので、  毎回指定しないとダメ?なのか?う〜ん、深いなぁ。 一回通ったらその後はOKだと楽なんだけどなぁ。

/* * 5.終わりの挨拶 */

IEのObjectで基本認証/Basic認証のページを開く、 ポイントは、 ヘッダーに "Authorization: Basic bWFpbG1hZ2E6Z3Vlc3Q=" とユーザーID:バスワードをBASE64変換したヘッダーを指定して開く、 そんな感じでした。 ツールに頼ったけど、BASE64の変換、探らないとなぁと思いつつ、 今回も中途半端にサヨナラです。 ※まぁ、パスワード変わらないなら、Const埋め込みでもいいのかなぁ・・・ プログラム作りは簡単で面白いなぁと感じるような 解説/メールマガジンを書きたいと思ってますが、 なかなか、うまくいってないです。(有料、無料とも上手くいってない・・・) 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 いつも失敗?の負け組のKen3でした。 ~~~~~~~(↑オイオイ)


検索して目的の情報を探す。

目的の情報を探すには、最近はググれとよく聞きます。なので、検索ボックスを付けました。
いろいろなキーワードを入れて、検索してみてください。

カスタム検索
三流君(site:www.ken3.org) 内を Googleを利用してキーワード する

ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

質問や要望など メッセージを送る(三流君に連絡する)

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。

リンクや広告など

項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

Blog:[三流君の作業日記]/ [サンプルコードのゴミ箱]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]