Excel VBA のスニペット集
このページは、Excel VBA のスニペットなどをまとめる予定のページです。
目次
注意
- コードのライセンスは CC0 (クレジット表示不要、改変可、商用可) です。
スニペット
Continue
Dim sheet As Worksheet
For Each sheet In Worksheets
If sheet.Name = "Sheet1" Then
GoTo Continue ' continue
End If
' なにかする
Continue:
Next
- VBA には言語機能としての continue がないためラベルと GoTo を使用します。
Break
Dim sheet As Worksheet
For Each sheet In Worksheets
If sheet.Name = "Sheet1" Then
Exit For ' Sheet1 が見つかったら抜ける
End If
Next
Dim i As Integer
Do While i < 3
If i = 1 Then
Exit Do ' i が 1 だったら抜ける
End If
i = i + 1
Loop
- VBA で break にあたるものは Exit For, Exit Do などです。
メッセージボックスの表示
MsgBox "Test"
入力用ダイアログボックスの表示
Dim s As String
s = InputBox("...を入力してください。", "タイトル", "初期値")
セル (Range オブジェクト) の取得
Dim r As Range
Set r = Range("A1") ' 番地を指定
Dim r As Range
Set r = Cells(1, 1) ' 行 (1から), 列 (1から) を指定。Cells(1, 1) は Range("A1") と同じ
Range()
やCells()
はApplication.ActiveSheet.Range()
やApplication.ActiveSheet.Cells()
と同等です。
セルの値の取得
セルの値のセット
Range("A1").Value = 100
セルのコピー・貼り付け
セルの色付け
Range("A1").Interior.ColorIndex = 6 ' 色番号 (6 = 黄色)
Range("A1").Interior.Color = RGB(255, 255, 0) ' RGB (0~255)
列幅の自動調整
Columns()
はApplication.ActiveSheet.Columns()
と同等です。
値が入っている最大行数を取得
Dim rowCount As Long
rowCount = Cells(mei.rows.Count, 1).End(xlUp).Row ' 1列目のセルのうち、値が入っているセルの最後の行数
行の削除
Rows()
はApplication.ActiveSheet.Rows()
と同等です。
ワークシートの追加
Dim sheet As Worksheet
Set sheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))
sheet.Name = "シート名"
ワークシートの削除
Worksheets("シート名").Delete
入力ファイル選択ダイアログ (ファイルパスを取得)
' 例: テキストファイル選択
Dim path As String
path = Application.GetOpenFilename("テキストファイル(*.txt),*.txt")
' ファイルが選択されなかった場合 "False" になります。
If path = "False" Then
' Exit Sub など
End If
出力ファイル選択ダイアログ (ファイルパスを取得)
' 例: テキストファイル選択
Dim path As String
path = "test.txt"
path = Application.GetSaveAsFilename( _
InitialFileName:=path _
, FileFilter:="テキストファイル(*.txt),*.txt" _
, FilterIndex:=1 _
, Title:="保存先を指定して下さい。" _
)
' ファイルが選択されなかった場合 "False" になります。
If path = "False" Then
' Exit Sub など
End If
フォルダ選択ダイアログ
ファイルの存在チェック
実行フォルダの取得
印刷
テーブルの行を走査する
Dim o As ListObject
Set o = Worksheets("シート名").ListObjects("テーブル1")
For i = 1 To o.ListRows.Count
' MsgBox o.ListRows(i).Range(o.ListColumns("列名1").Index).Text ' 「列名1」の値を表示
' MsgBox o.ListRows(i).Range(2).Text ' 2列目の値を表示
Next
ディクショナリを使用する
処理中の描画を抑える
Application.ScreenUpdating = False
' なにか処理
Application.ScreenUpdating = True
- 描画を抑えると処理速度が向上します。
確認ダイアログを抑える
Application.DisplayAlerts = False
' なにか処理
Application.DisplayAlerts = True
- 削除や保存確認ダイアログが出ないようになります。
文字変換
CSV 読み込み
すべてのシートで A1 を選択
PowerShell 実行
ユーティリティ関数
ワークシートの存在確認
''' 指定した名前のワークシートがあるか確認します。
''' @param sheetName シート名
''' @return Boolean
Function Worksheet_Exists(ByVal sheetName As String) As Boolean
Dim sheet As Worksheet
For Each sheet In Worksheets
If sheet.Name = sheetName Then
Worksheet_Exists = True
Exit Function
End If
Next
Worksheet_Exists = False
End Function
ファイル保存 (UTF-8 BOMなし)
''' ファイルをUTF-8 BOM なしで保存します。
''' 参考: http://d.hatena.ne.jp/replication/20091117/1258418243
''' @param path 保存先のパス
''' @param contents ファイルの内容
Sub File_WriteAllTextUTF8WithoutBOM(ByVal path As String, ByVal contents As String)
Dim binary As Variant
With CreateObject("ADODB.Stream")
.Type = 2 ' adTypeText
.Charset = "UTF-8"
.Open
.WriteText contents
' バイナリで読み直す
.Position = 0
.Type = 1 ' adTypeBinary
.Position = 3 ' BOM(3バイト)スキップ
binary = .Read()
.Close
End With
With CreateObject("ADODB.Stream")
.Type = 1 ' adTypeBinary
.Open
.Write binary
.SaveToFile path, 2 ' adSaveCreateOverWrite
.Close
End With
End Sub
文字列の組み立て
''' .NET の String.Format() のような形で簡易的に文字列を組み立てます。(例 String_Format("{0} {1}!", "Hello", 1234))
''' @param format 書式文字列
''' @param args() 挿入するデータ
''' @return String
Function String_Format(ByVal format As String, ParamArray args() As Variant) As String
String_Format = format
For i = 0 To UBound(args)
String_Format = Replace(String_Format, "{" & i & "}", CStr(args(i)))
Next
End Function