データを一時的に入れておく保管場所です。「変」という文字がついている通り、値を自由に変えて保存しておくことができます。ただし、自由とはいっても、同じ種類のデータの範囲で変更できます。例えば数値の変数に文字を入れることはできません。
サンプルコード
変数を使って、簡単な計算を行います。みかんとリンゴを買ったときの残金を求めています。
Sub test()Dim 財布 As LongDim みかん As LongDim リンゴ As Long'商品の値段みかん = 300リンゴ = 200'お買い物前財布 = 1000'みかんとリンゴを買う財布 = 1000 - みかん - リンゴ'買い物後の中身を表示MsgBox "財布のなかみは" & 財布 & "円です。"End Sub
変数が宣言した型で使用できるようになります。
Dim 変数名 as 型 |
変数名は自由に付けられ、日本語もOKです。ただし、以下のルールがあります。
ひらがな、カタカナ、漢字、英数字、_(アンダースコア)のみ。変数の先頭はアンダースコア以外となること。 |
特によく使う型を以下に記載します。
型名 | 型 | 範囲 |
ブール型 | Boolean | True、False |
整数型 | Integer | -32,768~32,767の整数 |
長整数型 | Long | -2,147,483,648~②147,483,647の整数 |
単精度浮動小数点数型 | Single | 負の値:約-3.4×10(38乗)~-1.4×10(-45乗) 正の値:約1.4×10(-45乗)~1.8×10(38乗) |
倍精度浮動小数点数型 | Double | 負の値:約-1.8×(10の308乗)~-4.0×(10の-324乗) 正の値:約4.9×(10の-324乗)~1.8×(10の308乗) |
日付型 | Date | 日付:西暦100年1月1日~西暦9999年12月31日 時刻:0:00:00 ~ 23:59:59 |
文字列型 | String | 任意の長さの文字列(20億文字まで) |
オブジェクト型 | Object | オブジェクト(セル、ワークシートを参照するのに使用) |
バリアント型 | Variant | 全ての種類の型 |
変数「財布」は買い物前は1000でしたが、買い物後は500となっています。このように変数は計算結果を代入して、値を変更することができます。
LongをSingleで代入すると値が変わってしまいます。例えば、以下のようにするとSingleの少数部分が抜け落ちてしまいます。
サンプルコード
Sub test2()Dim A As SingleDim B As LongB = 4.5A = BMsgBox "Aは" & A & "です。"End Sub
実行結果
意図的に違う型に代入することもありますが、特に理由がない場合は同じ型で代入するようにしましょう。
Interior.ColorプロパティまたはInterior.ColorIndexプロパティに色を設定します。
RGBを使ってInterior.Colorプロパティに設定します。
Cells(1, 1).Interior.Color = RGB(255, 0, 0)
実行結果
rgbは光の三原色 r(赤)、g(緑)、b(青)を表します。PCで表示する色はこの3色の割合を変えて様々な色が作られます。
r、g、bの値は0~255を取ります。0は色味が無し。255は色味が一番強いということです。
RGB(r,g,b) |
設定値
r(赤) | 0~255 |
g(緑) | 0~255 |
b(青) | 0~255 |
例1
Cells(1, 1).Interior.Color = RGB(0, 255, 0)
実行結果
緑の色味は最も強く、赤と青の要素は無し。そのため、緑が表示されます。
例2
Cells(1, 1).Interior.Color = RGB(0, 150, 0)
実行結果
緑の要素だけですが、先の例と比べて値が小さいため暗い緑になります。
例3
Cells(1, 1).Interior.Color = RGB(255, 255, 0)
実行結果
赤と緑の光が混合色の黄色になります。
Cells(1, 1).Interior.ColorIndex = 4
実行結果
カラーインデックスとは、番号と色の組み合わせです。
初期値は以下の通りになっており、このほかにも56番まで色が設定されています。
番号と色の組み合わせは変更することができます。自分と他の人のエクセルでは組み合わせが異なる可能性があるため、ColorIndexを配布するプログラムで使用するのはお勧めできません。
文字を太字、斜体にするには、Fornt.Bold、Font.ItalicをTrueにします。
例
'A1を太字Cells(1, 1).Font.Bold = True'A2を斜体Cells(2, 1).Font.Italic = True
実行結果
■実行前
■実行後
Fornt.Bold、Font.Italicをfalseにします。
例
'A1を太字Cells(1, 1).Font.Bold = True 'A2を斜体Cells(2, 1).Font.Italic = True
実行結果
■実行前
■実行後
Font.FontStyleにスタイルを設定することでも装飾が可能です。
例
'A1を太字Cells(1, 1).Font.FontStyle = "太字"'A2を斜体Cells(2, 1).Font.FontStyle = "斜体"
英語での指定も可能です。小文字、大文字のいずれでも設定できます。
'A1を太字Cells(1, 1).Font.FontStyle = "bold"'A2を斜体Cells(2, 1).Font.FontStyle = "italic"
Font.FontStyleに””または”標準”を設定します。書式を標準に戻し、太字/斜体を解除します。
例
'A1を太字をやめるCells(1, 1).Font.FontStyle = ""'A2を斜体をやめる。Cells(2, 1).Font.FontStyle = ""
または
'A1を太字をやめるCells(1, 1).Font.FontStyle = "標準"'A2を斜体をやめるCells(2, 1).Font.FontStyle = "標準"
“太字 斜体”、”bold Italic”のように両方の書式を設定します。太字と斜体(boldとItalic)を逆にすると正しく装飾できません。
'A1を太字Cells(1, 1).Font.FontStyle = "bold Italic"'A2を斜体Cells(2, 1).Font.FontStyle = "太字 斜体"
実行結果
条件によって処理を変えたいときに使います。
if 条件式1 then 処理1elseif 条件式2 then 処理2else 処理3endif
例
Rankが1~3なら「表彰台」、4~8なら「入賞」、それ以外なら「頑張りました。」を表示します。以下は、Rankが9なのでIf,ElseIfの条件が成立しないため、else「頑張りました。」が表示されます。
Rank = 9If (1 <= Rank) And (Rank <= 3) Then jusho = "表彰台"ElseIf (4 <= Rank) And (Rank <= 8) Then jusho = "入賞"Else jusho = "頑張りました。"End If MsgBox jusho
実行結果
select case 変数 case 値1 処理1 case 値2 処理2 … case else 処理3end select
例
家族(family)が「こども」なら「こども料金」、「祖父母」なら「シニア料金」、その他なら「通常料金」を表示します。
family = "祖父母"Select Case family Case "こども" Price = "こども料金" Case "祖父母" Price = "シニア料金" Case Else Price = "通常料金"End SelectMsgBox Price
実行結果
例
以下の例では、「赤」が2つのcaseにありますが、最初のcaseの処理のみ実行され「暖色1」が表示されます。
sColor = "赤"Select Case sColor Case "赤", "オレンジ" kind = "暖色1" Case "赤" kind = "暖色2"End SelectMsgBox kind
実行結果
例
年齢別に学校を表示します。以下の例ではage(年齢)が10なので、「Case 6 to 12」の処理が実行され、「小学校」が表示されます。
age = 10Select Case age Case 6 To 12 school = "小学校" Case 13 To 15 school = "中学校" Case 16 To 18 school = "高校"End SelectMsgBox school
実行結果
例
foodに設定した食べ物を「くだもの」「野菜」「その他」の種類に分けて、メッセージボックスに表示します。
下記では、foodに「きのこ」なので、Case Elseの処理を実行し、「その他」が出力されます。
food = "きのこ"Select Case food Case "桃", "柿", "りんご" kind = "くだもの" Case "ニンジン", "キャベツ", "トマト" kind = "野菜" Case Else kind = "その他"End SelectMsgBox kind
実行結果
・if…分岐が少ない場合、AND,ORを使った複雑な条件になる場合
・case…分岐が多く、一致するかどうかを調べる単純な判別
というふうにするとよいです。分岐が多い場合は、caseにすると見た目もすっきりして見やすくなります。
同じ処理を指定した回数だけor条件が成立する間、繰り返します。
1行目、2行目、100行目…に連番で数字を入力していくマクロを作るのに、
Cellsを100回書くのはとても面倒ですね。また、間違ってかいてしまうかもしれません。
反復処理は、一回分の処理と繰り返す回数を変えてやればよいです。同じ処理を何回も書く必要がなく便利です。
反復処理は、3種類あります。
For カウンタ = 開始 To 終了 Step 加算 処理Next
例
エクセルの一列目に100まで連番をふります
For i = 1 To 100 Step 1 Cells(i, 1).Value = iNext
カウンタ:i
開始:1
終了:100
加算:1
となり、カウンタが1~100(100回)になるまで処理を繰り返します。
Exit forを使えば、カウンタの値に関係なく途中でfor文を終了します。
例
1列目を下にチェックしていき、”stop!”があればforを抜けます。なければ、連番を振ります。
For i = 1 To 100 Step 1 If Cells(i, 1).Value = "stop!" Then Exit For End If Cells(i, 1).Value = iNext
実行結果(実行前→実行後)
指定する条件式が成立している間は処理を繰り返します。
While 条件式 処理WEnd
例
エクセルの一列目を下方向に色を塗っていく。セルに文字が入っていたら終了。
While (Cells(i, 1).Value = "") Cells(i, 1).Interior.Color = RGB(255, 255, 0) i = i + 1Wend
実行結果(実行前→実行後)
For文ではExit forで途中で抜けることができましたが、While~WendはExitを使うことはできません。
for,while文は処理実行前に条件式をチェックするのに対して、Do Loopは条件式を前後いずれかに選べます。
前条件
処理の前に条件式による判別を行う。「while 条件式」をDoの直後に書きます。
Do while 条件式 処理Loop
後条件
処理の後に条件式による判別を行う。「while 条件式」をLoopの直前に書きます。
Do 処理 while 条件 Loop
例
エクセルの一列目を下方向にチェック。セルが空でない場合に終了。
前条件
Do While (Cells(i, 1).Value = "") Cells(i, 1).Interior.Color = RGB(255, 255, 0) i = i + 1Loop
後条件
Do Cells(i, 1).Interior.Color = RGB(255, 255, 0) i = i + 1Loop While (Cells(i, 1).Value = "")
実行結果(実行前→実行後)
例
エクセル1列目を下方向にチェックし、文字がある場合にforを抜けます。
Do While (True) If Cells(i, 1).Value <> "" Then Exit Do End If Cells(i, 1).Value = i i = i + 1Loop
実行結果(実行前→実行後)
セルの高さ、幅を変えたいときは、セルの位置を指定し、セルのプロパティ(RowHeight、ColumnWidth)を設定します。
高さ、幅の設定方法に加えて、セルの位置指定方法とプロパティについても説明します。
行の高さ変更
セルの位置.RowHeight = 設定値
列の幅変更
セルの範囲.ColumnWidth= 設定値
設定値は、以下の画面の入力値にあたります。
例えば、A2セルの高さをサイズ30に変更したい場合、
Cells(“A2”).RowHeight= 30
とします。
①A2 がセルの位置
②RowHeight がセルの高さを示すプロパティ
③30 が設定値
となります。
まずは、見た目を変更するセルの指定方法を説明します。セルの位置はRangeまたはCellsで位置を指定します。
以下のように指定します。
Cells(行番号,列番号)
C2セルを指定する場合、以下のように記述します。
Cells(2,3)
Cells(行番号,”列名”)としても同じように指定できます。
Cells(2,"C")
以下のように指定します。
Range(“列名 行番号”)
C2のセルを指定したい場合は
Range(“C2”)と書きます。
Rangeは単一セルだけではなく、範囲指定が可能です。
選択したい範囲の左上、右下のセルを指定します。
Range(左上のセル,右下のセル)
A1からC3セルまでを選択するときは、以下のように設定します。
Range("A1:C3")
または
Range(Cells(1,1),Cells(3,3))
セルのプロパティを設定することでセルの外観を変更することができます。高さ、幅のほかにBordersプロパティでは罫線を引くこともできます。
どのようなプロパティがあるか確認するには、Cells.とエディターに入力してみてください。
指さしのアイコンが表示されているものがプロパティです。ただし、セルの外観とは直接関係のないプロパティもあります。
例えば、Rowプロパティは選んだセルが何行目かを表すので、これは外観とは直接関係がありません。
RowHeightプロパティの設定値を変更してみます。セルの高さが変わります。
例
Cells(2, 3).RowHeight = 30
実行結果
幅を変更するときは同様に以下のように書きます。
Cells(2, 3).ColumnWidth = 20
マクロがどんな風に動くか知るために、自動作成したマクロの中身を見てみましょう。
マクロを見ていく前に、マクロを実行する方法をマスターしましょう。
[開発]タブのからVisualBasic を起動して確認していきます。
F8を押すと1行ずつマクロを実行していきます。具体例でみていきましょう。
例では上の画像③マクロが表示されるの赤枠内です。
F5を押すと黄色で選択されている行以降をまとめて実行します。
途中で処理を中断したい行を指定できます。F5と合わせ使うと便利です。
使用例を具体的に説明しますね。画像は左にマクロ、右にエクセルの出力結果を表示しています。
こうすれば、必要な行だけ動作を確認することができるので便利です。
自動作成したマクロの内容を解説します。まずは、流れがわかる程度にざっくりと説明。詳細は今後じっくり別の機会に説明します。
以上の列名(B3のB)、行名(B3の3)や値(”1″)などがことなる場合は読み替えてやればどのような処理を実行しているかわかると思います。
このマクロは、こんな処理になります。
①選択しているセルに1を入力
②B3セルを選択し、2を入力
③B4セルを選択し、3を入力
④B5セルを選択し、4を入力
⑤B6セルを選択し、5を入力
⑥B2~B6までを選択し、コピー
⑦D2セルを選択し、貼り付け
まあそうでしょう…。そのように記録したマクロなので。しかし、マクロと自分でした操作がどのように紐づいているかわかるようにあえて書いてみました。
マクロを記録したけど、たくさん行数があり何をやっているかわからない…というときは、エクセルの出力結果を見ながら1行ずつ実行していくとマクロを理解しやすいです。いろんなマクロを記録して中を覗いてみてください。
エクセルには「マクロの記録」という機能があります。
あなたが行ったエクセル操作をマクロに置き換えてくれる便利な機能です。
作られたマクロは再実行が可能です。
簡単な操作なら、自分でマクロを作らなくても、この「マクロの記録」で自動作成ができます。
記録したい操作が終わったら記録を停止します。
[開発]→[記録終了]をクリックします。
マクロを動かし、出力結果を確認します。
先ほど入力した文字をエクセルシートから削除した後、以下の手順で実行します。
マクロ実行の時に決まったセルを選択しなければいけないのは不便ですね。どこを選択していたのかなんて覚えていられません。セルの選択位置を意識しないで実行できるように自動作成したマクロをちょっとだけ編集してみましょう。そのために、マクロがどのように組み立てられているか見ていきましょう。(次回へ続く)
マクロを編集する以外に、操作開始セルを選択するタイミングを変えてやることで想定した動きをするマクロを作成することができます。
マクロ記録開始→操作開始セルを選ぶ とすればOKです。今回の例でいうと
①B2以外のセルを選択→②マクロ記録開始→③B2セルを選択→「1」を入力…の順番で操作する→④記録終了
こうすれば、開始セルを選択するところも含めてマクロで実行できます。