none
数百枚のword の内容をaccessに登録する方法 RRS feed

  • 質問

  • word で記載された数百枚の報告書をaccessにDBとして出来るだけ楽に登録したいと考えていjます

    報告書のレイアウトは統一されています。

    当方、VBが使えます

    なにか良い方法はないでしょうか?

    2017年7月18日 11:25

回答

  • AccessのVBAで以下のような手順で
    (一つ一つの処理は検索すれば簡単にやり方がわかることなので自称初心者でもできるはず)

    1. VBAでExcelを起動する
    2. VBAでExcelに空のワークシート(以下SheetA)とAccessに取り込みたい列名が1行目にヘッダとして定義されているシート(以下SheetB)を用意する
    3. VBAでWordを起動する
    4. VBAで読み取りたいWordファイルを開く
    5. VBAでWordの文章全体を選択
      (数百枚というのが1ファイルに数百ページという意味なら1ページ毎に選択でも可)
    6. VBAでWordの選択範囲をクリップボードにコピー
    7. VBAでExcelのSheetAにペースト
      (レイアウトがきちんと統一されているなら取り込みたい部分は一定のセルに貼りつけられる)
    8. 取り込みたいセルに不要な文字が混ざっていたらVBAで置換などで除去する
    9. VBAで取り込みたいセルからSheetBの対応する列の2行目以降に内容をコピーする
    10. VBAでSheetAを空白にするかSheetAを削除して新規シートを作成する。
    11. VBAでWordファイルを閉じる。
    12. 他のWordファイルがあるのなら4から繰り返し
    13. 全データがそろったらVBAでSheetBのヘッダを含むデータ部分を選択してクリップボードにコピー
    14. AccessVBAでDoCmd.RunCommand acCmdViewTablesとDoCmd.RunCommand acCmdPasteでクリップボードの内容からテーブルとして取り込む。
    15. VBAでExcelとWordを終了する
    16. おわり


    #質問しっぱなしで放置は良くない


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年7月18日 15:28
  • CreateObject("Word.Application") でWordを開いてオートメーションで操作するのが順当でしょう。

    下記は、ワードファイルの最初の表のデータ(3列)をAccessのテーブルに取り込む場合のコード例です。

    Sub ImportWordDoc(docFilePath As String)
        Dim rs As DAO.Recordset
        Dim myWord As Object    'Word.Application
        Dim myWordDoc As Object    'Word.Document
     
        Set rs = CurrentDB.OpenRecorset("テーブル1")
        Set myWord = CreateObject("Word.Application")
        Set myWordDoc = myWord.Documents.Open(docFilePath)
        With myWordDoc.Tables(1)
            For R = 2 To .Rows.Count
                rs.Addnew
                rs(0) = .Cell(R, 1).Range.Text
                rs(1) = .Cell(R, 2).Range.Text
                rs(2) = .Cell(R, 3).Range.Text
                rs.Update
            Next
        End With
    
        myWordDoc.Close: Set myWordDoc = Nothing
        myWord.Quit: Set myWord = Nothing
        rs.Close: Set rs = Nothing
    End Sub

    2017年7月18日 18:47
  • 詳細が書かれていないので何とも言えないのですが、例えば数百枚の報告書を取り込んだ後も、日常業務として数枚の報告書を取り込む作業が発生する。というのであれば、例えば以下の運用も考えられます。

    1.スキャナで取りこむ。
    数枚セットすれば、自動的に一気に取込み、それぞれをPDF化、および指定された位置の文字をOCRにより読み取る。この文字を指定するエリアは複数指定可能。

    2.作成されたPDFおよびOCRにより読み取った複数の文字列を同時に表示するアプリを作成し、取り込む際に人間が確認し、誤りがあれば文字列を修正して取り込む。手書きではないのでほぼ読み取れるはず。特に英数字のみであればさらに正確に読み取る率が上がるはず。また、エラーチェックが可能なところはエラーチェックを付けると、読取り間違いが見過ごされる可能性も下がる。
    このPDFはSQL Server であれば簡単に取り込むことができるが、Accessなので、PDFは普通のフォルダに保存し、その索引情報のみをAccessで管理すると良い。

    #上記の運用が今回のケースに成り立つかどうかはわかりません。上記の機能を持ったスキャナは5万円以下で買えると思います。
    実際に私は上記の仕組みでシステムを構築した経験があります。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2017年7月19日 0:59
    モデレータ

