2018年8月18日土曜日

[エクセルVBA]変数とは

event_note8月 18, 2018

変数とは

データを一時的に入れておく保管場所です。「変」という文字がついている通り、値を自由に変えて保存しておくことができます。ただし、自由とはいっても、同じ種類のデータの範囲で変更できます。例えば数値の変数に文字を入れることはできません。

サンプルコード

変数を使って、簡単な計算を行います。みかんとリンゴを買ったときの残金を求めています。

Sub test()Dim 財布 As LongDim みかん As LongDim リンゴ As Long'商品の値段みかん = 300リンゴ = 200'お買い物前財布 = 1000'みかんとリンゴを買う財布 = 1000 - みかん - リンゴ'買い物後の中身を表示MsgBox "財布のなかみは" & 財布 & "円です。"End Sub

 

ポイント解説

変数を「宣言」する

変数が宣言した型で使用できるようになります。

Dim 変数名 as 型

変数名は自由に付けられ、日本語もOKです。ただし、以下のルールがあります。

ひらがな、カタカナ、漢字、英数字、_(アンダースコア)のみ。変数の先頭はアンダースコア以外となること。

型名

特によく使う型を以下に記載します。

型名範囲
ブール型BooleanTrue、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

実行結果

意図的に違う型に代入することもありますが、特に理由がない場合は同じ型で代入するようにしましょう。

変数とは まとめ

  • 変数とは計算結果などを代入して、値を変更することができる。
  • 用途に応じた型を使う。同じ型どうしで代入しないと、値が正しく代入されないことがある。

2018年8月16日木曜日

【エクセルVBA】セルの色を変える(Color/ColorIndex)

event_note8月 16, 2018

Interior.ColorプロパティまたはInterior.ColorIndexプロパティに色を設定します。

Interior.Color RGBによる設定

RGBを使ってInterior.Colorプロパティに設定します。

書き方

Cells(1, 1).Interior.Color = RGB(255, 0, 0)

実行結果

RGBの色指定について

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)

実行結果

赤と緑の光が混合色の黄色になります。

Interior.ColorIndex カラーインデックスによる設定

書き方

Cells(1, 1).Interior.ColorIndex = 4

実行結果

カラーインデックスについて

カラーインデックスとは、番号と色の組み合わせです。

初期値は以下の通りになっており、このほかにも56番まで色が設定されています。

番号と色の組み合わせは変更することができます。自分と他の人のエクセルでは組み合わせが異なる可能性があるため、ColorIndexを配布するプログラムで使用するのはお勧めできません。

 

2018年8月13日月曜日

【エクセルVBA】文字装飾(太字 /斜字)

event_note8月 13, 2018

文字を太字、斜体にするには、Fornt.Bold、Font.ItalicをTrueにします。

Font.Bold、Font.Italicで設定

書き方

'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.Styleでの設定も可能

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.Styleの場合)

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 = "太字 斜体"

実行結果

文字を装飾する(太字 /斜字) まとめ

  • 太字・斜体にするにはFont.Bold,Font.ItalicをTrueにする
  • Font.FontStyleに”太字”,”斜体”とすることでも太字・斜体にできる

2018年8月11日土曜日

【エクセルVBA】条件一致のときだけ処理する(if / select case)

event_note8月 11, 2018

条件によって処理を変えたいときに使います。

if文

書き方

  • 条件式1が成立する場合、処理1を実行します。
  • 条件式2が成立しない場合、処理2を実行します。
  • それ以外は処理3を実行します。
  • elseif、elseは省略可
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文

書き方

select case 変数 case 値1 処理1 case 値2 処理2 … case else 処理3end select
  • 変数が値1に一致する場合は処理1を実行し、end selectに移ります。
  • 変数が値2に一致する場合は処理2を実行し、end selectに移ります。
  • 値1、2に当てはまらない場合、処理3を実行し、end selectに移ります。
  • case elseは省略可能です。

使用例


家族(family)が「こども」なら「こども料金」、「祖父母」なら「シニア料金」、その他なら「通常料金」を表示します。

family = "祖父母"Select Case family Case "こども" Price = "こども料金" Case "祖父母" Price = "シニア料金" Case Else Price = "通常料金"End SelectMsgBox Price

実行結果

