このページは,Excel VBAについて整理しています.

目次

  1. セル
    1. 全範囲
    2. セル範囲
    3. 行・列
    4. 選択範囲
    5. アクティブセル
    6. 現在セルからの行数・列数の差異を用いる
    7. 特定セルを起点にして範囲選択する
  2. 最終行の取得
    1. 現在の表で
    2. 何かが設定されている範囲で
    3. 文字が入っている範囲で
    4. みなし最終行
  3. For Each文
    1. 選択範囲全てのセルで処理を施す
    2. 全てのワークシートで処理を施す
  4. Do Whileループ
    1. 同じディレクトリにある全てのファイルに処理を施す
  5. Select文
  6. コピー&ペースト
    1. 値のみ貼り付け
    2. 書式のみ貼り付け
    3. 行列を転置して貼り付け
  7. 表示・非表示・フィルター
    1. 行の非表示
    2. オートフィルタ
  8. 罫線
    1. 線種
    2. 線の位置
    3. 外枠
    4. 線の太さ
    5. 対角線
  9. 外観・書式
    1. 値のみ消去
    2. ウィンドウ枠の固定
    3. 列幅調整
    4. 折り返し表示・縮小表示
    5. 文字位置
    6. 桁区切り
    7. 日付
    8. 小数点
    9. ゼロでの頭埋め
    10. 文字列
  10. フォント
    1. 背景色
    2. セル結合
    3. コメント
    4. ハイパーリンク
  11. 印刷
    1. 1枚の用紙に印刷
    2. 印刷範囲を設定する場合
    3. 改ページ
    4. 用紙方向
    5. 全ページにフィールド名・レコード名を印刷
    6. ヘッダー・フッター
    7. PDF出力
  12. シート
    1. 挿入
    2. 複製
    3. 非表示・再表示
    4. 保護
    5. 表示位置をシートのトップへジャンプさせる
    6. ワークシートの存在を調べる
  13. ファイル・フォルダ
    1. ファイルを開く
    2. ファイルの保存
    3. 移動・リネーム
    4. ファイルのコピー
    5. ファイルの削除
    6. ブックのパス取得
    7. PDFを開く
    8. フォルダの作成
    9. フォルダの削除
  14. 文字列操作
    1. 入力値と表示値
    2. 数式のコピー
    3. 文字列分割
  15. 検索・置換
    1. 検索
    2. 置換
    3. 空白の置換
    4. 大文字・小文字,かな,全半角の変換
    5. 正規表現
    6. 半角カナを全角カナに変換する
  16. 画像
    1. 挿入
    2. 位置変更
    3. オートシェイプ
  17. プログラミング
    1. 整数商と剰余
    2. 可変引数
    3. 動的配列
    4. 列挙型変数
    5. ユーザー定義変数
    6. ユーザー定義関数
    7. マクロの終了
    8. エラー無視
    9. 警告無視
    10. 画面更新の停止
    11. GoTo
  18. 実行補助
    1. マクロ実行ボタン
    2. ショートカット
    3. メッセージボックス
    4. はい・いいえの選択ボタン
    5. 範囲選択
    6. 入力ボックス
    7. コマンドバーへの登録
    8. セル変更のイベント取得
    9. 実行ボタンの作成
    10. 起動・終了時実行
  19. 参考文献

セル

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)

Dim i As Integer

For i = 1 To EndColumn()
If Cells(1, i).Text = colTitle Then
Columns(i).Select
Exit Sub
End If
Next

End Sub

アクティブセル

アクティブセルは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. シートの全ての行の数を調べ,
  2. 全セル範囲における最終行のセルを起点として,
  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

' 空白セルのカウンタ
Dim cnt As Integer
cnt = 0

' 空白セル連続何回でループを終了するか
Dim maxcnt As Integer
maxcnt = 50

' ループ
Do Whie cnt < maxcnt
If Cells(i + cnt, j) = "" Then
cnt = cnt + 1
Else
tmp = i + cnt
cnt = 0
' 処理
i = tmp + 1
End If
Loop

For Each文

