Excel VBA
このページは,Excel VBAについて整理しています.
目次
- セル
- 最終行の取得
- For Each文
- Do Whileループ
- Select文
- コピー&ペースト
- 表示・非表示・フィルター
- 罫線
- 外観・書式
- フォント
- 印刷
- シート
- ファイル・フォルダ
- 文字列操作
- 検索・置換
- 画像
- プログラミング
- 実行補助
- 参考文献
セル
Cells(1, 2)
で1行2列目のセル(=B1セル)を取得します.
ほとんどそうする機会はありませんが,同じことをCells(1, "B")
と書くこともできます.
全範囲
Cells(i, j)
の形でなくCells
とするとアクティブシートの全セルを取得します.
セル範囲
Range
を使えば範囲指定して処理や設定を行うことができます.
例えば,Range("A1:C2")
で,A1セルからC2セルまでの範囲を表します.
ダブルクオーテーションで囲っていることにご注意ください.
セルのアドレスを文字列として認識させています.
望ましくない書き方ですが,Long型でnum = 2
のとき,Range("A1:C" & num)
のように書くこともできます.
同じ範囲は,左上と右下のセルをRange
の2つの引数として指定することでも表現することができます.
すなわち,Range(Cells(1, 1), Cells(2, 3))
と書くことが可能です.
行・列
行はRows
より記述します.
3行目の削除であれば
Rows(3).Delete |
です.
列削除はRows
に代えて,Columns
を使います.
Excelで行・列を追加または削除すると以降の行番号・列番号がずれて変わってしまいますから,追加や削除は表の外側(=行番号や列番号の大きい方)から処理するようにマクロを書きましょう.
選択範囲
選択範囲を用いるには,Range("セル範囲")
に代えてSelection
とします.
範囲を選択するには,
Range("セル範囲").Select |
とします.
列見出しに基づいて列を選択する,(SQL的でなく)Excel的なサンプルをあわせて掲載しておきます.
Sub 見出しを指定して列選択(colTitle As String) |
アクティブセル
アクティブセルはActiveCell
で使用できます.
選択セルとアクティブセルが異なることに注意してください.
現在セルからの行数・列数の差異を用いる
アクティブセルから1行2列先のセルを使用するには,
ActiveCell.Offset(1, 2) |
とします.
特定セルを起点にして範囲選択する
(2,3)セルから4行5列にわたる範囲を選択するなら,
Cells(2, 3).Resize(4, 5).Select |
とします.
最終行の取得
For文で最終行まで処理させたい場合,その都度行を数えるのは手間です.
適当な範囲を取得させたいと思いますし,それは自動でできます.
ここで,よく引っかかるポイントがあります.
それはExcelのいう最終行にはいくつかの種類があるということです.
- 現在の表の一番下の行のこと
- 何かが設定されている一番下の行のこと
- セル入力されている一番下の行のこと
現在の表で
あるセル(やセル範囲)を含んだ表を取得するのがCurrentRegion
(カレント・リージョン=「いまいる範囲」)です.
長方形型の表になっていると仮定して,1セルずつ動いてはみだしたら表外とみなします.
このため,空白行を挟むデータには使えません.
ある範囲の行数をカウントするには.Rows.Count
を使います.
したがって,例えば,A1セルを含んだ範囲の表の行数は
Cells(1, 1).CurrentRegion.Rows.Count |
で取得できます.
もし第1行が空白のときにB2セルを含んだ表を取得すると,1行分少ない値が返ってくることに注意してください.
何かが設定されている範囲で
たとえ空白を挟んでいたとしても,文字があるセルや書式設定されたセルがその外側にあればそれも使われている範囲だとみなすのがUsedRange
(ユースト・レンジ=「使われている範囲」)です.
この範囲での行数は.Rows.Count
で取得できますから,
UsedRange.Rows.Count |
で,設定のある最終行数が得られます.
文字が入っている範囲で
特定の行数で表の枠が設けられているものの,データが入っている行数はその都度違うという場合があります.
このような表では,行の高さや罫線にまで反応してしまうUsedRange
では広すぎますし,空白行がはさまっているとCurrentRegion
が使えません.
このような場合,文字が入っている一番下のセルを探すという方法を採ります.
手順としては3つにわけて,
- シートの全ての行の数を調べ,
- 全セル範囲における最終行のセルを起点として,
- そこから上に登って文字があるセルの位置を返してもらう
という書き方をします.
まず,ステップ1の全行数はRows.Count
によって取得できます.
このため,例えばA列で,最大行数が割り当てられたセルはCells(Rows.Count, 1)
です.
これをステップ2でいうところの起点とします.
そこからステップ3,文字のあるセルまで上に登るには,A列で最大行数が割り当てられたセルを主語とした上でEnd(xlUp)
と書きます.
まとめると,
Cells(Rows.Count, 1).End(xlUp) |
となります.
したがって,このケースでの最終行数は
Cells(Rows.Count, 1).End(xlUp).Row |
です.
みなし最終行
空白セルがはさまるデータでみなし最終行を決める必要がある場合のサンプルです.
Dim i, j, tmp As Integer |
For Each文
For Each文は何かの集合から個々の対象を1つずつ処理したいときに使うFor文のバリエーションです.
セル範囲から各セルに何か処理を施すというFor文でできそうなことも行えますが,For Each文が魅力的なのは,「選択範囲全てのセルで」・「全てのシートで」といった処理が行数やシート数を指定せずに可能となることです.
選択範囲全てのセルで処理を施す
特定のシートの中で選択範囲をとるシンプルな例だと,Selection
を用いて
Dim i As Variant |
となります.
処理では,例えば値なら,i.Value
を使います.
繰り返しを抜けるのにExit For
を使うのは通常のFor文と同じです.
全てのワークシートで処理を施す
選択範囲の全セルでなく,全てのワークシートで処理を行う場合はSelection
に代えてWorksheets
です.
Dim ws As Worksheet |
Do Whileループ
Do Whileループは条件を破るまで処理を反復し続けます.
次は,1列目において2行目から空白行に当たるまでセルを下降しつつ処理を繰り返すサンプルです.
より正確に言えば,「今のセルが空白でない間はループを続ける.そうでない場合は処理して,『次のセルへ移るためのカウンタを増やす』」です.
Dim i As Long |
For文と異なり,While文では自動的にカウンタが増えません.
このため,インクリメント(変数の値を1増やす)という処理を含めます.
繰り返しを抜けたい場合はExit Do
とします.
同じディレクトリにある全てのファイルに処理を施す
Dir
関数を併用して,現在のフォルダで未処理のファイルがなくなるまで(=全てのファイルに)マクロをかけることができます.
Do While Dir() <> "" |
xls,xlsx,xlsmのようなファイルのみを指定するのは,次の要領です.
Sub LoopMacro() |
Select文
If文では条件分岐の数が多くなりすぎる場合,Select文を使うと便利です.
Select Case 対象セル |
対象セルが値であれば,条件はIs > 0
や1 To 10
という書き方になります.
コピー&ペースト
Excelのセル範囲をコピー&ペーストするとき,値だけでなく書式やセル背景色もコピーされます.
基本のコピー&ペーストは次の通りです.(Range(範囲)
でなくCells(行,列)
も使えます.)
Range("コピー元").Copy Destination:=Range("コピー先") |
同じことですが,
Range("コピー元").Copy |
と分けて書くこともできます.
別シートに貼り付ける場合はPaste
できず,PasteSpecial
としなければならないことになっているのでご注意ください.
(PasteSpecial
は,通常オプションを伴って,セルの情報の一部のみを貼り付けるときに用いられます.)
値のみ貼り付け
PasteSpecial
のオプションをPaste:=xlPasteValues
とすると,値貼り付けになります.
Range("コピー先").PasteSpecial Paste:=xlPasteValues |
ただし,Value
(またはText
)プロパティのコピー&ペーストの方が,同時に他の部分にも値を利用する場合には便利かもしれません.
書式のみ貼り付け
PasteSpecial
のオプションをPaste:=xlPasteFormats
とすると,書式貼り付けになります.
Range("コピー先").PasteSpecial Paste:=xlPasteFormats |
行列を転置して貼り付け
PasteSpecial
のオプションをTranspose:=True
とすると,行と列を入れ替えて貼り付けます.
Range("コピー先").PasteSpecial Transpose:=True |
表示・非表示・フィルター
行の非表示
3行目を非表示にするには次のように書きます.
Rows(3).Hidden = True |
表示するにはFalse
です.
オートフィルタ
オートフィルタは
Range("セル範囲").Autofilter |
で設定します.
もう一度実行すれば,解除されます.
Excelでオートフィルタを使う場合,表内のどこか1セルから設定すればよく,予め範囲全体を選択しておく必要はありません.
同様にVBAでActiveSheet.Cells(1, 1).AutoFilter
と書いても,A1セルを含む現在の表(A1セルからのCurrentRegion
という範囲)が自動で選択され,オートフィルタを設定することができます.
また,絞り込みまで実行するには,
Range("セル範囲").AutoFilter Field:="範囲の左から何列目を使って絞り込むかという数値", Criteria1:="値" |
とします.
罫線
セル範囲を指定して文言を入れると,範囲内の個々のセルで斉一的に文言が入ります.
同様に,セル範囲で罫線の書式設定を行うと,範囲内の個々のセルに一律なパターンで罫線が設定されます.
この性質を利用して,格子状に罫線を引くことができます.
まず,単独のセルを罫線で囲む書き方です.
境界の線種を連続な線へ設定します.
Cells(2, 2).Borders.LineStyle = xlContinuous |
それでは,Range
でこの書き方を実行してみましょう.
Range("A1:C2").Borders.LineStyle = xlContinuous |
線を消すには,xlContinuous
ではなくxlNone
と設定します.
Range("A1:C2").Borders.LineStyle = xlNone |
線種
セルを囲まないことや,違う線種を用いることもできます.
例えば,セルまたはセル範囲の下側の辺(xlEdgeBottom
)にだけ二重線(xlDouble
)を設定するなら,Range("A1:C2").Borders(xlEdgeBottom).LineStyle = xlDouble
とします.
- 実線:
xlContinuous
- 破線:
xlDash
- 点線:
xlDot
- 二重線:
xlDouble
- 罫線なし:
xlNone
線の位置
Borders
の引数で線の位置を指定します.
該当範囲の一番下のセルにだけ下側の線を引くなら,Borders(xlEdgeBottom)
です.
内側の各セル水平線はBorders(xlInsideHorizontal)
とします.
外枠
範囲の外枠だけ太罫線で囲みたいという場合には
Range("A1:C2").BorderAround Weight:=xlMedium |
のように書きます.
この例では,線の太さを意味するWeight
オプションで中程度の線を指定しています.
線の太さ
Excelのデフォルトの罫線は細罫線xlThin
なので,中程の罫線がExcelでいう太罫線のことなのです.
ちなみに,非常に太いxlThick
も用意されています.
xlHairline
xlThin
:設定を省略するとこの値になるxlMedium
xlThick
対角線
Cells.Borders.LineStyle = xlLineStyleNone
で枠線を消去できますが,対角線を消すには,
Cells.Borders(xlDiagonalUp).LineStyle = xlLineStyleNone |
とします.
外観・書式
値のみ消去
書式設定されたテンプレートが存在するために全セルの値のみ消去したいという場合は,
Cells.ClearContents |
とします.
ウィンドウ枠の固定
あるセルの左肩で固定するには
Range("セル").FreezePanes = True |
とします.
なお,セル範囲が指定された場合は,最も左上にあるセルが参照される.
列幅調整
1列目で列幅を自動調整する場合,
Columns(1).Autofit |
とします.
値を指定するなら,
Columns(1).ColumnWidth = 20 |
のようにします.
折り返し表示・縮小表示
セル全体を折り返すには
Cells.WrapText = True |
とします.
行の高さを自動調整するRows(行).Autofit
と併用するとよいでしょう.
セル全体を縮小するには,
Cells.ShrinkToFit = True |
とします.
文字位置
B列の中央揃えであれば
Columns(2).HorizontalAlignment = xlCenter |
です.
桁区切り
B列が数値のとき,3桁区切りに設定するなら,次のようにします.
Columns(2).NumberFormatLocal = "#,###" |
Excelの書式設定と同様にシャープが使われています.
なお,次のように書くこともできます.
対象セル = Format("対象セル", "#,###") |
日付
日付もExcel同様に,
Columns(2).NumberFormatLocal = "yyyy年mm月dd日" |
と書きます.
小数点
例えば,小数点2桁なら,
対象セル = Format("対象セル", "#.##") |
とします.
ゼロでの頭埋め
例えば,4桁であれば,#
ではなく0
を使って
対象セル = Format("対象セル", "0000") |
とします.
文字列
Range("対象").NumberFormat = "@" |
フォント
フォントは次のように設定します.
Sub フォントの設定例() |
同じものをWithを使って書き直した例です.
Sub フォントの設定例2() |
背景色
RGB関数を左から順にRed,Green,Blueで設定します.
値の範囲は0〜255です.
Sub セル背景色の設定例() |
セル結合
セル結合と結合解除はそれぞれ次の通りです.
Range("結合範囲").Merge |
結合は,指定した範囲に値のあるセルが1つのみ存在する場合,その値となります.
2つ以上存在する場合,確認ダイアログがでます.
ダイアログを無視するため,Application.DisplayAlerts = False
を併用するとよいでしょう.
結合解除では,セル範囲の最も左上にあるセルにのみ値が残ります.
コメント
セルでコメントの追加・削除・取得を行う方法は以下の通りです.
Cells(1,1).AddComment "コメント" |
ハイパーリンク
メールアドレスへのハイパーリンクは,
ActiveSheet.Hyperlinks.Add Anchor:=Range("セル"), Address:="mailto:メールアドレス", TextToDisplay:="表示テキスト" |
で作成します.
ファイルへのハイパーリンクは,
ActiveSheet.Hyperlinks.Add Anchor:=Range("セル"), Address:="パス", TextToDisplay:="セルに表示するテキスト" |
で作成します.
印刷
1枚の用紙に印刷
1枚の用紙に印刷するには
With ActiveSheet |
とします.
応用して,FitToPagesWide
またはFitToPagesTall
のみが設定された場合,それぞれ列・行を合わせて印刷となります.
印刷範囲を設定する場合
アクティブシートで指定するのであれば,
ActiveSheet.PageSetup.PrintArea = "範囲" |
です.
改ページ
i行目で改ページするなら,
Rows(i).PageBreak = xlPageBreakManual |
とします.
- 特定の改ページの解除はプロパティを
xlPageBreakNone
にします. Cells.Clear
しても改ページ位置は残ります.
用紙方向
横置きなら,
ActiveSheet.PageSetup.Orientation = xlLandscape |
とします.
デフォルトの縦置きを明示するならxlPortrait
とします.
全ページにフィールド名・レコード名を印刷
1行目に書かれたフィールド名を印刷する場合,
ActiveSheet.PageSetUp.PrintTitleRows = "$1:$1" |
とします.
レコード名の場合はRows
のところがColumns
で,範囲は"$A:$A"
の要領です.
ヘッダー・フッター
印刷位置についてはLeft/Center/RightとHeader/Footerの組み合わせで場所が決まります.
ActiveSheet.PageSetup.CenterFooter = "&P" |
ここで,最後の&P
は現在何ページ目を印刷しているかです.
以下はよく使われる入力の例です.
&P/&N
:現在ページ/全ページ数&D &T
:日付 時刻&F &A
:ファイル名 シート名&&
:&(アンドを表示するには重ね打ちする)
入力するものにフォント・位置を指定する場合は次の通りです.
&B
でボールド,Iがイタリック,Uがアンダーライン,Sがストライク&L
で左寄せ,Cがセンタリング,Rが右寄せ
PDF出力
Windowsであればファイルパスのセパレータが¥
なので,アクティブシートを指定したファイル名で同じフォルダにPDF出力するには
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, fileName:=ThisWorkbook.Path & "¥ファイル名.pdf" |
となります.
複数シートから1ファイルのPDFを作るには
Sheets(Array("Sheet1", "Sheet2")).Select |
の要領です.
シート
挿入
シートの追加と命名をひとまとめにして,次のように行うとシンプルです.
Worksheets.Add.Name = "シート名" |
複製
アクティブシートをSheet1の前にコピーするなら,
ActiveSheet.Copy Before:=Sheet1 |
とします.
After:=Worksheets.Count
で,最終位置に複製.Before
もしくはAfter
を定めないと別ブックとして複製してしまう.- 特定のシートを複製するなら,
WorkSheets("シート名").Copy Before:=
の要領. - コピー後のアクティブシートはコピー先.
非表示・再表示
シートを非表示にするには,
Sheets("シート名").Visible = xlSheetVeryHidden |
とします.
- ユーザが自分で再表示できるようにする場合は
xlSheetVeryHidden
ではなくFalse
にする. - 再表示するには
True
にする.
保護
シートを保護するには,
Sheets("シート名").Protect Password := "パスワード" |
とします.
- 解除するには
Protect
をUnprotect
にする. - パスワードを知っているユーザは自分で保護を解除できる.
表示位置をシートのトップへジャンプさせる
アプリケーションで目的のセルにGoTo
します.
Application.Goto Reference:=Cells(1, 1), Scroll:=True |
ワークシートの存在を調べる
ワークシートの存在判定用の関数は用意されていないので,ユーザー定義関数を作って使います.
Public Function ExistsWorksheet(ByVal name As String) As Boolean |
ファイル・フォルダ
ファイルを開く
Windowsでファイルを開くには
buf = "ファイル名" |
します.
リンクを更新せずに開く場合,UpdateLinks
のオプションを使って,
buf = "ファイル名" |
とします.
ファイルの保存
アクティブなワークブックを上書き保存するには
ActiveWorkbook.Save |
とします.
アクティブなワークブックを名前をつけて保存するには,
ActiveWorkBook.SaveAs Filename:="パス" |
とします.
移動・リネーム
Linuxでのmv
コマンドと似ており,
Name "古いパス" As "新しいパス" |
とします.
ファイルのコピー
ファイルのコピーは
FileCopy "ファイル名までのコピー元パス", "ファイル名までのコピー先パス" |
とします.
コンマがあるので注意してください.
コピー先で拡張子・名前を変更することが可能です.
ファイルの削除
ファイルの削除は次のようにします.
Kill "パス" |
ブックのパス取得
開いているブックのフルパスを取得するには,
ActiveWorkbook.FullName |
とします.
フォルダまでなら.Path
,ブック名は.Name
で取得できます.
PDFを開く
Windowsでは
CreateObject("Shell.Application").ShellExecute パス |
と書くことで,PDFを開くことができます.
フォルダの作成
次は,Windowsでフォルダの存在判定をして,存在しないならフォルダを作成する例です.
Dim dirName As String |
フォルダの削除
フォルダの削除は次の通りです.
RmDir "パス" |
文字列操作
入力値と表示値
日付や桁区切りの表示形式を設定したセルでは入力値が加工された値が表示されています.
入力値Value
でなく表示値を取得したいときには,Text
プロパティを使います.
Sub 表示値のコピー() |
数式のコピー
数式をコピーしたいときなどは,Formula
プロパティを使います.
手でコピーするときと異なり,行や列がシフトしてしまうこともありません.
Formulaプロパティへ数式を納め,計算後の確定した値をValueプロパティに納め,さらに表示形式に応じて加工してTextプロパティに落とし込んでいます.
文字列分割
文字列の分割にはSplit
を用います.
Split(変数, 区切り文字) |
区切り文字によく指定されるのは,"$"
(Cells(i,j).Addressは$i$jを返す)や","
(CSV),改行を表すvbCrLf
です.
さらに,
Split(変数, 区切り文字) (引数) |
とすれば,分割されてできた配列の要素を得ることができます.
検索・置換
検索
ある範囲で文字列の検索を行うには次のようにします.
Dim rng As Range |
- この
rng.Address
は検索語に対する絶対アドレス. - 検索は範囲開始セルの次のセルから行う.
- 検索後の位置から次に該当するセルを検索するには,
Set rng = Range(範囲).FindNext(rng)
とする.ただし,検索をループするだけだと無限ループになるので,注意.(Exit Do
する.) - 検索該当なしだとエラーになるので,If文で
rng Is Nothing
のケースを分岐しておく. - 完全一致させるなら,
Find(what:="検索語", LookAt:=xlWhole)
置換
次はstr
に含まれる文字列を置換する例です.
str = Replace(str, "置換前文字列", "置換後文字列") |
空白の置換
' 全角スペースを半角スペースに変換 |
左右の余分な空白を除去するには
対象 = Trim(対象) |
とします.
左右の余分な空白に加え,文字列中の重複空白を1つまで切り詰めるには
対象 = WorksheetFunction.Trim(対象) |
とします.
大文字・小文字,かな,全半角の変換
大文字・小文字の変換は次の通りです.
対象 = UCase(対象) |
平仮名・片仮名の変換です.
対象 = StrConv(対象, vbHiragana) |
全半角の変換です.
対象 = StrConv(対象, vbWide) |
数字を全角から半角にするには,
Dim i, delta As Long |
とします.
数字を半角から全角にするには,
Dim i, delta As Long |
とします.
アルファベットを全角から半角にするには,
Dim i, delta As Long |
とします.
正規表現
Windowであるとします.
まず,正規表現の検索用オブジェクトを作ります.
Dim re As Object |
最初の1つでいいなら.Globa = False
です.
次に,このパターンでの検索を実行します.
re
が上で定めた変数であるとき,
Dim match As Variant |
において,配列中の第i要素match(i)
は実際にi番目に該当したときの検索結果match(i).Value
を持ちます.
(存在はmatch.Count > 0
かどうかで確認できます.)
あるいは,For Each m In match
としてFor文を作ることで,
m.Value ' 実際に該当したときのmの値 |
といった値を使うことができます.
正規表現で検索された箇所を置換したい場合は,
re.Replace(置換前文字列, 置換後文字列) |
とします.
半角カナを全角カナに変換する
半角カナを全角カナに変換するには,事前にツール>参照設定>Microsoft VBScript Regular Expression 5.5にチェックして,正規表現を使用できるようにしておきます.
このとき,次のマクロで変換できます.
Sub ConvHalfKanaToWide(strBeforeConv, strAfterConv) |
画像
挿入
画像ファイルを読み込んで貼り付ける例です.
ActiveSheet.Pictures.Insert "パス" |
位置変更
B3セルに位置を合わせる例です.
With ActiveSheet.Pictures(1) |
オートシェイプ
オートシェイプにより長方形を作成する例です.
With Range("範囲") |
.AddShape msoShapeRectangle
を.AddConnector msoConnectorStraight
とすれば直線になります.
i番目に作った図形の設定を行う例です.
With ActiveSheet.Shapes(i) |
プログラミング
整数商と剰余
a / b '商 |
可変引数
ParamArray
を使い,以下のような調子で処理します.
Sub マクロ名(ParamArray arr As Variant) |
動的配列
Dim srt() As String |
であるとき,2要素に定めるには
ReDim str(2) |
とします.
str(2)
に代入後,この2要素を保持したまま3要素にするには
ReDim Preserve str(3) |
とします.
Preserve
をつけていないと,値がクリアされることに注意してください.
列挙型変数
可読性を高めるためにそれぞれの数値に名前を付けておきたい場合,列挙型変数を使うと便利です.
列挙型変数はSubプロシージャの前に次のような形式で用意します.
Enum 列挙型変数名 |
このとき,Subプロシージャ内で列挙型変数.変数
の形で値を呼び出せるようになります.
ユーザー定義変数
複数のプロパティを格納するユーザー定義変数を定義するには,Subプロシージャの前で次のようにします.
Type タイプ名 |
これで,プロシージャでDim 変数 As タイプ名
と宣言できるようになり,変数
では変数.Str
や変数.Num
に値を格納することができる.
ユーザー定義関数
Functionプロシージャにより作成した関数で,文字列の入力を受けとって,文字列を返す例です.
Function 関数名(str As String) As String |
関数名そのもので他のプログラミング言語のreturn
を行っていることに注意しましょう.
Exit Funtion
にて途中で抜けることもできます.
ユーザー定義関数はそのブック内において,通常のExcel関数としても使用できます.
なお,通常のワークシート関数はVBAでWorksheetFunction.関数名
の形式で使用することができます.
ただし,その範囲はRange
やCells
で指定しなくてはなりません.
マクロの終了
実行中のマクロ自体を終了するには,
End |
とします.
プロシージャを終了させるには,
Exit Sub |
とします.
エラー無視
On Error Resume Next 'エラー無視する処理を開始 |
警告無視
Application.DisplayAlerts = False |
画面更新の停止
Application.ScreenUpdating = False |
GoTo
ループ中に条件外のセルをスキップするGoTo
の一例です.
Dim i As Variant |
実行補助
マクロ実行ボタン
ボタンや図形を設置した後,右クリックから「マクロの登録」を選び,作ってあるマクロを選択します.
すると,そのボタンを押すことでマクロが実行されるように紐づきます.
ショートカット
mac OSの場合なら,開発>マクロ>オプションからショートカットを決めることができます.
メッセージボックス
マクロが終了したことをユーザーに知らせると親切です.
メッセージボックスはMsgBox
の後に文字列を入力することで作成します.
Sub メッセージボックスの例() |
はい・いいえの選択ボタン
はい・いいえの2択をダイアログで出すにはMsgBox
の引数にvbYesNo
を使用します.
入力に応じてvbYes
またはvbNo
が返されので,処理を条件分岐します.
If MsgBox ("テキスト", vbYesNo) = vbYes Then |
範囲選択
範囲選択させる例です.
範囲選択をキャンセルした場合は,GoTo
でジャンプさせています.
Dim targetRange As Range |
入力ボックス
入力ボックスを出して,入力されたテキストを変数に格納する例です.
Dim 変数 As 型 |
入力キャンセルされてしまった場合のため,別途エラー処理することが必要です.
コマンドバーへの登録
右クリックしたときに表示されるコマンドバーにマクロを登録するには,
CommandBars("Cell").Controls(1).BeginGroup = True ' コマンドバーの一番上にマクロを置くために他をグループ化. |
とします.
削除するには
CommandBars("Cell").Controls("コマンドバーに表示される名称").Delete |
とします.
セル変更のイベント取得
例えば(1,1)セルが変更されるたびにオートでマクロを実行したいというのなら,サイドバーのモジュールではなくThisWorkbookに,次を書きます.
Private Sub Worksheet_Change(ByVal Target As Range) |
実行ボタンの作成
マクロで実行ボタンそのものを作成する例です.
Sub MacroSwitch() |
起動・終了時実行
起動時にマクロを実行するには,モジュールでなくThisWorkbook
に以下を記述します.
Private Sub Workbook_Open() |
終了時は
Private Sub Workbook_BeforeClose(Cancel As Boolean) |
です.
参考文献
事務の効率化のためにVBAマクロの学習をはじめたのであれば,次の逆引き辞典にはExcelでやっていた大抵のことが載っています.
- 田中 (2016)「Excel VBA 逆引き辞典パーフェクト」3版,翔泳社.
以下は,VBAに詳しいリンクです.