質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.43%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

2697閲覧

VBA - ローカルウインドウで調べた変数の型を、事前バインドで宣言すると実行できない

koyamashinji

総合スコア45

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/06/19 06:49

As Objectで宣言した変数について、遅行バインド後の型を、ローカルウインドウで確認し、
その型を、事前バインドとして宣言したのですが、エラーとなりました。
なぜでしょうか。
疑問に思ったので、こちらで質問させていただきます。


具体事例を下記に記します。

コード1(下記HTMLからtdタグのinnertextを取得するコードです。)について、
・変数 Aとtdsを、どちらもAs Objectとして宣言

・ステップイン実行時、ローカルで割り当てられた型を確認
変数Aは、型"HTMLTableRow"
変数tdsは、型"DispHTMLElementCollection"

・変数宣言を、それぞれ下記のように変更しコード実行
Dim A As HTMLTableRow
Dim tds As DispHTMLElementCollection

エラーがでる(「型が一致しません」)

念のため、
debug.Print TypeName(A)
debug.Print TypeName(tds)
で確認しましたが、どちらも型は上記で一致します。


#####ローカルウインドウの表示
イメージ説明


######コード1

Dim X As String X = "Apple" Dim A As Object, tds As Object For Each A In objIE.Document.getElementsByClassName("A") set tds = A.getElementsByTagName("td") If tds(0).innerText = X Then Msgbox tds(1).innerText Exit For End If Next

######HTML

<tbody> <tr class = "A"> <td class = "A-1" nowrap="..."> <b>Apple</b> ■ </td> <td style = "..."> <span>りんご</span> ● </td> </tr> <tr class = "A"> <td class = "A-1" nowrap="..."> <b>Banana</b> ■ </td> <td style = "..."> <span>バナナ</span> ● </td> </tr> ・ ・ ・ </tbody>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

HTMLTableRow, DispHTMLElementCollectionのような型は、VBAからは使えない(公開されていない)ようです。
HTMLTableRow型の代わりにIHTMLElementインタフェースを、
DispHTMLElementCollection型の代わりにIHTMLElementCollectionインタフェースを使うようにします。

Dim A As IHTMLElement
Dim tds As IHTMLElementCollection

単独のタグ要素場合はIHTMLElement、タグ要素のコレクションの場合はIHTMLElementCollectionを使う、といった感じでしょうか。

投稿2020/06/19 08:40

編集2020/06/19 08:47
kenshirou

総合スコア772

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koyamashinji

2020/06/19 08:47

いつもありがとうございます。 「公開されていない」というのは、Microsoft側でExcelの中にはコードとして作り込まれているが、オープンソースではないので、アクセスできない、という理解で間違ってないでしょうか。
kenshirou

2020/06/20 04:38

> Microsoft側でExcelの中にはコードとして作り込まれているが、 「Excelの中」というよりは、「IEの中」というべきでしょうね。 「公開されていない」というのは、いわゆる変数のスコープがPublicでない(限られた領域のみ参照可能)と考えて頂ければ結構です。 通常、「Dim xxx As 」と入力した後に使用可能な型の候補が表示されますが、Microsoft HTML Object Libraryの参照設定を行っても、HTMLTableRow, DispHTMLElementCollectionの候補は出てきません。 推測として、おそらくDOMの仕様に基づき、個々のタグの要素を表すクラスが内部的に用意されているのでしょうが、外部からそれらすべてを利用できるようにするのは色々な意味で不都合・不便なのではないかと。
koyamashinji

2020/06/22 04:42

非常に明快なご説明、有り難うございます。 いつも、大変助かっております。
guest

0

ExcelVBA

1Option Explicit 2 3'Microsoft HTML Object Library と 4'Microsoft Internet Controls 5'を参照設定すること 6 7Sub test() 8 Dim objIE As InternetExplorer 9 Set objIE = New InternetExplorer 10 11 Dim X As String: X = "Apple" 12 Dim A As HTMLTableRow 13 Dim tds As HTMLElementCollection 14 15 For Each A In objIE.document.getElementsByClassName("A") 16 Set tds = A.getElementsByTagName("td") 17 If tds(0).innerText = X Then 18 MsgBox tds(1).innerText 19 Exit For 20 End If 21 Next 22 23End Sub

とりあえず、こうじゃないかな。。。
動作確認はしてません。

投稿2020/06/20 13:38

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.43%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問