マクロの自動記録で雛型作って適当に改造というお手軽さ。
一般企業の業務システムなんて殆ど何でも作れちゃうし!
でもトラブルの元になることもあったりする。
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 SubDim i As Integer Dim j As Integer次に用意した変数に値を代入する。今回はセルを参照してそこに入力されている値を代入する。
i = Range("A1").Value
j = Range("B1").Value
C1セルに計算結果を代入する。
Range("C1").Value = i * jint 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 | -32768から32767の整数のみ | |
| long | -2147483648から2147483647の整数のみ | |
| Single | ±1.401298E-45から±3.402823E38 | |
| Double | ±4.94065645841247E-324から±1.79769313486232E308 | |
| String | 文字列 | |
| Byte | 0から255の整数 | バイナリファイルの読み書きなど。 |
| Boolean | 真偽 | ゲームの当たり判定などで使う。知らない間に内部的な処理で使っていることもある。 |
| Currency | -92233703685477.5808から922337203685477.5807 | お金を扱うときに使う。 |
| Date | 日付と時刻 | |
| Object | Excel上のオブジェクトを扱う。 | オートシェイプ、ワークシート、セルなど。 |
| Variant | なんでも取り扱える |
Sub 計算()
Dim i As Double
Dim j As Double
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 SubSub 絶対参照02()
Range("B1,B3,B5,B7,B9").Select
End SubSub 絶対参照03()
Range("C1:D5").Select
End SubSub 絶対参照04()
Range("A1,C1:D5").Select
End SubCells(行番号,列番号).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 SubRange("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 SubRange("A1:A10").Font.Name = "MS明朝"
Boldプロパティによる太字の設定。Falseは太字の解除を行う。
Range("B1:B10").Font.Bold = True
Italicプロパティによる斜体の設定。Falseは斜体の解除を行う。
Range("C1:C10").Font.Italic = True
Underlineプロパティによる下線の設定。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 = 12With文を使うことによってプログラムの記述量を減らすことができる。次のプログラムを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 SubIf 条件 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 SubSub 文字列の比較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 SubSub 文字列の比較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 SubSub 文字列の比較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 SubSub 文字列の比較5任意の文字数()
Dim str As String
str = Range("A1").Value
If str Like "???" Then
'A1セルに3文字の半角全角文字が入力されたとき
Range("A2").Value = "一致"
Else
'それ以外
Range("A2").Value = "一致しない"
End If
End SubSub 文字列の比較6任意の桁数の数字()
Dim str As String
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 SubIf 条件1 Then
条件1が満たされているときの処理
ElseIf 条件2 Then
条件2が満たされているときの処理
ElseIf 条件3 Then
条件3が満たされているときの処理
…
End IfSub 条件分岐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 SubSelect 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 iFor カウンタ変数名 = 初期値 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 = i + 1
Loop
End SubDo 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 SubDim i As Integer Dim j As Integer → Dim k As Integer | i | | j | | k | | l | Dim l As Integer |____| |____| |____| |____|しかし配列は大きなひとつの箱に複数の中身が入っている。 そしてそれらは0から始まる添え字によって管理される。配列の中身のことを要素という
| 0 i |
|.........|
| 1 k |
|.........|
| 2 j |
|.........|
| 3 l |
|_________|Sub 一次元配列()
'配列0から9の平均を求める
'配列numの宣言
Dim num(9) As Integer
'この変数に配列に格納された値の合計を代入する
Dim sum As Double
'平均
Dim avg As Double
'配列numの中身
num(0) = 30
num(1) = 67
num(2) = 97
num(3) = 51
num(4) = 39
num(5) = 44
num(6) = 75
num(7) = 23
num(8) = 11
num(9) = 41
'変数sum
sum = 0
'カウンタ変数を添え字に紐付けて
'配列に格納された値を呼び出してsumに足していき合計を求める
For i = 0 To 9
sum = sum + num(i)
Next
Range("A1").Value = "合計" & sum
avg = sum / 10
Range("A2").Value = "平均" & avg
End SubDim 配列名(扱いたいデータ数) as 変数の型通常、添え字は0からであるが次のようにすれば指定できる。
'1から10まで10個データを扱う配列 Dim num(1 to 10) As Integer次に扱うデータを配列に代入する。
配列名(添え字) = 数値や文字列等のデータ
|0-0 i |1-0 a |2-0 z |
|.........|.........|.........|
|0-1 k |1-1 s |2-1 x |
|.........|.........|.........|
|0-2 j |1-2 d |2-2 c |
|.........|.........|.........|
|0-3 l |1-3 f |2-3 v |
|_________|_________|_________|
Sub 二次元配列()
'あらかじめA1セルとA2セルで指定している配列の要素の表示
'3行4列の二次元配列
Dim num(2, 3) As String
Dim i As Integer
Dim j As Integer
'配列numの生成
num(0, 0) = "i"
num(0, 1) = "k"
num(0, 2) = "j"
num(0, 3) = "i"
num(1, 0) = "a"
num(1, 1) = "S"
num(1, 2) = "d"
num(1, 3) = "f"
num(2, 0) = "z"
num(2, 1) = "x"
num(2, 2) = "c"
num(2, 3) = "v"
'添え字の指定
i = Range("A1").Value
j = Range("A2").Value
'配列の要素の表示
Range("A3").Value = "配列(" & i & "、" & j & ")の表示"
Range("A4").Value = num(i, j)
End SubDim num(1 To 3, 1 To 4) As String
Sub Array関数()
'Sub 一次元配列()を書き直した
Dim num As Variant
Dim sum As Double
Dim avg As Double
num = Array(30, 67, 97, 51, 39, 44, 75, 23, 11, 41)
sum = 0
For i = 0 To 9
sum = sum + num(i)
Next
Range("A1") = "合計" & sum
avg = sum / 10
Range("A2").Value = "平均" & avg
End SubSub セルの値を配列で利用()
'セル範囲にあらかじめ入力されている数値の平均と合計を求める
Dim num As Variant
Dim sum As Double
Dim avg As Double
num = Range("A1:B10")
sum = 0
'行の指定、1行目から10行目を指定しているのでこのようになる
For i = 1 To 10
'列の指定、A列からB列の2列なのでこのようになる
'1列だけの場合は1 TO 1、2 TO 2…などのようにする
For j = 1 To 2
sum = sum + num(i, j)
Next
Next
Range("A11").Value = "合計" & sum
avg = sum / 20
Range("A12").Value = "平均" & avg
End Subnum = Range("A1:B10")
このように1列だけの場合も一次元配列ではなく二次元配列となる。
num = Range("A1:A10")