すべての返信

  • AccessのVBAで以下のような手順で
    (一つ一つの処理は検索すれば簡単にやり方がわかることなので自称初心者でもできるはず)

    1. VBAでExcelを起動する
    2. VBAでExcelに空のワークシート(以下SheetA)とAccessに取り込みたい列名が1行目にヘッダとして定義されているシート(以下SheetB)を用意する
    3. VBAでWordを起動する
    4. VBAで読み取りたいWordファイルを開く
    5. VBAでWordの文章全体を選択
      (数百枚というのが1ファイルに数百ページという意味なら1ページ毎に選択でも可)
    6. VBAでWordの選択範囲をクリップボードにコピー
    7. VBAでExcelのSheetAにペースト
      (レイアウトがきちんと統一されているなら取り込みたい部分は一定のセルに貼りつけられる)
    8. 取り込みたいセルに不要な文字が混ざっていたらVBAで置換などで除去する
    9. VBAで取り込みたいセルからSheetBの対応する列の2行目以降に内容をコピーする
    10. VBAでSheetAを空白にするかSheetAを削除して新規シートを作成する。
    11. VBAでWordファイルを閉じる。
    12. 他のWordファイルがあるのなら4から繰り返し
    13. 全データがそろったらVBAでSheetBのヘッダを含むデータ部分を選択してクリップボードにコピー
    14. AccessVBAでDoCmd.RunCommand acCmdViewTablesとDoCmd.RunCommand acCmdPasteでクリップボードの内容からテーブルとして取り込む。
    15. VBAでExcelとWordを終了する
    16. おわり


    #質問しっぱなしで放置は良くない


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年7月18日 15:28
  • CreateObject("Word.Application") でWordを開いてオートメーションで操作するのが順当でしょう。

    下記は、ワードファイルの最初の表のデータ(3列)をAccessのテーブルに取り込む場合のコード例です。

    Sub ImportWordDoc(docFilePath As String)
        Dim rs As DAO.Recordset
        Dim myWord As Object    'Word.Application
        Dim myWordDoc As Object    'Word.Document
     
        Set rs = CurrentDB.OpenRecorset("テーブル1")
        Set myWord = CreateObject("Word.Application")
        Set myWordDoc = myWord.Documents.Open(docFilePath)
        With myWordDoc.Tables(1)
            For R = 2 To .Rows.Count
                rs.Addnew
                rs(0) = .Cell(R, 1).Range.Text
                rs(1) = .Cell(R, 2).Range.Text
                rs(2) = .Cell(R, 3).Range.Text
                rs.Update
            Next
        End With
    
        myWordDoc.Close: Set myWordDoc = Nothing
        myWord.Quit: Set myWord = Nothing
        rs.Close: Set rs = Nothing
    End Sub

    2017年7月18日 18:47
  • ご教授ありがとうございます

    やってみます

    2017年7月18日 20:28
  • ご教授ありがとうございます

    やってみます

    2017年7月18日 20:28
  • 詳細が書かれていないので何とも言えないのですが、例えば数百枚の報告書を取り込んだ後も、日常業務として数枚の報告書を取り込む作業が発生する。というのであれば、例えば以下の運用も考えられます。

    1.スキャナで取りこむ。
    数枚セットすれば、自動的に一気に取込み、それぞれをPDF化、および指定された位置の文字をOCRにより読み取る。この文字を指定するエリアは複数指定可能。

    2.作成されたPDFおよびOCRにより読み取った複数の文字列を同時に表示するアプリを作成し、取り込む際に人間が確認し、誤りがあれば文字列を修正して取り込む。手書きではないのでほぼ読み取れるはず。特に英数字のみであればさらに正確に読み取る率が上がるはず。また、エラーチェックが可能なところはエラーチェックを付けると、読取り間違いが見過ごされる可能性も下がる。
    このPDFはSQL Server であれば簡単に取り込むことができるが、Accessなので、PDFは普通のフォルダに保存し、その索引情報のみをAccessで管理すると良い。

    #上記の運用が今回のケースに成り立つかどうかはわかりません。上記の機能を持ったスキャナは5万円以下で買えると思います。
    実際に私は上記の仕組みでシステムを構築した経験があります。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2017年7月19日 0:59
    モデレータ