VBAでできることとは?毎日のエクセル作業を自動化する方法3選

毎日同じようなエクセル作業を手作業で繰り返していませんか?
「写真を1枚ずつ貼り付けて、サイズを調整して、位置を整える。」「別シートのデータをコピーして、貼り付けて、また別のシートにコピーして……」
こういったルーティーン作業に、毎日30分以上費やしているという方はとても多いと思います。
私も会社員の頃、与えられた仕事をひたすら手作業で処理していました。
VBAを使えば、このような機械的な繰り返し作業はすべて自動化することができます。
ボタンをクリックするだけで、数十枚の写真の貼り付け・整列、複数シートへのデータ転記、図形の操作まで、一瞬で処理することが可能です。
この記事では「VBAでできること」をテーマに、プログラミング未経験だった私が独学でマスターし、年間50件以上のマクロ開発を受注するまでに活用してきたVBAの実例を紹介していきます。
コードを交えながら丁寧に解説するので、VBAをはじめて学ぶ方でも問題なく読み進めていただけます。
VBAとは何か?「人間が考えなくていい作業」はすべて自動化できる
VBAとは「Visual Basic for Applications」の略で、エクセルなどのMicrosoftOfficeに標準搭載されているプログラミング言語のことです。
難しい言葉が並んでいますが、要するに「エクセルを自動的に操作するプログラムを書くための言語」だと思ってください。
VBAでできることの本質は「機械的な処理の自動化」
私がVBAを学んできた経験から言えること、それは「人間が思考を伴わずにできる機械的な処理なら、VBAはほぼなんでも自動化できる」ということです。
「このデータを、この場所にコピーする」「この条件なら、この色をつける」「この写真を、このセルに貼り付ける」
こういった作業は、人間が何十回繰り返しても同じ結果になります。
結果が同じなら私たちの代わりにVBAにやらせればいいのです。
逆に言えば、「状況を判断して最適な答えを出す」という、思考が必要な作業はVBAには向いていません。
VBAは「ルールが決まっている繰り返し作業」を自動化するためのツールです。
VBAを使うとどのくらい時間が短縮できるか
たとえば、50枚の写真を手作業でエクセルに貼り付けるとしましょう。
1枚の処理に1分かかるとすれば、50分かかる計算になります。
VBAなら、このような処理はものの数秒で完了します。
毎日行うルーティーン作業に1時間かかっているとすれば、VBAを導入するだけで毎日1時間を丸ごと取り戻せるということになります。
私が受注するマクロ開発の案件でも「導入後に1日2〜3時間の作業削減に成功した」というお声をいただくことがとても多いです。
VBAでできること①|写真の貼り付けを完全自動化する
エクセルへの写真貼り付け作業は、私が受注するマクロ開発のなかでも特に依頼数が多い処理のひとつです。
「現場写真を報告書に貼る」「商品画像を台帳に貼り付ける」「検査写真を毎月まとめる」といった業務で、手作業による時間のロスが発生しています。
写真を自動で貼り付けるVBAの仕組み
写真の貼り付けVBAを使うと、「指定フォルダ内の画像を、指定したセルに順番に貼り付けていく」という処理を自動で行うことができます。
下記がそのサンプルコードです。
Sub 写真を自動貼り付け()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 画像ファイルが保存されているフォルダのパス
Dim folderPath As String
folderPath = "C:\Users\写真フォルダ\"
' フォルダ内の最初のファイルを取得
Dim fileName As String
fileName = Dir(folderPath & "*.jpg")
' 貼り付けを開始する行
Dim rowNum As Long
rowNum = 2
' フォルダ内の全ファイルをループ処理
Do While fileName <> ""
' セルの位置を取得
Dim targetCell As Range
Set targetCell = ws.Cells(rowNum, 2) ' B列に貼り付け
' 画像を挿入
Dim pic As Picture
Set pic = ws.Pictures.Insert(folderPath & fileName)
' 画像のサイズをセルに合わせる
With pic
.Left = targetCell.Left
.Top = targetCell.Top
.Width = targetCell.Width
.Height = targetCell.RowHeight
End With
' 次のファイルへ
fileName = Dir()
rowNum = rowNum + 1
Loop
MsgBox "写真の貼り付けが完了しました。", vbInformation
End Sub
コードの流れを説明します。
最初に folderPath という変数に、画像が保存されているフォルダのパスを指定しています。
Dir() 関数を使って、フォルダ内の.jpgファイルを1つずつ取得しています。
Do While のループで、ファイルが存在する間は処理を繰り返す仕組みです。
ws.Pictures.Insert で画像をシートに挿入し、その後の With ブロックでセルの位置とサイズに合わせて画像を整列させています。
このコードを実行するだけで、フォルダ内の画像が指定したセルに順番に貼り付けられていきます。
1枚1枚手作業でやっていた50分の作業が、ボタン1クリックで完了します。
関連記事「写真の貼付けを完全自動化」では、VBA学習を始めたばかりの頃に作成した写真貼付けマクロが紹介されています。
VBAでできること②|別シートへのテキスト転記を自動化する
次に紹介するのは、「シートをまたいだデータ転記」の自動化です。
入力シートに入力したデータを、集計シートや個別シートに自動で転記するという処理は、事務系の業務でとても頻繁に求められます。
手作業でコピペを繰り返していると、貼り付け先を間違えたり、1行ずれていたりというミスが発生しがちですが、VBAならこういった編集ミスの発生はありません。
別シートにデータを転記するVBAの仕組み
下記のサンプルコードは、「入力シート」のデータを読み取り、「集計シート」の最終行に自動で転記するコードです。
Sub 別シートに転記()
' 転記元シートと転記先シートを指定
Dim wsInput As Worksheet
Dim wsOutput As Worksheet
Set wsInput = ThisWorkbook.Worksheets("入力シート")
Set wsOutput = ThisWorkbook.Worksheets("集計シート")
' 転記元の最終行を取得
Dim lastRowInput As Long
lastRowInput = wsInput.Cells(wsInput.Rows.Count, 1).End(xlUp).Row
' 転記先の次の空白行を取得
Dim lastRowOutput As Long
lastRowOutput = wsOutput.Cells(wsOutput.Rows.Count, 1).End(xlUp).Row + 1
' 転記元の2行目からループ処理(1行目はヘッダーとして除外)
Dim i As Long
For i = 2 To lastRowInput
' A列〜C列のデータを転記先シートにコピー
wsOutput.Cells(lastRowOutput, 1).Value = wsInput.Cells(i, 1).Value ' 日付
wsOutput.Cells(lastRowOutput, 2).Value = wsInput.Cells(i, 2).Value ' 名前
wsOutput.Cells(lastRowOutput, 3).Value = wsInput.Cells(i, 3).Value ' 数量
' 転記先の行を1つ進める
lastRowOutput = lastRowOutput + 1
Next i
MsgBox "転記が完了しました。", vbInformation
End Sub
コードの動きを説明します。
Set wsInput と Set wsOutput で、転記元と転記先のシートをそれぞれ変数に格納しています。
End(xlUp).Row を使って、転記元と転記先の最終行を自動で取得している点がポイントです。
データが何行あっても、常に正しい行数を取得してくれます。
For i = 2 To lastRowInput のループで、入力シートの2行目から最終行までを1行ずつ処理し、集計シートの末尾に順番に書き込んでいきます。
このコードを実行すれば、入力作業をするだけで集計シートへのデータ転記が自動で完了します。
「どのシートに転記するか」「何列のデータを転記するか」をコードで自由に変更できるため、あらゆる業務に応用することが可能です。
関連記事「別シートにテキストを自動転記する方法」では簡単な転記マクロをダウンロードすることができます。
実際に転記マクロを動かしてどのような動きをするのかチェックしてみてください。
VBAでできること③|図形〇を使った操作を自動化する
「特定のテキストを〇で囲む」「承認済みの項目に〇を付ける」という処理も、VBAで自動化できます。
手作業でやろうとすると、図形の挿入→サイズ調整→位置の微調整、という手順を対象の項目の数だけ繰り返さなければなりません。
項目が多ければ多いほど、時間がかかりますが、VBAならボタン1クリックで図形の編集が可能です。
テキストを〇で囲むVBAの仕組み
下記のサンプルコードは、A列に「済」と入力されているセルを検索し、そのB列のテキストを図形の〇で自動的に囲むコードです。
Sub テキストに丸をつける()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 既存の〇図形を削除(前回実行分のリセット)
Dim shp As Shape
For Each shp In ws.Shapes
If shp.Name Like "丸図形*" Then
shp.Delete
End If
Next shp
' 最終行を取得
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' A列が「済」のセルにB列のテキストを〇で囲む
Dim i As Long
For i = 2 To lastRow
If ws.Cells(i, 1).Value = "済" Then
' 対象セルの位置とサイズを取得
Dim targetCell As Range
Set targetCell = ws.Cells(i, 2)
' 楕円(〇)図形を追加
Dim oval As Shape
Set oval = ws.Shapes.AddShape(msoShapeOval, _
targetCell.Left - 2, _
targetCell.Top + 2, _
targetCell.Width + 4, _
targetCell.Height - 4)
' 図形のスタイル設定(塗りつぶしなし・赤枠)
With oval
.Fill.Visible = msoFalse ' 塗りつぶしなし
.Line.ForeColor.RGB = RGB(255, 0, 0) ' 赤い枠線
.Line.Weight = 2 ' 線の太さ
.Name = "丸図形" & i ' 図形に名前をつける
End With
End If
Next i
MsgBox "〇付け処理が完了しました。", vbInformation
End Sub
コードの流れを解説します。
最初のループで既存の〇図形をすべて削除しています。
shp.Name Like “丸図形*" という条件で、このマクロが作成した図形だけを削除できるのがポイントです。
ws.Shapes.AddShape(msoShapeOval, …) で楕円(〇)の図形を追加しています。
引数には「左位置・上位置・幅・高さ」を指定でき、targetCell のプロパティから値を取得することで、セルの位置にぴったり合わせた〇を自動で生成することが可能です。
図形の塗りつぶしをなしにして、枠線を赤にすることで、テキストが透けて見える〇囲み処理が完成します。
関連記事「文字を〇で囲む操作を完全自動化」では、基本的な図形操作マクロをダウンロードすることができます。
VBAでできることはまだまだある|応用範囲は無限大
ここまで3つの具体例を紹介しましたが、VBAでできることはこれだけに留まりません。
私がこれまでに受注したマクロ開発案件を振り返ると、エクセル作業のほぼすべてを自動化できるという実感があります。
印刷・PDF出力の自動化
「毎月末に50枚の帳票を印刷する」「シートごとにPDFを書き出して保存する」といった印刷処理も、VBAで自動化することができます。
特定のシートだけを選択して印刷する、ファイル名に日付を自動挿入してPDF保存するといった処理も、数十行のコードで実装可能です。
データの集計・分析処理の自動化
複数シートのデータを1つのシートに集約する、条件に合うデータだけを抽出して別シートにまとめるといった集計処理もVBAの得意分野です。
関数で組んでいた複雑な集計処理も、VBAなら一瞬で処理できます。
フォルダ・ファイルの操作を自動化
「フォルダをまとめて作成する」「ファイルを特定のフォルダに自動で振り分ける」「複数のエクセルファイルを一括で開いて処理する」といったファイル管理系の自動化も、VBAが力を発揮する領域のひとつです。
毎月手作業でフォルダを作成している方には、特に効果が大きい自動化処理だと思います。
私がVBAを独学で身に付けた手順
「VBAを使えば便利そうだけど、プログラミングは未経験だし、難しそう……」と感じている方も多いと思います。
私もまったく同じ状況から独学でVBAを習得しました。
学校で習ったわけでも、専門的な研修を受けたわけでもありません。
私が行ったVBA学習の手順がこちら
- 「自動化したい業務」を1つ決める
- 「その処理に必要なVBAコード」をインターネットや初心者向けの参考書で調べる
- そのコードをそのままエクセルに入力して1行ずつ実行してみる
- どんな処理が行われているかを確認しながら覚えていく
最初から完璧なコードを書こうとするのではなく、「動くコードを作りながら覚える」という姿勢で取り組んだことが、挫折せずに学べた理由だ
と思っています。
最初は「コードを書くのに凄い時間がかかる」「よくわからないエラーが発生してイライラする」など挫折しそうになることが多いかと思います。
デバックを何度も繰り返しながら、焦らずに少しずつ積み重ねていきましょう。
VBAスキルは収益化できる
VBAのスキルは、身に付けるだけで終わらせる必要はありません。
私自身、2020年に独立してから副業としてマクロ開発の受注を始め、現在では年間50件程度の開発依頼をいただいています。
頑張って身に付けたスキルが収入になる!となれば、VBA学習へのモチベーションは変わってきますよね。
私の場合、独立して収入が激減するタイミングでVBAを勉強していたので死に物狂いでいろんなコードに挑戦していました。
プログラミング未経験だった私が独学でVBAスキルを収益化するまでに行った手順は、関連記事「【体験談あり】VBAスキルで副収入を得る方法|未経験から案件獲得まで」で詳しく紹介しています。
VBAスキルを副収入に変えたいという方は、ぜひ参考にしてみてください。
VBAを学ぶ際の注意点|初心者がつまずきやすい3つのポイント
VBAはとても便利なツールですが、初めて学ぶ際にはいくつかつまずきやすいポイントがあります。
私自身が独学で経験した失敗をもとに、注意点を3つ紹介します。
注意点①:コードを実行する前にバックアップを取る
VBAはエクセルのデータを直接操作するため、処理の内容によってはデータを上書きしたり削除したりすることがあります。
コードを実行する前に、必ずファイルのバックアップを取る習慣をつけておきましょう。
特に初めて作ったコードを本番ファイルで実行するのは危険です。
最初はテスト用のファイルを別途用意して、動作確認してから本番に適用するのが安全な進め方です。
注意点②:シート名やセル番地はファイルに合わせて変更する
この記事で紹介しているサンプルコードは、あくまでサンプルです。
コード内の “Sheet1" や “入力シート" というシート名、ws.Cells(i, 2) という列番号は、実際のエクセルファイルの構成に合わせて書き換える必要があります。
「コードをコピペしたのに動かない」というケースのほとんどは、シート名や列番号がファイルと一致していないことが原因です。
エラーが出たときは、まずシート名とセル番地を確認してみましょう。
注意点③:エラーが出ても焦らない
VBAを学び始めると、必ずエラーが出ます。
エラーは「失敗」ではなく「どこが間違っているかを教えてくれるヒント」だと思ってください。
エラーメッセージに表示される行番号と内容を確認して、1行ずつ修正していけば必ず解決できます。
私も独学で勉強していた頃は、1つのエラーを直すのに何時間もかかることがありました。
それでも諦めずにデバックを繰り返すことで、自然とVBAへの理解が深まっていきます。
デバックのやり方については、関連記事「初心者でもできるデバックの方法」で詳しく解説しています。
まとめ ~ VBAでできることを活かして、毎日の作業を自動化しよう ~
この記事では、VBAでできることを具体的なコードを交えながら紹介してきました。
写真の自動貼り付け、別シートへのデータ転記、図形〇の操作——これらはすべて、私が実際にマクロ開発の現場で活用してきた処理です。
VBAの本質は「人間が考えなくていい機械的な処理を自動化すること」です。
ルーティーン作業に費やしている時間を、VBAで取り戻すことができます。
「最初の1本を作る」ところが一番の壁ですが、サンプルコードをそのままコピペして動かすところから始めれば、誰でも必ずVBAを使えるようになります。
もし「自分の業務に合わせた複雑なチェック処理を実装したい」「既存のマクロを改良したい」といったご要望がありましたら、マメBlogのエクセルマクロ開発依頼にご相談ください。
業務内容に合わせたオーダーメイドマクロを設定させていただきます。
最後まで読んでいただきありがとうございました。エクセルVBAを使って面倒なルーティーン作業を自動化しちゃいましょう。






