Excel® VBA勉強

注意事項:Microsoft、Windows、Excelは、米国Microsoft Corporationの米国及びその他の国における商標または登録商標です。このページでは、™、®、©を省略したり、登録商標などに一般に使われている通称を用いたりする場合があります。

  1. 初心者でも1ヶ月勉強すれば業務1個自動化可能
  2. VBA具体例リンク
    1. 変数は直前宣言がよい
    2. 表全体を指定
    3. 表の最終行の行数・最終列の列数
    4. データが行単位の表のデータ件数
      1. 1行目が見出しの場合、見出しを含めた行数から1引く
      2. OffsetとResizeで見出しを除いた場合
    5. 表の右下隅セルを選択する場合
      1. Ctrl & ↓+Ctrl & →と同じことをする場合(表内のセルをA1とする)
      2. 表のセルのインデックス番号を使う場合(右下隅が最後)
    6. ワークシート最終行・最終列
    7. ブックが開いてなければ開く
    8. Functionを呼び出すときはCallをつけない
    9. 別ブックを開かずにセル値を取得(基本は開く)
    10. ブックの色々な開き方
    11. ファイル名に今月を指定する
    12. ファイル名に前月を指定する
    13. VLOOKUP関数の代わりのVBA
    14. 色々なExcel関数の代わりのVBA
    15. ピボットテーブルの追加をマクロの記録
    16. 従来のピボットテーブルレイアウトに変更
    17. ピボットテーブルの空白にフィルターをかけて非表示にする
    18. ピボットテーブルの行フィールドと値フィールドの設定
    19. 従業員の表からいくつかの組織の行を削除
    20. 複数の条件を満たす行を削除
    21. オートフィルターで抽出してコピーまたは削除
    22. オートフィルターで3つ以上の条件で抽出できる動的配列
    23. ピボットテーブルの小計を非表示にする
    24. セルの値0を一括削除する
    25. Timerでマクロ処理の実行時間を測る
    26. SheetsとWorksheetsは正確には違う
    27. ブックはSelectできず、Activateはできる
    28. “を文字として認識させるには””””と書く
    29. 印刷設定はプリンターとの通信をオフにして高速化
    30. 結合セルの値クリア
    31. 変数使用で行削除
  3. 勉強用リンク
    1. Office TANAKA
    2. 金子晃之氏
    3. エクセル兄さん たてばやし淳氏
    4. パソコンスキルの教科書
    5. インストラクターのネタ帳
    6. エクセルの神髄
    7. t-hom’s diary
    8. Yasucore Official Blog
    9. 侍エンジニアブログ
    10. kurumico.com
    11. moug モーグ(掲示板)

初心者でも1ヶ月勉強すれば業務1個自動化可能

10年以上前に、父親から唐突に「これ勉強したほうがいいよ」と、表紙がボロボロになった『Excel VBA パーフェクトマスターSecond Edition』(土屋和人著、秀和システム、2006)を譲られましたが、Excelを本格的に使う仕事をしてこなかったので、これまで本棚に放置していました。 しかしいつも目につくので、ずっと「VBAか…」とは思っていました。

これまで色々な職業を転々としたのですが、2021年の転職でExcelを本格的に使う仕事に就きました。2021年9月、YouTube動画で関数の勉強をしていて、たまたまVBAの解説動画を見て、「マクロの記録」を使えば、初心者でもある程度はできるということを知りました。そして、放置していたVBAの本を初めて開いてみました。しかし、「モジュール…プロシージャ…分からん!」という拒否反応が出て、まずはYouTubeのVBA動画で言葉や画面に慣れることにしました。

しばらくして再び本を開くと、拒否反応が出ず、なんとか読める状態になりました。しかしこの本は難しいと感じたので、本屋に初心者本を探しに行きました。そして『Excel マクロ&VBA[実践ビジネス入門講座]完全版』(国本温子著、SBクリエイティブ、2021)を見つけ、基礎から勉強を始めました。

勉強と並行して、仕事ではマクロの記録をつなぎ合わせてピボットテーブル作成マクロを作ることに挑戦し、9/30に人生初のマクロを完成させました。翌日、席の後ろをたまたま通った課長が、私がVBAを使っているのを見て、「マクロ使えるの?すごいね」と褒めてくれました。私が「マクロ面白いです」と言うと、「面白いよね」とにっこり。課長もマクロを勉強していて、ボタンを押すと印刷するマクロなどを作ってきたとのこと。私の隣の席の先輩も勉強中。俄然やる気が出てきました。

