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

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

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

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

Q&A

3回答

1300閲覧

”VBA”サンプルコードのコピペについて

hikaruokit

総合スコア4

VBA

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

0グッド

0クリップ

投稿2021/11/04 10:57

前提・実現したいこと

VBAのサンプルコードを標準モジュールにコピペし、かつ必要なライブラリーの参照設定を行っても、いざ実行すると、エラーになります。
エラーの種類は、実行時エラー 1004'7Range'メッソッドは失敗しました:'global'オブジェクトです。

ここに質問の内容を詳しく書いてください。
VBAでHTMLサイトやWPサイトからコンテンツの抽出作業をおこなっています。
標準モジュールに、コードをコピペし実行したところ以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ 実行時エラー 1004'7Range'メッソッドは失敗しました:'global'オブジェクトと表示されます。

該当のソースコード

VBA
ソースコード

Option Explicit
Private Sub CommandButton1_Click()
'Dim driver As New Selenium.ChromeDriver
Dim driver As New Selenium.PhantomJSDriver

Dim elmDoc As WebElement Dim OutputTarget As Range Dim sKeyWord As String Range("4:999").Clear 'サンプルプログラムなので手抜き

** sKeyWord = Range("SearchKeyWord")**
If sKeyWord = "" Then
Exit Sub
End If

Set OutputTarget = Range("OutputArea") With driver .Start '.Window.SetSize 1920, 1080 .Get "https://www.library.toyota.aichi.jp/" '豊田市図書館のHPにアクセス '検索するキーワードを投入 .FindElementById("kensaku_keyword").SendKeys Range("SearchKeyWord") & vbCrLf 'スクレイピング開始 'doclistの中に1冊ごとにdoc,doc,doc… という繰り返しで本の情報が入っている For Each elmDoc In .FindElementByClass("doclist").FindElementsByClass("doc") '各CSS名にアクセス OutputTarget.Cells(, 1) = elmDoc.FindElementByClass("doc-title").Text '本のタイトル Set OutputTarget = OutputTarget.Offset(1) OutputTarget.Cells(, 2) = elmDoc.FindElementByClass("doc-writer").Text '著者 Set OutputTarget = OutputTarget.Offset(1) OutputTarget.Cells(, 2) = elmDoc.FindElementByClass("doc-recap").Text '本の概略 Set OutputTarget = OutputTarget.Offset(1) OutputTarget.Cells(, 2) = elmDoc.FindElementByClass("doc-available").Text '貸出可否 Set OutputTarget = OutputTarget.Offset(2) Next End With

End Sub

### 試したこと VBAのコードだけでなくVBAのプログラミングされたエクセルブック全体をDLして実行したところ、正しく動きました。 ### 補足情報(FW/ツールのバージョンなど) chromedriverは、最新のバージョンをインストールしてます。 デバッグボタンをクリックすると、8行目の sKeyWord = Range("SearchKeyWord")の部分が黄色くなります。 なにか関数とか、変数の定義を宣言していないということでしょうか? プログラミング初心者ですので、よろしくお願いいたします。 ここにより詳細な情報を記載してください。

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

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

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

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

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

y_waiwai

2021/11/04 11:16

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
hikaruokit

2021/11/04 11:25

Option Explicit Private Sub CommandButton1_Click() 'Dim driver As New Selenium.ChromeDriver Dim driver As New Selenium.PhantomJSDriver Dim elmDoc As WebElement Dim OutputTarget As Range Dim sKeyWord As String Range("4:999").Clear 'サンプルプログラムなので手抜き sKeyWord = Range("SearchKeyWord") If sKeyWord = "" Then Exit Sub End If Set OutputTarget = Range("OutputArea") With driver .Start '.Window.SetSize 1920, 1080 .Get "https://www.library.toyota.aichi.jp/" '豊田市図書館のHPにアクセス '検索するキーワードを投入 .FindElementById("kensaku_keyword").SendKeys Range("SearchKeyWord") & vbCrLf 'スクレイピング開始 'doclistの中に1冊ごとにdoc,doc,doc… という繰り返しで本の情報が入っている For Each elmDoc In .FindElementByClass("doclist").FindElementsByClass("doc") '各CSS名にアクセス OutputTarget.Cells(, 1) = elmDoc.FindElementByClass("doc-title").Text '本のタイトル Set OutputTarget = OutputTarget.Offset(1) OutputTarget.Cells(, 2) = elmDoc.FindElementByClass("doc-writer").Text '著者 Set OutputTarget = OutputTarget.Offset(1) OutputTarget.Cells(, 2) = elmDoc.FindElementByClass("doc-recap").Text '本の概略 Set OutputTarget = OutputTarget.Offset(1) OutputTarget.Cells(, 2) = elmDoc.FindElementByClass("doc-available").Text '貸出可否 Set OutputTarget = OutputTarget.Offset(2) Next End With End Sub
hikaruokit

2021/11/04 11:34

すいません。 こちらのサイトがまだ不慣れで、ご迷惑をおかけします。 ここと、ご指摘された<code>をクリックしてでてきた画面と双方に、コードを貼り付けました。どうかよろしくお願いいたします。 okito
meg_

2021/11/04 11:37

コードは「コードの挿入」で記入しましょう。 コードの引用元を明記しましょう。
guest

回答3

0

VBAのコードだけでなくVBAのプログラミングされたエクセルブック全体をDLして実行したところ、正しく動きました。

 

