アプリ版:「スタンプのみでお礼する」機能のリリースについて

【VBA】実行中に「型が一致しません」というエラーが発生します。
http://d.hatena.ne.jp/language_and_engineering/2 …
上記URLの中の『もっと楽にコーディングしたい』項のコードを実行すると、
getElementByIdの引数のところで、
「型が一致しません」
というエラーが発生します。

原因がわからないのでわかる方居らっしゃったらお答えいただければと思います。

環境は以下のとおりです。
Window 7
IE 9
Excel 2003

おそらく上記環境が原因かと思うのですが…

A 回答 (1件)

このライブラリは,Arrayに文字列と数値を混在させる仕様です。



getElementByIdの時はArrayの要素が2つで,
getElementsByTagNameの時はArrayの要素が3つです。

この個数を間違えると,文字列を渡すべきところに数値が来たりして,
型が一致しないエラーになります。

Array内の要素数を間違えていないか,ご確認ください。
サンプルコードのように,2つまたは3つの区切りごとに改行すれば,
この手のミスは発見しやすくなります。

もしそれでもエラーが継続する場合は,具体的なコードを投稿して下されば助かります。
    • good
    • 1
この回答へのお礼

遅くなってしまい申し訳ないです。
返答頂きありがとうございます。

まだエラーが出るので、下記のコードを診断いただければ幸いです。


Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub IE操作改()

Dim ie As Object
Set ie = new_ie("http://www.google.co.jp")

' 検索キーワードを入力
type_val ie, "gbqfq", "ホゲラッチョ"
' 検索ボタンクリック
submit_click ie, "gbqfba"

' 1件目のサイトのタイトルを表示
MsgBox domselec(ie, Array( _
"id", "res", _
"tag", "li", 0, _
"tag", "h3", 0 _
)).innerText

' 終了
ie.Quit
Set ie = Nothing
End Sub



' IEがビジー状態の間待ちます
Sub waitIE(ie)
Do While ie.Busy = True Or ie.readystate <> 4
DoEvents
Loop

Sleep 100
End Sub


' 新規IE作成
Function new_ie(home_url)

Dim ie As Object
Set ie = CreateObject("InternetExplorer.Application")

' 初期ページを開く
goto_url ie, home_url
ie.Visible = True

Set new_ie = ie

End Function


' URL移動
Sub goto_url(ie, url)
ie.Navigate url
waitIE ie
End Sub


' $
Function gid(ie, dom_id)
' 注:IEのgetElementByIdはnameも参照する
Set gid = ie.Document.getElementById("p")
End Function


' getElementsByTagName
Function gtn(parent, tag_name)
Set gtn = parent.getElementsByTagName(tag_name)
End Function


' 入力します
Sub type_val(ie, dom_id, val)
gid(ie, dom_id).Value = val
Sleep 100
End Sub


' 送信ボタンやリンクをクリック
Sub submit_click(ie, dom_id)
gid(ie, dom_id).Click
waitIE ie
End Sub


' 簡易DOMセレクタ
Function domselec(ie, arr)
Dim parent_obj As Object
Dim child_obj As Object
Set parent_obj = ie.Document

' 条件配列内で階層を深めていく
cur = 0
continue_flag = True
Do While continue_flag = True

' 適用メソッドの種類を判定
If arr(cur) = "id" Then

' getElementById
dom_id = arr(cur + 1)
Set child_obj = parent_obj.getElementById(dom_id)

' 条件配列内のカーソルを進める
cur = cur + 2

ElseIf arr(cur) = "tag" Then

' getElementsByTagName
tag_name = arr(cur + 1)
index_num = arr(cur + 2)
Set child_obj = parent_obj.getElementsByTagName(tag_name)(index_num)

' 条件配列内のカーソルを進める
cur = cur + 3

End If

' 取得したオブジェクトを次の階層の親オブジェクトとする
Set parent_obj = child_obj

' 条件配列の終端まで来たか
If cur > UBound(arr) Then
continue_flag = False
End If

Loop

Set domselec = parent_obj

End Function

お礼日時:2012/12/19 17:04

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