最初に一致したcaseの処理のみ実行


以下の例では、「赤」が2つのcaseにありますが、最初のcaseの処理のみ実行され「暖色1」が表示されます。

sColor = "赤"Select Case sColor Case "赤", "オレンジ" kind = "暖色1" Case "赤" kind = "暖色2"End SelectMsgBox kind

実行結果

 

caseは範囲指定も可


年齢別に学校を表示します。以下の例では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

実行結果

caseは列挙による指定も可


foodに設定した食べ物を「くだもの」「野菜」「その他」の種類に分けて、メッセージボックスに表示します。

下記では、foodに「きのこ」なので、Case Elseの処理を実行し、「その他」が出力されます。

food = "きのこ"Select Case food Case "桃", "柿", "りんご" kind = "くだもの" Case "ニンジン", "キャベツ", "トマト" kind = "野菜" Case Else kind = "その他"End SelectMsgBox kind

実行結果

if とcaseの使い分け

・if…分岐が少ない場合、AND,ORを使った複雑な条件になる場合
・case…分岐が多く、一致するかどうかを調べる単純な判別

というふうにするとよいです。分岐が多い場合は、caseにすると見た目もすっきりして見やすくなります。

2018年8月9日木曜日

【エクセルVBA】繰り返し処理(For /While /Do)

event_note8月 09, 2018

同じ処理を指定した回数だけor条件が成立する間、繰り返します。

1行目、2行目、100行目…に連番で数字を入力していくマクロを作るのに、
Cellsを100回書くのはとても面倒ですね。また、間違ってかいてしまうかもしれません。

反復処理は、一回分の処理と繰り返す回数を変えてやればよいです。同じ処理を何回も書く必要がなく便利です。

反復処理は、3種類あります。

For文

For カウンタ = 開始 To 終了 Step 加算 処理Next
  • 開始から終了までの回数文の処理を繰り返します。
  • 処理が一回終わるごとに、カウンタに「加算」を加えます。
  • カウンタが「終了」を越えるとfor文 を終了
  • カウンタはマイナス値も可


エクセルの一列目に100まで連番をふります

For i = 1 To 100 Step 1 Cells(i, 1).Value = iNext

カウンタ:i
開始:1
終了:100
加算:1

となり、カウンタが1~100(100回)になるまで処理を繰り返します。

Forを途中で抜ける exit For

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文

指定する条件式が成立している間は処理を繰り返します。

While 条件式 処理WEnd
  • 条件式が成立(True)する限り、処理を繰り返す。
  • 判別式については、こちらを参照


エクセルの一列目を下方向に色を塗っていく。セルに文字が入っていたら終了。

While (Cells(i, 1).Value = "") Cells(i, 1).Interior.Color = RGB(255, 255, 0) i = i + 1Wend
  • 条件式:(Cells(i, 1).Value = “”) エクセルが空である

実行結果(実行前→実行後)

While を途中で抜けることはできない

For文ではExit forで途中で抜けることができましたが、While~WendはExitを使うことはできません。

Do Loop 文

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 = "")

実行結果(実行前→実行後)

Do Loopを途中で抜ける exit Do


エクセル1列目を下方向にチェックし、文字がある場合にforを抜けます。

Do While (True) If Cells(i, 1).Value <> "" Then Exit Do End If Cells(i, 1).Value = i i = i + 1Loop
  • 条件式:TRUE 常に条件が成立する

実行結果(実行前→実行後)

同じ処理を繰り返し行う(For /While /Do) まとめ

  • 同じ処理を繰り返すには、For/while/Doがある。
  • For、DoはExitにより処理を途中で抜けることができる。
  • WhileはExitを使うことができない。
  • Doは処理の前後のいずれかに条件を判別することができる。

2018年8月5日日曜日

【エクセルVBA】セルのサイズを変える

event_note8月 05, 2018

セルの高さ、幅を変えたいときは、セルの位置を指定し、セルのプロパティ(RowHeight、ColumnWidth)を設定します。

高さ、幅の設定方法に加えて、セルの位置指定方法とプロパティについても説明します。

行の高さ変更

セルの位置.RowHeight = 設定値

列の幅変更

セルの範囲.ColumnWidth= 設定値

設定値は、以下の画面の入力値にあたります。

