タグ別アーカイブ: PDF
PDFファイルをエクセルに変換~虎の巻~
【VBAができるのなら、PDFのエクセル変換はPower Automate Desktopを活用しよう!】
企業向けの仕事をしていると「PDFからの転記」処理に苦しんでいるシーンをよく見ます
もちろん世の中には自動変換ソフトをありますが、無料での打ち手となるとPower Queryしかありません
但し、Power Queryだと複数ページへの対応が難しかったりします
実は、
あまり知られていないですが、無料のPower Automate Desktopであれば複数ページでもエクセルへの変換は自由自在です
この記事ではPower Automate Desktopからエクセルに変換する方法をVBAのテクニックも交えながら解説します
ポイント
今回のポイントは2つあります
1つにはPower Automate Desktopの「PDFからテキストを抽出」アクションを使用するだけでは駄目、ということです
このアクションを使えば、PDFからテキストを抜き出せます
但し、エクセルに書き込むと次のような形になります
1つのセルに収まってしまい、データとして活用できる形になりません
ですので、もう一つ工夫が必要です
2つ目は、1つ目のポイントの続きでもあるのですが、抽出したデータにルールを適用する必要がある、ということです
これはどういうことかというと、1つのセルに収まらないように工夫したとしても、抽出したデータは1列に収まります
つまり、PDFが複数ページある場合も1つの列に収まってしまうので、データとして活用するにはルールを見つけて分解する必要があります
この上記ポイント2つを踏まえた上で、本格的な解説に入ります
Power Automate Desktopによるデータ抽出
PDFからテキストを抽出・アクション
まずはこちらのアクションにより、PDFからデータ(テキスト)を抽出します
データを抽出するPDFファイルを指定した後、抽出するページを指定する欄があります
こちらはデフォルトの設定通り「すべて」を指定しておきましょう
テキストの分割
冒頭に記述したように「PDFからテキストを抽出・アクション」のみだと、データとして活用できません
ですので「テキストの分割」アクションにより、データを分割する必要があります
この時、区切り記号には「新しい行」を指定してください
ここがある意味、今回の記事での最大のポイントかもしれません
そうすれば、以下のように複数行に分割されます
VBAによる処理
キーワード
ここからはVBAにて、更にデータを実際に処理する形にできるように変換します
データの変換内容については、PDFの内容と使用目的次第なので詳細は今回の記事では書きませんが、最重要な内容だけ書きます
最重要の内容とは「キーワードの設定」です
例えば、今回の記事で使用しているPDFファイルの内容は複数の請求書です
ここから明細行のみを抽出したいとしたら、各PDFページにおける明細行の開始行と終了行が必要です
よく見ると、上の画像であれば、明細行は数量と小計の間に挟まっていることが分かります
正確には「数量」から始まる行の一つ下からと、「小計」から始まる行の一つ上までが明細行のスペースです
ですので、別シートに以下の画像のような表を作るのがいいです
こちらの表を上から読み込み、開始行と終了行を繰り返し取得すれば、複数ページ分の明細行が取得できることになります
実際のコードは次のような形になります
変数:iを使用して繰り返し処理を行うとしたら、条件式に合う行位置をそのまま変数:iで表現します
条件式については、LEFT関数で行の先頭の文字列を抽出して照合します
Split関数
こちらの関数はPDFを扱う時には良く使います
PDFからエクセルに変換すると、どうしても下のような形になるからです
1行の中にどうしても、複数のテキストが組み込まれてしまいます
ですので、こちらを分割する必要がでてきます
分割についてはSplit関数を使用します
詳細についてはこちらの記事⇒Split関数をご参照ください
VBAとの連携
VBAを作成したら、Power Automate Desktopから実行します
「Excelマクロの実行」アクションを使用し、下の画像のようにマクロ名を指定します
もし、引数を渡す必要がある場合にはマクロ名の後に;を指定し、その後に引数を指定します
<まとめ>
今回はPDFファイルをエクセルに変換する方法を紹介いたしました
Power Automate DesktopにてPDFファイルの内容をエクセルに落とし、更にPower Automate DesktopからVBAを動かすという流れになります
RPAとVBAが共存するところが、もしかしたら分かりにくかったかもしれません
ただRPAとVBAを共存させる方法は結構、便利ですのでこれを機会に取り組んでみるのもいいかもしれませんね
エクセルのような表をアプリで簡単に作成してPDF化する方法~ガッツの日記第11回
【エクセルでシート別にわざわざ表を作成しなくても、簡単に表は作成できるんです!】
先日、PDFでデータを送付するため、わざわざエクセルのシート別にデータを管理している事例をみました
確かに、エクセルだと罫線が入った表をきれいに作成できるので仕方ない部分もあります
ただPDFファイルを作成するためだけにデータを一元管理しないのはデメリットも大きいです
今回はPower Appsにてデータを一元管理しつつ、PDFファイルを「エクセルで作成したように」作成する方法を解説します
具体的にやりたい事
元データは下の画像のエクセル表になります
こちらをPower Appsでフィルターしながら、Galleryに表示します
合計金額は別途ラベルで計算しておきます
そして上記の内容をPDFで別途出力します
ポイント
Print関数
Power Appsにて、新しい画面をクリックすると「縦長で印刷」を選択できます
実際に「縦長で印刷」の画面を選択すると、「Print関数」が仕込まれた画面が設定されます
上の画像の「印刷」をクリックすると、PDFで画面を保存することができる画面に切り替わります
しかも「印刷」ボタン自体はPDF画面に反映されません
何故ならVisibleプロパティに以下の内容が仕込まれてるからです
ですので、戻るボタンを作成する場合には、印刷ボタンをコピーしてOnSelectプロパティを変えるか、Visibleプロパティを変えましょう!
CONCAT関数&HTML
前述のPrint関数でPower AppsからPDFファイルを作成する方法は解説しました
では、エクセルのような表形式はどのように行うのか?気になるところだと思います
こちらは、通常ではデータテーブル機能を使用する方法が一般的だとは思います
ところが、Power Appsのデータテーブルだとあまり「表」らしくありません
ですので、HTMLで表を作成します
表の可変行の箇所は、CONCAT関数を使うのも大きなポイントです
今回は、Galleryの内容をCONCAT関数で抽出します!
データ抽出画面の作成
前述のPrint関数はPDFを作成する出力画面で使用します
それとはまた別の画面を作成し、出力画面で使用するデータを抽出できるようにします
こちらは「具体的にやりたい事」で前述した内容ですので、割愛させて頂きます
HTML
今回の内容はPrint関数で出力するのもポイントなのですが、HTMLで出力するところが最大のポイントとなります
特に行数が可変になるGalleryの内容をCONCAT関数を通じてHTMLで表現するところが難所です
基本構文
専門的な事は、専門サイトの方をご参照して頂きたいのですが、基本的な内容だけは紹介したいと思います
今回使用したHTMLをメモ帳で添付したので、そちらを修正して使いまわすことも十分可能だと思います
構文は大きく分けて3つに分かれます
1.普遍的なHTMLの内容の宣言、2.テーブルの構造の指定、3.見出し・行列の内容の指定
1.の普遍的な内容(”<!DOCTYPE html>~<body>)についてはここでは割愛させて頂きます
2.のテーブルの構造の指定については以下のように指定します
<table border=1 cellspacing=0 cellpadding=10 width=700 table style=font-size:15pt;>
「tablre border=1~cellspacing=0」で一般的な罫線を指定しています
そして、widthで表の幅、font-sizeでフォントサイズを指定しています
3.の見出し・行列の内容の指定については、見出しから解説します
<tr>
<th width=25%>日付</th>
<th width=25%>商品</th>
<th width=25%>客先</th>
<th width=25%>売上金額</th>
</tr>
<tr>で始まり、</tr>で終了するのですが、<th>~</th>内に各見出しを指定します
widthは列幅の指定になります
次に一番肝心の行列の指定です
こちらは前述のようにCONCAT関数で指定します
引数は2つになるのですが、第一引数はGalleryの内容になります
Gallery1.AllItemsを第一引数にすることで第二引数内で、ThisRecordによりGalleryの内容をHTML内に抽出することができます
次に、行列の内容ですが、こちらは見た目は小難しそうですが、<tr>と<td>の出現位置に注目して頂くとかなりシンプルなのがお分かりいただけると思います
まず、<tr>で1行目が始まり、各列が<td>で始まります
ここで、ルールが1つあるのですが、</~>で終了します
繰り返しになりますが、<tr>と<td>の出現位置に注目すれば、かなりシンプルに行列が表現できます
それでは、
ここまでで基本的な内容が指定できたと思います
ここから応用ですが、空白行を追加します
空白行は「” ”」で表現します
“<tr><td>” & “ ” & “</td><td>” & “ ” & “</td><td>” & “ ”& “</td><td>” & “ ”
更に合計行は「” ”」を交えながら表現します
& “</td><td>” & “ ” & “</td><td>” & “ ”& “</td><td align=right>” & Label_合計.Text & “</table>
これで、表を更にエクセルライクにすることができました
注意点
注意点は2つあります
1つは、HTMLはラベル内に記述するのではない点です
記述は下の画像のHTMLテキスト内で行います
次に注意点の2点目です
記述するHTMLはあくまで文字列で指定します
ですので、”ではじまり”で終わります
途中でも「文字列」が成立するように”の位置と&の位置には注意する必要があります
上記の内容に注意すれば、エクセルライクな表をPDFファイル内に設定できるようになります
<まとめ>
今回は、Power Appsにてエクセルのような表をPDFファイルで出力する方法について解説しました
今回の紹介した仕組みを有効活用すれば、エクセルの過度なシート別の使用も減らすことができます
尚、
今回はHTMLについては簡単な内容だけ紹介しました
ぜひ、専門的なサイトの内容も参考にして頂きたいと存じます
個人的には「SAMURAI ENGINEER BLOG」様を参考にさせて頂きました
PDF変換の応用~フォルダに入れた複数PDFから都合良くデータを切り取る方法
今回はフォルダに入れた複数PDFファイルから、一部の箇所だけデータを一括で取得します
扱うPDFファイルには、以下の画像のように振込先のデータが含まれています
このPDFファイルから振込先のデータだけを取得します
しかもPDFファイルは複数あり、行数が可変になっています
この処理のポイントは大きく分けて2つあります
ポイント
サンプルファイルの変換
今回の処理で主に作業するのは「サンプルファイルの変換クエリ」になります
複数ファイルの1つを変換するクエリを修正して、複数ファイル全てに変換ルールを適用します
M関数の組み合わせ
過去の記事で、見出し位置が不規則な複数ファイルからデータを取得する方法を解説しました
この際、上の画像の見出しをキーにしてList.PositionOf関数とTable.RemoveFirstN関数の組み合わせ「見出しの上の行」を削除しました
今回も同じようにList.PositionOf関数とTable.RemoveFirstN関数の組み合わせを使用します
・List.PositionOf関数 ➡ 指定文字列のList内の位置を取得
・Table.RemoveFirstN関数 ➡ テーブルから指定行の上の行を削除
フォルダから一括取得
まずは複数PDFファイルが格納されたフォルダからデータを一括取得します
「Fileの結合」画面ではテーブルではなく全ページを指定します
キーの設定
エディタで「サンプルファイルの変換クエリ」を開くと次の画像のようになっています
上の画像の黄色く印をした箇所の「お振込先・・・」以降の行から「備考」の上の行までが今回の取得対象です
「お振込先」の文字列をキーに設定した上で以降の作業を進めます
キーの抽出
キーとなる文字列「お振込先」の4文字を、列の追加タブ内の「抽出」メニューを使用して切り取ります
すると下の画像のように「お振込先」の文字列が抽出した列ができます
この「お振込先」の文字列より上の行を次から削除します
その前にステップ名は分かり易く変更しておきましょう➡Data2
キーの上の行の削除
ここからM関数を使用します
まずカスタム列作成画面にて、List.PositionOf関数を入力して「お振込先」の文字列がある行を特定します
すると10という数字が入った列ができます
「お振込先」の文字列は11行目ですが、M言語は0からはじまるので正しく設定できています
ここからTable.RemoveFirstN関数で上の行を削除します(-1などの調整は必要ありません)
上の画像の数式を文字列にすると次の通りとなります
Table.RemoveFirstN(Data2,List.PositionOf(Data2[最初の文字],”お振込先”))
この数式を作る際には、ステップ名をテーブル名に使用するのもポイントとなります
下の画像が新たに作成されたテーブルになります
テーブルが複数ありますが、必要なのは一つだけですので「行の保持」で余分なテーブルは削除します
テーブル展開
ここから作成したテーブルの展開処理を行います
まずはテーブル以外の列を削除します
この後、必要な列だけ展開します
この時点で大分、形になってきました
なお、この時点で最終アウトプットを行うクエリでエラーが発生しています
これはサンプルファイルの変換クエリで元ある列を削除しているからです
このエラーは各列の型式を変更する最終ステップを削除すれば消えます
では、変換クエリに戻ります
ここからは最終調整です
最終調整
上の画像のように、空欄や「備考」などの文字をフィルターで取り除きます
この状態から行列を入れ替えます
ここからは列名を整えるのですが、お振込先の文字は「列の分割」メニューで切り取っておきましょう
では、最終アウトプットのクエリを見てみましょう
うまくデータが複数作成できています
<まとめ>
今回は複数PDFファイルのデータから、キーのデータより上にある行を削除して必要な箇所だけ抽出しました
M関数のList.PositionOf関数とTable.RemoveFirstN関数をうまく組み合わせれば、意外と簡単に行えます
今回は、抽出データの下にあるデータはフィルタしただけで済みましたが、実際には複雑なパターンもあるかもしれません
その際は過去記事で紹介した「インデックス列と余り、減算の算出」の組み合わせが有効かもしれません
あわせて覚えておいていただけると幸いです
POWER AUTOMATE DESKTOP逆引き辞典~PDF操作~
Microsoft社の無料RPA・Power Automate Desktopのアクションの中から、PDF操作のアクションを紹介します
➡逆引き辞典に戻る
PDFファイルから1ページの抽出
アクション名:新しいPDFファイルへのPDFファイルページの抽出
下のGIF画像では3ページが詰まっているPDFファイルから、2ページ目を抽出しています
*➡参考ページ
パラメーターの選択
PDFファイル
抽出するPDFファイルを設定します
ページ選択
抽出するページを設定します
抽出されたPDFファイルのパス
抽出した後のファイルを出力します
ファイルが存在する場合
3種類の方法を選択できます(1.上書き、2.上書きしない、3.連番を付ける)
サンプル
ファイルなどの設定が必要です
PDFファイルから1ページの抽出
複数ファイルを1ファイルに統合
アクション名:PDFファイルを統合
複数PDFファイルを1PDFファイルに統合します
このアクションを行う場合には、事前に下の画像のように「フォルダー内のファイルを取得」アクションにて複数ファイル名を取得して変数/Filesに格納しておきます
パラメーターの選択
PDFファイル
PDFファイルを指定した変数を設定します
統合されたPDFのパス
作成したPDFファイル名を設定します
ファイルが存在する場合
既にファイルがある場合には「上書き」「上書きしない」「連番を付ける」を設定できます
サンプル
フォルダなどの設定が必要です
複数PDFファイルの統合
RPAで複数PDFファイル➡1PDFファイル、1PDFファイル➡複数ファイル
RPAには底知れない「便利機能」があります
今回はエクセルVBAで作成したらかなり複雑になりそうな作業を、RPAの画面内で数回のクリックで行えるようにする方法を解説します
具体的にRPAで行う作業は次の内容です
・フォルダにある複数のPDFファイルを1つのPDFファイルに結合
・1つのPDFファイルを複数のPDFファイルに分解
使うRPAは無料でインストールできる「Power Automate Desktop」になります
複数PDF➡1PDFファイル
下の画像にあるように、1つのフォルダに3つのPDFファイルが格納されています
それぞれのPDFファイルの中味は、数字の番号になっています
これらの複数のPDFファイルを2つのアクションで結合します
ファイル名の取得
取得するファイルが格納されているフォルダ名を、こちらのアクションで指定します
複数ファイルの結合
結合先のファイル名などをこちらのアクションで指定します
ファイル名には、必ず拡張子「.pdf」を指定するのがポイントです
*結合先のPDFを事前に作成しておく必要はありません
実際のRPAシナリオの動き
2つのアクションからなるシナリオを実際に動かすと次のように動きます
*次のGIF画像はデバックモードで動いています(1つ1つのアクション内容を確認して動かす)
まず、1つ目のアクションでフォルダ内に格納されているPDFファイルのファイル名を取得します
その後の2つ目のアクションで予め指定されたPDFファイルに、取得したファイルの内容を結合します
下のGIF画像は結合したPDFファイルを開いた時の内容です
1PDFファイル➡複数PDFファイル
こちらは2パターン紹介します
1つ目は1PDFファイルのページ数が決まっているパターン
2つ目はページ数が分からない時のパターンです
ページ数が事前に分からない時には、超えようがないページ数を指定します
ページ数が決まっているパターン
こちらはページ数+1のアクション数でシナリオを作成できます
今回は、上記のRPAシナリオで結合したPDFファイルを使用します
こちらはPDF内に3ページがあるのが事前に分かっています
ここから設定するアクションの話しです
フォルダに格納されているファイル名を取得するのは、上記のRPAシナリオと一緒です
次に「新しいPDFファイルへのPDFファイルページの抽出」アクションにて「元ファイル名」「ページの選択」「出力ファイル名」の3つを指定します
上記の画像はページ選択と出力ファイル名を1で指定していますが、同じものを後2ページ分作成します
上記のRPAシナリオを動かすと次のようになります
ページ数が事前に分からない場合のパターン
この場合は、繰返し処理を使います
下の図のように繰返し処理をするアクション内で、終了値を100というあり得ない数字で設定しておきます
そして、Loop内に先ほど設定したアクションを今回は1つだけ配置します
こちらの「新しいPDFファイルへのPDFファイルページの抽出」内には変数を設定します
上の画像で黄色く印を付けた「%LoopIndex%」は繰返し処理内で動くカウンター変数です
こちらのカウンター変数は自動で繰り上がっていきますので、こちらを活用します
但し、上記のままだとエラーが途中で発生しますので、エラー対策を組み入れておきます
あまり望ましくはないですが、エラー対策を入れなくても動くことは動きます
<まとめ>
今回はMicrosoft社の無料RPAである「Power Automate Desktop」を使用して「PDFを結合・分解」するところを紹介しました
もちろんエクセルVBAなどでも同じ事はできますが、開発や修正を考えると段違いにRPAを使用した方が早いですね
これはもう、知っているか知っていないかで差が段違いにつく世界だと思います
業務削減の必要性を感じている人はぜひ、RPAを研究して見るといいと思います
Power Queryって何8???~PDFファイルをエクセルに変換~
こんにちは、Excellent仕事術のガッツ鶴岡です
この記事は、Power Queryというエクセルのスゴイ新機能をまだ知らない人向けに書いている記事です
「エクセルで大量のデータを扱っているけど、何とか作業を効率化したい」
「エクセルをぜひ得意分野にしたい」
という方はぜひページの最後までお付き合いください
ところで、読者の皆さんは、スマホを初めて操作した時にどんな印象をもちましたでしょうか?
「ネットでレストランを見つけてそのまま予約電話ができる!!」
「直観的で操作が分かり易い」
筆者はPower Queryを登場した時には同じぐらい、いや、それ以上の衝撃を受けました
今回は筆者が衝撃を受けたPower Queryの機能の一つ、PDFファイル内のデータをエクセルファイルにダウンロードする方法を、簡単に紹介していきたいと思います
ちなみに今回、紹介する内容は、今までPower Queryを使ったことが無い人でも取り組める内容になっています
本題に入る前に、サンプルで使用するPDFの中味について紹介させてください
サンプルのPDFファイルは2ページに分かれており、以下のように2ページ内に3つの表があります
・1ページ目⇒2つの表データ
・2ページ目⇒1つの表データ
今回の解説では、PDFファイルのデータをまるごとエクセルシートにダウンロード(読込)するのではなく、ファイル内の3つの表をそれぞれ3つのエクセルシートにダウンロードします!
それでは、本格的な操作について解説を始めます
解説に使用するPDFファイルはぜひ、事前にダウンロードしておいてください
サンプルPDFファイル
目次
1.PDFファイルを指定
データタブの「データ取得」から「ファイルから」⇒「PDFから」を指定します
次にファイル自体を指定します
取得するファイルを指定すると、2.で解説する「ナビゲーター画面」が開きます
(注)もし、「PDFから」のボタンが無い場合
2.読込む対象データを指定
PDFのデータをPower Queryで取得する場合には、2つの方法を選択できます
・PDFのページ全部を取得する
・ページ内のテーブルデータ(表データ)を取得する
上の2つの方法の選択は、取得するファイルを指定した後に開く、この「ナビゲーター画面」で行います
ナビゲーター画面では、ページ単位やテーブルデータ単位にて、取得するものを取捨選択することもできます
ナビゲーター画面では、左側にリストで表示される各Table(テーブルデータ)、もしくは各ページの内容を、下のGIFのように確認することができます
実際に取得する内容を決めたら、ナビゲーター画面の左上「複数のアイテムの選択」にチェックを入れた上で、取得対象にもチェックを入れます
今回の解説では、下の画像のように3つのTable(表データ)にチェックを入れます
3.ダウンロード
取得対象データをナビゲーター画面で3つ指定しましたので、今度はダウンロード先を指定します
ナビゲーター画面下の「読み込みボタン」の横にある▼ボタンをクリックし、クリック後に表示された「読み込み先」のテキストをクリックします
「読み込み先」のテキストをクリックした後は実際の読込先、つまりダウンロード先を指定する画面が開きます
この解説では、読込先を指定する画面にて「テーブル」「新規ワークシート」の2つを指定します
この読込先の指定については、詳細な内容を解説した記事がありますので、そちらを参照してください
読込先として既存シートに読込を行ったり、ピボットテーブルで出力することも可能です
ここまで行えば、PDF内にあった3つの表データが下のGIFのように、3つのエクセルシートに分かれてダウンロードされています
ちなみに画面右に「クエリ」というものが3つできていますが、これはスマホ内のブックマークのようなものだと思ってください
4.「PDFから」のボタンが無い場合
バージョンによっては「PDFから」のボタンが出てきません