For Each文は何かの集合から個々の対象を1つずつ処理したいときに使うFor文のバリエーションです.
セル範囲から各セルに何か処理を施すというFor文でできそうなことも行えますが,For Each文が魅力的なのは,「選択範囲全てのセルで」・「全てのシートで」といった処理が行数やシート数を指定せずに可能となることです.

選択範囲全てのセルで処理を施す

特定のシートの中で選択範囲をとるシンプルな例だと,Selectionを用いて

Dim i As Variant
For Each i In Selection
' 処理
Next

となります.

処理では,例えば値なら,i.Valueを使います.
繰り返しを抜けるのにExit Forを使うのは通常のFor文と同じです.

全てのワークシートで処理を施す

選択範囲の全セルでなく,全てのワークシートで処理を行う場合はSelectionに代えてWorksheetsです.

Dim ws As Worksheet
For Each ws in Worksheets
' 処理
Next

Do Whileループ

Do Whileループは条件を破るまで処理を反復し続けます.
次は,1列目において2行目から空白行に当たるまでセルを下降しつつ処理を繰り返すサンプルです.
より正確に言えば,「今のセルが空白でない間はループを続ける.そうでない場合は処理して,『次のセルへ移るためのカウンタを増やす』」です.

Dim i As Long
i = 2 ' 初期値

Do While Cells(i, 1) <> ""
' 処理
i = i + 1
Loop

For文と異なり,While文では自動的にカウンタが増えません.
このため,インクリメント(変数の値を1増やす)という処理を含めます.

繰り返しを抜けたい場合はExit Doとします.

同じディレクトリにある全てのファイルに処理を施す

Dir関数を併用して,現在のフォルダで未処理のファイルがなくなるまで(=全てのファイルに)マクロをかけることができます.

Do While Dir() <> ""
' 処理
Loop

xls,xlsx,xlsmのようなファイルのみを指定するのは,次の要領です.

Sub LoopMacro()

'マクロと同じ階層にあるExcelのファイル全てに処理を施します.

Dim sep As String
Dim filePath As String
Dim fileName As String

If MsgBox ("このマクロは同じフォルダにある全エクセルを更新して自動保存してしまいます.処理を進めてよろしいですか?", vbYesNo) = vbYes Then
MsgBox "処理を開始します."
Else
End
End If

If Application.OperatingSystem Like "*Mac*" Then
sep = "/"
Else
sep = "¥"
End If

Application.ScreenUpdating = False

filePath = ThisWorkbook.Path & sep & "*.xls*"
fileName = ""
fileName = Dir(filePath)

Do While fileName <> ""

If fileName = ThisWorkbook.Name Then
GoTo ContinueLabel
End If

filePath = ThisWorkbook.Path & sep & fileName
Workbooks.Open filePath

'処理

ActiveWorkbook.Save
ActiveWorkbook.Close

ContinueLabel:
fileName = Dir()

Loop

Application.ScreenUpdating = True
MsgBox "マクロを実行しました."

End Sub

Select文

If文では条件分岐の数が多くなりすぎる場合,Select文を使うと便利です.

Select Case 対象セル
Case 条件1
' 処理
Case 条件2
' 処理
Case Else
' 処理
End Select

対象セルが値であれば,条件はIs > 01 To 10という書き方になります.

コピー&ペースト

Excelのセル範囲をコピー&ペーストするとき,値だけでなく書式やセル背景色もコピーされます.

基本のコピー&ペーストは次の通りです.(Range(範囲)でなくCells(行,列)も使えます.)

Range("コピー元").Copy Destination:=Range("コピー先")

同じことですが,

Range("コピー元").Copy
Range("コピー先").Paste

と分けて書くこともできます.

別シートに貼り付ける場合は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 フォントの設定例()

Cells(1, 1).Font.Color = RGB(0, 255, 0) '文字色を緑に設定
Cells(1, 1).Font.Bold = True '太字を設定
Cells(1, 1).Font.Italic = True '斜体を設定
Cells(1, 1).Font.Underline = False '下線を解除

End Sub

同じものをWithを使って書き直した例です.

Sub フォントの設定例2()

With Cells(1, 1).Font
.Color = RGB(0, 255, 0)
.Bold = True
.Italic = True
.Underline = False
End With

End Sub