例えば、A2セルの高さをサイズ30に変更したい場合、

Cells(“A2”).RowHeight= 30

とします。

①A2 がセルの位置
②RowHeight がセルの高さを示すプロパティ
③30 が設定値
となります。

 

セルの位置指定

まずは、見た目を変更するセルの指定方法を説明します。セルの位置はRangeまたはCellsで位置を指定します。

Cellsによる位置指定

以下のように指定します。
Cells(行番号,列番号)

C2セルを指定する場合、以下のように記述します。

Cells(2,3)

 

Cells(行番号,”列名”)としても同じように指定できます。

Cells(2,"C")

 

Rangeによる位置指定(単一セル)

以下のように指定します。
Range(“列名 行番号”)

C2のセルを指定したい場合は
Range(“C2”)と書きます。

Rangeによる位置指定(複数セル)

Rangeは単一セルだけではなく、範囲指定が可能です。

選択したい範囲の左上、右下のセルを指定します。

Range(左上のセル,右下のセル)

A1からC3セルまでを選択するときは、以下のように設定します。

Range("A1:C3")

または

Range(Cells(1,1),Cells(3,3))

 

 

プロパティ

セルのプロパティを設定することでセルの外観を変更することができます。高さ、幅のほかにBordersプロパティでは罫線を引くこともできます。

どのようなプロパティがあるか確認するには、Cells.とエディターに入力してみてください。
指さしのアイコンが表示されているものがプロパティです。ただし、セルの外観とは直接関係のないプロパティもあります。

例えば、Rowプロパティは選んだセルが何行目かを表すので、これは外観とは直接関係がありません。

高さの設定 RowHeight

RowHeightプロパティの設定値を変更してみます。セルの高さが変わります。

 Cells(2, 3).RowHeight = 30

実行結果

幅の設定 ColumnWidth

幅を変更するときは同様に以下のように書きます。

Cells(2, 3).ColumnWidth = 20

 

セルのサイズを変更する まとめ

  • セルの位置を指定するにはCellsもしくはRangeで行う。
  • セルの見た目を変更するには、変更したいセルとプロパティを指定し、プロパティの値を設定する。
  • 高さはRowHeight、幅はColumnWidthのプロパティを設定する。

2018年8月3日金曜日

【エクセルVBA】マクロを一行ずつ実行

event_note8月 03, 2018

マクロがどんな風に動くか知るために、自動作成したマクロの中身を見てみましょう。

マクロを見ていく前に、マクロを実行する方法をマスターしましょう。

[開発]タブのからVisualBasic  を起動して確認していきます。

VisualBasicを起動する

  1. [開発]タブ→[VisualBasic]をクリック

  2. [標準モジュール]→[ModuleXX]をダブルクリック(XXは数字)。マクロが表示されます。

マクロを確認するのに便利なキー

一行ずつマクロを実行(F8)

F8を押すと1行ずつマクロを実行していきます。具体例でみていきましょう。

  1. sub マクロ名()~End Subの任意の場所をクリック

    例では上の画像③マクロが表示されるの赤枠内です。

  2. F8キーを押すと黄色でマクロ名が選択されます。

  3. F8を押すたびに1行ずつ処理を実行します。

    下記の状態でF8を押すと、黄色の行が実行されて、セルに1が出力されます。

  4. さらにF8を押していき、End Subを実行するとマクロは終了です。

一気に実行(F5)

F5を押すと黄色で選択されている行以降をまとめて実行します。

途中で実行を止める(F9)

途中で処理を中断したい行を指定できます。F5と合わせ使うと便利です。

一気に実行(F5)、途中で実行を止める(F9)の操作例

使用例を具体的に説明しますね。画像は左にマクロ、右にエクセルの出力結果を表示しています。

  1. 中断したい行でF9を押す。目印として●が左側に表示され、行の色が変わります。

  2. マクロ内の任意の位置をクリックし、F5をクリックしてマクロを実行します。

  3. ●印で処理が中断されます。

  4. F8を押すと、1行だけ実行します。

  5. その後F5を押すと、残りの行を一気に実行。マクロを終了します。

こうすれば、必要な行だけ動作を確認することができるので便利です。

マクロの処理解説(概要)

