#6です。得意の悪のりで、VBAで取得するのはどうやるんだろうと、手持ちのコードをいじってみました。目的のWebページが公開できるものでは無いとの事ですので、こんな事も可能かもしれないという程度にとどまりますが、ご参考まで。実行例を画像で添付します。(SELECT:1 は、0から数えて二番目、すなわち「サンプル2」を選択している事を表します)
'Microsoft Internet Control
'Microsoft HTML Object Library
'に参照設定
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Sub analyzeWebPage()
Dim ie As InternetExplorer
Dim doc As IHTMLDocument '-A
Dim chNode As IHTMLDOMNode
Set ie = getTopIeTab
If ie Is Nothing Then Exit Sub
Set doc = New HTMLDocument '-B
Set doc = ie.document
For Each chNode In doc.ChildNodes
scanNode chNode
Next chNode
Set doc = Nothing
End Sub
Sub scanNode(myNode As IHTMLDOMNode)
Dim myChildNode As IHTMLDOMNode
If myNode.nodeName = "INPUT" Then Debug.Print "INPUT:" & myNode.Value
If myNode.nodeName = "SELECT" Then Debug.Print "SELECT:"; myNode.selectedIndex
If myNode.nodeName = "OPTION" Then Debug.Print "OPTION:"; myNode.Value
If myNode.HasChildNodes Then
For Each myChildNode In myNode.ChildNodes
scanNode myChildNode
Next myChildNode
End If
End Sub
'IEの最前面Tabを取得
Function getTopIeTab(Optional matchWord As Variant) As InternetExplorer
Dim hWnd As Long
Dim ie As InternetExplorer
Dim targetIe As InternetExplorer
Const IEClassName As String = "IEFrame" 'IEのClass名
hWnd = FindWindow(IEClassName, vbNullString)
For Each ie In CreateObject("Shell.Application").Windows()
If hWnd = ie.hWnd Then
ie.StatusBar = True
ie.statustext = CStr(hWnd)
If ie.statustext = CStr(hWnd) Then
If IsMissing(matchWord) Then
Set getTopIeTab = ie
ie.statustext = ""
Exit Function
Else
If InStr(ie.LocationURL, matchWord) > 0 Then
Set getTopIeTab = ie
Exit Function
End If
End If
End If
End If
Next ie
Set getTopIeTab = Nothing
End Function
メモ帳で下記の様なサンプルページを作って、select.htmlとか命名して保存して、IEで開きます。
<html>
<head>
</head>
<body>
<select name="example">
<option value="サンプル1">サンプル1</option>
<option value="サンプル2">サンプル2</option>
<option value="サンプル3">サンプル3</option>
</select>
</body>
</html>
このページをコピーして、デフォルトまたは、HTML形式を指定して貼り付けると、コンボボックスの様なコントロールが貼り付けられ、テキスト形式を指定して貼り付けると、一つのセルにリストが貼り付けられました。
(画像参照)
一発でお望みの形で取得するのは標準機能では難しいと思います。上記両様で取得したデータを合成する必要があるでしょう。
貼り付けられたコントロールは、TypeNameを調べるとHTMLSelectというコントロールの様でした
(デザインモードにして、選択すると=EMBED("Forms.HTML:Select.1","")と表示されます)
下記の様なコードで、値(サンプル1;サンプル2;サンプル3というセミコロン区切りのリスト)に変換できるかも
(コードを記述したブックのSheet1を対象にしています。テストは不十分ですので、バックアップを取ったファイルでお試し下さい。)
Sub test()
Dim sh As Worksheet
Dim myOleObject As OLEObject
Set sh = ThisWorkbook.Sheets("Sheet1")
For Each myOleObject In sh.OLEObjects
If TypeName(myOleObject.Object) = "HTMLSelect" Then
myOleObject.TopLeftCell.Value = myOleObject.Object.Values 'Valuesという名前だが配列ではなくて文字列
myOleObject.Delete '値取得後コントロール削除
End If
Next myOleObject
End Sub
なお、As HTMLSelectで変数宣言してアクセスしようとすると、xl2010が一発で飛びました
Sub test0()
Dim sh As Worksheet
Dim myOleObject As OLEObject
Dim mySelect As HTMLSelect
Set sh = ThisWorkbook.Sheets("Sheet1")
Set mySelect = sh.OLEObjects(1).Object
Debug.Print mySelect.Values
End Sub
お礼
mitarashi 様、 ご明察です。 SELECTで選択あるいはINPUTで入力した値を取得したかったのですが、説明がうまくなくてすみませんでした。 3日3晩ウロウロと迷い、悩み、あきらめそうになったのですが、ついにmitarashi様の上記の方法で試したら、、なんと!!!エクセルに実現することができました。 ほんとうに、ほんとうに、ありがとうございました。 費やした時間が無駄にならず、ものすごく嬉しいです。