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.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
・・・という構文なども使用してみましたが同じ現象でした。
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.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.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)の位置にタイトルを設定していましたので、これが間違っていたり、かぶってしまうと判断できなければ、同じタイトルに対し同じ処理をしてしまう(同じサイトを作ってしまう)ので、これを予防したかったのです。
また質問させていただくかもしれませんが、今後とも宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JavaScript window.openで開く...
-
getパラメータ
-
DOM要素を削除しても、イベント...
-
javascriptのdocument.allにつ...
-
テーブル背景を毎日入れ替える方法
-
onclickで別の場所にテキストを...
-
document.getElementsByClass
-
iframeのソースを取得したい
-
javascriptの基本的なことだと...
-
Webページ上に「文字を大き...
-
質問です! Operaって、document...
-
JavaScript を使ってpkゲームを...
-
同じIDで定義した要素の配列を...
-
イベントが初めの一回しか起き...
-
ASP.NETのコントロールの値をJa...
-
jspからjavascriptの変数引継ぎ
-
C#テキストボックスの文字を配...
-
なぜmatchメソッドがエラーにな...
-
関数でy=g(x)のgとは何の略です...
-
モーダルダイアログウィンドウ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
javascriptの基本的なことだと...
-
Latexに関する質問です。
-
DOM要素を削除しても、イベント...
-
文字を一文字ずつ表示
-
Null またはオブジェクトではあ...
-
excle VBA とweb上の検索を利用...
-
JavaScript window.openで開く...
-
FireFoxのjavascriptで自動でキ...
-
UWSCでオンクリックのボタンを...
-
ラジオボタンでreadonlyの切替え
-
XMLでのAttributeを持ったNode...
-
乗換案内 VBAで操作したい
-
Javascriptで定期的にF5を押す...
-
responseTextについて
-
webページ上のTabキーの動き
-
クリッカブルマップのリンク部...
-
ie操作 フレームのURLが...
-
TexでΣの添え字の位置直し
-
連動するセレクトボックスの内...
-
LaTeX:数式を等号揃えにする方法
おすすめ情報