ちなみに、パソコンスキルの教科書の武田氏も、学び始めて1ヶ月で実際の業務を3時間から30分にできたそうです。
エクセルマクロVBAの勉強法|独学で上達する18のコツ (fastclassinfo.com)

本とネットで勉強するにつれ、人生初のマクロは、マクロの記録のつなぎ合わせで無駄が多いことに気づきました。また、変数の宣言は先頭にまとめて書くより直前宣言のほうがよいことを知り、改良を重ねて、10/22に改良版が完成。勉強を初めて1ヶ月半くらいです。

父親から分厚い本をもらった時はVBAを食わず嫌いしていましたし、勉強し始めた直後は拒否反応も出ましたが、慣れてきたらとても面白いです。初心者がぶつかるエラーも、ネットで検索すれば簡単に解決策が見つかります。エラーを乗り越えてマクロが完成し、作るまでに何十分もかかっていたピボットテーブルがたった数秒でできた瞬間は静かに拍手しました。

プロのプログラマーみたいな簡潔な短いコードでなくても、まずは時短できればOK。極端な話、マクロの記録だけの長いコードでも自動化はできます。

VBA具体例リンク

変数は直前宣言がよい

VBAで変数宣言をまだプロシージャの先頭にまとめてしてますか? | hatena chips (hatena19.com)

VBA ローカル変数は使用する直前で宣言する – t-hom’s diary (hateblo.jp)

表全体を指定

Range(“表内のセル”).CurrentRegionと書く。
注意:空白行と空白列に囲まれた四角の領域を取得するので、表のすぐ上にタイトルが入力されていたら、その行も含まれてしまう。

1行目の見出しを覗いた範囲を変数dRngに格納するには、OffsetとResizeを使う。
Dim dRng As Range
With  Worksheets(“シート名”).Range(“表内のセル”).CurrentRegion 
      Set dRng = .Offset(1).Resize(.Rows.Count – 1)
End With

表の最終行の行数・最終列の列数

Endを使う。A1から表が始まっている場合。
最終行は、

Worksheets(“シート名”).Range(“A1”).End(xlDown).Row
※Ctrl & ↓と同じで、列の途中に空白があると使えない

または
Worksheets(“シート名”).Cells(Rows.Count, 1).End(xlUp).Row

最終列は、
Worksheets(“シート名”).Range(“A1”).End(xlToRight).Column
※Ctrl & →と同じで、行の途中に空白があると使えない

または

Worksheets(“シート名”).Cells(1, Columns.Count).End(xlToLeft).Column

データが行単位の表のデータ件数

1行目が見出しの場合、見出しを含めた行数から1引く

Dim cnt As Long
cnt = Worksheets(“シート名”).Range(“表内のセル”).CurrentRegion.Rows.Count -1 

OffsetとResizeで見出しを除いた場合

Dim dRng As Range
With  Worksheets(“シート名”).Range(“表内のセル”).CurrentRegion 
      Set dRng = .Offset(1).Resize(.Rows.Count -1)
End With
Dim rcnt As Long: rcnt = dRng.Rows.Count ’見出し除く行数(データ件数)

表の右下隅セルを選択する場合

Ctrl & ↓+Ctrl & →と同じことをする場合(表内のセルをA1とする)

Dim lastRow As Long

lastRow = Range(“A1”).End(xlDown).Row ’表の最終行の行数
Range(“A” & lastRow).End(xlToRight).Select

表のセルのインデックス番号を使う場合(右下隅が最後)

Dim rng As Range

Set rng = Range(“表内のセル”).CurrentRegion
rng.Cells(rng.Count).Select 

表のセルのインデックス番号は、A1はCell(1)、B1はCell(2)というように、
1行目左端→右端
2行目左端→右端
(中略)
最終行の左端→右端
という順番で振られ、右下隅セルが最後。

ワークシート最終行・最終列

ワークシート最終行・・・Range(“A” & Rows.Count)
ワークシート最終列・・・Cells(1, Columns.Count) 
Excelバージョンによって最終行が違うが、こう書くとバージョン関係なし

ブックが開いてなければ開く

【ExcelVBA】ブックが開いていなければ開く | Yasucore Official Blog 
Public Functionを使用

【ChatGPTの回答】※上のFunction使用の方が1秒以上早い
Excel の VBA を使用して、ワークブックが開いていない場合にワークブックを開くには、次のようなマクロを作成することができます。

