【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?

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のメッセージボックスが出てきます。

記述が間違っているのでしょうか?
何か他の記述がございますようでしたらご教授願えますでしょうか?

宜しくお願い致します。

A 回答 (4件)

見た限りあってると思いますが・・・


一致しない場合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

・・・という構文なども使用してみましたが同じ現象でした。

補足日時:2007/08/13 22:14
    • good
    • 0

 


質問の文言にちょと理解しかねるところがありますが。。。(^^;;

>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の処理をしてしまう、ということでしょうか?

補足日時:2007/08/14 04:59
    • good
    • 0

>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)と一致した場合は望むような作業をしてくれるのですが、一致しない場合に処理を停止するような構文を記述したいのです。


初心者ゆえ、説明もままなっていないかと思いますが、引き続き宜しくお願い致します。

補足日時:2007/08/14 11:54
    • good
    • 0

またまた登場です。



少々の理解力はあるつもりなんですが、今回はどうもいまいちやりたいことがわかりかねます。。(^^;;;

ようするに次のようなことですか?

 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分ごとに覗いて見ませう。。
 
    • good
    • 0
この回答へのお礼

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)の位置にタイトルを設定していましたので、これが間違っていたり、かぶってしまうと判断できなければ、同じタイトルに対し同じ処理をしてしまう(同じサイトを作ってしまう)ので、これを予防したかったのです。

また質問させていただくかもしれませんが、今後とも宜しくお願い致します。

お礼日時:2007/08/14 14:55

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