Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 7全般 : Excel 2010)
フォルダー内の複数のWordデーターをエクセルに転記
投稿日時: 18/03/31 21:21:56
投稿者: マルス
メールを送信

フォルダー内に複数100個くらいのワードのファイルがあります。
それぞれのある文字列(たとえば、表題という文字から2行のみそれぞれのWORDからエクセルに転記します。
具体的には一つ目のワードの表題から二行(計三行)をコピーして、エクセルのA1に転記する。
次に、二枚目のワードの表題という文字から二行(計三行)をコピーして、エクセルのA2に転記する。
とひたすら繰り返したいです。
非常に手作業では果てしない時間がかかっておりますので、ご教示いただけますと幸いです。
よろしくお願いします。

回答
投稿日時: 18/03/31 23:21:07
投稿者: simple

どこまで取り組んでいますか?
詰まっているところを中心に、質問するようにしてください。
 
なお「掲示板ご利用上のお願い」に一度目を通して下さいね。

回答
投稿日時: 18/04/01 12:16:02
投稿者: もこな2

simpleさんが指摘されているところはそのとおりとして、
ご質問はファイル名の話なのか、Word文書内の話なのかよくわからず。
 
Word文書の話なら、ワードを操作する必要があるとおもうので、ちょっと複雑な話になりそうな気がします。
こまってるポイントがわからないので、質問文の感想?だけ・・・

投稿日時: 18/04/01 14:42:06
投稿者: マルス
メールを送信

まず、フォルダーにワードのブックが100枚くらいあります。何枚かはわかりません。
1ブックに製品名とその説明があります。
文章の中で、製品名○○○○ 当製品は・・・・。で定型で始まるので、(すべて同じ行から始まっているとは限りません、ただし、上記の形式は一つです。
ほしい情報は各ワードから製品名を取り出し、エクセルのA列に順番に転記していきたいです。
製品が多ければB列となってもOKです。
一枚開けてコピーして、エクセルに転記してとアナログでやっていては、果てしなく時間がかかります。
こちらも勉強しますので、ご教示ください。

回答
投稿日時: 18/04/01 16:59:06
投稿者: もこな2

マルス さんの引用:
まず、フォルダーにワードのブックが100枚くらいあります。何枚かはわかりません。
細かいことですが、ワードで作られるものは"ブック"じゃなくて、"ドキュメント"ですね。
ファイルがWordDocumentかどうかを判定するには、Windowsなら拡張子を確認すればよいわけですから、Dir関数なり、Dirコマンドなり、FileSystemObjectを使うなりの方法でワードドキュメントだけ抽出可能とおもいますので、ファイル数はいくつあっても大した問題ではないとおもいます。
 
マルス さんの引用:
文章の中で、製品名○○○○ 当製品は・・・・。で定型で始まるので、(すべて同じ行から始まっているとは限りません、ただし、上記の形式は一つです。
ほしい情報は各ワードから製品名を取り出し、エクセルのA列に順番に転記していきたいです。
製品が多ければB列となってもOKです。
ということは、単純にドキュメント内を検索して、どこに書いてあるのか調べればいいですよね。
また、Document1つあたりに1製品名ってことですから、100ファイル程度であれば、行を変えなくても普通に処理できますね。Excel 2010なら、1,048,576 行あるので十分でしょう。
 
マルス さんの引用:
こちらも勉強しますので、ご教示ください。
わかることであれば可能な範囲でお答えしますので、どこがわからないのか教えてください。
もちろん、既に「掲示板ご利用上のお願い」はお読みになったんですよね?

回答
投稿日時: 18/04/01 22:23:05
投稿者: simple

横から失礼します。
 
Officeのアプリケーションたちは、
それぞれのオブジェクトを互いに操作することができます。
つまり、
・Excelのマクロで、Wordオブジェクトを操作する(Wordファイルを読み込み。特定文字列を取得)
とか、
・Wordのマクロで、Excelオブジェクトを操作する(ワークシートに文字列を書き込む)
といったことが可能です。
 
この件では、中心となる処理はWordの操作なので、本当は後者のほうが自然だと思います。
(ですから、本当はWordVBAの掲示板で質問したほうがよかったかもしれません。)
 
仮に、前者の方法(Excelマクロで作成)を採るとした場合、
全体の処理の流れとしては、

(1)Dir関数でWordファイル名を取得
(2)Wordファイルを開く
(3)検索機能を使って、製品名を取得する
(4)Wordファイルを閉じる
(5)シートに結果を書き込む
(6)次のワードファイルを取得して、(2)〜(5)を繰り返す。
(7)Wordファイルが無くなれば終了。
といったあらすじになるでしょう。
 
こうした場合は、全体を一遍に作るのではなく、
小さな部品の作成から入ってテスト検証を行い、
それらを最後に纏めるといったステップを踏んでいくとよいと思います。
 
まずは、一つの開かれているWordファイルを対象にして、
Wordの検索機能を使って、製品名を取得するところから検討を始めたらどうですか。
上記の(3)の部分ですね。
「Word 検索 ワイルドカード」といったキーワードで検索してみては?
Wordもマクロ記録ができますから、まずはそれを利用してみては?
 
ワイルドカードを指定して、"製品名*当製品は"で検索して、ヒットした部分のTextを採り、
"製品名"、"当製品は"などを""に置換すればよいと思います。
 
まずは上記に取り組んで頂きたいですが、
(1)の部分については、
下記の記事が参考になるでしょう。
【フォルダ内のファイル一覧を取得する】
http://www.moug.net/tech/exvba/0060001.html
 
ExcelからWordオブジェクトを操作する部分は、
【Word文書を開く】
https://www.moug.net/tech/exvba/0150093.html
が参考になるでしょう。
 
-----------------------
申し遅れましたが、
こちらのサイトでは、質問者さんは質問を出すだけでOKで、
あとは回答を待つだけということにはなっておりません。
 
あくまで、ご自分でコードを作成することが前提です。
それを皆さんがサポートするということが前提です。
ですから、どこまでできていますか?というのはそう言う趣旨でお尋ねしています。
(マクロは作ったことがないということでも、質問お断りということではなく、
  それに応じた助言をする用意はもちろんあります。)
 
-----------------------
ちなみに、Wordファイルの名前はどんなものなんですか?
ワークシートに書き込む情報は製品名だけでいいんですか?
それがどのファイルに対応したものかは不要なんですか?
 
もっと言えば、
製品毎のファイルなら、製品名をファイル名にするのが自然なわけですよね。
今からでも遅くないので、手作業で変更してしまうのが、あとあと有効ではないですか?
 
# 日中はアクセスできませんので、若干フライイングですが、コメントをさせて頂きました。
# ご了承ください。

回答
投稿日時: 18/04/03 16:27:06
投稿者: WinArrow
投稿者のウェブサイトに移動

WORD→Excelのデータ複写は、簡単そうに思われますが、
 結構、難しいというか厄介です。
  
問題は
WORDには、データという概念がないこと
 ・・・つまり、Excelでいうセルを意識せずに自由に入力できてしまうことです。
Excelのてんい転記することを考えてWORD文書を作成するくらいなら、最初からExcelで作成したほうが早いと思います。
  
既に作成されているWORRD文書の場合は、テスト的にExcelに複写してみるとよいでしょう。
たぶん、通常のコピペでは、Excel側で相当苦労しないと意図したものにならないと思います。
WORD側が文章けいしきなのか///表形式なのかでも違ってきます。
Excel側での付加作業を掛けないことを前提にするならば、
コピペではなく、テキスト形式で貼り付けることをお勧めします。
WORD側の書式設定を無視するので、書式設定はExcel側で行います。
(WORD側の開業はちょっと面倒かも?・・・そのためにテキスト形式を推奨)
  
simpleさんのレスの「処理の流れ」を借用させていただくと、
(3)(5)以外は、ExcelVBAでもWordVBAでも、どちらでも同じレベルと思います。
(3)は、Wordの機能ですから、WordVBAを作成することになります。
ExcelVBAに組み込む場合は、若干のカスタマイズが必要かも?
(5)は、上記で述べたように、WORD側のデータの有り様に対応したコードになると思いますので、
 場合によっては、試行錯誤になるかもしれません。
  
WordVBAは余りけいけい経験が少ないため、突っ込んだアドバイスができません。
Word→Excel複写に関する注意事項ということで、ご理解ください。
  
  

回答
投稿日時: 18/04/03 23:00:06
投稿者: simple

反応が無いようで残念。
折角なので、用意しておいたコードを書いておきます。
 
(検索のところは熟していないものだろうと思う。
  また、実テストはしていないので、思わぬ不具合があるかもしれない。
  必要な修正はご自分でしてください。
  まずはバックアップをとって、自己責任で使ってください。)
 

Option Explicit

'' Microsoft Word XX.X Object Libraryの参照設定が必要       '■注意

Dim wd   As Word.Application
Dim wdoc As Word.Document

Sub test()
    Const flder As String = "D:\MyDocuments\201803\test\" ' ■要修正 (最後に\が必要)
    Dim fname   As String
    Dim k       As Long

    Set wd = CreateObject("Word.Application")
    wd.Visible = True

    fname = Dir(flder & "*.doc*")

    Do While fname <> ""
        Set wdoc = wd.Documents.Open(flder & fname)
        k = k + 1
        Sheet1.Cells(k, 1).Value = fname
        Call getStrings(k)
        wdoc.Close wdDoNotSaveChanges
        fname = Dir()
    Loop
    wd.Quit
End Sub

Sub getStrings(k As Long)
    Dim s As String
    Dim b As Boolean
    Dim j As Long

    '検索の設定(ここは k=1の時だけ実行するだけでよいだろう。敢えてそのままにしておきます)
    With wd.Selection.find
        .ClearFormatting
        .Text = "製品名*当製品は"
        .Replacement.Text = ""
        .Forward = True
        .wrap = wdFindStop
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .MatchWildcards = True
    End With

    '検索
    j = 2
    wd.Selection.HomeKey Unit:=wdStory  '文章の冒頭へ
    Do
        b = wd.Selection.find.Execute
        If b = False Then Exit Do
        s = wd.Selection.Text
        s = Replace(s, "製品名", "")    '
        s = Replace(s, "当製品は", "")
        Sheet1.Cells(k, j).Value = Trim(s)
        j = j + 1
    Loop
End Sub

回答
投稿日時: 18/04/05 08:24:07
投稿者: もこな2

しばらく、質問者さんからのレスがないですが、簡単にできるだろうと思って質問してみたものの、難しいって言われて引いちゃったってところですかね。
 
確かに難易度はちょっと高いと思いますが、出来ないことではないとおもうので、まずはフォルダ内のワードファイルだけをシート上に書き出すみたいなマクロを作ってみてはどうでしょうか。
 
それくらいならサンプルも豊富に転がってますし、Excelの機能?だけでできますよ(正確にはOSの機能かもしれないが・・・)

トピックに返信