これ何て呼びますか Part2

タイトルの件ですが、現在CSVよりIDとPWを読み込み、Webページに自動ログインできるVBSを作成しております。
ネットの情報を頼りに下記ソースを作成し、自動ログインできるところまでは達成しました。
しかしながら、一回目の実行時はいいのですが、二回目以降時間を置かずにVBSを起動すると
エラーが発生します。(IEは起動し、ログイン自体は出来ます)
本エラーの回避方法をご教授願えませんでしょうか。

エラーの発生場所は objIE.Document.getElementsByName("username")(0).Value = SiteID
あたりだとは思うのですが、何が原因かがわからなく。。

○エラーメッセージ
エラー:オブジェクトがありません。:'objIE.Document.getElementByName(...)(...)'
コード:800A01A8
ソース:Microsoft VBScript 実行時エラー

○コード
'Option Explicit

Dim tmp 'CSV格納
Dim tmp2 'CSV分割
Dim SiteArray(10) 'ID,PW,URL格納
Dim SiteURL 'URL格納
Dim SiteID 'ID格納
Dim SitePW 'PW格納

Dim i
dim objFSO
dim stmCsvFile

'URL,ID,PWをCSVより読込
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set stmCsvFile = objFSO.OpenTextFile("C:\Users\***\Desktop\login.csv")

Do Until stmCsvFile.AtEndOfLine = True
tmp = stmCsvFile.readline
tmp2 = Split(tmp, ",")
SiteArray(i) = tmp2(1)
i = i + 1
Loop

stmcsvfile.Close


'URL,ID,PWを格納
SiteID = SiteArray(1)
SitePW = SiteArray(2)
SiteURL = SiteArray(0)

'---------- ひらく

Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True
objIE.Navigate SiteURL
Do Until objIE.busy = False And objIE.readyState = 4 : Loop '待ち合わせ

'---------- ID/PASSの入力

objIE.Document.getElementsByName("username")(0).Value = SiteID
objIE.Document.getElementsByName("password")(0).Value = SitePW

'---------- SUBMIT

objIE.Document.getElementsByName("login_form")(0).Submit
Do Until objIE.busy = False And objIE.readyState = 4 : Loop '待ち合わせ

'----------

宜しくお願い致します。

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

  • ご回答ありがとうございます。
    すみません、判定が必要なことがわかってませんでした。

    コメント頂いた箇所を下記の通り処理を変更しましたが現象はほぼ変わりませんでした。
    (上記の内容では動作せず、IsObjectを使用しております)
    アドバイス頂けると幸いです。
    変更分:
    Set uname =objIE.Document.getElementsByName("username")
    If IsObject(uname) Then
    uname(0).Value = SiteID
    end if

    Set upw =objIE.Document.getElementsByName("password")
    If IsObject(upw) Then
    upw(0).Value = SitePW
    end if

    変更があったエラーメッセージ:
    エラー:オブジェクトがありません。'upw(...)'

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/08/02 13:06
  • 何度も回答ありがとうございます。
    最初に回答頂いた記載方法を少し変更し、
    下記のような処理を挟むことで本問題は解決しました。ありがとうございます。
    今回の事象が発生した要因として、VisualStudio2013でデバッグして確認したところ
    1度目のプログラム実行時、uname.length = 1
    2度目のプログラム実行時、uname.length = 0
    となっておりました。upwも同様。
    なぜ一度目と二度目で実行結果に差が出るのかよろしければ教えて頂けないでしょうか。
    (別途各オブジェクトの初期化処理を追記しても現象変わらずでした)
    追加処理:
    IF uname.length > 0 then
    uname(0).value = SiteID
    else
    WScript.Quit
    end if

    No.3の回答に寄せられた補足コメントです。 補足日時:2015/08/04 21:01

A 回答 (4件)

こんにちは。



>コメント頂いた箇所を下記の通り処理を変更しましたが現象はほぼ変わりませんでした。

#1で私の書いた、IsObjectは一般論ですが、個別の問題になるとかなり話は込み入ってしまうから、やめておいたことですが、なんといっても、VBSで、どのように開発しているかは分かりませんが、そのオブジェクトのプロパティとか、確認をして開発したのでしょうか。

>Set upw =objIE.Document.getElementsByName("password")
の時点で、upw を確認できない状態ですと、
upw(0) という「添字(index)」があるかどうかさえ確認できませんよね。
その辺りはどうなんでしょうか?それで、Length プロパティを調べるように書いたわけです。

ふつう、例えば、ここの「教えて!goo」なんかでも、IDとパスワードは、きちんと、[ID(uname, pass)]を持っています。そしてIDには、添字は存在しません。

VBAがあれば、VBEditorのローカルウィンドウで、そのプロパティを確認していただくしかないと思います。もしかしたら、最初からとれていないのかもしれません。
    • good
    • 0

こんにちは。



私のミスで、話を長引かせてしまい、すみませんでした。

>2度目のプログラム実行時、uname.length = 0
いくつかは想像できます。

すでに、ログインしているということ。
また、ログインあるとすれば、ログアウトがどこかにあって、それを実行しなければならないとか。

もしくは、サイト側で拒否しているとしか。1回ログインすると、再ログインをしばらく待たされるところもあります。手動でメッセージなどをみて、その戻るメッセージをInstrで取得して、MsgBox に出すというようなことをすることもあります。

時間が経てば復帰するにしても、どこかで、IPアドレスをチェックされているかもしれません。
    • good
    • 0
この回答へのお礼

遅くなって申し訳ございません。
何度もありがとうございます!
サイト側の設定の可能性があるんですね。。

再ログインの拒否自体は手動で入力した際にされないのですが、
教えて頂いた方法でサイト側の方も試してみます!

またわからないことがあった際などに質問をするかもしれませんが
その時はまたご回答いただけると嬉しいです。

お礼日時:2015/08/14 11:28

#1の


「ダメなら、IsObjectで判定してください。」
#2の
「#1で私の書いた、IsObjectは一般論ですが、」

この記述は、間違いでした。Set upw =....
だから、Object になりますが、中身がない場合があるので、
If Not upw Is Nothing Then
でした。先ほど、気づきました。すみません。
もちろん、length >0 で判定すること自体は生きていますが、そもそもが違っている可能性もあります。
この回答への補足あり
    • good
    • 0

こんにちは。



通常、面倒でも、ことごとく、オブジェクトの判定をしないといけないと思うのです。IsObject という判定もあるけれども、私なら、こうしていると思います。

>objIE.Document.getElementsByName("username")(0).Value = SiteID
としないで、
一旦、変数に置いて、
Set uname =objIE.Document.getElementsByName("username")
If uname.Length >0 Then
uname(0).Value = SiteID
Else
Goto Quit
End If

Quit:

などとはしないのでしょうか?
オブジェクトはなくても、Variant型でも、VBAなら、この方法でエラーは発生しなかったように思うのですが、
何ぶんにも、VBSでは、今は試していませんので、ダメなら、IsObjectで判定してください。
この回答への補足あり
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A