dポイントプレゼントキャンペーン実施中!

ExcelのVBAでIEの制御をいていますが、getElementsByClassNameで「実行時エラー'438':オブジェクトは、このプロパティまたはメソッドをサポートしていません。」となります。

古いIEではgetElementsByClassNameはサポートされていなかったようですが、当方の実行環境はつぎのとおりです。

Windows 7 Pro. 64bit SP1
Excel 2007(VBA 6.5)
IE10

なお、getElementByIdとかは使用できています。
解決方法をご教示して頂きたくよろしくお願い致します。

A 回答 (5件)

#1~4です



ご提示のページを開き、下記コードを実行した結果は

2
0 stoksPrice realTimChange innerText=
1 stoksPrice innerText= 803


でした。
classname="stoksPrice realTimChange" もヒットして(仕様?バグ?)、そのinnterTextは空ですので取得出来ていない様に見えたのでしょう。
ie.document.getElementsByClassName("stoksPrice")(1).InnerTextなら良いかと思いますが、問題のページのソースを見てご検討願います。

'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 test()
Dim ie As InternetExplorer
Dim myElements As IHTMLElementCollection
Dim myElement As IHTMLElement
Dim i As Long

Set ie = getTopIeTab
If ie Is Nothing Then Exit Sub
Set myElements = ie.document.getElementsByClassName("stoksPrice")
Debug.Print myElements.Length
For Each myElement In myElements
Debug.Print i, myElement.className & " innerText= " & myElement.innerText
i = i + 1
Next myElement
Set ie = Nothing
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
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ie.document.getElementsByClassName("stoksPrice")(1).InnerTextで期待する結果を得ることができました。

数年前に定年退職し自分で使うアプリを必要に駆られて、その都度VBAやVB.NETで作るようにしています。体系的にVBを勉強をしたことがなく、全くその基礎ができてなくて何時まで経っても初心者を卒業することができないでいます。そんな中、No.2の回答のデバッグにおけるVBEの使用法は特に勉強になりました。

今回、ご親切に分かりやすく最後まで解決に導いて頂きただだだ感謝あるのみです。重ね重ねありがとうございました。

お礼日時:2014/03/02 00:04

#1~3です。


#3で提示したようなデータでは取得できているので(最後の</html の">"が無いのはコピペミスです)原因がつかめません。
誰でもアクセスできるWebページであればURLを教えていただければ試してみても良いですが、ログインが必要なものではそういう訳にもいきませんね。

この回答への補足

度々ありがとうございます。

可能であれば下記のURL(Yahoo!ファイナンシャルのトップページ)で試して頂ければ幸いです。ログインは不要です。

http://finance.yahoo.co.jp/

表示画面の上部にあるテキスト欄には、株式銘柄コードとして例えば6501を入力して、その右の黄色の[株価検索]ボタンをクリックして頂ければ、問題のHTMLソースの画面になります。

よろしくお願い致します。

補足日時:2014/03/01 21:07
    • good
    • 0

#3です。


下記の様なしょうも無いコードですが思わぬ深みにはまってしまいました。
(参照設定版のコードですが、いろいろと省略してあります)
Sub test()
Dim ie As InternetExplorer

Set ie = New InternetExplorer
ie.Visible = True
ie.navigate "http://www.hoge.jp/test.html"
' ie.Visible = True
Do While ie.Busy = True Or ie.readyState <> 4
Sleep 50
DoEvents
Loop
'ここだけ見ていただければ結構です
Debug.Print ie.document.getElementsByClassName("stoksPrice")(0).FirstChild.NodeValue
ie.Quit
Set ie = Nothing
End Sub

テストに使ったtest.html
<html><head></head><body><table><tr><td class="stoksPrice">5,258</td></tr></table></body></html

以下は備忘録ですが、
1.ローカルに置いたhtmlファイルでは動作しない。ie.readyStateのあたりでエラーになってしまう。
2.文字列変数にhtmlを入れて、HTMLDocumentにWriteして処理しようとすると、getElementsByTagNameは機能しますが、getElementsByClassNameはメンバが無いというエラーになってしまう。
仕方が無いので自分のホームページのサーバーにアップロードして試しました。(^^;)

この回答への補足

回答ありがとうございます。

問題のステートメントの最後部の.innerTextを.FirstChild.NodeValueに修正しましたが、.innerTextの時と同様に何も取得できませんでした。環境の違いの影響でしょうか?

ずっとVBA初心者にお付き合い頂き大変恐縮しています。

補足日時:2014/03/01 19:57
    • good
    • 0

#1です。


Microsoft Internet Control
Microsoft HTML Object Library
に参照設定して、VBEのオブジェクトブラウザでMSHTMLのメンバを眺めてみて下さい。
>Function getElementsByClassName(v As String) As IHTMLElementCollection
> MSHTML.HTMLDocument のメンバー
とある様に、getElementsByClassNameで得られるのはCollectionです。
また、
>Property innerText As String
> MSHTML.IHTMLElement のメンバー
であり、IHTMLElementCollectionにはinnerTextのプロパティは無く、エラーになります。

従って、http://oshiete.goo.ne.jp/qa/8410220.htmlでやっている様にループを回して取得する必要があります。
明らかに一個しかヒットしないなら、
ie.Document.getElementsByClassName("stoksPrice")(0).innerText
でも良いかもしれません。(未検証ですが)

この回答への補足

またまた、ありがとうございます。

お教え頂きましたように下記のとおり修正してエラーが起きなくなりましたが、5,258がセルにセットされません。

修正前: ie.Document.getElementsByClassName("stoksPrice").innerText
修正後: ie.Document.getElementsByClassName("stoksPrice")(0).innerText

よろしくお願い致します。

補足日時:2014/03/01 01:39
    • good
    • 0

当方Win7Home64bit、IE10、xl2010-32bitですが、


下記コードのgetElementsByClassNameは動作しています。
http://oshiete.goo.ne.jp/qa/8410220.html

他に原因があるのでは?
コードを開示されてはいかがでしょうか。

この回答への補足

早速回答頂きありがとうございます。

ご提示頂きましたgetElementsByClassNameを使用したコードは、問題なく実行できました。
どうも私のコードに問題があるようです。

やりたいことは、下記のHTMLソース中の5,258を下記のVBAステートメントでセルに取り込むことです。

</td>
<td class="stoksPrice">5,258</td>

Range("B10").Value = ie.Document.getElementsByClassName("stoksPrice").innerText

上記ステートメントでエラーとなっています。修正方法をお教え下さい。

補足日時:2014/02/28 23:17
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています