【ExcelVBA】Wordファイルの表のデータをAccessのテーブルに追加するには

この記事では、Wordファイルの表のデータをAccessのテーブルに追加する方法についてご説明します。

【動画】Wordファイルの表のデータをAccessのテーブルに追加する実際の動き

本題に入る前に、まずは次の動画をご覧ください。


まずはマクロがWordファイルとAccessのデータベースファイルを開きます。

開いたWordファイルから表を検索して特定した表から表データを取得します。

取得した表のデータを使ってAccessのデータベースのテーブルに追加するINSERT文を組み立てます。

INSERT文が用意できたらINSERT文を実行してAccessのデータベースのテーブルに追加します。

INSERT文は、表の数、行の数だけ用意して実行します。

マクロ作成の流れ

STEP.1
Wordファイルを開き、Wordの機能にアクセスできるインスタンスを生成する
Wordファイルを開き、Wordの機能にアクセスできるインスタンスを生成します。
STEP.2
Wordファイルを開く
Wordファイルを開きます。
STEP.3
検索文字(列)を元に、Wordのファイル内にある表を検索する
検索文字(列)を元に、Wordのファイル内にある表を検索します。
表内にある文字列で表があるかを特定します。
STEP.4
Word内に表があった場合は、CSVファイルのデータの数だけ行を追加する
Word内に表があった場合は、CSVファイルのデータの数だけ行を追加します。
STEP.5
CSVファイルのデータをWordの表に出力する
CSVファイルのデータをWordの表に出力します。

WordファイルとAccessのテーブルの例

Wordファイル

今回は以下のWordファイルを用意しました。

Accessのテーブル

今回は以下のAccessのテーブルを用意しました。

「T_社員」というテーブルを用意し、マクロを実行するとWordファイルの表のデータをこのテーブルに追加させます。

マクロ実行後は下のようにWordファイルの表のデータが「T_社員」のテーブルに追加されます。

コードの例

Option Explicit

Sub test()

    Dim wordFilePath    As String   'Wordファイルのフルパス
    Dim accDBFilePath   As String   'Accessのデータベースファイルのフルパス
    Dim WordApp         As Object   'Wordアプリケーションインスタンス用変数
    Dim WordDoc         As Object   'Wordファイルのインスタンス用変数
    Dim accDB           As Object   'Accessのデータベースファイル用変数
    Dim tblCnt          As Integer  'Wordファイルの表数をカウントする変数
    Dim WordTable       As Object   'Wordファイルの表用変数
    Dim cnt             As Integer  'カウンタ用変数
    Dim strSQL          As String   'SQL文格納用変数
    
    'Wordファイルのフルパスを取得する
    wordFilePath = ThisWorkbook.Path & "\0304.docx"
    
    'Accessのデータベースファイルのフルパスを取得する
    accDBFilePath = ThisWorkbook.Path & "\0304.accdb"
    
    'Wordアプリケーション用インスタンスを生成する
    Set WordApp = CreateObject("Word.Application")
    
    'Wordファイルを表示しない
    WordApp.Visible = False
    
    'Wordファイルを開く
    Set WordDoc = WordApp.Documents.Open(wordFilePath)
        
    'Accessアプリケーション用インスタンスを生成する
    Set accDB = CreateObject("Access.Application")
    
    'Accessのデータベースファイルを開く
    accDB.OpenCurrentDatabase accDBFilePath
        
    'Wordファイルにある表の数だけ処理を繰り返すFor文
    For tblCnt = 0 To WordDoc.Tables.Count - 1
                    
        '見つかった表を変数wdTableに格納する
        Set WordTable = WordDoc.Tables(tblCnt + 1)
    
        'Wordファイルの表の行数分ループさせるFor文(2行目のデータ行からループを開始)
        For cnt = 2 To WordTable.Rows.Count
        
            'テーブルにデータを追加するSQL文を作成する
            '→表のデータにある余計な文字「」をreplace関数で削除する
            strSQL = "INSERT INTO T_社員 (項番, 氏名, 年齢, 出身都道府県, 所属部署) VALUES " & _
                     "('" & Replace(WordTable.Cell(cnt, 1).Range.Text, "", "") & "'," & _
                     " '" & Replace(WordTable.Cell(cnt, 2).Range.Text, "", "") & "'," & _
                     " " & Replace(WordTable.Cell(cnt, 3).Range.Text, "", "") & "," & _
                     " '" & Replace(WordTable.Cell(cnt, 4).Range.Text, "", "") & "'," & _
                     " '" & Replace(WordTable.Cell(cnt, 5).Range.Text, "", "") & "')"
                                    
            DoEvents
            
            'SQL文を実行する
            accDB.CurrentDb.Execute strSQL
            
        Next cnt
    
    Next tblCnt
    
    'Wordファイルを閉じる
    WordDoc.Close
        
    'Wordを終了する
    WordApp.Quit
    
    '後処理
    Set WordDoc = Nothing
    Set WordApp = Nothing
    Set WordTable = Nothing
    Set accDB = Nothing
    
End Sub

注目すべきコード①

最初に見て頂きたいのは16行目から19行目です。

    'Wordファイルのフルパスを取得する
    wordFilePath = ThisWorkbook.Path & "\0304.docx"
    
    'Accessのデータベースファイルのフルパスを取得する
    accDBFilePath = ThisWorkbook.Path & "\0304.accdb"

コードの説明

以上のコードは、WordファイルとAccessのデータベースファイルのフルパスを取得するコードです。

