ここから質問投稿すると、最大4000ポイント当たる!!!! >>

SeleniumBasicをPCにインストールして、下記のVBAコードで、Excelから"http://gihyo.jp/book/list"にクロームでアクセスしました。サイトにはアクセスできたのですが、いきなり添付のエラーが出ました。オブジェクトがない? excel sheetは開いていますが、、、
目的はh3要素の文字列のB3セルへの書き込みです。
対処法が判る方、教えてください。


---------
Sub GetNewBookTitle()

Dim drv As New ChromeDriver
Dim wELe As WebElement
drv.Get "http://gihyo.jp/book/list"
Set wELe = drv.FindElementByTag("h3")
Range("B3").Value = wLEe.Text
drv.Quit
Columns("B:B").AutoFit

End Sub

「ExcelVBAでWebスクレーピングし」の質問画像

A 回答 (1件)

わたし流のアレンジをしてみました。



Set wELe = drv.FindElementByTag("h3")
もし、ここでエラーが出るのでしたら、
C:\Users\[ユーザー]\AppData\Local\SeleniumBasic
この中のSelenium関連に古いものが入っている可能性が高いです。

'//
Sub GetNewBookTitleR()
 Dim drv As ChromeDriver
 Dim wELes As WebElements
 Dim ar, i As Long, j As Long

 Set drv = New ChromeDriver
 drv.Get "http://gihyo.jp/book/list"

 Set wELes = drv.FindElementsByClass("data")
 For i = 1 To wELes.Count
  ar = Split(wELes(i).Text, vbLf)
  j = UBound(ar) + 1
  Cells(2 + i, 2).Resize(, j).Value = ar
  Cells(2 + i, 2).Resize(, j).WrapText = False
 Next
 If j > 0 Then
  Columns("B:B").Resize(, j).AutoFit
 End If
End Sub
    • good
    • 0

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

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

このQ&Aと関連する良く見られている質問

QVBscriptでExcel sheetの並び替えできますか?

Excel sheetのC列に数値が入っています。VBscriptでC列を基準に(他の列のデータと一緒に))降順に並び替えしたいのですが、可能でしょうか?
可能であればスクリプトのコーディングを教えて!

Aベストアンサー

>可能であればスクリプトのコーディングを教えて!
以下のコートで可能ではあっても、リクエストが細かすぎて、vbsにはふさわしくないように感じます。以下のコードは、ブラックボックス化してしまい、条件的に成立するのは難しいし、作者の私自身でも時間が経つとメインテも利かなくなりそうです。まず、コード自体を読み直してみてください。その内容が理解できるようなら、実用に差し支えないと思います。

しかし、目で見て確認してから、実行するのは、VBAしかないように思います。

'------------------
'//ExcelOpen.vbs
Dim objFS, FileName, extension
Dim xlApp,wb
Const SHN="Sheet1" 'シート名
FileName = WScript.Arguments.Item(0)
If WScript.Arguments.Count =0 Then
MsgBox "Excelファイルをドラッグ・ドロップしてください。"
WScript.Quit
End If
Set objFS = CreateObject("Scripting.FilesystemObject")
extension = objfs.GetExtensionName(FileName)
If Left(LCase(extension),3)<>"xls" Then
MsgBox "Excelファイルではありません。",64
WScript.Quit
End If
Set xlApp =GetObject(,"Excel.Application")
If xlApp is Nothing Then
Set xlApp = CreateObject("Excel.Application")
End If
xlApp.Visible = True
Set wb= xlApp.Workbooks.Open(FileName)
Dim Rng, Sh
'xlAscending=1, xlDescending=2, xlYes =1
With wb
With .Worksheets(SHN)
Set Rng =.Range("A1").CurrentRegion
'C列
Rng.Sort Rng.cells(1,3),2,,,,,,1
End With
.Save
.Close False
wscript.quit
End With
xlApp.Quit
Set Rng =Nothing
Set Sh = Nothing
Set wb = Nothing
Set xlApp = Nothing
Set objFS = Nothing