Sub OpenWorkbook()
Dim wb As Workbook
On Error Resume Next
Set wb = Workbooks(“workbook_name.xlsx”)
If wb Is Nothing Then
Set wb = Workbooks.Open(“C:\path\to\workbook_name.xlsx”)
End If
On Error GoTo 0
End Sub
このマクロでは、まず Workbooks オブジェクトを使用してワークブック “workbook_name.xlsx” が開いているかどうかを確認します。もし開いていなければ、Workbooks.Open メソッドを使用してワークブックを開きます。

Functionを呼び出すときはCallをつけない

【VBA】Function()とは何か?どんなときに使うものか?そこそこマクロを組める人でも、意外とご存じないですね – YouTube

別ブックを開かずにセル値を取得(基本は開く)

VBA】ブックを開かないでセルのデータを取得する2つの方法 – YouTube

ブックを開かずにセル値を取得(ExecuteExcel4Macro,Excel.Application)|VBAサンプル集 (excel-ubara.com)

Excelから別のExcelファイルを操作するVBA|CreateObject (excel-excel.com)

【ExcelVBA】別インスタンスで複数開いて作業能率を上げよう (kurumico.com)

ブックの色々な開き方

ブックのいろいろな開き方(GetObject、参照設定、アドイン)|VBA技術解説 (excel-ubara.com) 

ファイル名に今月を指定する

[mixi]特定の日付入りのファイルを自動で開く方法 – EXCEL VBA | mixiコミュニティ
Workbooks.Open Filename:=”C:\WINDOWS\デスクトップ\”  & “○○○” & “.xls”
“○○○”の部分を FORMAT(DATE,”YYYY.MM”) に置き換える。

エクセルのVBAです。決まった文字列+前月の日付というファイル名… – Yahoo!知恵袋
ActiveWorkbook.SaveAs “パス名+ファイル名の固定部分” & Format(Date, “yyyymm”)

『月名のみが違うファイルを開くVBAの書き方』(SATTI) エクセル Excel [エクセルの学校] (studio-kazu.jp)
ユーザーフォームのコンボボックスに入力された月のファイルを開く方法

ファイル名に前月を指定する

エクセルのVBAです。決まった文字列+前月の日付というファイル名… – Yahoo!知恵袋
DateAdd関数を使用する。ActiveWorkbook.SaveAs “パス名+ファイル名の固定部分” & Format(DateAdd(“m”, -1, Date), “yyyymm”)

VBA DateAdd 関数 (tipsfound.com)
DateAdd(単位, 加算時間, 日時)

VBAで日付や時刻の加減算を行う(DateAdd) | Excel作業をVBAで効率化 (vbabeginner.net)

VBA関数(日付,DateAdd)|VBA入門 (excel-ubara.com)

VLOOKUP関数の代わりのVBA

エクセルマクロVBAでVlookup関数の代わりに別シートのデータ参照(最終行まで) (fastclassinfo.com)

VLOOKUP関数の代わりにVBAで高速処理をする方法!2個以上の結果取得も可! – エク短|Extan.jp

セル範囲⇔配列(マクロVBA高速化必須テクニック)|VBA入門 (excel-ubara.com)

Excelマクロの配列でよく使うUbound関数・Lbound関数の使い方の検討と具体的な使用例について – しくじるなよ、デューティ。 (duty-cant-fail.com)

セル範囲を配列に格納して、変数iとjをLBoundからUBoundまで動かしてVLOOKUP関数と同じことをVBAでやるコードが書けるようになります。
LBoundは普通は0ですが、セル範囲のValueをいれた配列のLBoundは1になることに注意。

色々なExcel関数の代わりのVBA

エクセル関数をマクロで作る!10事例でVBAプログラムを解説 (fastclassinfo.com) 

ピボットテーブルの追加をマクロの記録

 ピボットテーブル(PivotTable)|VBA入門 (excel-ubara.com) 

従来のピボットテーブルレイアウトに変更

Excel VBA ピボットテーブルを操作する【オプション設定】 (kurumico.com)

ピボットテーブルの空白にフィルターをかけて非表示にする

ピボットテーブルの空白セルにフィルターをかける場合、PivotItems(“(空白)”)と書いたら、 実行時エラー ‘1004’「アプリケーション定義またはオブジェクト定義のエラー」が出ます。正しくはPivotItems(“(blank)”)と書きます。

Excel 2007 SP2 もしくは Excel 2010 の環境で空白セルを “(空白)” と指定したマクロのフィルター処理を実行するとエラーが発生する (microsoft.com)

 【Excel VBA】ピボットテーブルの作成例 (vba-gas.info) 

 PivotFields(“フィールド名”).PivotItems(“(blank)”).Visible = False 

