マクロの自動記録で雛型作って適当に改造というお手軽さ。
一般企業の業務システムなんて殆ど何でも作れちゃうし!
でもトラブルの元になることもあったりする。
VBAはMicrosoft Officeに搭載されている統合開発環境Visual Basic Editor(VBE)上で開発する。
コードはMicrosoft Excel 2003と2007で動かしているが2003以前でも2007以降でもたぶん動く。
バージョン間の互換性は高い。
Sub HelloWorld() 'これはコメント、アポストロフィーのあとに入力する 'メモみたいなもん '実行結果はA1セルにHelloWorldと表示される Range("A1").Value = "HelloWorld" End Sub
オブジェクト名.メソッド名 オブジェクト名.プロパティ名 = 値Range("A1").Value はRange(セル)にValue(値の代入の設定を行うプロパティ)をするという意味である。
Sub 変数() 'あらかじめA1セルとB1セルに入力されている整数を掛けて計算結果をC1セルに表示する Dim i As Integer Dim j As Integer i = Range("A1").Value j = Range("B1").Value Range("C1").Value = i * j End Sub
Dim i As Integer Dim j As Integer次に用意した変数に値を代入する。今回はセルを参照してそこに入力されている値を代入する。
i = Range("A1").Value j = Range("B1").ValueC1セルに計算結果を代入する。
Range("C1").Value = i * j
int i,j,k;VBAではこのようにするとk以外はVariantになってしまう。
Dim i, j, k As Integer正しくは
Dim i As Integer, j As Integer, k As Integer他にもVBA(VB)は独特の仕様があるから気を付けよう。
型 | 扱えるデータ | メモ |
Integer | ||
long | ||
Songle | ||
Double | ||
String | ||
Byte | ||
Boolean | ||
Currency | ||
Date | ||
Object | ||
Variant |
Sub 計算() Dim i As Single Dim j As Single i = 3 j = 2 '加 Range("D1").Value = i + j '減 Range("E1").Value = i - j '乗 Range("F1").Value = i * j '除 Range("G1").Value = i / j '商 Range("H1").Value = i \ j 'あまり Range("I1").Value = i Mod j 'べき乗 Range("J1").Value = i ^ j '文字列結合演算子 Range("k1").Value = i & j End Sub
Sub 相対参照() 'セルG7を選択する Range("G7").Select 'ActiveCellは現在選択されているセルを参照する。 'Offsetはセルを移動させる。左の数値は上下の指定、右の数値は左右の指定。 '下に1つ、右に3つセルを移動させる。移動後のセルはJ8。 ActiveCell.Offset(1, 3).Select End Sub
-2,-2 | -2,-1 | -2,0 | -2,1 | -2,2 |
-1,-2 | -1,-1 | -1,0 | -1,1 | -1,2 |
0,-2 | 0,-1 | 基準 | 0,1 | 0,2 |
1,-2 | 1,-1 | 1,0 | 1,1 | 1,2 |
2,-2 | 2,-1 | 2,0 | 2,1 | 2,2 |
=$C$1+$D$1
Sub 絶対参照01() Range("A1").Select End Sub
Sub 絶対参照02() Range("B1,B3,B5,B7,B9").Select End Sub
Sub 絶対参照03() Range("C1:D5").Select End Sub
Sub 絶対参照04() Range("A1,C1:D5").Select End Sub
Cells(行番号,列番号).Select
Sub コピペ() '文字列の代入 Range("A1").Value = "( ^ω^)" Range("A2").Value = "\(^o^)/" Range("A3").Value = "(´∀`)" Range("A4").Value = "キタ━(゚∀゚)━!" Range("A5").Value = "vipper" 'コピペ Range("A1:A5").Copy 'Copy→Cutにするとカット Range("B1").PasteSpecial'コピー先の先頭を指定してペースト End Sub
Range("B1,B3,B5,B7,B9").Copyや
Range("A1,C1:D5").Copyのようなセルの指定はできない。
Sub 設定() 'フォント Range("A1:A10").Font.Name = "MS明朝" '太字 Range("B1:B10").Font.Bold = True '斜体 Range("C1:C10").Font.Italic = True '下線 Range("D1:D10").Font.Underline = True End Sub
Range("A1:A10").Font.Name = "MS明朝"Boldプロパティによる太字の設定。Falseは太字の解除を行う。
Range("B1:B10").Font.Bold = TrueItalicプロパティによる斜体の設定。Falseは斜体の解除を行う。
Range("C1:C10").Font.Italic = TrueUnderlineプロパティによる下線の設定。Falseは下線の解除を行う。
Range("D1:D10").Font.Underline = True
'セルの塗りつぶし Range("A1").Interior.ColorIndex = 10 '文字色の変更 Range("A1").Font.ColorIndex = 10
'セルを塗りつぶす Range("A1").Interior.Color = RGB(255, 255, 255) '文字色の変更 Range("A1").Font.Color = RGB(255, 255, 0)
Range("A1").Font.Size = 12
With文を使うことによってプログラムの記述量を減らすことができる。次のプログラムをWith文を使い書き換える。
Sub 設定() 'セルの指定 Range("A1:A10").Select 'フォント 'Selectionは相対参照の項で使ったActiveCellと同じで現在選択されているセルを参照する。 'ただし複数セルを選択しているときActiveCellは先頭のセルしか参照しないので注意すること。 '今回の場合、ActiveCellを使うとA1セルしか以下の設定が反映されない。 Selection.Font.Name = "MS明朝" '太字 Selection.Font.Bold = True '斜体 Selection.Font.Italic = True '下線 Selection.Font.Underline = True End Sub
With文を使うと以下のようになる。With~End With間のすべてのSelectionを省略することができる。
Sub 設定() 'セルの指定 Range("A1:A10").Select With Selection 'フォント .Font.Name = "MS明朝" '太字 .Font.Bold = True '斜体 .Font.Italic = True '下線 .Font.Underline = True End With End Sub
With文の基本形
With 重複しているメソッドやオブジェクト … End With
次のように複数のメソッドやオブジェクトを省略することもできる。
'セルの指定 Range("A1:A10").Select With Selection.Font 'フォント .Name = "MS明朝" '太字 .Bold = True '斜体 .Italic = True '下線 .Underline = True End With End Sub
このようにIf文(後述)などの他の構文と組み合わせることもできる。
Sub 文字列の比較1完全一致() Dim str As String str = Range("A1").Value With Range("A2") If str Like "a" Then 'A1セルに半角のaが入力されたとき .Value = "一致" Else 'それ以外 .Value = "一致しない" End If End With End Sub
条件(セルの中の値や計算の結果など)によって処理を分けたいときにはIf文やCase文を使う。~
Sub 条件分岐If() Dim hundred As Integer hundred = Range("A1").Value If hundred < 100 Then 'A1セルに100未満が入力されたとき Range("A2").Value = "100未満" Else 'A1セルに100以上が入力されたとき Range("A2").Value = "100以上" End If End Sub
If 条件 Then '条件が満たされているときの処理 処理1 Else '条件が満たされていないときの処理 処理2 End If< は比較演算子で~未満を表す。意味は変数hundredが100未満のときである。
If hundred < 100 Then
演算子 | 記号 | メモ |
未満 | 1 < 2 | 2を含まないので2 < 2は成立しない。 |
以下 | 1 <= 2 | 2を含むので2 <= 2も成立する。 |
超過 | 2 > 1 | 2を含まないので2 > 2は成立しない。 |
以上 | 2 >= 1 | 2を含むので2 >= 2も成立する。 |
等号 | 1 = 1,1 <> 1 | |
文字列の比較 | Like "a" | 詳細は後述 |
Sub 文字列の比較1完全一致() Dim str As String str = Range("A1").Value If str Like "a" Then 'A1セルに半角のaが入力されたとき Range("A2").Value = "一致" Else 'それ以外 Range("A2").Value = "一致しない" End If End Sub
Sub 文字列の比較2部分一致() Dim str As String str = Range("A1").Value If str Like "*a*" Then'複数の指定はa*b*cのようになる 'A1セルに半角のaを含む文字列が入力されたとき Range("A2").Value = "一致" Else 'それ以外 Range("A2").Value = "一致しない" End If End Sub
Sub 文字列の比較3ある範囲内での一致() Dim str As String str = Range("A1").Value If str Like "[a-g]" Then '数字[1-9]・ひらがな[あ-こ]・かたかな[ア-コ]も可 'A1セルに半角のa,b,c,d,e,f,gのいずれか一文字が入力されたとき Range("A2").Value = "一致" Else 'それ以外 Range("A2").Value = "一致しない" End If End Sub
Sub 文字列の比較4ある範囲外での一致() Dim str As String str = Range("A1").Value If str Like "[!a-d]" Then 'A1セルにa,b,c,d以外のアルファベットが一文字だけ入力されたとき Range("A2").Value = "一致" Else 'それ以外 Range("A2").Value = "一致しない" End If End Sub
Sub 文字列の比較5任意の文字数() Dim str As Variant str = Range("A1").Value If str Like "???" Then 'A1セルに3文字の半角全角文字が入力されたとき Range("A2").Value = "一致" Else 'それ以外 Range("A2").Value = "一致しない" End If End Sub
Sub 文字列の比較6任意の桁数の数字() Dim str As Integer str = Range("A1").Value If str Like "###" Then'こういう書き方も出来る[0-9][0-9][0-9] 'A1セルに3桁の半角全角数字が入力されたとき Range("A2").Value = "一致" Else 'それ以外 Range("A2").Value = "一致しない" End If End Sub
演算子 | 記号 | メモ |
論理積 | 条件1 And 条件2 | 条件1と条件2が両方満たされたとき。 |
論理和 | 条件1 Or 条件2 | 条件1と条件2のいずれかが満たされたとき。 |
排他的論理和 | 条件1 Xor 条件2 | 条件1と条件2のいずれかが満たされたとき。 |
論理否定 | Not 条件 | 条件が満たされなかったとき。 |
論理等価 | 条件1 Eqv 条件2 | 条件1と条件2が両方満たされたとき。もしくは両方満たされなかったとき。 |
論理包含 | 条件1 Imp 条件2 | 条件1と条件2が両方満たされなかったとき。 |
Sub 条件分岐Else_If() Dim hundred As Integer hundred = Range("A1").Value If hundred >= 100 Then 'A1セルに100以上が入力されたとき Range("A2").Value = "100以上" ElseIf hundred >= 90 Then 'A1セルに90以上が入力されたとき Range("A2").Value = "90以上" ElseIf hundred >= 80 Then 'A1セルに80以上が入力されたとき Range("A2").Value = "80以上" ElseIf hundred >= 70 Then 'A1セルに70以上が入力されたとき Range("A2").Value = "70以上" ElseIf hundred >= 60 Then 'A1セルに60以上が入力されたとき Range("A2").Value = "60以上" Else 'A1セルに60未満が入力されたとき Range("A2").Value = "60未満" End If End Sub
If 条件1 Then 条件1が満たされているときの処理 ElseIf 条件2 Then 条件2が満たされているときの処理 ElseIf 条件3 Then 条件3が満たされているときの処理 … End If
Sub 条件分岐Select_Case() Dim hundred As Integer hundred = Range("A1").Value Select Case hundred Case Is >= 100 'A1セルに100以上が入力されたとき Range("A2").Value = "100以上" Case Is >= 90 'A1セルに90以上が入力されたとき Range("A2").Value = "90以上" Case Is >= 80 'A1セルに80以上が入力されたとき Range("A2").Value = "80以上" Case Is >= 70 'A1セルに70以上が入力されたとき Range("A2").Value = "70以上" Case Is >= 60 'A1セルに60以上が入力されたとき Range("A2").Value = "60以上" Case Else 'A1セルに60未満が入力されたとき Range("A2").Value = "60未満" End Select End Sub
Select Case 変数や式など Case Is 条件1 条件1が満たされているときの処理 Case Is 条件2 条件2が満たされているときの処理 Case Is 条件3 条件3が満たされているときの処理 … Case Else どの条件も満たされなかったときの処理 End Select条件式を使わない場合(例えばString型の変数に特定の文字列が代入されたことを条件にするというようなとき)、ISは不要。
Case "雨"Toを使えば値の範囲を指定できる。
Case 1 To 10'1 <= n => 10 のとき
無限ループを作ってしまったらEscキーで強制終了しよう。
Sub 繰り返しFor_Next() Dim num As Integer num = Range("A1").Value 'A1セルに入力された数値だけループを繰り返す For i = 1 To num Step 1 'Cellsについてはセルの操作のCellsによる指定を参照 Cells(i, 2).Value = "このループは" & i & "回目です" Next i
For カウンタ変数名 = 初期値 To 終了値 Step 加算値(1なら省略可) 処理 Next カウンタ変数名(カウンタ変数名は省略可)初期値はループ開始時のカウンタ変数の値である。このカウンタ変数の値が終了値になるとループが終了する。カウンタ変数は宣言しなくても使える
Sub 繰り返しDo_While() Dim num As Integer Dim i As Integer num = Range("A1").Value i = 1 'A1セルに入力された数値だけループを繰り返す Do While i <= num Cells(i, 2).Value = "このループは" & i & "回目です" 'ループが一周するごとにiに1が加算される(numの数値に近づく=終了条件に近づく) i = i + 1 Loop End Sub
Do While 終了条件 処理 Loopこのように後判定にすることもできる。後判定にすると必ず1回は処理を実行する。
Do 処理 Loop While 終了条件
Sub 二重ループ() '九九の表 '外側のループが1回終わる間に内側のループが9回行われる For i = 1 To 9 For j = 1 To 9 Cells(i, j).Value = i & "×" & j & "=" & i * j Next j Next i End Sub