PDFのデータを読んでいるとき、そのテキストを一覧にしたいときがあります。
このときマウスで範囲指定してコピーし、エクセルへ貼り付けしていくことになることが多いです。
しかしテキスト情報が多いPDFの場合、この作業は時間がかかる上にとても面倒くさいです。
またコピー箇所を間違えて、抜けや漏れがあったりすることもあります。
そこでこのページではVBAを使ってPDFのテキスト情報を取得し、エクセルへ一覧にする方法を紹介します。
・PDFのテキスト情報をXMLを再帰的に処理して取得するプログラムを解説
・VBA入りのエクセルファイルをダウンロード可能
それでは以下で詳しく紹介していきます。
目次
- 1 VBAでPDFのテキスト情報を取得しエクセルに書き出し一覧にする
- 2 VBA入りのエクセルファイルをダウンロード
- 3 VBA作成前の事前準備
- 4 VBAのプログラムソース解説
- 4.1 プログラム0|変数宣言の指定
- 4.2 プログラムA-1|プログラム開始
- 4.3 プログラムA-2|シート設定
- 4.4 プログラムA-3|セルB1の値をpathとして取得
- 4.5 プログラムA-4|プログラムBを実行
- 4.6 プログラムA-5|プログラムCを実行
- 4.7 プログラムA-6|FileSystemObjectの設定
- 4.8 プログラムA-7|xmlpathを削除
- 4.9 プログラムA-8|プログラム終了
- 4.10 プログラムB|PDFをXMLファイルに変換
- 4.11 プログラムC-1|プログラム開始
- 4.12 プログラムC-2|MSXMLオブジェクトを生成
- 4.13 プログラムC-3|非同期処理に対応しない
- 4.14 プログラムC-4|xmlファイルをロード
- 4.15 プログラムC-5|ロード失敗した場合、メッセージ表示してプログラム終了
- 4.16 プログラムC-6|プログラムDを実行
- 4.17 プログラムC-7|プログラム終了
- 4.18 プログラムD-1|プログラム開始
- 4.19 プログラムD-2|objxmlの要素をFor Eachで順番に処理
- 4.20 プログラムD-3|objChildxmlに子要素があれば、プログラムDを再帰的に実行
- 4.21 プログラムD-4|objChildxmlに子要素がなければ、エクセルにテキストを書き出す
- 4.22 プログラムD-5|プログラム終了
- 5 Excel VBAについて詳しく理解したいなら
VBAでPDFのテキスト情報を取得しエクセルに書き出し一覧にする
VBAでPDFを操作して、PDFのテキスト情報をエクセルに出力します。
このプログラムの使用手順は以下のとおりです。
手順1. セルB1にPDFのフルパスを入力
手順2. VBAプログラムを実行
以下で使い方の手順を紹介します。
手順1. セルB1にPDFのフルパスを入力
上記のようにセルB1にテキストを取得したいPDFのファイルパスを取得します。
ここで指定したPDFのテキストをエクセルに書き出します。
手順2. VBAプログラムを実行
VBAを実行するとエクセルにPDFのテキスト情報を出力します。
A列にテキスト番号、B列にテキストを書き出します。
上記の画像では280行目までテキストを出力していますが、およそ10秒程度で処理は終わります。
これはお使いのPCの仕様によるかと思いますので、参考情報です。
不要なテキスト情報は手動で削除
ここではXMLファイルからテキスト情報を抽出しています。
そのためXMLファイルのヘッダー情報に保存されているテキストも出力されます。
上記の画像のように、不要なヘッダー情報が出力されているのが分かります。
これらに関しては、手入力で削除せざるを得ません。
ボタンにVBAプログラムを登録
上記の画像では、VBAプログラムをボタンに登録しています。
ボタンにVBAプログラムを登録することで、ボタンを押下しプログラムを実行することができます。
ボタンをVBAプログラムを設定したい場合は、以下で動画も交えて設定方法を紹介しているので、そちらをご覧ください。
VBA入りのエクセルファイルをダウンロード
以下で紹介しているVBAプログラムをそのまま使いたい人は、以下のフォームからダウンロードできます。
登録したメールアドレスへ「VBAプログラムが含まれたエクセル」を送信します。
本プログラムの内容をそのまま使用可能です。ぜひお仕事にお役立てください。
それでは、以下でプログラムについて詳細を説明します。
VBA作成前の事前準備
ExcelでVBAを使うためにはいくつかの準備が必要です。
具体的には以下です。
準備2. 「Microsoft XML v6.0」の参照設定を変更
準備3. フォルダを扱うための事前準備
準備4. 「Acrobat」の参照設定を変更
上記に関して、以下で説明します。
準備1. ExcelでVBAを使うための事前準備
エクセルVBAを使うためには、保存ファイルの拡張子変更、Excelの基本設定変更の2つをしておきます。
2つともで難しい作業はなく、それぞれ1分もあれば設定変更可能です。
上記に関しては、以下の記事で解説をしています。
もしVBAを使うための準備段階に不安がある人は上記をご覧ください。
この内容は以下の動画で紹介しています。
入門エクセルマクロの使い方|マクロ作成から実行までを徹底解説
文字や画像だけで分かりづらい人は上記の動画をご覧ください。
準備2. 「Microsoft XML v6.0」の参照設定を変更
エクセルVBAでXML情報を取得するために、VBAの設定を変更しておく必要があります。
実はVBAのデフォルト設定の場合、メール送信操作はできません。
参照設定を変更することで、HTTPリクエスト通信とHTMLの解析が可能になります。
参照設定の変更手順は以下のとおりです。
手順2. 「参照設定」を選択
手順3. 「Microsoft XML v6.0」にチェックを入れる
手順4. OKをクリック
手順を以下で説明します。
上記の設定をしていないと、本事例で紹介しているプログラムは動作しません。必ずチェックを入れるようにします。
それでは、以下でプログラムについて詳細を説明します。
準備3. フォルダを扱うための事前準備
この事例ではフォルダを操作するために、FileSystemObjectを活用します。
FileSystemObjectを使用する場合、VBAの参照設定を変更しておく必要があります。参照設定とは、機能拡張させることです。
FileSystemObjectを使用するために以下の参照設定を変更します。
これでフォルダやファイルの情報を取得することができるようになります。
設定方法の詳細は以下のページで紹介しています。
準備4. 「Acrobat」の参照設定を変更
Adobe Acrobatを使用するためには、VBAの参照設定を以下のとおり変更します。
これでAdobe Acrobatを使ってPDF操作が可能になります。
設定方法の詳細は以下のページで紹介しています。
注意|Acrobat操作には、Acrobat Proを利用する必要がある
使用するパソコンにAcrobat Readerしか含まれていなかったとしたら、VBAでPDF操作はできません。
このページで紹介するPDF操作には、Adobe Acrobat Proを購入しておく必要があります。参照設定で、Acrobatをチェックできないならば、Acrobat Proに登録されていないことを意味しています。
したがって、こちらからAcrobat Proを試すことができます。
なお、Acrobat Standardでも可能かも思われますが、検証しておりません。
VBAのプログラムソース解説
今回紹介するプログラムの概要は以下です。
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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
'プログラム0|変数設定の指定 Option Explicit 'プログラムA-1|プログラム開始 Sub GetPDFText() 'プログラムA-2|シート設定 Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("Sheet1") 'プログラムA-3|セルB1の値をpathとして取得 Dim path As String path = ws.Range("B1").Value 'プログラムA-4|プログラムBを実行 Dim xmlpath As String xmlpath = ConvertXml(path) 'プログラムA-5|プログラムCを実行 Call XmlParse(xmlpath, ws) 'プログラムA-6|FileSystemObjectの設定 Dim fs As FileSystemObject Set fs = New Scripting.FileSystemObject 'プログラムA-7|xmlpathを削除 fs.DeleteFile (xmlpath) 'プログラムA-8|プログラム終了 End Sub 'プログラムB-1|プログラム開始 Function ConvertXml(path) 'プログラムB-2|Acrobatアプリケーションを起動 Dim objAcroApp As New Acrobat.AcroApp objAcroApp.Show 'プログラムB-3|AcrobatでPDFを開く Dim objAcroAVDoc As New Acrobat.AcroAVDoc Set objAcroAVDoc = New Acrobat.AcroAVDoc objAcroAVDoc.Open path, "" 'プログラムB-4|PDFの情報を取得 Dim objAcroPDDoc As Acrobat.AcroPDDoc Set objAcroPDDoc = objAcroAVDoc.GetPDDoc() 'プログラムB-5|JavaScriptオブジェクトを作成 Dim js As Object Set js = objAcroPDDoc.GetJSObject 'プログラムB-6|PDFをxmlファイルに変換 Dim savename As String savename = Replace(path, "pdf", "xml") js.SaveAs savename, "com.adobe.acrobat.xml-1-00" 'プログラムB-7|PDFファイルを変更無しで閉じる objAcroAVDoc.Close (1) 'プログラムB-8|Acrobatアプリケーションを終了 objAcroApp.Exit 'プログラムB-9|オブジェクト解放 Set js = Nothing Set objAcroPDDoc = Nothing Set objAcroAVDoc = Nothing Set objAcroApp = Nothing 'プログラムB-10|Funtionプロシージャの戻り値を設定 ConvertXml = savename 'プログラムB-11|プログラム終了 End Function 'プログラムC-1|プログラム開始 Sub XmlParse(xmlpath, ws) 'プログラムC-2|MSXMLオブジェクトを生成 Dim XMLDocument As MSXML2.DOMDocument60 Set XMLDocument = New MSXML2.DOMDocument60 'プログラムC-3|非同期処理に対応しない XMLDocument.async = False 'プログラムC-4|xmlファイルをロード XMLDocument.Load (xmlpath) 'プログラムC-5|ロード失敗した場合、メッセージ表示してプログラム終了 Dim strMsg As String If XMLDocument.parseError.ErrorCode <> 0 Then strMsg = XMLDocument.parseError.reason 'エラー内容を出力 MsgBox "ロードに失敗しました・・・" & vbCrLf & vbCrLf & strMsg, vbCritical Exit Sub End If 'プログラムC-6|プログラムDを実行 Call GetChildNodes(XMLDocument.ChildNodes, ws, 3) 'プログラムC-7|プログラム終了 End Sub 'プログラムD-1|プログラム開始 Sub GetChildNodes(objxml, ws, i) 'プログラムD-2|objxmlの要素をFor Eachで順番に処理 Dim objChildxml As Object For Each objChildxml In objxml 'プログラムD-3|objChildxmlに子要素があれば、プログラムDを再帰的に実行 If objChildxml.HasChildNodes = True Then Call GetChildNodes(objChildxml.ChildNodes, ws, i) 'プログラムD-4|objChildxmlに子要素がなければ、エクセルにテキストを書き出す Else If Not objChildxml.Text = "" Then ws.Range("A1").Offset(i, 0).Value = i - 2 ws.Range("B1").Offset(i, 0).Value = objChildxml.Text i = i + 1 End If End If Next 'プログラムD-5|プログラム終了 End Sub |
それでは、以下でプログラムを詳しく説明していきます。
プログラム0|変数宣言の指定
1 |
Option Explicit |
「Option Explicit」とは、変数宣言を強制するためのものです。
予期しないエラーを防止できるため「Option Explicit」を入力することを習慣化することを推奨しています。
詳しい説明は以下のページで紹介しています。
また変数については、以下のページで紹介しています。
プログラムA-1|プログラム開始
1 |
Sub GetPDFText() |
「Sub GetPDFText()」のプログラムを開始することを意味します。
VBAではプロシージャという単位でプログラムを呼び出します。
プロシージャの構文は下記となっています。
1 2 3 |
Sub プロシージャ名() '実行プログラム End Sub |
「Sub」で始まり「End Sub」で終わります。
プロシージャに関連するmoduleの話については以下で説明しています。
プログラムA-2|シート設定
1 2 |
Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("Sheet1") |
「Sheet1」をwsとして設定します。
なお「ThisWorkbook」を付けることで、VBAプログラムが含まれるエクセルファイルの「Sheet1」を細かく指定しています。
プログラムA-3|セルB1の値をpathとして取得
1 2 |
Dim path As String path = ws.Range("B1").Value |
変数pathを文字列型で設定し、セルB1の値をpathとして取得します。
Debug.Printでの検証結果
1 2 3 4 5 6 |
Dim path As String path = ws.Range("B1").Value Debug.Print path >>>D:\Website_パソコンスキルの教科書\307_VBA_PDF_10\13_PDFToText\VBA\副業・兼業のガイドライン.pdf |
上記のとおりpathでフルパスを取得できていることが分かります。
プログラムA-4|プログラムBを実行
1 2 |
Dim xmlpath As String xmlpath = ConvertXml(path) |
xmlpathを文字列型で変数設定し、プログラムB「Funtion ConvertXml(path)」を実行します。
「Funtion ConvertXml(path)」を実行後に、その戻り値をxmlpathとして取得します。
xmlpathはプログラムBを実行後に、値が格納されます。
プログラムBで説明していますが、このxmlpathはプログラムB-10のとおりsavename(プログラムB-6で設定)の値を返ってきます。
Debug.Printでの検証結果
1 2 3 4 5 6 |
Dim xmlpath As String xmlpath = ConvertXml(path) Debug.Print xmlpath >>>D:\Website_パソコンスキルの教科書\307_VBA_PDF_10\13_PDFToText\VBA\副業・兼業のガイドライン.xml |
これでxmlpathに、PDFをxmlに変換したファイルパスを取得できていることが分かります。
プログラムA-5|プログラムCを実行
1 |
Call XmlParse(xmlpath, ws) |
プログラムCを実行します。
このとき引数として、プログラム4で取得したxmlpath(xmlファイルのファイルパス)とws(Sheet1)を渡します。
プログラムA-6|FileSystemObjectの設定
1 2 |
Dim fs As FileSystemObject Set fs = New Scripting.FileSystemObject |
FileSystemObjectは、ファイルやフォルダを操作するときに使うオブジェクトです。
本事例ではFileSystemObjectをfsという変数として扱います。
変数fsは定義するだけではなく、「Set fs = New Scripting.FileSystemObject」と記入して使えるようになります。
これを忘れてしまうことが多いので、注意が必要です。
FileSystemObjectに関する注意点
参照設定にて、Microsoft Scripting Runtimeを設定に入れておく必要があります。
設定を忘れると動作しませんので、事前に設定を変更しておく必要があります。
なお、FileSystemObject以外にもフォルダを操作する方法はあります。しかしFileSystemObjectを使えば、ファイルとフォルダを両方操作できるので、覚えることが少なくて済みます。
細かいことを覚えるのが面倒な人は、ファイルやフォルダを操作するときはFileSystemObjectを使うと覚えておくといいです。
FileSystemObjectについては以下で詳しく説明していますので、ご覧ください。
プログラムA-7|xmlpathを削除
1 |
fs.DeleteFile (xmlpath) |
この時点でxmlファイルの解析は終了しているため、ファイル削除します。
FileSystemObjectのDeleteFileメソッドを使ってxmlファイル(xmlpath)のファイルを削除します。
プログラムA-8|プログラム終了
1 |
End Sub |
これでプログラムAは終了です。
プログラムB|PDFをXMLファイルに変換
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 |
'プログラムB-1|プログラム開始 Function ConvertXml(path) 'プログラムB-2|Acrobatアプリケーションを起動 Dim objAcroApp As New Acrobat.AcroApp objAcroApp.Show 'プログラムB-3|AcrobatでPDFを開く Dim objAcroAVDoc As New Acrobat.AcroAVDoc Set objAcroAVDoc = New Acrobat.AcroAVDoc objAcroAVDoc.Open path, "" 'プログラムB-4|PDFの情報を取得 Dim objAcroPDDoc As Acrobat.AcroPDDoc Set objAcroPDDoc = objAcroAVDoc.GetPDDoc() 'プログラムB-5|JavaScriptオブジェクトを作成 Dim js As Object Set js = objAcroPDDoc.GetJSObject 'プログラムB-6|PDFをxmlファイルに変換 Dim savename As String savename = Replace(path, "pdf", "xml") js.SaveAs savename, "com.adobe.acrobat.xml-1-00" 'プログラムB-7|PDFファイルを変更無しで閉じる objAcroAVDoc.Close (1) 'プログラムB-8|Acrobatアプリケーションを終了 objAcroApp.Exit 'プログラムB-9|オブジェクト解放 Set js = Nothing Set objAcroPDDoc = Nothing Set objAcroAVDoc = Nothing Set objAcroApp = Nothing 'プログラムB-10|Funtionプロシージャの戻り値を設定 ConvertXml = savename 'プログラムB-11|プログラム終了 End Function |
プログラムB(B-1~B-11)でpathで指定したPDFをxmlファイルに変換します。
こちらは以下のページで詳しく説明しています。
プログラムC-1|プログラム開始
1 |
Sub XmlParse(xmlpath, ws) |
Subプロシージャ「XmlParse」のプログラムの開始を表します。
引数としてxmlpathとwsを受け取ります。
2. ws:プログラムA-2で設定したシート
上記の引数を受け取って、プログラムCで使用します。
プログラムC-2|MSXMLオブジェクトを生成
1 2 |
Dim XMLDocument As MSXML2.DOMDocument60 Set XMLDocument = New MSXML2.DOMDocument60 |
MSXMLオブジェクトを生成します。
なお実行には「Microsoft XML, v6.0」の参照設定にチェックしておきます。
そうしないとエラーが発生します。
プログラムC-3|非同期処理に対応しない
1 |
XMLDocument.async = False |
VBAは非同期処理に対応していないので、async = Falseとします
「async = False」は読み込み終了後、次の処理をします(同期処理)
「async = True」は、読み込みが終わらなくても、次のステップへ(非同期処理)行きます。
プログラムC-4|xmlファイルをロード
1 |
XMLDocument.Load (xmlpath) |
xmlpathで指定したxmlファイルをXMLとして読み込みます。
XMLDocumentの最初の200文字を検証してみます。
Debug.Printでの検証結果
1 2 3 4 5 6 7 8 9 10 |
XMLDocument.Load (xmlpath) Debug.Print Mid(XMLDocument.XML, 1, 200) >>><?xml version="1.0"?> >>><!-- Created from PDF via Acrobat SaveAsXML --> >>><!-- Mapping Table version: 28-February-2003 --> >>><TaggedPDF-doc> >>> <?xpacket begin='?' id='W5M0MpCehiHzreSzNTczkc9d'?> >>> <?xpac |
これでxmlファイルを読み込むことができていることが分かります。
プログラムC-5|ロード失敗した場合、メッセージ表示してプログラム終了
1 2 3 4 5 6 |
Dim strMsg As String If XMLDocument.parseError.ErrorCode <> 0 Then strMsg = XMLDocument.parseError.reason 'エラー内容を出力 MsgBox "ロードに失敗しました・・・" & vbCrLf & vbCrLf & strMsg, vbCritical Exit Sub End If |
xmlの読み込みに失敗したら、メッセージを表示してプログラムを終了させます。
またエラー内容もsetMsgとして取得し、
メッセージ表示に関しては、以下で詳しく説明しています。
プログラムC-6|プログラムDを実行
1 |
Call GetChildNodes(XMLDocument.ChildNodes, ws, 3) |
3つの引数を渡して、プログラムDを実行します。
2. ws:プログラムA-2で設定したシート
3. 3:シートに書き出す行数
上記の3つを渡します。
プログラムC-7|プログラム終了
1 |
End Sub |
プログラムC-1と対になるプログラムです。プログラム終了させる記載です。
「End Sub」を読み込むと、プログラムが終了します。
プログラムD-1|プログラム開始
1 |
Sub GetChildNodes(objxml, ws, i) |
プログラムDはXMLの要素に含まれる子要素を再帰的に処理するためのものです。
つまりobjxmlとして受け取ったXMLの各要素に子要素があれば、子要素がなくなるまで処理を繰り返します。
再帰的に処理する理由
このプログラムでは、XMLの要素に含まれる子要素をチェックしていく流れにしています。
その理由は、テキストを重複なく取得するためです。
XMLは性質上、子要素が親要素の一部になっています。そのため、子要素に含まれるテキストは親要素にも含まれます。
つまり親要素と子要素を両方取得すると、同じテキストを2回取得してしまいます。
そうなると、エクセルに同じテキストが2回以上を書き出されてしまいます。
それを防ぐために、子要素がない末端要素であり、かつテキストが含まれていれば、エクセルにテキストを書き出す流れにしています。
こうすることで、重複したテキストがエクセルに書き出されないようにしています。
引数として取得する3つの要素
以下の3つの要素を受け取ります。
2. ws:プログラムA-2で設定したシート
3. i:シートに書き出す行数
これらの要素を受け取って、プログラムD-2以降の処理を行っていきます。
プログラムD-2|objxmlの要素をFor Eachで順番に処理
1 2 |
Dim objChildxml As Object For Each objChildxml In objxml |
objChildxmlをObject型の変数として設定します。
そして、プログラムD-1で取得したobjxmlの子要素をobjChildxmlとして一つずつ処理を行います。
プログラムD-3|objChildxmlに子要素があれば、プログラムDを再帰的に実行
1 2 |
If objChildxml.HasChildNodes = True Then Call GetChildNodes(objChildxml.ChildNodes, ws, i) |
objChildxml(objxmlの子要素)が、さらに子要素を持っていれば、プログラムD(GetChildNodes)を実行します。
「xmlドキュメントオブジェクト.HasChildNodes」で子要素を持っているかどうかをBoolean型で判定できます。
Trueであれば、子要素を持っているとなります。
引数として取得する3つの要素
以下の3つの要素を受け取ります。
2. ws:プログラムA-2で設定したシート
3. i:シートに書き出す行数
これらの要素を渡して、プログラムD-1を再帰的に処理させます。
プログラムD-4|objChildxmlに子要素がなければ、エクセルにテキストを書き出す
1 2 3 4 5 6 7 8 |
Else If Not objChildxml.Text = "" Then ws.Range("A1").Offset(i, 0).Value = i - 2 ws.Range("B1").Offset(i, 0).Value = objChildxml.Text i = i + 1 End If End If Next |
ElseはプログラムD-3が実行されないときを表します。
したがってプログラムD-4はobjChildxml(objxmlの子要素)が子要素を持っていない場合に実行されます。
「objChildxml.Text」で子要素のテキストを取得できます。
「If Not objChildxml.Text = “” Then」で、テキストが含まれている場合のみ、エクセルに書き出すようにします。
A列には番号、B列にはテキストをそれぞれ出力します。
i=i+1でエクセルに出力する行数をカウントアップします。
プログラムD-5|プログラム終了
1 |
End Sub |
プログラムD-1と対になるプログラムです。プログラム終了させる記載です。
「End Sub」を読み込むと、プログラムが終了します。
プログラムの解説はここまでです。
Excel VBAについて詳しく理解したいなら
上記は、私が実際にVBAを活用して効率化してきた事例を紹介しています。
VBAを活用すると、仕事を効率化できる幅を広げることができます。
Excel VBAで出来ることは動画でも解説
動画でも解説しています。
エクセルマクロVBAで出来ることを15の事例で紹介|日常業務をラクにするヒントを見つけよう!
(音声が小さいので、ボリュームを上げてご覧いただければと思います)
VBAの勉強方法
私はプログラミング初心者からVBAを勉強を始めて少しずつレベルアップしていきました。
成長の過程は以下で紹介しています。
学習の過程では、意識すべきポイントがあります。
特に独学の場合だと、勉強を優先してしまい、肝心な実践を疎かにしがちです。
私の経験では、実践から逆算した勉強が必要だと考えています。
目指すべきは会社でお金をもらいながら勉強することです。
要はVBAを仕事の一つとして上司に認めてもらうのです。
そうすればわざわざ高いお金を払って勉強をする必要がなくなります。
しかも作業を自動化して、会社やチームに貢献しつつ、自らのスキルアップできます。
そのために必要な考え方を以下で紹介しています。
とはいえ、プログラミング初心者でVBAについて知識ゼロの人もいるはずです。
いきなり会社でVBAで使うことさえ、とてつもなくハードルが高く見えてしまうものです。
その場合は、VBAの基本について学ぶ必要があります。
たとえば車の運転も慣れてしまえば、たいしたことではありません。
しかし教習所で運転の基本を学び、免許を取得することで、公道で運転できるようになります。
VBAも同じです。VBAに免許はありませんが、まずは基本を学ばないことには会社で使えるレベルにはなりません。
実際に私もプログラミング初心者のときは、動画を見たり書籍を読んだりして勉強しました。
今はオンラインの教材で無料で学習できるものも多いです。
上記のリンクでは、私の経験から勉強にオススメの教材を紹介しています。
興味がある人はご覧ください。