>可能であればスクリプトのコーディングを教えて!
以下のコートで可能ではあっても、リクエストが細かすぎて、vbsにはふさわしくないように感じます。以下のコードは、ブラックボックス化してしまい、条件的に成立するのは難しいし、作者の私自身でも時間が経つとメインテも利かなくなりそうです。まず、コード自体を読み直してみてください。その内容が理解できるようなら、実用に差し支えないと思います。

しかし、目で見て確認してから、実行するのは、VBAしかないように思います。

'------------------
'//...続きを読む

QVBAでオブジェクトの名前に変数を用いる

Dim rng As Range, txtbox As Shape

Set rng = Range("A1")
Set txtbox = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 1, 1, 100, 30)
text.Name = rng + "d"

この場合最後の行で変数 rng は無視されてテキストボックスの名前は「d」となります。

text.Name = Range("A1") + "d"
とか
text.Name = Cells(1,1) + "d"
とすると
名前は「(A1の内容)d」
となります。

この違いってどういうものなのでしょう。Range型変数を用いて「(A1の内容)d」とすることはできないのでしょうか。


もう1点だけ。
変数の型について
https://www.moug.net/tech/exvba/0150065.html
にあるObject型というのは
あらゆる種類のオブジェクトを格納できる、オブジェクトに関してはVariant的な存在なのでしょうか。

Dim rng As Range, txtbox As Shape

Set rng = Range("A1")
Set txtbox = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 1, 1, 100, 30)
text.Name = rng + "d"

この場合最後の行で変数 rng は無視されてテキストボックスの名前は「d」となります。

text.Name = Range("A1") + "d"
とか
text.Name = Cells(1,1) + "d"
とすると
名前は「(A1の内容)d」
となります。

この違いってどういうものなのでしょう。Range型変数を用いて「(A1の内容)d」とすることはできないのでしょう...続きを読む

Aベストアンサー

No2です。

>A2とrngは参照という点で等価な気がしますが、難しい。
一方はオブジェクト、他方はセル位置を示す文字情報ですので、等価ではありません。
「Rangeはオブジェクトである」ということを忘れないでください。


>text.DrawingObject.Formula = "=rng" は動作せず
>text.DrawingObject.Formula = "=" & rng これは動作せず
>text.DrawingObject.Formula = rng ついでにこれも動作せず

いずれも関数式を設定するセンテンスで、右辺は関数式を意味する「文字列」である必要があります。
上記のうち、"=rng"は文字列ではありますが、そのまま "=rng"という意味になるので、関数式として理解されない可能性が高いです。
(エクセルはrngという名前の定義を探しますが、定義が見つからなければエラーになります)
その他は、オブジェクトを文字列であるかのように勘違いをしていると思われる記述になっていて、機械には解釈できない記述になっています。

なさりたいことは、Rangeオブジェクトが有しているセル位置の情報を文字列化した「A2」($A$2)を右辺に設定することではないでしょうか?
ですので、右辺を
 "=" & rng.Address
等とすることで、動作するようになると思います。
(rngオブジェクトが保持しているセル位置属性を明示的に示している)

No2です。

>A2とrngは参照という点で等価な気がしますが、難しい。
一方はオブジェクト、他方はセル位置を示す文字情報ですので、等価ではありません。
「Rangeはオブジェクトである」ということを忘れないでください。


>text.DrawingObject.Formula = "=rng" は動作せず
>text.DrawingObject.Formula = "=" & rng これは動作せず
>text.DrawingObject.Formula = rng ついでにこれも動作せず

いずれも関数式を設定するセンテンスで、右辺は関数式を意味する「文字列」である必要があります。
上記のう...続きを読む

Q[Excel,VBA,VBE] VBE上で構文,定型文の貼り付けを完結させたい

お世話になります。

VBEの右クリックに「よく使う構文の貼り付け」を追加したいと考えています。

