質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

2回答

1318閲覧

webスクレイピングでのマクロの起動について

system-r

総合スコア7

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/08/06 15:12

下記のVBAコードを起動させてもキーワードと順位が取得できませんが、
一度、マクロの編集ボタンを押してコード開いた後、VBAを起動させると、キーワードと順位が取得できます。
どうしてかお分かりになる方はいらっしゃいますか?

Sub rank()

Application.ScreenUpdating = False

StRow = Selection.Row '最初行

siteurl = Cells(StRow, 1)
keywordl = Cells(StRow, 2)

'web画面起動------------------------------------------------
'---インターネットに接続してブラウザを開く---
Dim objIE As InternetExplorer
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True

'---インターネットの特定のページを開く---
objIE.navigate "https://seocheki.net/?m=rank"
Call IEWait(objIE) 'IEを待機
'Call WaitFor(1) '0秒停止

'---IEに自動で文字入力して情報検索する---
Dim objtag As Object
'web画面起動------------------------------------------------

'URLとキーワードをweb画面に入力*************************************************
Columns(Columns.Count).ClearContents

Do Until Cells(StRow, Columns.Count) <> ""
For Each objtag In objIE.document.getElementsByTagName("input") 'URL
If InStr(objtag.outerHTML, """url1""") > 0 Then
objtag.Value = siteurl
Cells(StRow, Columns.Count) = siteurl
Exit For
End If
Next
Loop
Cells(StRow, Columns.Count).ClearContents

Do Until Cells(StRow, Columns.Count) <> ""
For Each objtag In objIE.document.getElementsByTagName("input") 'kw1
If InStr(objtag.outerHTML, """word1""") > 0 Then
objtag.Value = keywordl
Cells(StRow, Columns.Count) = keywordl
Exit For
End If
Next
Loop
Cells(StRow, Columns.Count).ClearContents
'URLとキーワードをweb画面に入力*************************************************

SendKeys "{ENTER}"

Dim WshShell

Set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys "{NUMLOCK}"
Set WshShell = Nothing

Call WaitFor(1) '1秒停止

'取得順位をエクセルに出力*********************************************************

'キーワードと順位を取得する-----------------------------------------------
For Each objtag In objIE.document.getElementsByTagName("td")
If InStr(objtag.outerHTML, """kw1""") > 0 Then
Cells(StRow, 3) = objtag.innerText
Exit For
End If
Next

For Each objtag In objIE.document.getElementsByTagName("td") If InStr(objtag.outerHTML, """grank1""") > 0 Then Cells(StRow, 4) = objtag.innerText Exit For End If Next

'キーワードと順位を取得する-----------------------------------------------

'取得順位をエクセルに出力*********************************************************

'IE終了
objIE.Quit
Set objIE = Nothing

MyError:

End Sub

'---コード2-1|IEを待機する関数---
Function IEWait(ByRef objIE As Object)
Do While objIE.Busy = True Or objIE.readyState <> 4
DoEvents
Loop
End Function

'---コード2-2|指定した秒だけ停止する関数---
Function WaitFor(ByVal second As Integer)
Dim futureTime As Date

futureTime = DateAdd("s", second, Now) While Now < futureTime DoEvents Wend

End Function

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

少し検証しようとしたのですが

If InStr(objtag.outerHTML, """url1""") > 0 Then

url1とはなんでしょうか・・。

投稿2020/08/08 09:45

mako1972

総合スコア383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

system-r

2020/08/23 07:22

url1とはID名です。 <td><input type="text" id="url1" value="" style="width:280px;" onfocus="this.select()" onkeypress="if(event.keyCode==13) rank_check()" /></td>
guest

0

コーディングについては言及しませんが、
せめてソースコード部分は"コードの挿入"という機能を利用頂く方が、
回答する方々にとって読みやすいです。

本題についてです。

まず、キーワードと順位が取得できない時に、
どの様にマクロが実行されているのか記載されていないので、
既存の情報では正確な回答はできません。

また、Windows10 Excel 2019 64bit 環境では、
"マクロの編集ボタン"とは何を指しているかが正確に理解できませんでしたが、
VBE上でマクロを実行したという意味でしょうか?

もしその認識で相違ない場合、
該当のボタンを押下する過程は必要ない為、記載頂かない方がよいです。

取り合えず、同環境では以下の4通りの実行方法で、
キーワードと順位がシート上に記載されます。

1.フォームコントロールのボタンに rank を登録して実行する
2.ActiveX コントロールのボタンのクリックイベントで rank を実行する
3.VBE上で rank を実行する
4.開発タブのマクロダイアログから rank を実行する

後、事象は正確に記載してほしいのですが、
"キーワードと順位が取得できない" はマクロが実行されないことと同義ではありませんよね?
そもそもマクロは実行されていますか?

実行されていないのであれば、マクロが実行される環境の整備不備かなと思います。

実行されているのであれば、どの箇所で不具合が発生しているかを記載して下さい。
不具合の発生箇所の特定は質問者側で済ませておくべきかなと思います。

また、取得できるできないの表現方法について、
ブラウザに表示されている情報を取得できないことを指しているのか、
Excel のシート上に該当の情報が記載されないことを指しているのかが曖昧かなと思います。

ご自身の環境でどの様な事象が発生しているかはご自身にしか分かりません。

ご自身がその事象を正確に説明できなければ、
回答する側はその事象を正確に理解することはできませんので、
発生した事象については詳細に記載頂く方がよいと思います。

ついでに、私の実行環境では上述のコードで問題なく動いていそうなので、
ご自身の実行環境も記載した方がよいかもしれません。

少なくとも、質問する際のガイダンスで環境の記載が推奨されていますよね。

投稿2020/08/07 02:21

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問