注目すべきコード②

次に見て頂きたいのは22行目です。

    'Wordアプリケーション用インスタンスを生成する
    Set WordApp = CreateObject("Word.Application")

コードの説明

以上のコードは、Wordアプリケーション用インスタンスを生成するコードです。

このインスタンスを生成することでWordが起動されて操作することができるようになります。

今回はWordファイルを開いたりWordファイルにある表の検索や表のデータを取得したり、Word自体を終了させるなどの操作を行うのに使います。

注目すべきコード③

次に見て頂きたいのは25行目です。

    'Wordファイルを表示しない
    WordApp.Visible = False

以上のコードは、Wordの画面を非表示にするコードです。

Trueの場合はWordが表示されたままの状態になります。

注目すべきコード④

次に見て頂きたいのは28行目です。

    'Wordファイルを開く
    Set WordDoc = WordApp.Documents.Open(wordFilePath)

以上のコードは、Wordファイルを開く処理のコードです。

OpenメソッドにWordファイルのフルパスを指定して実行することで、そのWordファイルが開きます。

注目すべきコード⑤

次に見て頂きたいのは31行目です。

    'Accessアプリケーション用インスタンスを生成する
    Set accDB = CreateObject("Access.Application")

コードの説明

以上のコードは、Accessアプリケーション用インスタンスを生成するコードです。

このインスタンスを生成することでAccessが操作できるようになります。

今回はAccessのデータベースを開いたり、SQL文を実行するなどの操作を行うのに使います。

注目すべきコード⑥

次に見て頂きたいのは34行目です。

    'Accessのデータベースファイルを開く
    accDB.OpenCurrentDatabase accDBFilePath

コードの説明

以上のコードは、Accessのデータベースファイルを開く処理のコードです。

OpenCurrentDatabaseメソッドにAccessのデータベースのフルパスを指定して実行することで、指定したAccessのデータベースファイルを開きます。

注目すべきコード⑦

次に見て頂きたいのは37行目から61行目です。

    'Wordファイルにある表の数だけ処理を繰り返すFor文
    For tblCnt = 0 To WordDoc.Tables.Count - 1
                    
        '見つかった表を変数wdTableに格納する
        Set WordTable = WordDoc.Tables(tblCnt + 1)
    
        'Wordファイルの表の行数分ループさせるFor文(2行目のデータ行からループを開始)
        For cnt = 2 To WordTable.Rows.Count
        
            'テーブルにデータを追加するSQL文を作成する
            '→表のデータにある余計な文字「」をreplace関数で削除する
            strSQL = "INSERT INTO T_社員 (項番, 氏名, 年齢, 出身都道府県, 所属部署) VALUES " & _
                     "('" & Replace(WordTable.Cell(cnt, 1).Range.Text, "", "") & "'," & _
                     " '" & Replace(WordTable.Cell(cnt, 2).Range.Text, "", "") & "'," & _
                     " " & Replace(WordTable.Cell(cnt, 3).Range.Text, "", "") & "," & _
                     " '" & Replace(WordTable.Cell(cnt, 4).Range.Text, "", "") & "'," & _
                     " '" & Replace(WordTable.Cell(cnt, 5).Range.Text, "", "") & "')"
                                    
            DoEvents
            
            'SQL文を実行する
            accDB.CurrentDb.Execute strSQL
            
        Next cnt
    
    Next tblCnt

コードの説明

以上のコードは、Wordファイルにある表のデータをAccessのデータベースにあるテーブルに追加する処理のコードです。

この処理は、表の数だけ繰り返し行います。

コードの詳細

37行目のコードは、Wordファイルにある表の数だけ処理を繰り返すFor文です。

Wordファイルにある表の数は、WordDoc.Tables.Countから取得することができます。

40行目のコードでは、Wordの表を変数「WordTable」に格納します。

43行の目のコードは、Wordの表の列数分処理を繰り返すFor文です

Wordの表の列数は、WordTable.Rows.Countから取得することができます。

47行目から52行目のコードでは、Wordの表のデータをAccessのデータベースのテーブルに追加するINSERT文を組み立てます。

表の値は「WordTable.Cell(cnt, 1).Range.Text」から取得するのですが、Replace関数を使って文字を削除しています。

今回削除しているのは

ただし、今回削除した不要な文字について、他にどんな種類があるのかすべてを確認できていません。(Wordファイルによっては別の文字である可能性があるかもしれません)

なので、使われているWordファイルでどんな不要な文字があるのか事前に確認し、その不要文字を削除するようコードを適宜修正対応してください。

なお、以上のコードだけではINSERT文が分かりにくいと思うので、実際に実行するINSERT文の例を以下にお見せします。

INSERT INTO T_社員
(
    項番
   ,氏名
   ,年齢
   ,出身都道府県
   ,所属部署
)
VALUES
(
    '1'
   ,'藤田健一'
   ,52
   ,'宮崎県'
   ,'人事部'
)

57行目のコードでは、SQL文を実行しています。

ExecuteメソッドにSQL文(INSERT文)を指定して実行することでSQL文が実行されます。

INSERT文が正常に実行されれば、Wordファイルの表のデータがAccessのデータベースのテーブルに追加されます。

動作確認

WordファイルとAccessのテーブルの例」をご覧ください。

最後に

この記事では、Wordファイルの表のデータをAccessのテーブルに追加する方法についてご説明しました。

Wordファイルの表のデータをAccessのテーブル保存しておきたい場合は本記事を参考にして頂けたら幸いです。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら