10代と話して驚いたこと

VBAを実行すると、

実行エラー424
オブジェクトが必要です。

となってしまいます。
エラーとなっている行は、

.Document.getElementById("q_d").Value = ActiveSheet.Cells(rowno, 1).Value

です。

作成したリストは、以下のようになっています。

Sub MAP住所()
Dim objIE As Object, rowno As Integer
rowno = 1
Set objIE = CreateObject("InternetExplorer.Application")
With objIE
'Google Map起動
.Navigate "http://maps.google.co.jp/"
.Visible = True
Do While (ActiveSheet.Cells(rowno, 1).Value <> "")
'IE待機
Do While .Busy = True
DoEvents
Loop
'住所をテストボックスへ入力
.Document.getElementById("q_d").Value = ActiveSheet.Cells(rowno, 1).Value
'送信ボタンクリック
.Document.forms(0).submit
'次の行
rowno = rowno + 1
Loop
End With
Set objIE = Nothing
End Sub

A列にある住所を読み込んで、グーグルマップに表示するスクリプトになります。
どう直して良いのか、皆目わかりません

御指南願います

A 回答 (11件中1~10件)

こんにちは。


Google マップで、仕様としてどこまで用意されているか、
ということさえも俄かには把握できない私です。
(因みに手作業でもマーカー(座標の一時的ブックマーク)の数に制限はあるようです)
これまでの流れに合わせるならば、XML操作での解決を探るとか、
それとも、ご指摘頂いたようにWeb APIなどでの解決を目指す、
ということになるのかと思います。
(HTML操作だけでは解決できないような気がします。断言はできませんが。)
ただ、そういうことになると、元々のご質問とはだいぶ離れてしまいますし、
私がサジェストできるものはもはや残っていない気がします。
解決に適した知識を募る意味で、
"Google マップのマーカー(バルーン)をVBAで設定"
のようなタイトルで、今一度、真っ新な質問を建て直してみては如何でしょう。
力及ばずすみません。
尚、効果的で有用なサポートを続けて下さっているNo.10さんの方から
もう少し、お話を引き出してみるのもきっと質問者さんの力になると思います。
早期の解決を祈りつつ、私はここまで、とさせて頂きます。
頑張ってください。
    • good
    • 0
この回答へのお礼

cj_moverさん

いろいろアドバイスありがとうございました。

お礼日時:2013/04/22 12:33

一応、補足では回答者に Mailは届きませんのでcj_mover さんはお気付きでないかもしれませんね。


面倒でもWeb APIで取り組まれた方がいいのではと。
    • good
    • 0

あ、すみません。


kumatti1さん、こちらこそ、どうもです。勉強になりました。
    • good
    • 0

やりたいことは理解できました。


http://productforums.google.com/forum/#!topic/ma …
とりあえず、
「一つのマップに複数の住所に対応したブックマークを残す」処までです。
ブックマークしたポイントすべてにマーカーを表示する手順(リンク先参照)も
自動化した方がいいでしょうか?
そこまではすぐには(少し勉強しないと)書けないので、
「マーカー表示まで自動化したい」かどうか書いておいて、
回答を待つか、お急ぎなら、別件で質問を立ててみてください。

Sub MAP住所マルチブックマーク()
Dim objIE As Object, rowno As Integer, sngT As Single
' ' InternetExplorer起動
  Set objIE = CreateObject("InternetExplorer.Application")
  With objIE
' ' Google Map起動
    .Navigate "http://maps.google.co.jp/"
' ' IE待機
    While .Busy Or .ReadyState <> 4
      DoEvents
    Wend
    .Visible = True
' ' 行番号 初期化
    rowno = 1
    Do
      DoEvents
      With .Document.Forms(0)
' ' 住所をテストボックスへ入力
        .Item("q").Value = Cells(rowno, 1).Value
' ' 送信ボタンクリック
        .Submit
      End With
