
VBAを独学で学んでいる者です。
実力・知識がないながらも検索エンジンなどを頼りに頑張っています。
しかしながらどうしてもわからない事があり、煮詰まってしまいましたので、質問させていただきました。
当方、VBAにてIEを操作し、セルの内容を自動入力していくプログラムを書いています。
以下に記述しているものや、「document.body.innertext」で取得したIEの情報と書き込みたいセルの内容が一致しない場合にエラーメッセージを表示したいのですが、どうもうまくいきません。
If~Thenなどを使うことで条件分岐できるのだとはおもうのですが、当方の記述ですと条件を無視(?)してElseに飛んでしまいます。
当方が記述している内容は以下です。
(Cells(1, 1)には文字列を入力しています。)
~ここから~
'リンク情報からオブジェクトを探し.Clickする
For n = 0 To objIE.document.Links.Length - 1 'リンク数分まわす
Debug.Print objIE.document.Links(n).innertext 'デバックで表示する
'リンク先(.text)をチェックする(文字列比較する)
If objIE.document.Links(n).innertext = ActiveSheet.Cells(1, 1).Text Then
objIE.document.Links(n).Click '.Clickでクリックしてみた
Exit For '見つかったので強制的にループを抜ける
Else
MsgBox "NG!!", vbExclamation
Exit Sub
End If
Next
~ここまで~
Else
MsgBox "NG!!", vbExclamation
Exit Sub
を消すと、「For n = 0 To objIE.document.Links.Length - 1 」がinnertextを取得し、Cells(1, 1)の内容を読み取りクリックを実行してくれるのですが、Elseを入れると、Cells(1, 1)の内容と一致しているにも関わらず、Elseへ移行し、NGのメッセージボックスが出てきます。
記述が間違っているのでしょうか?
何か他の記述がございますようでしたらご教授願えますでしょうか?
宜しくお願い致します。
No.4ベストアンサー
- 回答日時:
またまた登場です。
少々の理解力はあるつもりなんですが、今回はどうもいまいちやりたいことがわかりかねます。。(^^;;;
ようするに次のようなことですか?
Cells(lineIndex, 1)の内容が、Linksオブジェクトの中になければ、エラーメッセージを表示して、プロシージャを終了する。
'-------------------------------------------------
For n = 0 To objIE.document.Links.Length - 1
If objIE.document.Links(n).innertext = ActiveSheet.Cells(lineIndex, 1).Value Then
●有った時の処理●
Exit Sub
End If
Next
'ここへ抜けたということは、該当のものがなかったということなので
MsgBox "NG!!", vbExclamation
End Sub
'--------------------------------------
Forで、Linksコレクションの中を全部探して、Forを抜けたら、該当データはなかったことになる
コードを小出しにされてるのでアドバイスできるのはこの程度です。
こういった類の質問は、
実際のデータを提示
実際のコードを全て提示
そして、やりたいことを箇条書きにする
これらのことを提示されると解決が早いと思われます。
また他の方からもよりよい回答が寄せられると思います。
やりたいことの全貌は見えませんが、何かしら面白そうなことをやっていそうなので、ちょと興味あり。
で、30分ごとに覗いて見ませう。。
onlyromさん、当方のような者にお付き合いいただき、ありがとうございます。
稚拙な表現により、困惑させてしまいましたこと、お許しください( ー_ー)
しかし、onlyromさんのご回答がヒントとなり、当方が行いたいことを実現できると思います!!
当方の記述は
For n = 0 To objIE.document.Links.Length - 1
If ~~~ Then
End If
Exit For
Next
●以下よりその後の記述●
・・・というような物だったんですが、
Nextの後に、その後の操作を入れていたことが原因と思われます。
このような記述ではなく、End Ifの後にその後の操作を入れ、
Nextで閉じる必要があったようです。。。
お騒がせいたしました。
この件が落ち着きましたら、基礎からじっくり勉強していきたいと思っています。
何ぶん、初めてのVBA作成でして・・・(汗
やりたいことを表現するのも難しいものですね・・・。
わからない箇所を具体的に説明する能力も必要と感じました。
当方、セルに入力した内容を元に、サイト作成を半自動で行いたかったのです。
Cells(lineIndex, 1)の位置にタイトルを設定していましたので、これが間違っていたり、かぶってしまうと判断できなければ、同じタイトルに対し同じ処理をしてしまう(同じサイトを作ってしまう)ので、これを予防したかったのです。
また質問させていただくかもしれませんが、今後とも宜しくお願い致します。
No.3
- 回答日時:
>Elseを入れてしまうと、最初のLinks「0のあああ」に対してElseが効いてしまうため、
>Cells(1,1)「ううう」まで行き着かずElseの処理をしてしまう、ということでしょうか?
そのとおりです。
で、実際の並びはどうなっているのでしょうか。
実際では、Cells(1,1)の内容は
linksコレクションの1番目にあるのでしょうか?
何れにしろ、提示のFor文に値をひとつずつ当てはめてみればお分かりになると思いますが。
この回答への補足
実際の並びなんですが・・・
まずVBAにてCells(1,1)(あああとします)の内容をHTMLに反映し、その「あああ」をVBA次回起動時に再度HTML内に探しに行く、ということを自動で行うものなんです。
つまりそのHTMLは常に変化するため、
実際の構文はCells(1,1)ではなく、
Do While Cells(lineIndex, OK).Text = "OK"
lineIndex = lineIndex + 1
Loop
Cells(lineIndex, 1)
・・・といったものを使っているため、特定の語句「あああ」を探しに行くものではなく、常に変化するCells(lineIndex, 1)を探したいため、nの番号は毎回変わります。
ですので、
For n = 0 To objIE.document.Links.Length - 1 'リンク数分まわす
Debug.Print objIE.document.Links(n).innertext 'デバックで表示する
'リンク先(.text)をチェックする(文字列比較する)
If objIE.document.Links(n).innertext <> ActiveSheet.Cells(lineIndex, 1).Text Then
MsgBox "NG!!", vbExclamation
Exit Sub
End If
Next
・・・という、=を<>に変えた構文を最初に持ってきてあげたりしたのですが、これですと、リンクのinnertext情報を拾ってくれませんでした。
とりあえず、Cells(lineIndex, 1)と一致した場合は望むような作業をしてくれるのですが、一致しない場合に処理を停止するような構文を記述したいのです。
初心者ゆえ、説明もままなっていないかと思いますが、引き続き宜しくお願い致します。
No.2
- 回答日時:
質問の文言にちょと理解しかねるところがありますが。。。(^^;;
>Elseを入れると、Cells(1, 1)の内容と一致しているにも関わらず
Cells(1,1)の内容と同じものがLinksコレクションの中にあるにはあるが、
それは、コレクションの【1番目】にあるのではなくて、2番目以降にあるのではありませんか
言いたいことは、次のようなことです。
Cells(1,1) の内容
「ううう」
Linksコレクションの順番と内容
0 あああ
1 いいい
2 ううう
3 えええ
このように、Cells(1,1)の内容が、Linksコレクションの一番最初になければ、
提示のコードでは、質問のようになるのは当然ですよね。
勘違いでしたらご容赦願います(^^;;;
この回答への補足
ご回答ありがとうございます。
質問の文言がわかり辛いもので申し訳ありません。
onlyromさんがおっしゃられていることは、つまり、
Cells(1,1)の内容と同じものがLinksコレクションの中にあるにはあるが、
Elseを入れてしまうと、最初のLinks「0のあああ」に対してElseが効いてしまうため、
Cells(1,1)「ううう」まで行き着かずElseの処理をしてしまう、ということでしょうか?
No.1
- 回答日時:
見た限りあってると思いますが・・・
一致しない場合ELSEに飛ぶんですよね?
この回答への補足
>一致しない場合ELSEに飛ぶんですよね?
はい、一致しない場合にElseに飛ばすように記述したいのですが・・・。
「If objIE.document.Links(n).innertext = ActiveSheet.Cells(1, 1).Text Then」内の「=」を「<>」に変え、Elseの前にNGメッセージを入れても同じ結果になってしまいます。
以下のような
sitehtml = objIE.document.body.innertext
If InStr(sitehtml, ActiveSheet.Cells(1, 1).Text) <> ActiveSheet.Cells(1, 1).Text Then
MsgBox "一致しません"
Exit Sub
End If
・・・という構文なども使用してみましたが同じ現象でした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
onClickイベントの変更方法
-
TexでΣの添え字の位置直し
-
テキストボックスへの引数によ...
-
JavaScript window.openで開く...
-
removeEventListenerの必要性
-
オンマウスについて
-
webページ上のTabキーの動き
-
ラジオボタンでreadonlyの切替え
-
重い処理とはどのようなものが...
-
教えてください><
-
このプログラムを改善してくれ...
-
ローカルにあるファイルを検索...
-
jQuery|要素だけを変更できま...
-
商品リンクをランダムで指定数...
-
この配列は何?
-
Boolean型配列中のTrueの有無を...
-
setTimeoutでループしたいので...
-
ActiveXobjectが作成できない
-
jqueryのグローバル変数とロー...
-
Jqueryのanimateのオプションに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DOM要素を削除しても、イベント...
-
XMLでのAttributeを持ったNode...
-
Latexに関する質問です。
-
javascriptの基本的なことだと...
-
JavaScript window.openで開く...
-
excle VBA とweb上の検索を利用...
-
VBAのIE操作でframe構造のサイ...
-
iframeのソースを取得したい
-
FireFoxのjavascriptで自動でキ...
-
UWSCでオンクリックのボタンを...
-
VBAでIEのボタンを押してメッセ...
-
ブラウザ情報の件で困ってます...
-
Null またはオブジェクトではあ...
-
繰り返し処理で記述したいのです。
-
webページ上のTabキーの動き
-
onClickイベントの変更方法
-
ブラウザのウィンドウサイズに...
-
removeEventListenerの必要性
-
乗換案内 VBAで操作したい
-
文字を一文字ずつ表示
おすすめ情報