こんな疑問に回答します。
非表示にできる< 目次 >
オブジェクト変数がカラだった場合とは?(問題点の確認)
本記事の読者の皆様は、プログラミング知見が高いと思いますので、
初歩的なところはショートカットして説明していきますね
(要望あればTwitterで「@nkmr_dai」向けに質問なげてくださいませ。回答できなかったら、申し訳ないですが。。。)
ということで、まずは、以下のコードをベースに説明します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub obj変数の説明用コード() Dim driver As New Selenium.ChromeDriver Dim obj As object driver.Start 'Yahooのトップページへアクセス driver.Get ("https://yahoo.co.jp") 'XPathの○○○は任意のものに入れ替えてね。 Set obj = driver.FindElementByXPath("〇〇〇") 'objをクリックする obj.click() End Sub |
はい。
ということで、もし仮に 該当のXPathが存在しなかった場合、
「obj.click()」の実行時、VBA側ではエラーになります。
「何を押せばいいんですか?」とプログラム側で判断不可となるためエラーとなるわけです。
では、どうすれば良いの?ということを説明していきます。
オブジェクト変数がカラの時の戻り値は?(問題の理解)
この問題を解決するためには、オブジェクト変数が カラだった時の戻り値を知る必要があります。
結論、オブジェクト変数に何も無い時の戻り値は「Nothing」となります。
はい。
ここまでで、カンが良い人は 解決方法は分かってしまってるかと思いますが、
「Nothing」が戻り値であることが分かれば、IF文で分岐を作ってあげれば解消できますね。
前段で紹介したコードを元に、対象のXPathの有無で 処理が分岐する方法を 次段では説明していきますね。
オブジェクト変数がカラの時にスキップする方法(解決方法)
既に IF文で解決できると、前段で説明していますが、改めて。
結論、IF文でNothingの時は処理をスキップするようにコーディングしてあげれば解決します。
前段の説明用に紹介したコードを元に、コーディングすると以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Sub obj変数が未格納時にスキップする説明用コード() Dim driver As New Selenium.ChromeDriver Dim obj As object driver.Start 'Yahooのトップページへアクセス driver.Get ("https://yahoo.co.jp") 'XPathの○○○は任意のものに入れ替えてね。 Set obj = driver.FindElementByXPath("〇〇〇") '★分岐させる If obj = nothing then '正の時(カラの時) '┗何も記載しない = 処理をしない = スキップの意味と同義 '負の時(何か入ってる時) else 'objをクリックする obj.click() End if End Sub |
分かりやすく理解するために「obj = nothing」を条件分岐にしています。
一応、コード上にコメントを入れてますので、
そちらを一読してもらえれば、「そんなもんね」と理解できるかと思います。
参考:もうちょっとスリムにコーディングしたい
もうちょっとスリムに 条件分岐を コーディングしたい人向けのコーディング方法も紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub スリムなコード() Dim driver As New Selenium.ChromeDriver Dim obj As object driver.Start 'Yahooのトップページへアクセス driver.Get ("https://yahoo.co.jp") 'XPathの○○○は任意のものに入れ替えてね。 Set obj = driver.FindElementByXPath("〇〇〇") '★Notを利用すると、コード短縮できます。 If Not(obj = nothing) then 'objをクリックする obj.click() End if End Sub |
ちょっとだけ解説すると、
If obj = nothing then は、「空である場合に、正の処理してね。」となります。
この場合、空であるときは処理をスキップしたいため、Elseで追加コードを記載する必要があるわけです。
一方、今回のスリム化したコードでは
If Not(obj = nothing) then は、「空でない場合に、正の処理してね。」となります。
この場合、Elseを使わずに、そのまま コーディングすれば良いため、視認性が良くなります。
おわりに
今回はここまでとなります。
VBA × Selenium のネタでしたが、どちらかというとVBA寄りの話でしたね。
ただ個人的には、Seleniumの戻り値を1つとってもGoogle検索で中々出てこなかったりしたので
今回の記事作成に至っていたりします。
今後も、VBA×Seleniumに関する、実際に直面した問題などをネタに記事作成して参りますので、
NakamuraBlogをどうぞよろしくお願いします。(主に自分の備忘止めブログになっていますが。)
ここまでお読みいただきありがとうございました。
少しでも あなたが ストレスレスなSeleniumライフを送れることを筆者を心より祈っております。
以上、おわりです。