Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Excel 2013)
IE操作 SELECTタグ 
投稿日時: 18/02/14 13:22:29
投稿者: 真下まゆ

お世話になっております。IE操作で質問です。
 
↓aaa.html のような感じでリストボックス的なものが二つあるサイトがあります。
渡される数字が 1 の時は、部署のボックスの一番上 この場合は a:総務 を選択。
渡される数字が 1 以外の時は、それ以外の 経理、管理、営業 全てを選択
したいのですが、★以降の IF 文の記述ができません。
 
このリストの中身は、都度変わるので今は4つですが、明日は5つになるかもしれません。
IF文以降を教えて頂けると有りがたいです。宜しくお願いしますm(_ _)m
 
■aaa.html
<HTML>
<BODY>
<TR>
<TH bgcolor='#66FFCC'>部所</TH>
<TD COLSPAN=3><SELECT NAME=BUSYO MULTIPLE size=5 WIDTH=250>
<OPTION VALUE='1'>1 : 総務</OPTION>
<OPTION VALUE='3'>3 : 経理</OPTION>
<OPTION VALUE='4'>4 : 管理</OPTION>
<OPTION VALUE='5'>5 : 営業</OPTION>
</SELECT></TD>
 
<TH bgcolor='#66FFCC'>名前</TH>
<TD COLSPAN=3><SELECT NAME=NAME MULTIPLE size=5 WIDTH=250>
<OPTION VALUE='1'>1 : 山田太郎</OPTION>
<OPTION VALUE='2'>2 : 山田花子</OPTION>
<OPTION VALUE='3'>3 : 鈴木一郎</OPTION>
<OPTION VALUE='4'>4 : 鈴木良子</OPTION>
</SELECT></TD>
</TR>
</BODY>
</HTML>
 
 

Option Explicit
 
Declare PtrSafe Sub Sleep Lib "Kernel32" _
    (ByVal dwMilliseconds&)
 
Sub Main()
    IEAutomation 1
End Sub
 
Sub IEAutomation(ByVal Number As Long)
    Const READYSTATE_COMPLETE = 4&
                 
    Dim oIE As Object, oColl As Object
    Dim sPath As String
    Dim sURL As String
     
    sPath = ThisWorkbook.Path
 
    Set oIE = CreateObject("InternetExplorer.Application")
    sURL = sPath & "\aaa.html"
     
    With oIE
        .Visible = True
        .Navigate sURL
 
        While .Busy Or .readyState <> READYSTATE_COMPLETE
            Sleep 50
        Wend
         
        '★もし1が渡された時は、リストの一番上を選択
        If Number = 1 Then
            Set oColl = oIE.Document.getElementsBytagname("option")
            oColl.Item(0).Selected = True
        'それ以外の数字が渡された時は、リストの1番上以外を全部選択
        Else
                 
        End If
    End With
End Sub

投稿日時: 18/02/14 16:48:19
投稿者: 真下まゆ

すみません。自己解決しました。
明後日以降、念の為コード載せます。
ちょっと忙しくて、しばらく放置します。すみません<(_ _)>

回答
投稿日時: 18/02/14 17:38:02
投稿者: 半平太

本当に aaa.htmlがそんな作りなら、SELECTタグで取得できますよね?
 

 Set oColl = oIE.Document.getElementsBytagname("SELECT")
 
 Dim aSEL, NN As Long

 For Each aSEL In oColl
     If aSEL.Name = "BUSYO" Then
         aSEL.Item(0).Selected = (Number = 1) 'トップの処理。1ならTRUE
         
         For NN = 1 To aSEL.Length - 1  '2番目以降を処理
             aSEL.Item(NN).Selected = Not (Number = 1) ’トップの反対
         Next NN         
     End If
 Next

投稿日時: 18/02/16 08:42:38
投稿者: 真下まゆ

半平太様
 
ご連絡が大変遅くなり、申し訳ありませんでした。
コードありがとうございましたm(_ _)m
 
最初は SELECT タグが 2 つあるとき、"BUSYO" の方を捕まえてみると
中身の OPTION タグをループする方法が分からず・・・
 
OPTION タグを運良く Select 出来ても
OPTION タグの数を数えることが出来ず・・・
その他全部を Select するってどうやるんだろう???
 
そんなこんなでモヤモヤしていたところ、
“Length”が分かって、何とか自己解決していたところでした。
 
私が書くとツラツラと長いコードになってしまいますが、
スッキリ纏めて下さり、ありがとうございました。
 
思い通りの動きをしてくれましたm(_ _)m