''IE待機
      sngT = Timer
      While (InStr(.Document.Title, ActiveSheet.Cells(rowno, 1).Value) = 0) And (Timer - sngT < 2)
        DoEvents
      Wend
' ' 次の行
      rowno = rowno + 1
    Loop Until (Cells(rowno, 1).Value = "")
  End With
  Set objIE = Nothing
End Sub

この回答への補足

cj_moverさん、

回答ありがとうございます。
このマクロを実行したところ、10件目までは一つの地図上にマークされましたが、
11件目からは、10件目までの表示は消され、11件以降は1件ずつしかマークされませんでした。

スクリプトをみる限り、そのような制限は見当たらないのですが。

補足日時:2013/04/15 12:49
    • good
    • 0

> ひとつのマップ上に、それぞれの住所のマッピングをしたかったのです。


>
> って可能なのでしょうか?

Google マップ については、私は詳しい訳ではありませんので、
簡単な例で手作業での手順など具体的に示してもらうことは可能でしょうか?
Google マップ のヘルプをチラッと覗いてみましたが
「マッピング」という用語や機能に関する解説が見つけられません。
マップ上にマッピング、って私はどういう意味か知らないのです。

どうしたいか解れば、できるだけ、お応えするつもりです。

この回答への補足

Googleマップで住所検索したときに表示される、オレンジ色の風船みたいなポイントのことです。

そのポイントをひとつの地図の上に、複数の検索した住所を置く方法を知りたいのです。

補足日時:2013/04/11 15:35
    • good
    • 0

cj_mover さん、お気遣いどうも。

