📑

ExcelVBA関数集(一部)

2020/09/27に公開

※この記事は、Qiitaに投稿した記事を一部変更したものです。
https://qiita.com/kunosu/items/fe5e1e10dbf1f6975344


注意

  • 本記事は [Ctrl] + [F] での検索前提で書かれています。
  • 全ての関数は載っていません。

定数 Const

Const 定数名 As String = "記載したページだけから参照できる定数"
Public Const 定数名 As String = "ブック全体から参照できる定数"

関数を作成する

値渡し ByVal / 参照渡し ByRef

  • 値渡し:呼び出し元は変更されない
  • 参照渡し:呼び出し元も変更される(C言語のポインタのようなもの)
  • 未指定の場合は「参照渡し」になる
Sub func(ByVal 値渡し As String, ByRef 参照渡し As String)

End Sub

戻り値がない関数の呼び出し

Call func(x, y)

戻り値

Function func() As 戻り値の型
	func = 戻り値
End Function

関数を途中で終了して呼び出し元へ戻す

if 何か判定 Then
	Exit Sub
End If

例外処理

※GoTo文を使うため、あまり多用しないこと

Sub func()
	On Error GoTo ErrorHandler  'エラー発生でErrorHandlerへ飛ぶ

	'処理を書く

	Exit Sub
ErrorHandler:
	'-- 例外処理
	Debug.Print "【例外発生】"
	Application.ScreenUpdating = True   '画面の更新を再開
End Sub

値が日付か判定

if IsDate(Cells(1,2)) Then
	'B1が日付の時の処理
End If

条件分岐

等しい

  • == は使えない
  • = で判定

否定 Not

  • != は使えない
  • <> で判定
  • 下記の判定方法もあります
if Not(判定) Then

End If

Switch文

Select Case x
	Case 1
		'x == 1のときの処理
	Case 2
		'x == 2のときの処理
	Case Else
		' どれでもない時
End Select

ループ

while文

Do While 条件
	'真の間繰り返し
Loop

while文を途中で抜ける

Exit Do	'breakは使えない

for文

For i = 0 To 10
	'11回繰り返す
Next i

for文を途中で抜ける

Exit For

デバッグする

イミディエイトウィンドウに値を表示させる

  • Debug.Print の出力先
  • 表示方法:メニューの [表示] -> [イミディエイト ウィンドウ]
Debug.Print(変数名)
Debug.Print "文字列";変数名;"文字列" '文字列と組合せて出力

イミディエイトウィンドウをクリアする

普通に編集できるため、[Ctrl] + [A] で全選択して [Del]

インクリメント/デクリメント

i++ のような機能はないので、普通に足す/引くしかないです

複数行をまとめてコメントアウト

  • 編集ウィンドウの [コメント ブロック] をクリック
  • 編集ウィンドウの表示方法
    • [表示] -> [ツールバー] -> [編集] をチェック

With文(変数を省略)

With ワークシート
	.Cell() 'ワークシート.Cell()と同じになる
End With

セル

セルから値を取得して変数に代入

Dim 変数名 As String
変数名 = Cells(1, 2).Value  ' B2の値を文字列で得る

セルの内容が変更された時に実行 Worksheet_Change

  • 対象のワークシートのモジュールに下記を記入
  • マクロによるセルの変更があっても実行されるため、下手すると無限ループになります
Private Sub Worksheet_Change(ByVal Target As Range)
	Dim changeCells As Range	'変更監視範囲

	'変更監視範囲を「A1:C100」に指定
	Set changeCells = Application.Intersect(Target, Range(Cells(1,1), Cells(100, 3)))

	'未変更or空白なら無視
	If (changeCells Is Nothing) Or (Cells(Target.Row, Target.Column) = "") Then
	'If (changeCells Is Nothing) Or (Target.Item(1) = "") Then	'こちらでもOK
		Exit Sub
	End If

	func(Target.Item(1))	'変更があったセルに対して処理を行う(関数呼び出し)
End Sub

指定セルから一番下のセルを得る

  • [Ctrl] + [↓] で移動するセルと同じ場所になる
  • xlUp で上になる
Cells(1, 2).End(xlDown) 'B1から一番下のセル

指定セルから一番右のセルを得る

  • [Ctrl] + [→] で移動するセルと同じ場所になる
  • xlToLeft で左になる
Cells(1, 2).End(xlToRight) 'B1から一番右のセル

セルを検索 Find

  • what:= 検索対象
  • LookIn:= 検索対象の種類を指定
  • 検索失敗時の処理を記述すること
名前 種類
xlValues
xlFormulas 数式
xlComments コメント
Dim foundCell As Range   '検索結果のセルを格納
foundCell = Range("B:B").Find(what:="あ", LookIn:=xlValues)	'値として「あ」を含むセルをB列から検索

If (foundCell Is Nothing) Then	'検索失敗時の処理
	MsgBox "「あ」は存在しません"
Else
	'検索対象が見つかったときの処理
End If

空白を判定する

いくつか判定方法があります

Dim cell As Range   '判定対象のセル

'cellにエラー値(#NAなど)が含まれる場合エラーになる
If cell = "" Then
End If

'何も入っていない空白を確認したい場合
If IsEmpty(cell) Then
End If

'関数の結果で空白の場合も確認したい場合1
If CStr(cell.Value) = "" Then
End If

'関数の結果で空白の場合も確認したい場合2
If cell.Text = "" Then
End If

配列

配列を宣言・初期化

Dim 配列名(サイズ) As 型名
Erase 配列名	'初期化

初期化の値

型名
数値 0
文字 "" (空)
オブジェクト Nothing
バリアント Empty

配列のループ

Dim 要素 As Variant '必ずバリアント型で宣言すること

For Each 要素 In 配列名()
	'配列の各値が「要素」に代入された状態で処理される
Next 要素

配列のサイズ

UBound(配列名)
UBound(配列名, 次元)	'2次元以上の配列のとき指定

行を挿入

Rows(2).Insert '2行目に挿入
Range("B2").EntireRow.Insert 'B2セルへ挿入

変更の取り消し

  • [Ctrl] + [Z] と同じ動作
  • マクロで変更したものは戻せない

マクロの軽量化

Application.EnableEvents を変更することでイベント(セルの編集)の監視を止めることができる

Application.EnableEvents = False	'イベントを無視する
Application.Undo	'変更の取り消し
'・・・
'なんか処理する
'・・・
Application.EnableEvents = True 'イベント監視を再開

Discussion