電子書籍の厳選無料作品が豊富!

タイトルが文字数の関係でおかしいのですが

エクセルVBAで IEのHPに 値を代入して、送信するのですが

同じページで oObjDoc.getElementsByName()やoObjDoc.getElementsByID()などで、値を代入したいのですが、この構文の2回目の所で エラ検出の debugに 「書き込めない」 などのエラーが出ます。(当然、実際もスルーされます)

初期化がまずいのか 判断しかねています。

一般的なID、PSW代入ページから来ました
Sleep 500
Set oObjDoc = Nothing
Set pitem = Nothing
Set oObjDoc = objIE.document

Set pitem = oObjDoc.getElementById("order_type")
value = "通常注文" 実際は3パターン
Dim order As Object
For Each order In pitem
If InStr(1, order.innerText, value) > 0 Then
pitem.value = order.value
Exit For
End If
Next
pitem.Click

Set pitem = Nothing
Sleep 500
id = "変更" '上記の入力を確定させるためだと思う 変更 クリック
Set pitem = oObjDoc.getElementById(id)
For Each pitem In objIE.document.getElementsByTagName("input")
If pitem.value = id Then
Exit For
End If
Next
pitem.Click

'オーダーの内容
If TradeForm.ordertype_btn1 = True Then
value = "3"
Else
value = "1"
End If

Set aradio = oObjDoc.getElementsByName("side")
Debug.Print aradio.Length
For i = 0 To aradio.Length - 1
Debug.Print i
Debug.Print aradio(i).Name
2回目で エラー70 書き込みできません。
Debug.Print aradio(i).value

If "side" = aradio(i).Name And aradio(i).value = value Then
aradio(i).Checked = True
Exit For
End If
Next

Set pitem = Nothing

で、aradio.Length は 2を返して  Set aradio = oObjDoc.getElementsByName("side")
はHP内容と一致、動作しているようです
で、1回まわって 2回目(これが答えなのですが)の i=1 で 次
aradio(i).Name  が 取れません。
debug.printは 
2
0
side
3
1

ところが
前の
id = "変更" '変更 クリック
Set pitem = oObjDoc.getElementById(id)
を 全部レムれば プログラムは 通ります。

debug.print が 書き込めない と言うエラーも 今まで始めてみました。

どれかの初期化が 抜けているのでしょうか

よろしくどうぞ

A 回答 (2件)

私もちょくちょく「書き込めないエラー」が発生しますので詳しい方のお答えが欲しいです(おいおいw)。



ただ、しばらくすると動くこともあるので、解決法がよく分かっていません。
なんとなく体感では
・IEを複数動かしたり、他のIE操作プログラムを動かしたあとに起きやすい
・ステップ実行だと何故かうまくいくことがある
・SleepやWaitの時間をしっかり取る

Set objshell = CreateObject("Shell.Application")
Set objIE = objshell.Windows.Item(objshell.Windows.Count - 1)

このような瞬間に、オブジェクトをうまく取れていない時があるのではないか?
(でもその場合だとnothingになるはずですよね…)

--
今回のコード、実行してないのですけど、

この2行ヘンじゃないですか?
 Set pitem = oObjDoc.getElementById(id)
 For Each pitem In objIE.document.getElementsByTagName("input")
1行目がいらない気が…。
これだと、「inputタグの中の全てのid」となります。
inputタグの中の全てのオブジェクトなら分かります。

そして、ページのidはそもそも一意ですし、そのあたりのコードは
objIE.document.getElementByID("変更").click
だけでいいような気が…。

外していたら申し訳ない。

この回答への補足

基本、ページの読み込み完了が ミソのようです。
それも、ワンパターンの方法だけに頼るとダメな様です。
感謝

補足日時:2014/01/11 11:49
    • good
    • 0
この回答へのお礼

感謝

SLEEP 500 入れたら 解決したような・・・
まだ、すべて通ったわけでは無いのですが、参考になります。

お礼日時:2014/01/05 17:35

クリックした直後は画面の更新が完了していないのでエラーが発生します。



画面が完了するまでの時間はネットワークの込み具合などによって大きく変わりますので、固定した時間待つのではなく、IE.Busy や IE.Document.ReadyState などをチェックするようにしてください。

Webページによってはそれでもうまくいかない場合がありますので、臨機応変に工夫が必要となります。
    • good
    • 0
この回答へのお礼

ありがとうございます

どうも、その辺のようですね。工夫してみます

お礼日時:2014/01/09 18:53

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