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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

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

Q&A

解決済

1回答

849閲覧

クラス・インスタンスのメンバを効率的・体系的に調べる方法

Yshida

総合スコア5

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

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

0グッド

0クリップ

投稿2020/11/08 11:37

前提・実現したいこと

クラス・インスタンスのメンバ(メソッドやプロパティ)を効率的・体系的に調べる方法を知りたい

発生している問題・エラーメッセージ

クラス・インスタンスのメンバ(メソッドやプロパティ)を調べるのに時間がかかる。 今回は、下記のコードのうちで htDoc.getElementsByTagName("INPUT")(collectionCnt).ParentNode.ParentNode.previousElementSibling.innertext の箇所の、"ParentNode"、"previousElementSibling" を見つけるのにGoogleでの検索などをおこない具体的な使用事例などを調べましたが、見つけるのに時間を要しました。 効率的・体系的に調べる方法はないでしょうか。 なお、下記のコードは、WEB上(IE)の表中の片側の列のチェックボックスのみにVBAでレ点をいれるものです。

該当のソースコード 言語:VBA (Excel)

Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Option Explicit Sub WEB操作TEST() 'Internet Explorerの COM (Component Object Model) をインスタンス化 Dim ie As Object Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True ie.navigate "https://yshida.web.fc2.com/" 'URLへ移動 'ウィンドウ切り替え待ち Sleep 2000 Dim htDoc As Object 'HTML文書の格納変数 Set htDoc = ie.document 'IEからHTML文書を取得する。 Dim htElement As Object 'HTML要素の格納変数 Dim collectionCnt As Long '要素のコレクション(≒配列)の添え字 Dim strParentPreviousElement As String '一つ手前の欄(※)の要素の文字列 ※自分→親要素→前要素 collectionCnt = 0 For Each htElement In htDoc.getElementsByTagName("INPUT") 'INPUTタグのコレクションのオブジェクトを参照し繰り返し処理 If htElement.Type = "checkbox" Then 'チェックボックス(checkbox)があるか判定 On Error Resume Next '一つ手前の欄(※)に"X"がない場合のエラー回避用 ※自分→親要素→前要素 strParentPreviousElement = htDoc.getElementsByTagName("INPUT")(collectionCnt).ParentNode.ParentNode.previousElementSibling.innertext '一つ手前の欄(※)の文字列を格納 ※自分→親要素→前要素 On Error GoTo 0 'エラー処理無効 If InStr(strParentPreviousElement, "X") = 1 Then '一つ手前の欄が"X"か判定 htElement.Click End If End If collectionCnt = collectionCnt + 1 strParentPreviousElement = vbNullString Next End Sub

試したこと

Google検索、VBEでのオブジェクトブラウザの確認、MSDN(確認したが見方がよくわかりませんでした)

補足情報(FW/ツールのバージョンなど)

Windows10 Home
64ビット オペレーティングシステム、x64ベース プロセッサ
Excel(Microsoft365)

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

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

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

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

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

guest

回答1

0

ベストアンサー

Docs 見るのが一番手早く正確です。

こんなの。MSDN が提供してるリファレンスです。
https://docs.microsoft.com/ja-jp/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa752279%28v%3Dvs.85%29

追記
今 VBE のオブジェクトブラウザを見てみましたが、
ちゃんと previousElementSibling が MSHTML.IElementTraversal のメンバーであることが確認できます。
Docs も見ましたが、トラバースと名のある通りイテレータみたいな感じですね。

逆に、例えば HTMLInputElement クラスからそのすべてのメンバが参照できます。
その中に previousElementSibling が確認できました。

コードエディタでも同じことができます。
試しにコードエディタに HTMLInputElement のオブジェクトを作ってコードを書いてみると、
オブジェクト.(ドット)まで入力すると使用できるメンバが列挙され、その中に previousElementSibling がありました。

VBA を使っていて、「体系的」にメンバが知りたいなら VBE の機能だけで十分ではないですか。
それで不十分な箇所を Docs などで深堀りすればよいかと。

もしやりたいことからの逆引きみたいな調べ方について質問されているのであれば、
それはぐぐるしかないと思います。

投稿2020/11/12 06:30