背景色

RGB関数を左から順にRed,Green,Blueで設定します.
値の範囲は0〜255です.

Sub セル背景色の設定例()
Cells(1, 1).Interior.Color = RGB(255, 0, 0) 'A1セルの背景色を赤に設定
End Sub

セル結合

セル結合と結合解除はそれぞれ次の通りです.

Range("結合範囲").Merge
Range("結合解除範囲").UnMerge

結合は,指定した範囲に値のあるセルが1つのみ存在する場合,その値となります.
2つ以上存在する場合,確認ダイアログがでます.
ダイアログを無視するため,Application.DisplayAlerts = Falseを併用するとよいでしょう.

結合解除では,セル範囲の最も左上にあるセルにのみ値が残ります.

コメント

セルでコメントの追加・削除・取得を行う方法は以下の通りです.

Cells(1,1).AddComment "コメント"
Cells(1,1).ClearComments
Cells(1,1).Comment.Text

ハイパーリンク

メールアドレスへのハイパーリンクは,

ActiveSheet.Hyperlinks.Add Anchor:=Range("セル"), Address:="mailto:メールアドレス", TextToDisplay:="表示テキスト"

で作成します.

ファイルへのハイパーリンクは,

ActiveSheet.Hyperlinks.Add Anchor:=Range("セル"), Address:="パス", TextToDisplay:="セルに表示するテキスト"

で作成します.

印刷

1枚の用紙に印刷

1枚の用紙に印刷するには

With ActiveSheet
.PageSetup.Zoom = False
.PageSetup.FitToPagesWide = 1
.PageSetup.FitToPagesTall = 1
End With

とします.

応用して,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
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, fileName:=ThisWorkbook.Path & "¥ファイル名.pdf"

の要領です.

シート

挿入

シートの追加と命名をひとまとめにして,次のように行うとシンプルです.

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 := "パスワード"

とします.

  • 解除するにはProtectUnprotectにする.
  • パスワードを知っているユーザは自分で保護を解除できる.

表示位置をシートのトップへジャンプさせる

アプリケーションで目的のセルにGoToします.

Application.Goto Reference:=Cells(1, 1), Scroll:=True

ワークシートの存在を調べる

ワークシートの存在判定用の関数は用意されていないので,ユーザー定義関数を作って使います.

Public Function ExistsWorksheet(ByVal name As String) As Boolean

Dim ws As Worksheet
For Each ws In Sheets
If ws.name = name Then
ExistsWorksheet = True
Exit Function
End If
Next

ExistsWorksheet = False

End Function

ファイル・フォルダ

ファイルを開く

Windowsでファイルを開くには

buf = "ファイル名"
Workbooks.Open ThisWorkbook.path & "¥" & buf

します.

リンクを更新せずに開く場合,UpdateLinksのオプションを使って,

buf = "ファイル名"
Workbooks.Open ThisWorkbook.path & "¥" & buf, UpdateLinks:=False

とします.

ファイルの保存

アクティブなワークブックを上書き保存するには

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
dirName = "ディレクトリ名"
If Dir(ThisWorkbook.path & "¥" & dirName, vbDirectory) = "" Then
MkDir ThisWorkbook.path & "¥" & dirName
End If

フォルダの削除

フォルダの削除は次の通りです.

RmDir "パス"

文字列操作

入力値と表示値

日付や桁区切りの表示形式を設定したセルでは入力値が加工された値が表示されています.
入力値Valueでなく表示値を取得したいときには,Textプロパティを使います.

Sub 表示値のコピー()
Cells(2, 1).Value = Cells(1, 1).Text 'A2セルの入力値としてA1セルの表示値を使う
End Sub

数式のコピー

数式をコピーしたいときなどは,Formulaプロパティを使います.
手でコピーするときと異なり,行や列がシフトしてしまうこともありません.
Formulaプロパティへ数式を納め,計算後の確定した値をValueプロパティに納め,さらに表示形式に応じて加工してTextプロパティに落とし込んでいます.

文字列分割

文字列の分割にはSplitを用います.

Split(変数, 区切り文字)

区切り文字によく指定されるのは,"$"(Cells(i,j).Addressは$i$jを返す)や","(CSV),改行を表すvbCrLfです.

