PDF表データ→Excel表に変換(縦一列にコピーされてしまう場合)

2021年9月29日

お仕事などでお客さんからPDFで資料が送られてきて、
そのデータを基に仕事を進める際に、そのデータをExcelに写して
作業を進める事は多いのではないでしょうか?

・PDF表のデータをコピー、Excelに貼付けたら、データが縦一列に貼付けされた
・PDF表データは1セルも空白が無い状態だ

今回は↑の条件に当てはまる場合は
マクロ(VBA)を使用して元の配置に戻します。
ソースコードは記事上に記載しております。
 

広告

『表のデータが縦一列に貼付けされる場合』とは具体的には

PDFの表_Excel表に転記_縦一列_1
PDF元データ表(左図)からExcel(右図)へデータを貼付けると縦一列に並ぶ場合

 
PDFの表部分をコピーして、Excelに貼り付けると、冒頭の画像のようになる場合です。
また再度注意点ですが、これからご紹介する方法では
【表がびっしり1セルも空白が無い場合にのみ】有効です。

空白がありますと、その部分はうまく表示されませんので、個別の対応(変換)が必要となります。空白が1~2か所程度ならば対応出来ると思いますが。

PDFの表_Excel表に転記_縦一列_2
PDF元データの表は、できるだけすべて埋まっている状態でないと厳しい。空白がある場合は、Excelに貼付けた縦一列に並んだデータに自分で仮データを打ち込む必要があります。

 
※PDF表のデータをコピー&貼付けした際に、
 表データが空白で区切られて表示されてしまう場合、
 そんな場合は、こちらの記事がお役に立てるかと思います。
ちなみに、空白で区切られている場合は、あらかじめ準備しておいた数式を使って分離します。
 

 
それでは話をもとに戻して今回の場合のVBAを見て参りましょう。
 

VBAでデータをExcelに一発変換

PDFの表_Excel表に転記_縦一列_6
この画面のExcelシートをもとに説明や作成したVBAソースコードを記載します

上の画面を参考にし、
以下、VBAソースコード例を記載しておりますが、コードは2通り準備しました。
いずれも
 ・セル【B6】にPDF元データを貼り付けて
 ・並び直したデータは【E6】を右上端として
データを処理する仕様です。詳しくはすぐ上の画像をご覧ください。
 

1.PDF元データの表が【何列あるのか】を手入力でコードに直入力

Option Explicit

Sub From_PDf_to_Excel()

'画面STOP
Application.ScreenUpdating = False

 Dim A As String
 Dim WB1 As Workbook
 Dim mySht1 As Worksheet
 Dim i, cnt1, EndLine1, EndLine2, PDFRows As Long
   
  A = "Test"
  Set mySht1 = ThisWorkbook.Worksheets(A)
  
'★1
If mySht1.Range("B6") <> "" Then
 
'最終行確認
  EndLine1 = mySht1.Range("B5").End(xlDown).Row
'PDFの列数入力
  PDFRows = ▲▲ '←ここにPDFの列数を入力する
  cnt1 = 6
  EndLine2 = 1

'データ転記
    For i = 6 To EndLine1
     mySht1.Cells(cnt1, 4 + EndLine2).Value = mySht1.Cells(i, 2).Value
     If EndLine2 < PDFRows Then
      EndLine2 = EndLine2 + 1
     Else
      EndLine2 = 1
      cnt1 = cnt1 + 1
     End If
    Next i
   
'★1終了
End If
 
'Restart Screen
 Application.ScreenUpdating = True
    
End Sub
PDFの表_Excel表に転記_縦一列_7

PDF資料のデータ表が何列あるか?を上のコードに
直接列数を入力してから、マクロを実行すると変換されます。
列数を入力する箇所は↑のソースコードの『22列目部分【▲▲】』箇所に
「?列」の「?」部分の数字のみを記入して、マクロ実行です。
 

ソースコードの内容

★もしも【B6】が空白でなければ以下の事を実行する
 ・【B6】から下に向かって入力されているデータを
 ・【E6】→【F6】…といった順で右に1つずつズレながら転記していき、
 ・コード中の【▲】のPDF元データ列数まで来たら、1列下にスライドし
 ・再度【E列】→【F列】…といった具合に1列ずつズレながら転記する。
 ・【B6】からのデータが無くなり次第、動作を終了する。

こんな感じのコードです
 

2.Excel任意のセルにPDFの列数を入力し、そこを参照するようなコード

Option Explicit

Sub From_PDf_to_Excel()

'画面STOP
Application.ScreenUpdating = False

 Dim A As String
 Dim WB1 As Workbook
 Dim mySht1 As Worksheet
 Dim i, cnt1, EndLine1, EndLine2, PDFRows As Long
   
  A = "Test"
  Set mySht1 = ThisWorkbook.Worksheets(A)  
  
'★1
If mySht1.Range("B6") <> "" And mySht1.Range("B2") <> "" Then

'最終行確認
  EndLine1 = mySht1.Range("B5").End(xlDown).Row
'PDFの列数確認
  PDFRows = mySht1.Range("B2").Value
  cnt1 = 6
  EndLine2 = 1

'データ転記
    For i = 6 To EndLine1
     mySht1.Cells(cnt1, 4 + EndLine2).Value = mySht1.Cells(i, 2).Value
     If EndLine2 < PDFRows Then
      EndLine2 = EndLine2 + 1
     Else
      EndLine2 = 1
      cnt1 = cnt1 + 1
     End If
    Next i

'★1終了
End If

'Restart Screen
 Application.ScreenUpdating = True

End Sub

↑のソースコードではセル【B2】に「?列」の「?」部分の数字のみを記入して、
マクロ実行!といった具合です。具体的には↓の画像を参考にしてください。
 

PDFの表_Excel表に転記_縦一列_4
PDFの表_Excel表に転記_縦一列_5

コードの内容的なお話で、どんな指示がなされているかと申しますと、
 

ソースコードの内容

★もしも【B6】と【B2】が空白でなければ以下の事を実行する
 ・【B6】から下に向かって入力されているデータを
 ・【E6】→【F6】…といった順で右に1つずつズレながら転記していき、
 ・【B2】のPDF元データの列数まで来たら、1列下にスライドし
 ・再度【E列】→【F列】…といった具合に1列ずつズレながら転記する。
 ・【B6】からのデータが無くなり次第、動作を終了する。

こんな感じのコードです。

基本的には1のモノと一緒です。
両方とも、もしも元データの記載がなければ
VBAでの処理が行われない仕様になっております。

以上になります。
いかがだったでしょうか?
解決出来て、業務の効率化、時短につながれば幸いです。

広告