例:右クリックメニューから"for文"→"終端セルまで"で以下の文を張り付ける
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
for i = 2 to Cells(Rows.Count, 1).End(xlUp).Select

next i
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

"選択範囲のコメントアウト"を追加したり、Excel側の右クリックにマクロを登録する等の方法は検索したら出てきたのですが、表題の件は見つけられませんでした。

現状、直接記入するかメモ帳から貼り付けていますが少し不便を感じています
ご存知の方がいらしたら、ぜひ教えて頂きたいですm_m

補足質問(こちらは回答不要です)
VBEのショートカットに"選択の開始"は登録出来ないでしょうか
Shiftキーとの併用で任意の範囲選択が出来ることは存じていますが、Shiftキー押しっぱなしでは運指が辛い時があります

お世話になります。

VBEの右クリックに「よく使う構文の貼り付け」を追加したいと考えています。

例:右クリックメニューから"for文"→"終端セルまで"で以下の文を張り付ける
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
for i = 2 to Cells(Rows.Count, 1).End(xlUp).Select

next i
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

"選択範囲のコメントアウト"を追加したり、Excel側...続きを読む

Aベストアンサー

こんにちは。

× for i = 2 to Cells(Rows.Count, 1).End(xlUp).Select

○ For i = 2 to Cells(Rows.Count,1).end(xlUp).Row

ご希望に叶うかは分かりませんが、個人的なことですが、ちょうど、この件について、その貼り付けするツールの作者とのやり取りをこの間までしていたばかりです。

右クリックメニューでは、知りませんが、Ctrl + Shift + R のショートカットキーで、以下を登録してあります。
Lastrow=Cells(Rows.Count,1).End(xlUp).Row
これらのコード(テンプレート)は、40項目ぐらい登録しています。

ツールの名前は、「MZ-Tools」 といいます。MZは、マジンガーZの略だそうです。
VBAのみならず、VSでも使用できる、世界的に有名なツールのひとつです。

解説は以下で出ています。
https://www.ka-net.org/blog/?p=6260

現在は、Ver.8 で、$79.5 で、日本語対応もしていませんので、日本では、あまり一般的には購入されないとは思います。それでも、かつてVer.3 (フリー)は、皆の知られたツールでした。Ver.3 は、同じ機能はありましたから、ウィルスさえ気をつければ、本家にはありませんが、探せば見つかるかと思います。
https://www.mztools.com/index.aspx

なお、その昔は、VSSという、MSのディベロッパーバージョンの中にあったのですが、これはデータベース状にしてしまい、後がとても使いづらかったです。MZ-Tools には、ショートカットキーとは別に、お好みコード・エレメントという機能もついています。

こんにちは。

× for i = 2 to Cells(Rows.Count, 1).End(xlUp).Select

○ For i = 2 to Cells(Rows.Count,1).end(xlUp).Row

ご希望に叶うかは分かりませんが、個人的なことですが、ちょうど、この件について、その貼り付けするツールの作者とのやり取りをこの間までしていたばかりです。

右クリックメニューでは、知りませんが、Ctrl + Shift + R のショートカットキーで、以下を登録してあります。
Lastrow=Cells(Rows.Count,1).End(xlUp).Row
これらのコード(テンプレート)は、40項目ぐらい登録し...続きを読む

QVBscriptのエラーメッセージの意味がわかりません

https://bgp.he.net/AS9228
のURLからtitleタグを取ってきて、文字列分割して、一部の文字を画面に表示するVBスクリプトを作成しましたが、最後の行で添付のエラーが出ます。どなたかデバグ方法を教えてください!




------
Option Explicit

Dim objIE

Set objIE = CreateObject("InternetExplorer.Application")
'IEを開くかどうか。開くを指定
objIE.Visible = True

'当該ページをIEで開く
objIE.navigate "https://bgp.he.net/AS9228"


'ページが読み込まれるまで待つ
Do While objIE.Busy = True Or objIE.readyState <> 4
WScript.Sleep 100
Loop


