
ExcelのVBAでIEの制御をいていますが、getElementsByClassNameで「実行時エラー'438':オブジェクトは、このプロパティまたはメソッドをサポートしていません。」となります。
古いIEではgetElementsByClassNameはサポートされていなかったようですが、当方の実行環境はつぎのとおりです。
Windows 7 Pro. 64bit SP1
Excel 2007(VBA 6.5)
IE10
なお、getElementByIdとかは使用できています。
解決方法をご教示して頂きたくよろしくお願い致します。
No.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
回答ありがとうございます。
ie.document.getElementsByClassName("stoksPrice")(1).InnerTextで期待する結果を得ることができました。
数年前に定年退職し自分で使うアプリを必要に駆られて、その都度VBAやVB.NETで作るようにしています。体系的にVBを勉強をしたことがなく、全くその基礎ができてなくて何時まで経っても初心者を卒業することができないでいます。そんな中、No.2の回答のデバッグにおけるVBEの使用法は特に勉強になりました。
今回、ご親切に分かりやすく最後まで解決に導いて頂きただだだ感謝あるのみです。重ね重ねありがとうございました。
No.4
- 回答日時:
#1~3です。
#3で提示したようなデータでは取得できているので(最後の</html の">"が無いのはコピペミスです)原因がつかめません。
誰でもアクセスできるWebページであればURLを教えていただければ試してみても良いですが、ログインが必要なものではそういう訳にもいきませんね。
この回答への補足
度々ありがとうございます。
可能であれば下記のURL(Yahoo!ファイナンシャルのトップページ)で試して頂ければ幸いです。ログインは不要です。
http://finance.yahoo.co.jp/
表示画面の上部にあるテキスト欄には、株式銘柄コードとして例えば6501を入力して、その右の黄色の[株価検索]ボタンをクリックして頂ければ、問題のHTMLソースの画面になります。
よろしくお願い致します。
No.3
- 回答日時:
#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初心者にお付き合い頂き大変恐縮しています。
No.2
- 回答日時:
#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
よろしくお願い致します。
No.1
- 回答日時:
当方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
上記ステートメントでエラーとなっています。修正方法をお教え下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) <excel vba>selenium basicのWebDriverの自動更新のエラーについて 1 2022/10/01 17:07
- Visual Basic(VBA) VBAでArrayListを使う為の「mscorlib.tlb」の参照設定について 3 2022/03/23 19:45
- Visual Basic(VBA) VBA アドインについて お詳しい方 ご教授をお願いします。 相談事項 現在以下の対応を実施した所、 1 2022/11/02 16:53
- Visual Basic(VBA) Access VBAから使用したExcelプロセスを閉じる方法について 4 2022/06/08 17:50
- その他(パソコン・周辺機器) EXCELで「WEBオプションの対象ブラウザ」を変更する方法 2 2023/04/12 15:44
- その他(プログラミング・Web制作) Pythonでexcelのvbaを作成、実行する方法について Pythonで表の自動集計プログラムを 3 2022/07/09 09:58
- Visual Basic(VBA) Vba 互換モードでのAppActiveについて教えてください 2 2022/06/27 18:47
- Excel(エクセル) 重複したデータ(空白は除く)のVBA表記について 4 2022/08/15 07:28
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- Excel(エクセル) エクセル・スプレッドシートで、一定数を超えたらゼロから再累計する方法 8 2022/05/28 03:52
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ブール代数を用いた、論理式の...
-
エクセルでマクロを使い、多数...
-
Webサイトのurlの保存方法?
-
PCのウェブサイトのショートカ...
-
パソコン版グーグルマップを最...
-
gooの無料ホームページで文字が...
-
Photoshop初心者です。PCが重い...
-
B5ノートパソコン、よく止ま...
-
指定されたパスは存在しません...
-
エクセル VBE 入力支援の動作が変
-
パソコンと体質的に相性が悪い...
-
Microsoft Edge で InPrivateを...
-
Illustratorのショートカットキー
-
adobe premiere で作った動画を...
-
必要ないモノまでインストール...
-
サイトのショートカットアイコ...
-
イラストレーター8.0のトラッキ...
-
「インターネットのプロパティ...
-
フォトショップCS3のショートカ...
-
コンピュータ使用時のフリーズ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでマクロを使い、多数...
-
getElementsByClassName不可
-
「Irfan view」 って...
-
VBA→IEでtextareaにセル範囲の値
-
GIFの背景透明化・・・
-
Webサイトのurlの保存方法?
-
EdgeでInPrivate上Webページの...
-
サイトのショートカットアイコ...
-
パソコン版グーグルマップを最...
-
Photoshop初心者です。PCが重い...
-
クロームの右上のダウンロード...
-
ASUS UEFI BIOS utilityという...
-
VMWare Player 上でフリーズ抜...
-
パソコンと体質的に相性が悪い...
-
エクセルでマクロ使うとフリー...
-
指定されたパスは存在しません...
-
ファンが急に回転してフリーズ...
-
QuickTime のキーボードショー...
-
デスクトップのショートカット...
-
インターネットショートカット...
おすすめ情報