ピボットテーブルの行フィールドと値フィールドの設定

 VBAを使ってピボットテーブルに行と列を設定する | ハトらぼ (hatolabo.com) 
Dim columnFieldsArray   As Variant
columnFieldsArray = Array(“〇”, “△”, “◇”)

For i = 0 To UBound(columnFieldsArray)

    pivot.AddDataField _
        Field:=pivot.PivotFields(columnFieldsArray(i)), _
        Caption:=columnFieldsArray(i) + ” “
Next 
Captionに + ” ” と空文字を連結して、「項目名が重複している」エラーを回避。

従業員の表からいくつかの組織の行を削除

Sub DeleteRows() 
          Dim wb As Workbook 
          Dim wsData As Worksheet 
          Dim lRow As Long

          Dim i As Long
          Set wb = ThisWorkbook Set wsData = wb.Sheets(“Sheet1”) ‘データが含まれているシート名
          lRow = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row
          For i = lRow To 1 Step -1
                  If wsData.Cells(i, 2).Value = “*役員*” Or _
                      wsData.Cells(i, 2).Value = “*A班*” Or _
                      wsData.Cells(i, 2).Value = “*出向*” Then
                      wsData.Rows(i).EntireRow.Delete
                   End If
           Next i
End Sub
このマクロでは、まずシート内の最終行を取得します。次に、最終行から順に列2の値が「役員」「福岡班」「出向」の行を削除します。このマクロでは、行の一括削除に EntireRow.Delete メソッドを使用しています。

複数の条件を満たす行を削除

EXCEL VBA 複数の条件を満たす行を削除・空白削除・あいまい条件・0削除(行削除・列削除:Deleteメゾット) (akira55.com) 

オートフィルターで抽出してコピーまたは削除

Office TANAKA – Excel VBA Tips[オートフィルタ[結果をコピーする]]

Office TANAKA – Excel VBA Tips[オートフィルタ[絞り込んだ行を操作する]]

【VBA】オートフィルタの結果をコピーや削除する【CopyとDeleteを使う】 (daitaideit.com)

オートフィルターで3つ以上の条件で抽出できる動的配列

【VBA】動的配列って何?注意は?使い方は?懇切丁寧に解説します – YouTube
抽出条件を配列Aに格納して、Range(“A1”).Autofilter 1, A, xlFilterValueと書けば、普通2つしか設定できない抽出条件が3つ以上設定可能になる。
動的配列をアパートの部屋に例えていて分かりやすい。
後半はドラクエ風の画面やセリフが出てきて面白い。

土屋和人著『1日10分でぐんぐんわかる!Excel自動化の入門教室』(ナツメ社)p.277
Array関数を使って、Criteria1:=Array(“〇”, “△”, “□”)

ピボットテーブルの小計を非表示にする

VBAでピボットテーブルの小計を表示しないように:エクセルマクロ・Excel VBAの使い方/ピボットテーブル (relief.jp)

Excel VBA ピボットテーブルを操作する【小計非表示編】 (kurumico.com)

雨のち晴れ ピボットフィールドの集計(小計)行について (fc2.com)

ピボットのマクロ化についての質問です。ピボットの小計行を非表… – Yahoo!知恵袋
エラー’1004’「PivotDieldクラスのSubtotalsプロパティを設定できません」が出たときの一番簡単な回避法は、For Eachの前にOn Error Resume Next、Nextの後にOn Error GoTo 0 を書くこと。

PivotField.Subtotals プロパティ (Excel) | Microsoft Docs

セルの値0を一括削除する

セルの値が0はクリアするマクロ -エクセル2003です。ある集計表におい- Excel(エクセル) | 教えて!goo
Columns(“H:M”).Replace “0”, “”, xlWhole
0と完全一致するなら空白と置換

Columns(“H:M”).Replace “0”, “”
これだと30 とかの 0まで消えてしまう

【VBA入門】Replace関数とReplaceメソッドで文字列の置換 | 侍エンジニアブログ (sejuku.net)

Timerでマクロ処理の実行時間を測る

【ExcelVBA入門】処理時間を計測するためのTimer関数の使い方とは | 侍エンジニアブログ (sejuku.net)

【Excel VBA】Timerでマクロの処理の実行時間を計測する方法 (forward-soft.co.jp)

SheetsとWorksheetsは正確には違う

シートとワークシートって違うんですよ。何が違うかちゃんと説明できますか? – YouTube
シートはワークシート、グラフシート、マクロシート、ダイアログシートの4種類。でもワークシート以外はほとんど使われてないから、短いSheetsのほうが書くのが楽。

