- 締切済み
VBA フォームに入力したものを検索しエクセルへ
わたしはVBA初歩で現在勉強しているものです。 VBAでユーザフォームに検索窓を設置しました。 下記のことをできるようにしたいです。 (1)フォームの検索窓に文字を入力 (2)フォームのボタンを押す (3)googleで(1)の文字を検索(サイトはshowしなくてよい) (4)検索結果のすべてを A列 番号 B列 タイトル C列 URL というように順次流していく。 ↑このようなものを作りたいのですが、どのようなコード記述をすればよいでしょうか? 教えてください。 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
質問の標題が、中身を示していない。 よく見たら、WEB検索(Google検索)を「検索語を指定して」プログラムでやりたい。結果をエクセルシートに残したい」という内容のようだ。 最近勉強したのかもしれないが、「ユーザーフォーム」など持ち出す必要はない。(質問点がぼやける。知っている人が、表題だけ見て、パスする恐れもある。) シートのセルやテキストボックス(WSやUFの)やプログラムの中でも、検索語は記述・入力できる。 勉強し始めは、ユーザーとのインターフェイスの道具立てなどこだわるな。 ーー NAVIGATEなどはVBAの名のもとに開設されているが、マイクロソフトが、VBAの流儀で記述できるように作ってくれただけ。ある意味では、異質のもの) ーー それよりもWEBサイトの成り立ち、仕組みの勉強をすべきだ。 多分HTML文や画像のあり場所の情報などが利用者のコンピュター世界に 来ると思うが、その仕組みや有様を勉強する必要があると思う。 Googleで、ある語句や語句の集まり、短い文章などを入力して、検索すると、候補記事が数万から100万件に及んで(存在すると)出てくる。こんなものをすべて対象にURLを問題にしても仕方がない。 Googleの照会の世界に入ったら、あとの処理は(どの分を選んだかなど)VBA(ないしスクリプト)では扱えるようにGoogleは、作って公開してないと思う(小生は知らないだけかも)。 スマホのAndroid(OS)のプログラムの世界では、あるかどうか知らない。 少なくとも勉強中は、関心や興味が、あれもこれもと飛びやすいが、学習目的足的達成には危険・有害だ。 またタイトルといっているのはどういうものを指しているのか? HTML文の中のTAITLE文? ーー VBAにも学ぶべきことは多いと思う。 質問においては標題に気を付けて。 そして内容を反映するように。
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
こんにちは。 TextBox1 「フォームの検索窓」 CommandButton1 「フォームのボタン」 という条件で書いてあります。 各コードネームに齟齬がないよう注意してください。 URLエンコードの関数については、 日常的に使っているものですが、 私自身のPCでしか動作確認したことがないので、 もしも、そちらでうまくいかないようなことがあれば、 その旨伝えて下さい。 ' ' 〓〓 UserForm モジュール 〓〓 Private Sub CommandButton1_Click() ' Me.Hide SearchGoogle sWord:=Me.TextBox1.Text End Sub ' ' 〓〓 〓〓 ' ' 〓 標準モジュール 〓 ' ' // Google検索結果すべてA列:通番,B列:標題,C列:URL Sub SearchGoogle(ByVal sWord As String) Const Google = "https://www.google.co.jp/search?q=", READYSTATE_COMPLETE = 4 Dim oIE As Object, oDoc As Object Dim colDiv As Object, oDiv As Object, o As Object, oDivNext As Object Dim sURL As String, h As String Dim cn As Long sURL = Google & EncodeUTF8(Trim(sWord)) ' GoogleSerach & 検索キーワードをUTF-8にエンコードした文字列 Set oIE = CreateObject("InternetExplorer.Application") ' IE起動 oIE.Visible = True ' IE表示 可視化しておいた方が万一のトラブル処理に困らないので。 oIE.Navigate URL:=sURL ' 普通にナビ cn = 0 Do Do While oIE.Busy Or oIE.ReadyState < READYSTATE_COMPLETE DoEvents ' 待機 Loop Set oDoc = oIE.Document ' HTMLドキュメント取得 Set colDiv = oDoc.getElementsByClassName("r") ' 検索結果のクラスDivを取得 For Each oDiv In colDiv ' 検索結果を総当たり cn = cn + 1 ' 件数(通番)カウント h = "" For Each o In oDiv.ChildNodes ' [URL}取得 If LCase(o.localName) = "a" Then h = o.href: Exit For Next ' ' [件数(通番)] [URL} [標題]をセル出力 Cells(cn, 1).Resize(, 3).Value = Array(cn, h, oDiv.innerText) Next On Error Resume Next Set oDivNext = oDoc.getElementById("pnnext") ' 次ページナビボタンを取得 On Error GoTo 0 If oDivNext Is Nothing Then ' 次ページナビが無ければループを抜けて処理終了 Exit Do Else oDivNext.Click ' 次ページへ遷移 Set oDivNext = Nothing End If Loop oIE.Quit ' IE閉じる Set colDiv = Nothing: Set oDoc = Nothing: Set oIE = Nothing End Sub ' ' // 文字列をURLエンコードして返す(UTF-8)(Office 64bit対応) Private Function EncodeUTF8(ByVal Source As String) As String Dim oHtmlFile As Object Dim oElement As Object Source = Replace(Source, "\", "\\") Source = Replace(Source, "'", "\'") Set oHtmlFile = CreateObject("htmlfile") Set oElement = oHtmlFile.createElement("span") oElement.setAttribute "id", "rresponse" oHtmlFile.appendChild oElement oHtmlFile.parentWindow.execScript _ "document.getElementById('rresponse').innerText " _ & "= encodeURIComponent('" & Source & "');", "JScript" EncodeUTF8 = oElement.innerText End Function ' ' 〓 〓 尚、 連続投稿された質問q9327346にも目を通していますが、 設問からして、責任のある回答はできそうもないので見送ります。 Web検索って、htmやhtmlばかりじゃないですよね? pdfだったらどうするのか、とか、 今回「検索結果のすべてを」リスト化して、 件数分(例えば数百とか)のシートを挿入する、 という時点で機能維持が危うい気がしますし、 画像についても恐らくすべてという意味だとすると、 最後までExcelが落ちずに動いてくれるのかな?と。 検索結果の総数に制限を設けて、 ひとつのブック内のシート数に上限を設けて、 取り込む画像もサムネイルとかアイコンのように縮小して、 とかならできるのかも知れないけれど、 それが使い物になるかどうかは、こちらには判らないし、、、。 最近、別件で見掛けた質問でも最初の設計をお座なりにして 後々の機能追加で破綻している例があったのですが、 画像をベタベタExcelに(リンクを)張って、 肝心のブックが開かない、なんてことにならないように、と。 画像は画像ファイルとしてローカルPC内に管理しておいて 必要な時にExcelやUserformに配置したImageコントロールに表示する というような設計が標準的で、 画質の劣化もなく、管理し易く、ブック破損のリスクも避けられる、 と思うのですが、、、。 因みにExcelシートに画像張るとか(画像として)貼るとかすると、 原則的に画像は圧縮されます。保守の為ですね。 無理に圧縮しないで写真を貼ったりすると、 数枚程度でもブックの挙動が遅くなるのを実感できることがあります。 なので、今のままの設計だとこちらからは、 ちょっと手が出せないかな、と思っています。 参考になることがあれば、検討してみて下さいませ。