さらに,

Split(変数, 区切り文字) (引数)

とすれば,分割されてできた配列の要素を得ることができます.

検索・置換

検索

ある範囲で文字列の検索を行うには次のようにします.

Dim rng As Range
Set rng = Range("範囲").Find(what:="検索語")
  • このrng.Addressは検索語に対する絶対アドレス.
  • 検索は範囲開始セルの次のセルから行う.
  • 検索後の位置から次に該当するセルを検索するには,Set rng = Range(範囲).FindNext(rng)とする.ただし,検索をループするだけだと無限ループになるので,注意.(Exit Doする.)
  • 検索該当なしだとエラーになるので,If文でrng Is Nothingのケースを分岐しておく.
  • 完全一致させるなら,Find(what:="検索語", LookAt:=xlWhole)

置換

次はstrに含まれる文字列を置換する例です.

str = Replace(str, "置換前文字列", "置換後文字列")

空白の置換

' 全角スペースを半角スペースに変換
対象 = Replace(対象, " ", " ")

' タブを半角スペースに変換
対象 = Replace(対象, vbTab, " ")

' 改行を半角スペースに変換
対象 = Replace(対象, vbCr, " ")
対象 = Replace(対象, vbLf, " ")
対象 = Replace(対象, vbCrLf, " ")

左右の余分な空白を除去するには

対象 = Trim(対象)

とします.

左右の余分な空白に加え,文字列中の重複空白を1つまで切り詰めるには

対象 = WorksheetFunction.Trim(対象)

とします.

大文字・小文字,かな,全半角の変換

大文字・小文字の変換は次の通りです.

対象 = UCase(対象)
' または 対象 = Format(対象, ">")

対象 = LCase(対象)
' または 対象 = Format(対象, "<")

平仮名・片仮名の変換です.

対象 = StrConv(対象, vbHiragana)
対象 = StrConv(対象, vbKatakana)

全半角の変換です.

対象 = StrConv(対象, vbWide)
対象 = StrConv(対象, vbNarrow)

数字を全角から半角にするには,

Dim i, delta As Long
Dim str As String
delta = Asc("0") - Asc("0")
For i = Asc("0") To Asc("9")
str = Replace(str, Chr(i - delta), Chr(i))
Next i

とします.

数字を半角から全角にするには,

Dim i, delta As Long
Dim str As String
delta = Asc("0") - Asc("0")
For i = Asc("0") To Asc("9")
str = Replace(str, Chr(i), Chr(i - delta))
Next i

とします.

アルファベットを全角から半角にするには,

Dim i, delta As Long
Dim str As String

delta = Asc("A") - Asc("A")
For i = Asc("A") To Asc("Z")
str = Replace(str, Chr(i - delta), Chr(i))
Next i

delta = Asc("a") - Asc("a")
For i = Asc("a") To Asc("z")
str = Replace(str, Chr(i - delta), Chr(i))
Next i

とします.

正規表現

Windowであるとします.
まず,正規表現の検索用オブジェクトを作ります.

Dim re As Object
Set re = CreateObject("VBScript.RegExp")
With re
.Pattern = "正規表現のパターン"
.Global = True
End With

最初の1つでいいなら.Globa = Falseです.

次に,このパターンでの検索を実行します.
reが上で定めた変数であるとき,

Dim match As Variant
Set match = re.Execute(対象セル)

において,配列中の第i要素match(i)は実際にi番目に該当したときの検索結果match(i).Valueを持ちます.
(存在はmatch.Count > 0かどうかで確認できます.)

あるいは,For Each m In matchとしてFor文を作ることで,

m.Value ' 実際に該当したときのmの値
m.FirstIndex + 1 ' 何番目の該当か

といった値を使うことができます.

正規表現で検索された箇所を置換したい場合は,

re.Replace(置換前文字列, 置換後文字列)

とします.

半角カナを全角カナに変換する

半角カナを全角カナに変換するには,事前にツール>参照設定>Microsoft VBScript Regular Expression 5.5にチェックして,正規表現を使用できるようにしておきます.
このとき,次のマクロで変換できます.

