単純なコピペではレイアウトが崩れてしまい上手く行かないので、簡単に抽出できる方法を考えてみた。
陥りがちな罠
例えばこんなPDFがあるとします。

これの表データが欲しい場合、単純にCtrl+A 、Ctrl+C、Ctrl+VでExcelにコピッペしてしまいがちですが、そうするとこうなってしまいます↓

レイアウトがぶっ壊れてしまい、見るも無残な状態です。今回はこれを何とかしようって事で作ってみた。
GetTables
以下コピッペでOK。
※Microsoft Word 1X.0 Object Libraryの参照設定必要なので追加してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
Sub GetTables() ' ダイアログボックス表示 Dim PDFFile As String Dim WSH As Variant Set WSH = CreateObject("WScript.Shell") ' 始まりはデスクトップ ChDir WSH.SpecialFolders("Desktop") ' pdfファイル、単一のみ PDFFile = Application.GetOpenFilename(FileFilter:="pdf ファイル (*.pdf), *.pdf", MultiSelect:=False) ' キャンセルされた場合 If VarType(PDFFile) = vbBoolean Then Exit Sub End If '現在のExcelのアクティブセル座標を取得しておく Dim wsActive As Worksheet Set wsActive = ActiveSheet Dim nRctiveRow As Long Dim nActiveCol As Long nRctiveRow = ActiveCell.Row nActiveCol = ActiveCell.Column ' Word起動 Dim objApp As Object Dim objDoc As Word.Document Set objApp = CreateObject("Word.Application") Application.DisplayAlerts = False ' 非表示 objApp.Visible = False Set objDoc = objApp.Documents.Open(PDFFile) Dim nPasteCnt As Long Dim objTable As Table nPasteCnt = objDoc.Tables.Count ' テーブルが複数存在する場合 If nPasteCnt > 1 Then Dim vbRet As Integer vbRet = MsgBox("テーブルが複数存在します。全て抽出しますか?", vbYesNo + vbExclamation, "確認") ' Noの場合は最初の一つだけ If vbRet = vbNo Then nPasteCnt = 1 End If End If Dim nTableCnt As Long Dim nRowCnt As Long Dim nColCnt As Long Dim nAllRowCnt As Long For nTableCnt = 1 To nPasteCnt ' テーブルセット Set objTable = objDoc.Tables(nTableCnt) For nRowCnt = 1 To objTable.Rows.Count For nColCnt = 1 To objTable.Columns.Count wsActive.Cells(nRctiveRow + nRowCnt - 1 + nAllRowCnt, nActiveCol + nColCnt - 1).Value = _ Replace(objTable.Cell(nRowCnt, nColCnt).Range.Text, Chr(7), "") Next nColCnt Next nRowCnt ' 複数テーブルの場合は1行開けて入力する nAllRowCnt = nAllRowCnt + nRowCnt Next nTableCnt ' 後処理 objDoc.Close objApp.Visible = False Set objApp = Nothing Application.DisplayAlerts = True End Sub |
PDFだろうと強制的にWORDで開くのがポイント。WORDで開く事でTablesによりテーブルだけぶち抜けるので綺麗にデータだけ持ってこれます。
複数テーブル有る時は、全部抽出するかメッセージを出し、NOなら最初の表のみ抽出。YESの場合は表と表の間を1行開けて抽出していきます。
実際の動き
複数テーブルはこんな感じ↓ テーブルが一個だけならダイアログは出ずそのまま抽出されます。

後はこれを個人用マクロブックにでも忍ばせておけば、いつどんなExcelを開いている時でも呼び出せるようになるのでかなり便利なハズ。是非ご活用ください~(ᵔᴥᵔ)
コメント