Super Introduction to VBA
はじめに
はじめてVBAをやってみようと思ったきっかけは、会社の業務で一人が一ヶ月(20営業日)かかりっきりでExcel上でおこなっていた作業があまりにも非効率的だったので、VBAでやってみたら作業の効率化が図れると思ったことでした。
結局、それは20営業日かかっていた手作業がマクロの実行で20秒で済むようになり、自分なりに感動したことを覚えています。「こんなに短時間でできるんだ、すげーっ!」そういう単純な感動というか喜びというものが、VBAにのめりこむようになるきっかけになるのではないでしょうか。
そのVBAをはじめて知ったのは、書店である本を手にとったのがきっかけでした。
「かんたんプログラミング Excel2000VBA 基礎編 」大村あつし著
この本は今でも名著だと思っています。理由は私をVBAに導いてくれたから。それ以外の理由は要らないでしょう。
とはいえ、それだけではお勧めする理由にならないので説明を加えると、全体の構成としては、マクロとはなんぞやというところからVisual Basic Editorの使い方までを解説する前半の超入門編と、ブック・シート・セルというオブジェクトの解説から変数・制御構造・対話型プロシージャといった基本的なマクロを書くために必要不可欠な超基礎編からなります。
ただし、超入門編と超基礎編は私が勝手に区分けしたもので、本書にはそのような区分はありません。
超入門編と超基礎編のバランスがとてもいいと思います。説明しすぎず、説明しなさすぎず。何をしたら、マクロが感動に結び付くか、その近道がここには書かれています。
超入門編は、マクロの意味→マクロ記録→マクロの編集→ショートカットキーの登録と、ここまでできれば自分だけの小さなマクロは使えるようになります。少しの努力でまずマクロに対する感動が手に入る。これが大切だと思います。これがあるからマクロをやろうと思えるのです。
超基礎編は、今となっては説明が少し足りないと思うのですが、初心者の頃はここを首っ引きでマクロを組んだものです。やはりこのくらいの分量が適切なんだなあと思います。
私の好きなマクロに
myRow = Cells(Rows.Count, 1).End(xlUp).Row
というものがありますが、この本で勉強してから今まで一番役に立っているマクロです。
ただ、このシリーズはExcel 2010の版を最後に途絶えていて、それより新しいExcel 2013、Excel 2016の版はありません。ですので、今なら同じ著者の
「Excel VBA 本格入門 ~日常業務の自動化からアプリケーション開発まで~」大村あつし著
がいいでしょうね。
もちろん最近はサイト上で学べるところが多くなっていますが、「うちのサイトだけでVBAは十分!」なんていうところはほとんどないと思います。やっぱり一冊の本にまとまった情報はしっかり学習するには欠かせません。ですから、きっかけはサイトでかまわないと思いますが、しっかり学ぶためにはやはりしっかりした本が必要になると思います。
導入編
VBAとは? マクロとは?
VBAとマクロについて覚えるべきことは2つ。「VBAとはプログラミング言語である」「マクロとはVBAで書かれたプログラムである」です。今は意味がわからなくても、VBAとマクロが違うものだということだけは理解してください。
マクロ記録
マクロをやり始める一番の理由は、「繰り返しおこなわれる退屈な定型処理を自動化できる」ですね。ここではショートカットキーにマクロを登録する方法を説明する予定なんですが、例えばエディタなどでは定番の「Ctrl + Shift + S」を押すと「名前を付けて保存」ダイアログが表示される(メニューバーから毎回選択することから解放される)ことなどを説明します。
次の図を見てください。A1のセルからC5のセルまでが選択されています。このセルに罫線を引くマクロを自動記録したいと思います。
この状態でウィンドウの下側にあるステータスバーの「準備完了」の文字のすぐ右のアイコンをクリックしてください。
[マクロの記録]ダイアログが出てきますね。[マクロ名(M)]は好きな名前(日本語も可)を付けることができます。ここでは、[DrawBorders]とします。[ショートカットキー(K)]は好きなキーボードショートカットキー(Ctrl+(Shift)+英小文字)を付けることができます。これは後で説明します。[マクロの保存先(I)]は「作業中のブック」「新しいブック」「個人用マクロブック」から保存したいブックを選ぶことができます。ここでは、「作業中のブック」を選択します。
次に「OK」を押します。さあ、マクロの記録中になりました。いよいよマクロの記録を開始します。[Ctrl+1]を押して[セルの書式設定]ダイアログを出します。
次に罫線タブを押します。
ここで罫線を引きます。外枠に通常の線、内側に一番細い線を引きました。
「OK」を押すと、実行されます。
最後にウィンドウの下側にあるステータスバーのすぐ右のアイコンをクリックしてください。マクロの記録開始時とはアイコンが異なっているはずです。これを押すと、マクロの記録が終了になります。
ここで[Alt + F11]を押してみましょう。これは、これからマクロを作成する上でつねに開いておくことになるVisual Basic Editor (VBE) を開くショートカットキーです。左側の[プロジェクト]ペインの[Module1]をクリックすると右側のペインに次のようなコードが表示されるはずです。
そこに下のようなコードが書かれています。
Sub DrawBorders() ' ' DrawBorders Macro ' ' Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlHairline End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlHairline End With End Sub
ここにはマクロ記録の悪い部分が出ています。記録したい部分と無関係な部分まで記録されてしまうのです。ですから関係ない部分を削除すると、次のようになります。
Sub DrawBorders() With Selection .Borders(xlEdgeLeft).Weight = xlThin .Borders(xlEdgeTop).Weight = xlThin .Borders(xlEdgeBottom).Weight = xlThin .Borders(xlEdgeRight).Weight = xlThin .Borders(xlInsideVertical).Weight = xlHairline .Borders(xlInsideHorizontal).Weight = xlHairline End With End Sub
いかがでしょうか。かなり短くなりましたね。このマクロ、実はA1からC5のセルだけのマクロではないのです。マクロ実行前にF6からJ11のセルを選択しておけば、そのセルの罫線も引けてしまいます。そのわけはいずれ説明するときが来るでしょう。
今ここで重要なのは、あらかじめ与えられたセルに罫線を引くという、いわば苦痛な定型的作業をマクロ一発でやってしまうことができたということです。慣れてくれば、支店別月別の売上金額のピボット集計もマクロ一発でできてしまいます。
さて、このマクロを繰り返し使うにはどうしたらよいでしょうか。ボタンに登録するという方法もありますが、ここではショートカットキーに登録する方法を説明します。
[Alt + F8]キーを押してみましょう。次のようなダイアログが出るはずです。[DrawBorders]以外にたくさんマクロがありますが、今は気にしないでください。ここで右下の[オプション(O)…]を押してください。
[マクロオプション]というダイアログが出てくるはずです。[ショートカットキー(K)]に好きな英小文字を入れます。ここでは「m」を入れてみました。入れたら「OK」を押してください。次にワークシートに戻って好きなセルを選択して、[Ctrl + m]を押してみてください。
マクロが実行され、罫線が引かれたはずです。
ここまでできると、ようやく自分だけの小さなマクロが次々と作れるようになります。後は具体的な知識が拡がるにつれ、作れるマクロが多くなってきます。
超入門編
以上までを踏まえて、小さいけれど使えると便利なマクロを紹介したいと思います。ここで紹介するマクロはショートカットキーを設定すると威力を発揮します。ご自分の好きなショートカットキーを探してみてください。なお、わたしのショートカットキーの設定をコメントで表示しますが、既存のショートカットキーとかぶるものもたくさんありますので、ショートカットキーを設定するときは注意してくださいね。
Sub S_SaveWB()
'ショートカットキーをCtrl+Sに設定
If ActiveWorkbook.Saved = True Then
ActiveWorkbook.Save
End If
End Sub
このマクロは、ブックが保存されていない状態のときだけ上書き保存コマンドを実行するマクロです。ショートカットキーの設定方法は前節でやったとおりです。
「名前を付けて保存」ダイアログを表示するマクロ
Sub S_ShowSaveAs() 'ショートカットキーをCtrl+Shift+Sに設定 Application.Dialogs(xlDialogSaveAs).Show arg1:=ActiveWorkbook.Name End Sub
このマクロは、説明のとおり、「名前を付けて保存」ダイアログを表示するマクロで、ブックに名前を付けて保存します。それをショートカットキーでできるようにしたのがミソです。
ブックを保存して閉じるマクロ
Sub S_CloseWB1() 'ショートカットキーをCtrl+Wに設定 With ActiveWorkbook .Save .Close End With End Sub
このマクロは[保存]と[閉じる]を別々にするのが面倒なので作ったマクロです。
ブックを保存せずに閉じるマクロ
Sub S_CloseWB2() 'ショートカットキーをCtrl+Qに設定 With ActiveWorkbook .Saved = True .Close End With End Sub
このマクロは保存せずに閉じたいときに確認ダイアログが出てきて、「OK」をいちいち押すのが面倒なので、「OK」を押さなくてもいいように作ったマクロです。
エクセルを終了するマクロ
Sub S_QuitApp() 'ショートカットキーをCtrl+Shift+Qに設定 Application.Quit End Sub
このマクロは[Alt + F4]キーを押すのが面倒なので自分の好きなショートカットキーでExcelを終了したいために作ったマクロです。
印刷プレビューを表示するマクロ
Sub S_ShowPrintPreview() 'ショートカットキーをCtrl+Dに設定 ActiveSheet.PrintPreview End Sub
このマクロは印刷プレビューを一発で表示します。
ページ設定を表示するマクロ
Sub S_ShowPrintPreview() 'ショートカットキーをCtrl+Dに設定 ActiveSheet.PrintPreview End Sub
このマクロはページ設定を一発で表示します。
値のみを貼り付けるマクロ
Sub S_PasteValues() 'ショートカットキーをCtrl+Shift+Vに設定 Selection.PasteSpecial Paste:=xlValues End Sub
このマクロは地味ですが、ある値を書式の違うセルに貼り付けるためにつかくマクロです。一番よく使います。
数式のみを貼り付けるマクロ
Sub S_PasteFormulas() 'ショートカットキーをCtrl+Shift+Fに設定 Selection.PasteSpecial Paste:=xlFormulas End Sub
書式のみを貼り付けるマクロ
Sub S_PasteFormats() 'ショートカットキーをCtrl+Shift+Tに設定 Selection.PasteSpecial Paste:=xlFormats End Sub
値・式のみをクリアするマクロ
Sub S_ClearContents() 'ショートカットキーをCtrl+Shift+Cに設定 Selection.ClearContents End Sub
3.8とペアで2番目によく使います。
セルを結合するマクロ
Sub S_MergeCells_True() 'ショートカットキーをCtrl+Eに設定 Selection.MergeCells = True End Sub
セルの結合を解除するマクロ
Sub S_MergeCells_False() 'ショートカットキーをCtrl+Shift+Eに設定 Selection.MergeCells = False End Sub
セルを縦方向にのみ結合するマクロ
Sub S_MergeCells_Vertical() 'ショートカットキーをCtrl+Rに設定 Dim StartRow As Long Dim StartColumn As Long Dim EndRow As Long Dim EndColumn As Long Dim i As Long Application.ScreenUpdating = False StartRow = Selection.Range("A1").Row StartColumn = Selection.Range("A1").Column EndRow = StartRow + Selection.Rows.Count - 1 EndColumn = StartColumn + Selection.Columns.Count - 1 For i = StartColumn To EndColumn Range(Cells(StartRow, i), Cells(EndRow, i)).Merge Next i Application.ScreenUpdating = True End Sub
このマクロだけ複雑ですが、機能はタイトルにあるとおりですが縦方向にだけセルを結合します。当然ですが、縦2行、横2行以上の選択範囲を選択していないと、このマクロを動かしても何も変わりません。Excelの標準機能にない割りにわたしは使うので紹介しておきます。
列幅を特定のセル範囲のデータの幅に合わせるマクロ
Sub S_ColumnsAutoFit() 'ショートカットキーをCtrl+Tに設定 Selection.Columns.AutoFit End Sub
特定のセルを選択して、そのセルに列幅をあわせます。縦に1列だけ選択してくださいね。
画面設定ダイアログボックスを表示するマクロ
Sub S_ShowDisplay() Application.Dialogs(xlDialogDisplay).Show End Sub
これで簡単なマクロの紹介は終わります。好きなものを試してみてくださいね。このマクロを使ってくださると大変うれしいです。
コメントを残す