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

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

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

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

Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

Q&A

解決済

3回答

17029閲覧

Excel VBAでWord文章から検索語のある段落の前後まで抽出したい

s.kono

総合スコア37

VBA

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

Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

0グッド

1クリップ

投稿2018/10/24 04:23

Microsoft Excel/Word Version 2013-2016

フォルダの中にあるWordファイルの中から特定の文字列を探し出し、前後の範囲を広げて抽出した文字列をExcelに出力したいのですが、

VBA

1objSelection.Paragraphs.first.Range.Text

とすると欲しい範囲までとれません、
行数やページ単位で取得する方法は分かったのですが、チルダが付いた変なファイルを読み込んだ時などにエラーが発生すると致命的な問題が起きることがあるため用いたくありません。

文字列取得範囲を広げて指定する良い方法はないでしょうか?
よろしくお願いします。

VBA

1Sub DocParagraphGet() 2'参考 https://technet.microsoft.com/ja-jp/library/ee692875.aspx 3 4 Dim wdApp As Object ' Word.Application 5 Dim wDoc As Object 'Word.Document 6 Dim objFso As Object 7 Dim objFolder As Object 8 Dim objSelection As Object 9 Dim sBookName As String '出力ブック名 10 Dim objWb As Workbook 11 Dim sOrgPath As String, sRetPath As String, sKeyWord As String 12 Dim iParagNum '段落数 13 14 15 Set wdApp = CreateObject("Word.Application") 16 wdApp.Application.Visible = True '可視化 表示しなければ特に必要なし 17 18 sOrgPath = ThisWorkbook.Sheets("フォーム").Range("B13") & "\" 19 sRetPath = ThisWorkbook.Sheets("フォーム").Range("B14") & "\" 20 iParagNum = ThisWorkbook.Sheets("フォーム").Range("B15") 21 sKeyWord = "規格" 22 sBookName = Format(Now, "yymmddhhmm") & "_Wordからの出力" & ".xlsx" 23 24 Set objFso = CreateObject("Scripting.FileSystemObject") 25 Set objFolder = objFso.GetFolder(sOrgPath) 26 Set objWb = Workbooks.Add 27 objWb.SaveAs (sRetPath & sBookName) 28 29 objWb.Sheets.Add Before:=Sheets(1) 30 r = 0 31 For Each f In objFolder.Files 32 33 sxx = Right(f.Name, 5) 34 If 0 < InStr(sxx, ".doc") Then 35 r = r + 1 36 objWb.Sheets(1).Cells(r, 1) = f.Name 37 Set wDoc = wdApp.documents.Open(sOrgPath & "\" & f.Name, True) '読み取りモードで開く 38 Set objSelection = wdApp.Selection 39 objSelection.Find.Text = sKeyWord 40 objSelection.Find.Forward = True 41 If objSelection.Find.Execute Then 42 r = r + 1 43 objWb.Sheets(1).Cells(r, 2) = objSelection.Paragraphs.first.Range.Text 44 Else 45 objWb.Sheets(1).Cells(r, 2) = "なし" 46 End If 47 wdApp.documents.Close 48 End If 49 50 Next f 51 52Set objFso = Nothing 53Set objFolder = Nothing 54Set wdApp = Nothing 55 56 57End Sub

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

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

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

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

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

guest

回答3

0

ベストアンサー

「チルダが付いた変なファイル」の話は出ているので、範囲の拡張の話を。

選択範囲の属する段落+前後の1行まで選択範囲を拡張するサンプルです。
MoveStart/MoveEndメソッドを使用することで元の範囲の開始/終了位置を動かしています。

Selection.MoveStart メソッド (Word)

Selection.MoveEnd メソッド (Word)

どの程度範囲を広げれば良いのかわからなかったので、expandCountexpandUnitを適当に調整してください。

vba