Sub ConvHalfKanaToWide(strBeforeConv, strAfterConv)

Dim re As New RegExp
Dim reMatches As MatchCollection

re.Pattern = "[。-゚]+"
re.Global = True
Set reMatches = re.Execute(strBeforeConv)

Dim i As Long
Dim matchCnt As Long
matchCnt = reMatches.Count

Dim reMatch As Match
Dim targetChrs As String

strAfterConv = strBeforeConv
For i = matchCnt - 1 To 0 Step -1
Set reMatch = reMatches.Item(i)
targetChrs = StrConv(reMatch.Value, vbWide)
strAfterConv = Left(strAfterConv, reMatch.FirstIndex) & targetChrs & Mid(strAfterConv, reMatch.FirstIndex + reMatch.Length + 1)
Next

End Sub

画像

挿入

画像ファイルを読み込んで貼り付ける例です.

ActiveSheet.Pictures.Insert "パス"

位置変更

B3セルに位置を合わせる例です.

With ActiveSheet.Pictures(1)
.Top = Range("B3").Top
.Left = Range("B3").Left
End With

オートシェイプ

オートシェイプにより長方形を作成する例です.

With Range("範囲")
ActiveSheet.Shapes.AddShape msoShapeRectangle, .Left, .Top, .Width, .Height
End With

.AddShape msoShapeRectangle.AddConnector msoConnectorStraightとすれば直線になります.

i番目に作った図形の設定を行う例です.

With ActiveSheet.Shapes(i)
.Fill.ForeColor.RGB = RGB(255, 255, 255) '図形内部の色
.Fill.Solid '図形内部を塗りつぶし
.Line.ForeColor.RGB = RGB(0, 0, 0) '枠線の色
.Line.Weight = 10 '枠線太さ
.TextFrame2.TextRange.Characters.Text = "テキスト" 'テキスト
.TextFrame2.TextRange.Font.Size = 20 'テキストのフォントサイズ
.TextFrame2.VerticalAnchor = msoAnchorMiddle '上下センター
.TextFrame2.HorizontalAnchor = msoAnchorCenter '左右センター
End With

プログラミング

整数商と剰余

a / b '商
a \ b '整数商
a mod b '剰余

可変引数

ParamArrayを使い,以下のような調子で処理します.

Sub マクロ名(ParamArray arr As Variant)
Dim i As Long
For i = 0 To UBound(arr)
' 処理
Next i
End Sub

動的配列

Dim srt() As String

であるとき,2要素に定めるには

ReDim str(2)

とします.

str(2)に代入後,この2要素を保持したまま3要素にするには

ReDim Preserve str(3)

とします.
Preserveをつけていないと,値がクリアされることに注意してください.

列挙型変数

可読性を高めるためにそれぞれの数値に名前を付けておきたい場合,列挙型変数を使うと便利です.
列挙型変数はSubプロシージャの前に次のような形式で用意します.

Enum 列挙型変数名
変数1 = 数値1
変数2 = 数値2
End Enum

このとき,Subプロシージャ内で列挙型変数.変数の形で値を呼び出せるようになります.

ユーザー定義変数

複数のプロパティを格納するユーザー定義変数を定義するには,Subプロシージャの前で次のようにします.

Type タイプ名
Str As String
Num As Long
End Type

これで,プロシージャでDim 変数 As タイプ名と宣言できるようになり,変数では変数.Str変数.Numに値を格納することができる.

ユーザー定義関数

Functionプロシージャにより作成した関数で,文字列の入力を受けとって,文字列を返す例です.

Function 関数名(str As String) As String
Dim str As String
' 処理
関数名 = str 'returnに相当
End Function

関数名そのもので他のプログラミング言語のreturnを行っていることに注意しましょう.
Exit Funtionにて途中で抜けることもできます.

ユーザー定義関数はそのブック内において,通常のExcel関数としても使用できます.

なお,通常のワークシート関数はVBAでWorksheetFunction.関数名の形式で使用することができます.
ただし,その範囲はRangeCellsで指定しなくてはなりません.

マクロの終了

実行中のマクロ自体を終了するには,

End

とします.

プロシージャを終了させるには,

Exit Sub

