この記事では、Wordファイルの表のデータをAccessのテーブルに追加する方法についてご説明します。
【動画】Wordファイルの表のデータをAccessのテーブルに追加する実際の動き
本題に入る前に、まずは次の動画をご覧ください。
まずはマクロがWordファイルとAccessのデータベースファイルを開きます。
開いたWordファイルから表を検索して特定した表から表データを取得します。
取得した表のデータを使ってAccessのデータベースのテーブルに追加するINSERT文を組み立てます。
INSERT文が用意できたらINSERT文を実行してAccessのデータベースのテーブルに追加します。
INSERT文は、表の数、行の数だけ用意して実行します。
マクロ作成の流れ
表内にある文字列で表があるかを特定します。
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週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。