'タイトルを表示
msgbox objIE.document.Title


Dim s As String
Dim s1 As String
Dim p As String
Dim result as String

'タイトルタグを変数に入れる

s = objIE.Document.title
s1 = Split(s, "-")(0)
p = InStr(s1, " ")
result = Mid(s1, p + 1)

'分割した文字列を画面に表示

msgbox result

https://bgp.he.net/AS9228
のURLからtitleタグを取ってきて、文字列分割して、一部の文字を画面に表示するVBスクリプトを作成しましたが、最後の行で添付のエラーが出ます。どなたかデバグ方法を教えてください!




------
Option Explicit

Dim objIE

Set objIE = CreateObject("InternetExplorer.Application")
'IEを開くかどうか。開くを指定
objIE.Visible = True

'当該ページをIEで開く
objIE.navigate "https://bgp.he.net/AS9228"


'ページが...続きを読む

Aベストアンサー

「As String」を削除してみてください。

Qユーザーフォームが消えない

今、ユーザーフォームを勉強しています。
手始めに、ラベルを表示して、2秒経ったら消す。
ということをやろうとして下記の通り書きましたが、
消えてくれません。
何処が間違っているのでしょうか。
宜しくお願いします。

Sub test2()
Load UserForm1
UserForm1.Label1.Caption = "ABC"
UserForm1.Show
Sleep 2000
UserForm1.Hide
Unload UserForm1
End Sub

Aベストアンサー

難しい質問ですね。
ご自身で参考にしたコードがあるのでしょうか。
ModalMode に関しては、なんとも言えないのは、UserForm 上で、Lable に命令を出しているからです。
それがなければ、後は補填するだけで済みます。
なお、Sleep を使っていらっしゃるようですが、Sleep 自体は、Win API ですから、もちろん、エラーが出ているはずです。

Load UserForm1
UserForm1.Label1.Caption = "ABC"
UserForm1.Show
Sleep 2000 --ここまでで、UserForm のメモリが安定しないので、Label の操作ができないのではないでしょうか。

ふつう、自己消去型のメッセージは、Win API を利用するのですが、UserForm を活かすなら、

Sub test2()
 Application.OnTime Now + TimeSerial(0, 0, 2), "UserFormColse"
 With UserForm1
  .Label1.Caption = "ABC" 'マクロが一定の終了をしないと出てこない
  .Show 'vbModeless 'この場合は、どちらでもよい。
 End With
End Sub

Sub UserFormColse()
 Unload UserForm1
End Sub

Label.Caption ="ABC" がなければ、問題はSleep の部分と余分な部分を切り落とすだけです。
こんなふうにしか私は思いつかなかったです。

その代用品として、このようなコードがあります。
Private Declare Function MessageBoxTimeoutA Lib "user32" (ByVal hWnd As Long, ByVal _
lpText As String, ByVal lpCaption As String, ByVal uType As Long, ByVal _
wLanguageId As Long, ByVal dwMilliseconds As Long) As Long

Sub TimeOutMessage()
MessageBoxTimeoutA 0&, "ABC", "メッセージ", vbMsgBoxSetForeground, 0, 2000 '2秒
End Sub

参考まで。

難しい質問ですね。
ご自身で参考にしたコードがあるのでしょうか。
ModalMode に関しては、なんとも言えないのは、UserForm 上で、Lable に命令を出しているからです。
それがなければ、後は補填するだけで済みます。
なお、Sleep を使っていらっしゃるようですが、Sleep 自体は、Win API ですから、もちろん、エラーが出ているはずです。

Load UserForm1
UserForm1.Label1.Caption = "ABC"
UserForm1.Show
Sleep 2000 --ここまでで、UserForm のメモリが安定しないので、Label の操作ができないのではないでし...続きを読む

Qエクセルvbaに関する質問です

Private Sub WorkSheet Change(ByVal Target As Range)
Select Case ActiveSheet.Range(“B1”).Value
Case 1To 10:
TextBox1.BackColor = vbYellow
Case 11To 20:
TextBox1.BackColor = vbBlue
Case Else:
TextBox1.BackColor = vbRed
End Select
End Sub

このマクロでB1のセルの値に応じて
テキストボックス1の背景色を変えるところまでは
素人ながら作れたのですが
このselect case の分岐を保ったまま
変数を使って
B(変数)の値でテキストボックス(変数)の背景色を変えられるようにしたいのですが
どうしたら良いでしょうか?
ユーザーフォームを使わずに
ワークシート上で変数を適用させるのは無理なのでしょうか?

Dim i As integer
For i = 1 To 3
Select case ActiveSheet.Range(“B”& i).Value
Case 1 To 10:
ActiveSheet.Controls(“TextBox”& i).Backcolor = vbYellow
(省略)
End Select
Next I
と入力してみたのですがうまくいきませんでした…

どうかよろしくお願いします

Private Sub WorkSheet Change(ByVal Target As Range)
Select Case ActiveSheet.Range(“B1”).Value
Case 1To 10:
TextBox1.BackColor = vbYellow
Case 11To 20:
TextBox1.BackColor = vbBlue
Case Else:
TextBox1.BackColor = vbRed
End Select
End Sub

このマクロでB1のセルの値に応じて
テキストボックス1の背景色を変えるところまでは
素人ながら作れたのですが
このselect case の分岐を保ったまま
変数を使って
B(変数)の値でテキストボックス(変数)の背景色を変えられる...続きを読む

Aベストアンサー

>Meを使うのに何かしらの設定が必要なのでしょうか…?
必要はありません。
Me つまり、自分のこと。自分で誰かというと、Sheet(親)
[親].[子].[プロパティ]

No.1で、「シートモジュールのみ」と書かれていますが、Sheet1, Sheet2 ... など特定のオブジェクトモジュールに使われるキーワードです。

今回の場合は、シートの上に、ActiveX コントロールを使っていますので、同じシートのTextBox1と、同じところでコードを使うことになります。

これで、ワンパッケージ
----------TextBox1 -(Active X = OLE Object)---------
===== Sheet1 ===================
    Me.TextBox1
  VBA Code ---Event Driven //
「--------------VBA Pane-------」

QVBscriptでWebスクレーピングしたい!

"https://bgp.he.net/AS9228"
のサイトにIndonesiaという国名の文字列があるのでこれをMsgBoxで画面表示したいです。

HTML文を解析すると、 <a href="/country/ID">Indonesia</a>
という文にIndonesiaがあるため、

まずは、innerHTML の中で ”/country/ID” という文字列を検索し、見つかったら、
そこから2個目の文字から、”<” の文字位置の直前まで文字列を取り出せばいいのかな。

と考えましたが、コードがわかりません。VBスクリプトに詳しい方教えてください。

下記に作成途中のコードを掲載します。


ーーー<コードここから>ーーー
Option Explicit

Dim objIE
 Set objIE = CreateObject("InternetExplorer.Application")
'IEを開くかどうか。開くを指定
objIE.Visible = True

'当該ページをIEで開く
objIE.navigate "https://bgp.he.net/AS9228"


'ページが読み込まれるまで待つ
Do While objIE.Busy = True Or objIE.readyState <> 4
WScript.Sleep 100
Loop


On Error Resume Next
Dim elements
Dim Text_pos1


Text_pos1 = instr(document.body.innerHTML,"/country/ID",1)

MsgBox Text_pos1

ーーー<コードここまで>ーーー

"https://bgp.he.net/AS9228"
のサイトにIndonesiaという国名の文字列があるのでこれをMsgBoxで画面表示したいです。

HTML文を解析すると、 <a href="/country/ID">Indonesia</a>
という文にIndonesiaがあるため、

まずは、innerHTML の中で ”/country/ID” という文字列を検索し、見つかったら、
そこから2個目の文字から、”<” の文字位置の直前まで文字列を取り出せばいいのかな。