ブックはSelectできず、Activateはできる

【VBA】「Select」と「Activate」の違い分かりますか?ほとんど同じですけど、エラーになる注意がひとつあります – YouTube
1つのセルやシートに対してはSelectもActivateも同じ。しかしブックはActivateしか使えない。なぜなら、開いている2つのブックを同時に選択できないから。
Activeセルとは、入力セルのこと。Selectされたセル範囲の中で、Activeセル(白くなっているセル)は1つだけ。そのActiveセルを、Selectの範囲で移動させるときAcrivateを使う。

“を文字として認識させるには””””と書く

【VBA】マクロで、なぜ文字列はダブルコーテーション(“”)で囲むのか?という、実は奥が深い問題 – YouTube
“田中”という文字列は”””田中”””、”という文字列は””””と書く。
一番外側が文字列を表すセット、左から2番目がエスケープ文字(後ろの”が記号ではなく文字だとExcelに伝えるもの)。

印刷設定はプリンターとの通信をオフにして高速化

VBAで印刷設定を高速に行う | Excel作業をVBAで効率化 (vbabeginner.net)

【ExcelVBA入門】高度な印刷設定をする方法とは?高速化対応も解説! | 侍エンジニアブログ (sejuku.net)

土屋和人著『1日10分でぐんぐんわかる!Excel自動化の入門教室』(ナツメ社)p.271

結合セルの値クリア

EXCEL 結合セルのClearContentsのエラーの回避方法 – Qiita
Range(“A1”).MergeArea.ClearContents
実務として簡単なのは、Range(“A1”).Value = “” 

変数使用で行削除

Rows(変数1 & “:” & 変数2).Delete
【エクセルマクロ】変数を使用して行を削除:使用例6選 | kirinote.com

勉強用リンク

Office TANAKA

田中亨氏のYouTubeとWebサイト。
MicrosoftのMVP(Most Valuable Professional)のExcel部門を日本人初受賞され、Excel 2007からは、田中氏が提案した機能も実装。軽妙な語り口とユーモアのある例えを交えた解説。

Office TANAKA – YouTube
Office TANAKA

【関数】あなたのイライラを解消する「セルのモード」ご存じない方が多すぎる! – YouTube
編集はとりあえずF2、左下の「入力、編集、参照」に注目

金子晃之氏

Excel本が人気。知識ゼロの初心者でも中級者レベルになれるIT知識を紹介。

金子晃之 – YouTube
初心者のためのExcel使い方まとめ【絶対保存版】│パソニュー (pasonyu.com) 

エクセル兄さん たてばやし淳氏

ベネッセUdemyにてオンライン動画でExcelを教える新鋭の講師。

エクセル兄さん たてばやし淳 – YouTube

パソコンスキルの教科書

運営者の武田氏は東大院理系出身ですが、無職や派遣社員などを経験。たまたま依頼されたデータ集計の仕事がきっかけで関数やVBAを知識ゼロから身に付けたそうです。詳しくはブログのプロフィールを。武田氏のストーリーにグッと来ました。

パソコンスキルの教科書 – YouTube

パソコンスキルの教科書 – 仕事が楽しくなるスキルをお届け (fastclassinfo.com)

エクセルマクロVBAの勉強法|独学で上達する18のコツ (fastclassinfo.com)

インストラクターのネタ帳

人気講師伊藤潔人氏のサイト

いちばんやさしいExcel VBAの教本 (relief.jp)
インストラクターのネタ帳 (relief.jp) 

エクセルの神髄

鵜原パソコンソフト研究所のサイト

ExcelとVBAの入門解説|エクセルの神髄 (excel-ubara.com) 

t-hom’s diary

VBAプログラマーthom氏のブログとWebサイト

t-hom’s diary (hateblo.jp)
トップページ – You.Activate (thom.jp) 

Yasucore Official Blog

やすこれ氏のブログ。働かないために業務自動化を推し進め、幅広くExcel(VBA含む)の知識を身に付けた後、事務職からVBAエンジニアに転職。

仕事効率化 | Yasucore Official Blog

侍エンジニアブログ

プログラミングスクールのブログ

Excel VBA Archives | 侍エンジニアブログ (sejuku.net) 

kurumico.com

くるみこ氏のブログ。VBAは独学。VBでフリーソフトを作っていた経験と、仕事でExcelVBAを酷使している中での気づきなどを発信されています。

kurumico.com

moug モーグ(掲示板)

Excel VBA を学ぶなら moug モーグ 

タイトルとURLをコピーしました