とします.

エラー無視

On Error Resume Next 'エラー無視する処理を開始
' 処理
On Error GoTo 0 '以降,エラー処理無効化

警告無視

Application.DisplayAlerts = False
' 処理
Application.DisplayAlerts = True

画面更新の停止

Application.ScreenUpdating = False
' 処理
Application.ScreenUpdating = True

GoTo

ループ中に条件外のセルをスキップするGoToの一例です.

Dim i As Variant
For Each i In Selection
If i.Value = "" Then
GoTo Continue
End If
' 処理
Continue:
Next i

実行補助

マクロ実行ボタン

ボタンや図形を設置した後,右クリックから「マクロの登録」を選び,作ってあるマクロを選択します.
すると,そのボタンを押すことでマクロが実行されるように紐づきます.

ショートカット

mac OSの場合なら,開発>マクロ>オプションからショートカットを決めることができます.

メッセージボックス

マクロが終了したことをユーザーに知らせると親切です.
メッセージボックスはMsgBoxの後に文字列を入力することで作成します.

Sub メッセージボックスの例()
Cells(1, 1) = "マクロ入力テスト"
MsgBox "マクロの実行を終了しました!"
End Sub

指定したタイミングでメッセージボックスがポップアップする

はい・いいえの選択ボタン

はい・いいえの2択をダイアログで出すにはMsgBoxの引数にvbYesNoを使用します.
入力に応じてvbYesまたはvbNoが返されので,処理を条件分岐します.

If MsgBox ("テキスト", vbYesNo) = vbYes Then
' Yesの場合の処理
Else
' Noの場合の処理
End If

範囲選択

範囲選択させる例です.
範囲選択をキャンセルした場合は,GoToでジャンプさせています.

Dim targetRange As Range
On Error GoTo myCancel
Set targetRange = Application.InputBox("メッセージ", Type:=8)
' 処理
myCancel:

入力ボックス

入力ボックスを出して,入力されたテキストを変数に格納する例です.

Dim 変数 As
変数 = InputBox ("テキスト")

入力キャンセルされてしまった場合のため,別途エラー処理することが必要です.

コマンドバーへの登録

右クリックしたときに表示されるコマンドバーにマクロを登録するには,

CommandBars("Cell").Controls(1).BeginGroup = True ' コマンドバーの一番上にマクロを置くために他をグループ化.
With CommandBars("Cell").Controls.Add(Before := 1)
.Caption = "コマンドバーに表示される名称"
.OnAction = "別途定義する作動用のマクロ名(括弧不要)"
End With

とします.

削除するには

CommandBars("Cell").Controls("コマンドバーに表示される名称").Delete

とします.

セル変更のイベント取得

例えば(1,1)セルが変更されるたびにオートでマクロを実行したいというのなら,サイドバーのモジュールではなくThisWorkbookに,次を書きます.

Private Sub Worksheet_Change(ByVal Target As Range)
If (Target.Row = 1 And Target.Column = 1) Then
Call マクロ
End If
End Sub

実行ボタンの作成

マクロで実行ボタンそのものを作成する例です.

Sub MacroSwitch()
With ActiveSheet.Buttons.Add(Range("左上になるセル").Left, _
Range("左上になるセル").Top, _
Range("幅範囲").Width, _
Range("高さ範囲").Height)
.Name = "ボタンの識別名"
.OnAction = "マクロの名称(マクロ名後の括弧は不要だが,ダブルクォーテーションでマクロ名を囲むこと)"
.Characters.Text = "ボタンに表示されるテキスト"
End With
End Sub

起動・終了時実行

起動時にマクロを実行するには,モジュールでなくThisWorkbookに以下を記述します.

Private Sub Workbook_Open()
' 処理
End Sub

終了時は

Private Sub Workbook_BeforeClose(Cancel As Boolean)
' 処理
End Sub

です.

参考文献

事務の効率化のためにVBAマクロの学習をはじめたのであれば,次の逆引き辞典にはExcelでやっていた大抵のことが載っています.

  • 田中 (2016)「Excel VBA 逆引き辞典パーフェクト」3版,翔泳社.

以下は,VBAに詳しいリンクです.