と考えましたが、コードがわかりません。VBスクリプトに詳しい方教えてください。

下記に作成途中のコードを掲...続きを読む

Aベストアンサー

こんにちは

>innerHTML の中で ”/country/ID” という文字列を検索し、~
他にも同様のURL等が記載されている可能性があるかもしれませんので、idが「asinfo」となっている要素の中のクラス属性が「asright」の直下のリンク要素という取得の仕方に変えてみました。

こんな感じでも動作すると思います。
MsgBox objIE.document.querySelector("#asinfo .asright>a").textContent

QVBAのグローバルオブジェクト違反

エクセル VBAでコピーして、本当は他のシートに張り付けたいのですが、
試しに、離れた場所に張り付けようとしたら
グローバルオブジェクト違反の、表示が出ました。多分文法上の
問題だと思うのですが、下のコードで、COPYの指定のどこが悪いか教えてください。


Private Sub cmd コピーする_Click()
Dim 数 As Integer
If lst一覧.ListIndex = -1 Then
MsgBox "コピーする"
lst一覧.SetFocus
Else
For 数 = 0 To lst一覧.ListCount - 1
If lst一覧.Selected(数) = True Then
Cells(数 + 1, 1).Resize(, 6).Font.Strikethrough = True
Range("数 + 1", 5).Copy Range("数 + 1", 50)
End If
Next 数
End If
End Sub

エクセル VBAでコピーして、本当は他のシートに張り付けたいのですが、
試しに、離れた場所に張り付けようとしたら
グローバルオブジェクト違反の、表示が出ました。多分文法上の
問題だと思うのですが、下のコードで、COPYの指定のどこが悪いか教えてください。


Private Sub cmd コピーする_Click()
Dim 数 As Integer
If lst一覧.ListIndex = -1 Then
MsgBox "コピーする"
lst一覧.SetFocus
Else
For 数 = 0 To lst一覧.ListCount - 1
If lst...続きを読む

Aベストアンサー

> Range("数 + 1", 5).Copy Range("数 + 1", 50)

その上の行と同様に 「Cells」を使えば紛れがないでしょうに。

Cells(数 + 1, 5).Copy Cells(数 + 1, 50)

Qエクセルのファイルを開く際の質問です

エクセルのファイルを開くと、常にAの160のセルが左上に表示させるような方法はありませんでしょうか、みんなが使うので、いつも開くと、最期のほうのページが表示されます。
VBAになるのかと思いますが、思いつきません。
先頭行の固定は必要なのですが、なんとか途中のページにある文章を左上にいつも表示させて開きたいのです。どなたか、お救い下さい。

よろしくお願いいたします。

Aベストアンサー

こんばんは。

'//Thisworkbook モジュールに貼り付けます。
Private Sub Workbook_Open()
  Application.Goto Worksheets(2).Range("A160"), True
End Sub

マクロ付きのブック(xlsm)か、バイナリのブック(xlsb) で保存します。

ただし、もし、拡張子が、xlsx でマクロなしのブックを指定した場合は、個人用マクロブックなどを使った特別のブログラムが必要になります。それはまた、ご相談ください。

QPrivate Sub MyFind(ByVal src As String, ByRef rng

Private Sub MyFind(ByVal src As String, ByRef rng As Range)
Dim r As Range
Set rng = Nothing
For Each r In Range("F5:AJ5")
If r.Text = src Then
Set rng = r
Exit Sub
End If
Next
End Sub
このマクロの意味を、教えてください?

Aベストアンサー

No8は無視してください。
https://ideone.com/wF8Bejを
こちらでを変えました。
https://ideone.com/7lDjiU
にアップしています。
Textでの比較はいろいろと弊害がありそうなので、Valueの比較に変えています。
この方法なら#####の表示箇所も、非表示の箇所も、00:00:00の箇所も問題なく検索できます。(こちらで試した限りではですが)


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

人気Q&Aランキング