1'検索後の状態を想定(検索文字列選択状態) 2With objSelection 3 '選択範囲を段落まで拡張 4 'Const wdParagraph = 4 5 .Expand wdParagraph 6 7 8 '前後に範囲を拡張(例:前後に1行ずつ拡張) 9 Const expandCount = 1 10 'Const wdLine = 5 11 Dim expandUnit As Word.WdUnits 12 expandUnit = wdLine 13 14 '選択開始位置・終了位置をずらす 15 .MoveStart expandUnit, -expandCount 16 .MoveEnd expandUnit, expandCount 17 18 'Debug.Print .Text 19End With 'objSelection

投稿2018/10/24 13:07

imihito

総合スコア2166

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

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

s.kono

2018/10/25 05:30

回答ありがとうございます。 なぜか Dim expandUnit As Word.WdUnits の部分で「ユーザー定義型が定義されていません」とエラーとなります とりあえず次のコードで欲しいものが取得できました。 Wordのプロパティと定数の意味が良く分からなくて苦労しています。 参照の問題でしょうか? 参照でDLL読み込みエラーが出てしまい参照設定は出来ていません With objSelection Const wdLine = 5 .MoveEnd Unit:=wdLine, Count:=2 objWb.Sheets(1).Cells(r, 2) = .Text End With 'objSelection
imihito

2018/10/25 14:32

`Word.WdUnits`はWordのタイプライブラリ内で定義されている列挙型なので、参照設定が無いとエラーになりますね。 書き忘れていました、すみません。 参照設定が上手くいかない状況、というのはあまり経験がありませんが、Officeのインストールがどこか失敗しているのだと思います。 もしWord側のVBEが動くなら、Word操作部分はそちらで作った上で、型宣言を省く・定数/列挙型を値にしてExcelに移植、というのも手かもしれません。
s.kono

2018/10/25 23:22

参照設定のエラーは社内の担当に投げてみます。Word VBAの概念を知ることが出来て助かりました。ありがとうございます。VBEもExcel側からはよく利用するのですがWordはめったに利用することがないので今度時間のある時に勉強してみます。無事欲しいものが取得できました。ありがとうございます。
guest

0

チルダが付いた変なファイルを読み込んだ時などにエラーが発生すると致命的な問題が起きることがあるため用いたくありません。

とりあえずこの部分にのみ反応しますと、チルダが付いたファイルはWordが勝手に作成する作業用のファイルです。
なのでこのファイルを検索対象にするのは問題かと。
今のコードでチルダ以外のファイルは問題ないのであれば、チルダのファイルを除外すれば済むような気がします。
ま、問題が起きる起きないに関わらず除外は必須ですね。

VBA

1If Left(f.Name, 1) <> "~" And 0 < InStr(sxx, ".doc") Then

投稿2018/10/24 06:58

ttyp03

総合スコア16998

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

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

s.kono

2018/10/24 07:52

ありがとうございます。条件をかけたときになぜかひっかからなかったのです、今一度良く見てみます。
s.kono

2018/10/25 05:36 編集

ひっかかるようになりました、次にZIPフォルダのファイルに引っかかったり、これも除外しました、今は保護がかかっているファイルがあり、それをどうするか、、、フォルダの中は色々なのでもう「 On Error Resume Next」で飛ばしても良いのかと、、、
guest

0

「チルダが付いた変なファイル」は、Excelのブックや、Wordの文書を開いている間に自動で作成される隠しファイルです。

ファイル名の頭に[~]が付いてるファイルは処理の対象外とすべきでしょう。

投稿2018/10/24 06:48

ExcelVBAer

総合スコア1175

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

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

s.kono

2018/10/24 07:54

はい、うまく除外できなくて除外方法を考え直して見ます。ありがとうございました。
ExcelVBAer

2018/10/25 00:00

その「うまく除外できていない」コードを載せたら?
s.kono

2018/10/25 05:35

出来ました! 隠しファィル表示でも見えないのでおかしくなっていたファイルがいたのかもしれません、親フォルダごと削除して除外をいれたらうまくいきました。正しく検証した結果をお知らせできなくてすみません。
ExcelVBAer

2018/10/25 07:41

ひょっとしたら、システム用のファイルとして認識されているのかもしれませんね。 よくある事なのですが、たまにしかバグにならないので、自分も忘れやすいので 気を付けたいものです。
s.kono

2018/10/25 23:17

コメントありがとうございます。いい経験になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問