- 締切済み
エクセル表の中にリンクが貼られているwordファイルの中身をキーワード
エクセル表の中にリンクが貼られているwordファイルの中身をキーワード検索して、検索結果を表示したいのです。 ※マクロ超初心者です。 次のような10,000行データがあるエクセル表があります。 A(野菜) B(果物) C(色) D(word文書にリンク) 1 きゅうり りんご 赤 ファイル1.doc 2 トマト バナナ 黄 ファイル2.doc 3 レタス ぶとう 紫 ファイル3.doc 4 キャベツ 梨 オレンジ ファイル4.doc ・ ・ ・ このエクセル表からリンクが貼られた(D列)すべてのword文書全文の中から、キーワード検索して 検索した結果該当するword文書にリンクを貼っているエクセル表のデータを抜き出して、 一覧表にすることはできますか? 例えば、キーワード検索した結果、ファイル1.docとファイル4.docにそのキーワードが含まれていた場合、 1 きゅうり りんご 赤 ファイル1.doc 4 キャベツ 梨 オレンジ ファイル4.doc という、表示結果になってほしいのです。 一発で結果表示できなくても、2段階実行とかでも構いません。 どうでしょうか? 至急、教えて下さい!お願いします!!
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- buraigasho
- ベストアンサー率78% (32/41)
>'下の独自関数を呼び出しちゃいます。"aa"は、検索するキーワードを拾ってください。 >'ドキュメント名はアクティブシートから拾ってます。 >If SearchDocument("aa", ActiveSheet.Range("D" & CStr(I)).Value) Then このままでは、ダイアログボックスは開かれずに、"aa"というキーワードを探しに行きます。 上記の"aa"に検索するキーワードが入力されたセルを選択するか、メッセージボックスでキーワードを拾うかは、そちらの使用にあわせてください。 たとえば、シート1のA1のセルに検索キーワードを入力した場合、 Dim KeyWords As String KeyWords = Sheets("シート1").Range("A1").Value If SearchDocument(KeyWords, ActiveSheet.Range("D" & CStr(I)).Value) Then という感じです。 セルに入力された文字列をVBAで参照する方法については、ググってみてください。 ダイアログもついでにすぐ探せるはずです。
- buraigasho
- ベストアンサー率78% (32/41)
10000件のワードファイルからキーワード検索というのは、とても負荷が大きいいですねぇ~ エクセルのVBAでしたら、一個一個見に行っちゃうので、とてもロスが多いです。 .netやJavaでも変わりは無いですが・・・ とりあえずの方法としては、10,000行あるドキュメントをループして、1ファイルずつ検索して結果を保存し、別のシートかなにかにデータを出力していくっていう感じですかな? 'たいがいボタンから動作するかな~?って予想で・・・ Private Sub button1_Click() Dim I As Long 'For~Nextで最初の行から最終行までを総なめしちゃいます。 For I = 1 To ActiveSheet.Range("D1").End(xlDown).Row '下の独自関数を呼び出しちゃいます。"aa"は、検索するキーワードを拾ってください。 'ドキュメント名はアクティブシートから拾ってます。 If SearchDocument("aa", ActiveSheet.Range("D" & CStr(I)).Value) Then Sheets(2).Range("A" & CStr(I)).Value = ActiveSheet.Range("A" & CStr(I)).Value Sheets(2).Range("B" & CStr(I)).Value = ActiveSheet.Range("B" & CStr(I)).Value Sheets(2).Range("C" & CStr(I)).Value = ActiveSheet.Range("C" & CStr(I)).Value Sheets(2).Range("D" & CStr(I)).Value = ActiveSheet.Range("D" & CStr(I)).Value End If Next End Sub ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Wordドキュメントを検索する独自関数 ' 'SearchDocument '返り値:Boolean 'KeyWords:検索したいキーワード(文字列) 'DocumentName:検索するWordファイルのフルパス(文字列) ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Public Function SearchDocument(KeyWords As String, DocumentName As String) As Boolean SearchDocument = False On Error Resume Next 'オブジェクト変数の宣言 Dim objWord Dim objDoc Dim objSelection 'ワードアプリケーションを格納 Set objWord = CreateObject("Word.Application") '検索するドキュメントを開く Set objDoc = objWord.Documents.Open(DocumentName) Set objSelection = objWord.Selection '検索設定 '検索するキーワードを設定 objSelection.Find.Text = KeyWords '前方から検索する objSelection.Find.Forward = True 'キーワードを単語単位で完全一致させてます。 '文字であいまい検索の場合は省いてください。 objSelection.Find.MatchWholeWord = True '検索結果があればTrueが返ります。 If objSelection.Find.Execute Then SearchDocument = True End If Set objWord = Nothing End Function こんな感じです。 アレンジは必要ですが、試してみてください。
補足
回答して頂いて、本当にありがとうございます! 早速マクロに登録してみましたが。。。 やっぱり10,000件を検索するのは相当時間がかかるのか、パソコンが固まってしまいました。 ところで、回答して頂いたものを実行すると、キーワードをどこで入力するのでしょうか? ボタンを押下すると、キーワード検索のダイアログボックスが出てくる・・・とか? そのあとに、sheet2に検索結果を含む行の一覧表が表示されているはず・・・なのでしょうか? 本当に何もわからなくてすみません。。。 もう一度、回答お待ちしております。