編集2020/11/13 06:06
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Yshida

2020/11/23 06:36

申し訳ありません。ご回答頂いたことを見逃していました。ありがとうございます。参考になります。 また、この質問に関してネットで改めて調べてみまして、今後はVBEでオブジェクトブラウザのほかにローカル/ウォッチウィンドウを利用していこうと思います。 MSDNは見方や調べ方がイマイチわからないのですが何かコツや詳細を説明したサイト等ありますのでしょうか。
退会済みユーザー

退会済みユーザー

2020/11/23 06:57

コツや詳細を説明したサイトは心当たりがないです。 MSDN の見方についてですが、 ページ内に構文や引数、戻り値などの詳細な仕様がそのまま書かれてますし、 ページ左側にライブラリ - オブジェクト - メンバの様な体系的なリンクが用意されてます。 逆に、MSDNの見方の何がどう分からないのでしょうか。 なお、調べ方については、 挙動を調べたいメソッドやプロパティ member に対して、 ブラウザの検索欄に「member docs」とか入力すると、 大体上位に MSDN のページが出てくるので、それでいいと思います。
Yshida

2020/11/23 11:49

お返事ありがとうございます。 >>逆に、MSDNの見方の何がどう分からないのでしょうか。 例えば初めにご紹介いただいた下記URLですと、表題に「IHTMLElement interface」とありますが、これが今回 私のつまずいた「htDoc.getElementsByTagName("INPUT")(collectionCnt).ParentNode.ParentNode.previousElementSibling.innertext」の箇所にそもそも関連があるかどうかが、わかりませんでした。関連がありそうだとは感じることはできても、確信ができないし、確かめ方がわからないという状態です。 また、左側にあるリンクの構造は下のようになっていますが、こちらも何を指しているかがよく把握できませんでした。 URL: https://docs.microsoft.com/ja-jp/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa752279%28v%3Dvs.85%29 左側リンク(樹形図): Internet Explorer for Developers > Platform APIs > MSHTML Reference > Scripting Object Interfaces > IHTMLElement > IHTMLElement interface
退会済みユーザー

退会済みユーザー

2020/11/23 13:19

まず、紹介したURLは質問とは直接関係ないです。 割と根本的な問題ですが、まずは記事を読みましょう。 以降、previousElementSibling に絞って記載しますが、 直接関係ないというのは、IHTMLElement は previousElementSibling を持たないからです。 これは上記URLの左側の IHTMLElement の箇所をクリックすると確認できます。 下にずらっとメンバが列挙されますが、その中には previousElementSibling は存在しません。 ただ、全く無関係ではないです。 COM系のオブジェクトは大抵同じスーパークラスを持ちます。IDispatch や IUnknown 等。 後、IHTMLElement も IElementTraversal も MSHTML で定義されます。 次、樹形図として記載頂いた箇所はそこまで気にする必要ない所ですね。 どちらかというと、その下に続く className や click の方を見て下さい。 すると、IHTMLElement は className や click といったメンバを持つことが理解できます。 またその逆で、className や click を持つオブジェクトは IHTMLElement であることが予想できます。 (逆は必ずしも正しいとは限りません。) 同様に、IElementTraversal をクリックすると、そのメンバに previousElementSibling があります。 そして、IElementTraversal は他のメンバに firstElementChild や lastElementChild を持つことも把握できます。 つまり、previousElementSibling をメンバに持つオブジェクトでは、 firstElementChild や lastElementChild も使えそうであることが予想できます。 文面のみでは正確にご希望の調べ方を把握しかねますが、 体系的に調べる、というのはこういうことではないでしょうか。 ちなみに以上のことから、あなたが躓いていた 「htDoc.getElementsByTagName("INPUT")(collectionCnt).ParentNode.ParentNode」というオブジェクトは、 IElementTraversal を継承した何らかのオブジェクトであることが分かります。 また、上述した辺りのメソッド(first だの last だの)は字面で機能がある程度把握できてしまいますが、 各メソッドのリファレンスを見れば、その機能の詳細が正確に確認できます。
Yshida

2020/11/28 01:53

ありがとうございます。今回の質問に頂いた回答で、とても理解が進みました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問