アプリ版:「スタンプのみでお礼する」機能のリリースについて

交通費計算を自動でするための
VBAを作ったのですが
往復と記入したら×2にするIF文を書いたところ
上手くいきません。
初心者なので詳しい方がいらっしゃいましたらご教授お願い致します。

【作ったものの具体的な内容】
ワークシートA欄・B欄に出発駅、到着駅を記入し
のD欄に片道か往復か記入すると
IEで検索されE欄に料金が出されるもの

【症状】
エラーコード91「オブジェクト変数またはwithブロックが設定されていない」と表示される。
出てくるまでは処理が行われ、
処理の20個ほど先まで実行されてからエラーが出ることもあれば
最初の1個目でエラーが出ることもある。
エラーが出るまでの処理は現状確実にできています。

Sub IE()

Dim IE As InternetExplorer

Set IE = CreateObject("internetexplorer.application")

IE.Visible = True
IE.Navigate "transit.yahoo.co.jp"

End Sub


Sub 処理()

Dim IE As InternetExplorer

Set IE = CreateObject("internetexplorer.application")

IE.Visible = True

Dim i As Long
For i = 2 To Range("a" & Rows.Count).End(xlUp).Row

IE.Navigate "transit.yahoo.co.jp"


Do While IE.Busy Or IE.ReadyState < 4
DoEvents
Loop

IE.Document.getElementById("sfrom").Value = Range("b" & i).Value

IE.Document.getElementById("sto").Value = Range("c" & i).Value

IE.Document.forms("search").submit


Do While IE.Busy Or IE.ReadyState < 4
DoEvents
Loop


If Range("d" & i).Value = ("往復”) Then


Range("e" & i).Value = Replace(IE.Document.getElementsByclassName("fare")(0).innerText, "円", "") * 2

Else

Range("e" & i).Value = Replace(IE.Document.getElementsByclassName("fare")(0).innerText, "円", "")

End If

質問者からの補足コメント

  • うーん・・・

    よくわかっていなくてごめんなさい、
    ブレークポイントを使って実行してみて
    ウィッチウィンドウで確認する、ということであってますでしょうか。
    IE.Document.getElementsByclassName("fare")(0).innerText
    の値は
    object HTMLLIElementと表示されました
    全然見当違いでしたらすみません。

    No.2の回答に寄せられた補足コメントです。 補足日時:2020/04/18 20:20

A 回答 (5件)

やっと問題の正体が見えたので、後はウォッチ ウィンドウ等を使って


IE.Document.getElementsByclassName("fare")
に代わる片道料金を表す「○○円」と言う文字列を返すプロパティーを探す必要があります。
HTMLの内容を確認できるのであれば手がかりが得られるのですが、難しいですね。
確実にエラーが起きる条件、起きない条件を示して別質問にしてください。
往復料金(2倍)を計算するための手法は解決済みですよね?
    • good
    • 0
この回答へのお礼

HTMLの内容、「要素の検査」で見られました。
<li class="fare"><span class="mark">251円</span></li>という風になってました。
("fare")の中身をmarkに変えてみたところ
エラーが出ることなく到着時間が表示されました。
ちょっとお手上げな状態なのですが何かご存じでしょうか・・・?

お礼日時:2020/04/21 20:43

HTMLの内容が想定通りであった場合には、


IE.Document.getElementsByclassName("fare")(0).innerText
に○○円と表示され、そこからReplace関数で"円"を除去
計算に使用するためには数値化(Val関数)
という流れになっているはずです。
ですが、エラーの起きるところでは、想定通りになっていないのでしょう。
ですが、これは往復という問題以前に起こっているはずです。
本当に
>往復と記入したら×2にするIF文を書いたところ
>上手くいきません。
という変更で発生したエラーなのでしょうか?
つまり、往復という条件を使用しなければすべての片道料金が正常に表示されるのでしょうか?
    • good
    • 0
この回答へのお礼

ご返信いただき誠にありがとうございます。
片道料金のみ(
Range("e" & i).Value = Replace(IE.Document.getElementsByclassName("fare")(0).innerText, "?~", "")
のみ記述でIf文なし)で実行してみたところ
同じ91エラーが表示され止まりました。
最初から間違っていたようです、申し訳ありません・・・。
こういった場合、どう直したらよいのでしょうか?

お礼日時:2020/04/20 19:41

確認のやり方はそれで良いと思います。


得られる値は文字列のはずなのですが・・
>object HTMLLIElementと表示されました
エラーが起きない場合でも同じですか?
    • good
    • 0
この回答へのお礼

度たびありがとうございます。
いま改めて確認しましたところ
Watch : : IE.Document.getElementsByclassName("fare")(0).innerText : <オブジェクト変数または With ブロック変数が設定されていません。> : Variant/Integer : Sheet1.中身
と表示されました
このinnerText とは、検索結果から「円」を除くためのものだと思ったのですが違ったのでしょうか?

お礼日時:2020/04/19 15:52

No.1です。


すべての行を F8(ステップイン)で試す必要はないと思います。
>エラーコード91「オブジェクト変数またはwithブロックが設定されていない」と表示される。
一般的には、ウォッチ ウィンドウをつかって変数の内容を確認すればよいのですが、このエラーでは使えない可能性があります。その前に設定されている変数に不備があるパターンもあるのです。
とりあえずStopを利用して、
IE.Document.getElementsByclassName("fare")(0).innerText
の内容を確認することをお勧めします。
また、前回の回答に明らかな不備が有りましたので修正しておきます。

Val(Range("e" & i).Value = Replace(IE.Document.getElementsByclassName("fare")(0).innerText, "円", "") ) * 2

Range("e" & i).Value = Val(Replace(IE.Document.getElementsByclassName("fare")(0).innerText, "円", "") ) * 2
ではいかがでしょうか?
この回答への補足あり
    • good
    • 0
この回答へのお礼

詳しくありがとうございます。
新たにお教えいただいたコードに直したところ
最初と同じくエラーが出るまでは動くようになりました!
ありがとうございます。
エラーは変わらず同じ91です。
>Stopを利用して、
IE.Document.getElementsByclassName("fare")(0).innerText
の内容を確認する
につきまして、私の理解力が足らず申し訳ないのですが、
どのように行うとできるのでしょうか・・・
詳しくお教えいただいたにもかかわらず、聞き返してしまいごめんなさい。

お礼日時:2020/04/18 19:25

動作確認はしていませんが、IE.Document内の情報は基本的に文字列です。


×2のような計算をするためには、「文字列」→「数値」の変換が必要であると思われます。

Val(Range("e" & i).Value = Replace(IE.Document.getElementsByclassName("fare")(0).innerText, "円", "") ) * 2
詳しくは、
VBA Val 関数
https://www.tipsfound.com/vba/05val
等を参考にしてください。

また、【症状】に示されているようなエラーはIE.Documentの内容に依存しているものと思われますので、エラー発生時にDebugで確認することをお勧めします。
VBA デバッグの仕方
https://www.tipsfound.com/vba/01010
    • good
    • 0
この回答へのお礼

長文にもかかわらず、丁寧な回答ありがとうございます。
試してみましたところ、
Val関数では動いてくれず(例に挙げていただきましたコードで動かなかったため)
教えていただいたデバッグでの確認で、F8押しっぱなしで、最後まで片道、往復ともに正確に入力してくれるようになりました。
ご教示ありがとうございます。
実行(F5)では動作に波があるのは、IEの動作によるものなのでしょうか・・・。

お礼日時:2020/04/18 13:45

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