(`・ω・´)

ie.Document.Forms(0).Item("q").Value = "東京都"
ie.document.Forms(0).Item("gbqfb").click

などとも書けますね。
VBAなので、DocumentComplete イベントも利用出来ますね。

参考URL:https://gist.github.com/1619670
    • good
    • 0

あ、いや、もしかしたら話が噛み合ってないのかも知れないと思ったもので。



> エラーはなくなりましたが、住所を複数登録して、検索させると、
> 最後の行の住所しか、ブックマークされませんでした。
>
> 私のやりたかったことは、
> 複数の住所をすべてgoogle map上にマップしたかったのです。

原質問のコードと私の提示したコードの処理内容を手作業の手順で説明すると、
 IEを開いて、Googleマップを開き、
 A列一行めから下へ順に(空セルでない間ループして)
  セル値である住所を
  Googleマップの検索ボックスに入力して
  Googleマップの検索ボタンを押す
  (指定した住所の地図が表示される)
 以上繰り返しで、必然的に、順次【次のページ】に次の地図を表示する
というものです。
すべての処理が終了すると、"最後の行の住所しか"表示されていませんが、
IE左上の戻るボタン(←左矢印)で直前の地図を表示できます。
(まず↑この点を確認してください。これ↑が出来ていないという理解で
 回答No.4を書きましたので。)
つまり地図が重なっている状態、原質問のコードとご質問への
もっとも自然と思える"要求仕様"への解釈に基づいているつもり
だったのですが、、、。

"複数の住所をすべてgoogle map上にマップ"というのは、ひょっとして、
 IE上の複数のタブに一件ずつ、住所に対応した地図を表示して
 タブの切替操作だけで複数の地図の表示を切り替えるようにしたい、
ということだったりします?
それとも
 複数のIEを立ち上げて、複数のウィンドウに一件ずつ、住所に対応した地図を表示して
 ウィンドウの切替操作だけで複数の地図の表示を切り替えるようにしたい
とか?
これら、それぞれにまったくアプローチが異なりますので、その場合は、
求める完成形がどんなものか、はっきりと書いてくださいね。
現在のものより難しくはなりますけれど。

当初の理解であっていた場合は、
きちんと地図が表示されないうちに次の地図をコマンドしてしまう、
つまり処理能力よりもコマンドが急ぎすぎている状態だと、
ページが追加されずに次々上書きされていくような形で、
"最後の行の住所"に対応した地図ひとつだけしか読み込まれていない
という結果になることも十分に考えられます。
回答No.4はその対策の一例です。

そもそもIE操作は非同期なので、
いつ終るか判らない処理を
終っていることが見込まれる時間まで待機するとか
終っているかどうかを何度も問い合わせながら待機したりして
次の操作へ順番通り進める工夫をしなければなりませんから、
ある程度調整を加えていかないとうまく行かない面も多々あるものです。

#話が噛み合っていたなら、このレスは杞憂、棄て置いて結構ですので。

この回答への補足

cj_moverさん、回答ありがとうございます。

まず、戻るボタンで、マッピングされていることはできています。

ただ、私のやりたかったことは、

ひとつのマップ上に、それぞれの住所のマッピングをしたかったのです。

それって可能なのでしょうか?

補足日時:2013/04/11 13:35
    • good
    • 0

回答No.2:補足欄へのレスです。


私の環境では、No.1のコードで300回以上失敗無しなので、
未知の環境に合わせて手直しするのは自信持てない面もありますが、
考えられる箇所に待機を追加してみました。
提示のコードに他の処理を書き加えている場合は、
その中身によって適切な対応は変わる場合もあるかも知れませんけれど。
While Timer - sngT < 0.1
うまくいかなければ、0.1より大きめに書き換えることで、差し当た、
対応してみてください。
せっかくNo.3さんがIDを書いてくれているので、
getElementById() を使う場合の記述もメモとして添えておきますね。
今回は時間調整にTimer()関数を使っていますが、興味おありでしたら
APIのSleep関数の使い方とかも覚えていくとよいと思います。
とりあえあず、ここまでです。

Sub MAP住所()
Dim objIE As Object, rowno As Integer, sngT As Single
rowno = 1
Set objIE = CreateObject("InternetExplorer.Application")
With objIE
'Google Map起動
.Navigate "http://maps.google.co.jp/"
.Visible = True
'IE待機
While .Busy Or .readyState <> 4
DoEvents
Wend
Do
'住所をテストボックスへ入力
.document.activeElement.Value = ActiveSheet.Cells(rowno, 1).Value
'.document.getElementById("gbqfq").Value = ActiveSheet.Cells(rowno, 1).Value
'送信ボタンクリック
.document.forms(0).submit
'IE待機(地図が読み込まれるまで待つ)
sngT = Timer
While (InStr(.document.Title, ActiveSheet.Cells(rowno, 1).Value) = 0) And (Timer - sngT < 2)
DoEvents
Wend
'IE待機(地図の表示が完了するまでの時間を多めにとって待つ)追加
sngT = Timer          ' 追加
While Timer - sngT < 0.1    ' 追加(数値を変えて実用に合わせる)
DoEvents            ' 追加
Wend              ' 追加
'次の行
rowno = rowno + 1
Loop Until (ActiveSheet.Cells(rowno, 1).Value = "")
End With
Set objIE = Nothing
End Sub
    • good
    • 0

> q_d



idは、gbqfq ですね。
    • good
    • 0

No.1です。

編集ミスしました。
誤)
Dim objIE As InternetExplorer, rowno As Integer, sngT As Single
正)
Dim objIE As Object, rowno As Integer, sngT As Single
以上訂正です。すみません。

Microsoft Internet Controls に参照設定してある場合は、訂正不要です。

なるべく原形を保って書き加えるように書いていましたから、
私としては間違いであることに変わりないのですが、、、。
失礼しました。

この回答への補足

cj_moverさん

ありがとうございました。
エラーはなくなりましたが、住所を複数登録して、検索させると、
最後の行の住所しか、ブックマークされませんでした。

私のやりたかったことは、
複数の住所をすべてgoogle map上にマップしたかったのです。

google map の途中経過をみていると、
複数のブックマークがされていることは確認できるのですが、
処理が終わると、最後の行の住所しかブックマークされていません。

どこを修正すれば、いいのでしょうか?

補足日時:2013/04/10 13:06
    • good
    • 0

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

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


おすすめ情報

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