デバッグボタンをクリックすると、8行目の

sKeyWord = Range("SearchKeyWord")の部分が黄色くなります。

"SearchKeyWord"はセル範囲の名前だと思います。対象のエクセルにはその名前で定義されたセル範囲があって質問者さんがコードをコピペしたブックにはそれがなかったのでエラーになったと思われます。

投稿2021/11/04 11:35

meg_

総合スコア10762

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

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

hikaruokit

2021/11/04 11:46

なるほど、しらべてみます。ありがとうございます。 あとで、またご報告させていただきます。
hikaruokit

2021/11/06 09:23

恵さん ありがとうございます。ご指摘の通りでした。 このエクセルBOOKに搭載のVBAを他のサンプルコードを使って編集するには、sheet1に直接貼り付けてもよいのでしょうか?それとも標準モジュールに元のコードを貼り付けて、さらに、他のサンプルコードをコピペして編集すべきでしょうか? VBA初心者なので、愚問かもしれませんが、よろしくお願いいたします。
meg_

2021/11/06 11:22

> このエクセルBOOKに搭載のVBAを他のサンプルコードを使って編集するには、sheet1に直接貼り付けてもよいのでしょうか? 対象のbookの構成やコードの構成によるかと思います。 詳細についてはサンプルコードを提供している提供元へ直接質問された方が良いかと思います。
hikaruokit

2021/11/08 11:30

そうですね!ありがとうございます。 恵さん またなにかあったらよろしくお願いいたします。
guest

0

検索キーワードが書いてあるシートで
SearchKeyWord
と名前を定義すると、エラーから先に進むと思います。

イメージ説明

Excel セル 名前範囲 などで検索すると、
https://www.moug.net/learning/e_basic/e_basic28.html
など、みつかるので、テストシートに手作業で設定してみてください。

それにしても、サンプルコードで図書館かぁ・・・攻めてるなぁなんてね。
( https://webtan.impress.co.jp/e/2010/08/24/8655 など興味があったら・・・)

投稿2021/11/04 11:49

ken3memo

総合スコア132

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

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

ken3memo

2021/11/04 11:52

Range("OutputArea") ここも、忘れないでね?
hikaruokit

2021/11/04 12:00

ありがとうございます。そのままDLしたブックのSHEET1のSEARCHBOXにsearchkeywordと書かれていました。あとキーワードの入力というボタンがありました。この差ですね!
hikaruokit

2021/11/06 09:14

もういちど、エクセルブックごとDLして、VBAプロジェクトでSHEET1に書かれたコードをみました。 するとここに貼り付けたコードが、そのままプロシージャに書かれていました。 またエクセルをみてみると、 Searchkeywordと0utputAreaとが名前ボックスに表示されていました。 Private Sub CommandButton1_Click()というタイトルでこのエクセルの入力ボタンのVBAをSheet1でコーディングしていたんですね! 私は、このコードをコピペして、標準モジュールに貼り付けていました。 肝心のSheet1は空白のまま(笑 そこで質問なのです。 VBAの場合、コードのコピペは、標準モジュールへ貼り付けよ!が定石ですが、今回のこの Sheet1にあるコードを、ネット上のサンプルコードを使って、編集する場合、Sheet1にあるコードに直接コピーして貼り付けて編集してもOKでしょうか? 巷でいわれているサンプルコードは、「標準モジュールへ貼り付けよ」といわれています。 これは、サンプルコードをすべて貼り付ける場合を前提としてるもので、部分的に貼り付ける場合は、Sheetに直で貼り付けても構わないとの理解でよろしいでしょうか? 以上、初心者でVBAのことがよくわかっていないのでよろしくお願いいたします。
guest

0

Option Explicit
Private Sub CommandButton1_Click()
'Dim driver As New Selenium.ChromeDriver
Dim driver As New Selenium.PhantomJSDriver

Dim elmDoc As WebElement
Dim OutputTarget As Range
Dim sKeyWord As String

Range("4:999").Clear 'サンプルプログラムなので手抜き

sKeyWord = Range("SearchKeyWord")
If sKeyWord = "" Then
Exit Sub
End If

Set OutputTarget = Range("OutputArea")

With driver

.Start

'.Window.SetSize 1920, 1080

.Get "https://www.library.toyota.aichi.jp/" '豊田市図書館のHPにアクセス

'検索するキーワードを投入
.FindElementById("kensaku_keyword").SendKeys Range("SearchKeyWord") & vbCrLf

'スクレイピング開始
'doclistの中に1冊ごとにdoc,doc,doc… という繰り返しで本の情報が入っている

For Each elmDoc In .FindElementByClass("doclist").FindElementsByClass("doc")

'各CSS名にアクセス
OutputTarget.Cells(, 1) = elmDoc.FindElementByClass("doc-title").Text '本のタイトル
Set OutputTarget = OutputTarget.Offset(1)

OutputTarget.Cells(, 2) = elmDoc.FindElementByClass("doc-writer").Text '著者
Set OutputTarget = OutputTarget.Offset(1)
OutputTarget.Cells(, 2) = elmDoc.FindElementByClass("doc-recap").Text '本の概略
Set OutputTarget = OutputTarget.Offset(1)
OutputTarget.Cells(, 2) = elmDoc.FindElementByClass("doc-available").Text '貸出可否

Set OutputTarget = OutputTarget.Offset(2)
Next

End With

End Sub

投稿2021/11/04 11:31

hikaruokit

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問