自動作成したマクロの内容を解説します。まずは、流れがわかる程度にざっくりと説明。詳細は今後じっくり別の機会に説明します。

  • ActiveCell.FormulaR1C1 = “1”選択しているエクセルのセルに「1」を出力します。
  • Range(“B3”).SelectB3のセルを選択します。
  • Range(“B2:B6”).SelectB2~B6を選択します。2.では、1つのセルでしたが、こちらは複数セルを選択している状態です。
  • Selection.Copy選択しているセル(Selection)をコピー(Copy)します。
  • ActiveSheet.Paste選択しているシート(の選択しているセル)にコピーした内容を貼り付けます。

以上の列名(B3のB)、行名(B3の3)や値(”1″)などがことなる場合は読み替えてやればどのような処理を実行しているかわかると思います。

このマクロは、こんな処理になります。

①選択しているセルに1を入力
②B3セルを選択し、2を入力
③B4セルを選択し、3を入力
④B5セルを選択し、4を入力
⑤B6セルを選択し、5を入力
⑥B2~B6までを選択し、コピー
⑦D2セルを選択し、貼り付け

 

 

 

 

まあそうでしょう…。そのように記録したマクロなので。しかし、マクロと自分でした操作がどのように紐づいているかわかるようにあえて書いてみました。

マクロを一行ずつ実行 まとめ

  • [開発]タブ→VisualBasicを開いてマクロを確認できる
  • F8キー:1行ずつ実行/F5キー:一気に実行/F9キー:実行を途中で停止 をつかうとマクロを理解するのに便利

マクロを記録したけど、たくさん行数があり何をやっているかわからない…というときは、エクセルの出力結果を見ながら1行ずつ実行していくとマクロを理解しやすいです。いろんなマクロを記録して中を覗いてみてください。

 

2018年8月2日木曜日

【エクセルVBA】操作マクロを自動で記録する

event_note8月 02, 2018

エクセルには「マクロの記録」という機能があります。
あなたが行ったエクセル操作をマクロに置き換えてくれる便利な機能です。
作られたマクロは再実行が可能です。
簡単な操作なら、自分でマクロを作らなくても、この「マクロの記録」で自動作成ができます。

操作を記録する

  1. [開発]をクリック、[マクロの記録]ボタンを押す。
  2. [マクロ名]、[説明]には操作がわかる内容を記入。
  3. 記録したい操作をエクセル上で行う。
    例として、下の画像のように「文字の入力→コピー→貼り付け」を記録します。

記録を停止する

記録したい操作が終わったら記録を停止します。
[開発]→[記録終了]をクリックします。

作成したマクロを動かそう

マクロを動かし、出力結果を確認します。
先ほど入力した文字をエクセルシートから削除した後、以下の手順で実行します。

  1. [マクロ]をクリック
  2. 記録したマクロ(例では「コピーペースト」)を選択し[実行]をクリック。
  3. 記録した時と同じにならない場合
    下の図のように、「1」が違う場所に表示される場合は[実行]を押す直前に選択しているセルを確認してください。
    マクロを記録開始したときと同じセル(B2)が選択されているでしょうか?
    記録を開始した時のセル(B2)を選択してから[実行]を押しましょう。
    これで記録した時と同じ結果になりました。

マクロの記録 まとめ

  • [記録開始]ボタン→手動操作→[記録終了]ボタン で操作をマクロに記録できる。
  • 記録したマクロを[実行]すれば、手動操作とおなじ結果がエクセルに出力される。
  • 記録したマクロを[実行]するときはセルの選択に注意。[記録開始]の時と異なると正しく動かないことがある。

マクロ実行の時に決まったセルを選択しなければいけないのは不便ですね。どこを選択していたのかなんて覚えていられません。セルの選択位置を意識しないで実行できるように自動作成したマクロをちょっとだけ編集してみましょう。そのために、マクロがどのように組み立てられているか見ていきましょう。(次回へ続く)

補足

マクロを編集する以外に、操作開始セルを選択するタイミングを変えてやることで想定した動きをするマクロを作成することができます。

マクロ記録開始→操作開始セルを選ぶ とすればOKです。今回の例でいうと

①B2以外のセルを選択→②マクロ記録開始→③B2セルを選択→「1」を入力…の順番で操作する→④記録終了

こうすれば、開始セルを選択するところも含めてマクロで実行できます。