「[H] プログラミング」カテゴリーアーカイブ

エクセルVBA 変数宣言

エクセルマクロ(その4)変数を宣言する

今回は、プログラムの部品として重要な「変数」について説明していきたいと思います。

「変数」というのはもちろん日本語なのですが、なんとなく意味がよくわからない日本語だと思います。

プログラムの中で、いろんな値や文字などを格納する箱みたいなものと考えていただくのがいいと思います。

VBAにおいては、プログラムの最初に、そのプログラムの中で使う変数を宣言することが一般的です。

前回までのブログ記事を紹介しておきます。必要があれば参照ください。
エクセルマクロ(その1)VBEの使い方を知ろう
エクセルマクロ(その2)セルの選択方法
エクセルマクロ(その3)ブックを切り替える

 

 

1.変数の宣言方法

まず、最初のプロシージャを見てください。

Sub テスト()
Dim x As Integer
x = 10
Debug.Print x  '10
End Sub

最初の「Dim x as Integer」という部分が変数宣言になります。
「Dim」+「変数名」+「as」+「変数のデータ型」という形です。

「Integer」という部分が、変数のデータ型を示しています。
ちなみに、「Integer」は整数(-32768~32767の範囲の整数)を示します。

変数は何でも入る箱なのですが、入れる前にどんな種類のものを入れるかを宣言しておかなければならないのです。

「x = 10」という部分は、「x」という変数に、「10」を代入するという意味です。ただし、この「10」がいつまでも「x」の中に入っているわけではありません。

Sub テスト()
Dim x As Integer
x = 10
x = 20
Debug.Print x  '20
End Sub

上記のプロシージャは、「x = 10」の下に「x = 20」が書かれています。
すでに「10」が入っているにも関わらず、後から「20」を代入すると、前に入っていた「10」は消えて、「20」になってしまうが変数なのです。

つまり、後から代入したものが強いというわけです。

次は、こんなプロシージャを見てください。

Sub テスト()
Dim x As Integer
x = x + 1
Debug.Print x  '1,1,1,1,....
End Sub

こんどは、「x = x + 1」という代入式になっています。
この場合は、今ある「x」に1を足したものを「x」に代入するという意味になります。

このプログラムを何度実行しても、Debug.Printで表示されるのは、「1」となります。これは、一旦プロシージャが終了すると、宣言された変数は消滅してしまうからです。

ところが、宣言されている変数の値をプロシージャの終了後も保持する方法があります。

Sub テスト()
Static x As Integer
x = x + 1
Debug.Print x  '1,2,3,4,5,....
End Sub

「Dim」ではなく、「Static」と書くことで、変数「x」の値は、プロシージャ終了後も保持されるので、Debug.Printで表示される値は、「1、2,3,4、5・・・」と増えていきます。

その他にも、変数の値を保持する方法としては以下のようなものがあります。

(宣言セクション)
Private x As Integer
--------------------------
Sub テスト()
x = x + 1
Debug.Print x  '1,2,3,4,5,....
End Sub

標準モジュールの先頭に、「Private x As Integer」と書いて、Subプロシージャの中には、変数宣言を書いていない場合です。

標準モジュールの先頭の場所を「宣言セクション」と言って、モジュール全体にかかるような内容を書きます。

宣言セクションに書いた変数宣言は、標準モジュール全体で使用される変数ということで、値が保持されています。

上記の場合、「Private」と書いているので、書かれている標準モジュール内のみで有効になっています。

一方、「Private」を「Public」に変えると、他の標準モジュールまで有効範囲が広がって変数が宣言されます。

(宣言セクション)
Public x As Integer
---------------------------
Sub テスト()
x = x + 1
Debug.Print x  '1,2,3,4,5,....
End Sub

このように、変数を宣言する方法によって、有効期間や有効範囲が変わるということを覚えておいてください。

ただし、変数を保持する形で宣言したとしても、エラーでストップした時や、エクセルブックを閉じてしまうとリセットされますので、注意してください。

 

 

2.変数の型の種類

ここで、変数のデータ型について説明したいと思います。

(1)数値型

整数だったら、IntegerかLong、小数だったらSingleかDouble、通貨だったらCurrencyと覚えておけば大丈夫です。ただし、代入した数値の精度は、データ型によって変わりますので、注意が必要です。

Sub 数値()
Dim s0 As Byte
Dim s1 As Integer
Dim s2 As Long
Dim s3 As Single
Dim s4 As Double
Dim s5 As Currency
s0 = 100.123456789
s1 = 100.123456789
s2 = 1000000.12345679
s3 = 12.3456789012345
s4 = 12.3456789012345
s5 = 12.3456789012345
Debug.Print s0  '100  ...整数になる
Debug.Print s1  '100  ...整数になる
Debug.Print s2  '1000000 ...整数になる
Debug.Print s3  '12.34568 ...小数点以下5桁になる
Debug.Print s4  '12.3456789012345 ...すべて正しく表示される
Debug.Print s5  '12.3457 ...小数点以下4桁になる
End Sub

 

データ型 初期値 データ範囲
Byte 0 0~255
(バイト型)
Integer 0 -32,768~32,767
(整数型)
Long 0 -2,147,483,648~2,147,483,647
(長整数値)
Single 0 4Byteで表せる浮動小数点値
(単精度浮動小数点数型)
Double 0 8Byteで表せる浮動小数点値
(倍精度浮動小数点数型)
Currency 0 8Byteで表せる固定小数点値
(通貨型)

(2)ブール型

ブール型は、真偽を判定するような場合に使われる型です。

Sub ブール型()
Dim flag As Boolean
Dim kazu As Integer
kazu = 15
If kazu > 10 Then
flag = True
End If
Debug.Print flag  'True
End Sub

If~End IFの構文の中で、flagにTrueを代入しています。Boolean型の変数には、TrueもしくはFalseしか代入できません。

データ型 初期値 データ範囲
Boolean false TrueまたはFalse

(3)日付型

日付は、エクセルの日付範囲と異なって、西暦100年から計算できます。
また、エクセルと同様に日付や時刻はシリアル値にも変換可能です。
日付型の変数に代入を見てみましょう

Sub 日付()
Dim hi As Date
Dim jikoku As Date
hi = "2022/7/20"
jikoku = "8:20:30"
Debug.Print hi  '2022/07/20
Debug.Print jikoku  '8:20:30
Debug.Print Now  '2022/07/20 19:44:49
Debug.Print Date  '2022/07/20
Debug.Print Time  '19:44:49
End Sub

上記の例では、「hi = “2022/7/20″」と書いていますが、「hi = #2022/7/20#」と書くことができます。そうすると、自動的に「hi = #7/20/2022#」と整形されます。
また、「jikoku = #8:20:30#」と書くと、「jikoku = #8:20:30 AM#」と整形されます。
必ず、日付や時刻を代入するときは、ダブルクォーテーションか、#で囲むようにしてください。

Now、Date、Timeは、自動的に現在の日付や時刻を導く関数です。

データ型 初期値 データ範囲
Date 1899/12/30 00:00:00 西暦100年1月1日~西暦9999年12月31日
時刻は0:00:00~23:59:59まで

(4)文字列型

文字列を変数に代入する場合は、必ずダブルクォーテーションで囲む必要があります。

Sub 文字列()
Dim kotoba As String
kotoba = "おはよう"
Debug.Print kotoba  'おはよう
End Sub

 

データ型 初期値 データ範囲
String vbNullString 文字列

(5)オブジェクト型

オブジェクト型は、数字や値を代入するような変数ではなく、オブジェクトを参照するタイプの変数です。

Sub オブジェクト型()
Dim place As Object
Range("A1:C3").Select
Set place = Selection
place.Interior.Color = RGB(255, 0, 0) '赤、xlnoneで透明
Set place = Nothing
End Sub

オブジェクト型の場合は、「Set 変数名 = オブジェクト」と書きます。
「Set 変数名 = Nothing」と書くことで、オブジェクトの参照を解除します。

データ型 初期値 データ範囲
Object Nothig 任意のオブジェクト参照
Range Nothig セルの範囲
Worksheet Nothig ワークシート
Workbook Nothig ワークブック

(6)バリアント型

バリアント型は、配列変数の宣言によく使われます。
すべての型のタイプに対応する万能型の変数です。

Sub バリアント型()
Dim x(5) As Variant
x(1) = 10  '数値型(整数)
x(2) = 10000000  '数値型(長整数)
x(3) = 10.1234567  '数値型(小数)
x(4) = "みかん"  '文字列型
x(5) = True  'boolean型
Debug.Print x(1)  '10
Debug.Print x(2)  '10000000
Debug.Print x(3)  '10.1234567
Debug.Print x(4)  'みかん
Debug.Print x(5)  'True
End Sub

 

データ型 初期値 データ範囲
Variant Empty あらゆる種類のデータ型を扱える

(7)ユーザー定義型

ユーザー定義型は、複数の種類のデータ型を1つの変数に収めるような場合に使用します。

(宣言セクション)
Type myClassMember
namae As String
birthday As Date
age As Integer
bloodtype As String
End Type
---------------------
Sub クラス()
Dim m(30) As myClassMember
m(1).namae = "鈴木"
m(1).birthday = "2004/12/1"
m(1).age = 18
m(1).bloodtype = "B"
Debug.Print m(1).namae
Debug.Print m(1).birthday
Debug.Print m(1).age
Debug.Print m(1).bloodtype
End Sub

Type [ユーザー定義変数]~End Typeの中で、個別の変数を定義して、Subプロシージャの中で、ユーザ定義変数を宣言した使い方の一例です。

 

 

3.定数の宣言方法

定数とは、変化しない値のことを言います。

もともとVBAが持っている定数のことを「組み込み定数」と言い、ユーザーが勝手に作成する定数のことを「ユーザー定義定数」と言います。

組み込み定数は、とても沢山あるのですが、とくに宣言する必要がなくて使うことができます。

一方、ユーザー定義定数は、きちんと宣言して使用する必要があります。

定数を定義する場合、2つの定義方法があります。それは、標準モジュールの宣言セクションで定義する場合と、プロシージャ内で宣言する場合の2つです。

(1)宣言セクションで定義する

(宣言セクション)
Const tax As Single = 0.1
------------------
Sub ユーザー定義定数1()
Dim kakaku As Long
Dim kosu As Integer
Dim goukei As Long
Dim goukei_zeikomi As Long
kakaku = 1000
kosu = 3
goukei = kakaku * kosu
goukei_zeikomi = goukei * (1 + tax)
Debug.Print goukei  '3000
Debug.Print goukei_zeikomi  '3300
End Sub

宣言セクションで宣言する場合、以下の2つの書き方があります。

Public Const tax As Single = 0.1
Private Const tax As Single = 0.1

[Public / Private] Const 変数名 As 型 = 値、という書き方になります。

Publicを付けて定数を宣言すると、他の標準モジュールでも有効な定数となります。一方、Privateを付けて定数を宣言すると、現在の標準モジュールのみで有効な定数となります。なお、単に「Const tax As Single = 0.1」として宣言すると「Public」が省略されたものとみなされます。

(2)プロシージャ内で宣言する

Sub ユーザー定義定数2()
Dim kakaku As Long
Dim kosu As Integer
Dim goukei As Long
Dim goukei_zeikomi As Long
Const tax As Single = 0.1
kakaku = 1000
kosu = 3
goukei = kakaku * kosu
goukei_zeikomi = goukei * (1 + tax)
Debug.Print goukei
Debug.Print goukei_zeikomi
End Sub

プロシージャ内で宣言する場合は、PublicやPrivateは付加せず、Constから記述するようにしてください。

Const 変数名 As 型 = 値

プロシージャ内で、定数を宣言した場合、定数の有効範囲は、そのプロシージャ内に限定されます。このような意味で、プロシージャ内での定数宣言の意味はそれほどないのですが、定数であることがすぐにわかるということで、用いられることが多いと思います。

 

 

4.列挙型の宣言方法

列挙型というのは、定数をまとめて宣言する方法です。ただし、列挙型で宣言できるのは、整数値のみです。

また、列挙型の宣言は標準モジュールの宣言セクションで行います。

(宣言セクション)
Private Enum youbi
日 = 1
月
火
水
木
金
土
End Enum
---------------------------
Sub 列挙型()
Debug.Print youbi.日  '1
Debug.Print youbi.月  '2
Debug.Print youbi.火  '3
Debug.Print youbi.水  '4
Debug.Print youbi.木  '5
Debug.Print youbi.金  '6
Debug.Print youbi.土  '7
End Sub

宣言セクションで列挙型を宣言する場合、PublicとPrivateのどちらかを先頭につけて宣言します。なお、省略した場合はPublicとなります。

[Private またはPublic] Enum 列挙型名
メンバー名 = [整数]
メンバー名
メンバー名
メンバー名
メンバー名
End Enum

Privateの有効範囲はそのモジュール内のみ、Publicの有効範囲は他のモジュールでも有効になります。

最初のメンバーの右に「= 1」などの整数値を書きます。
そうすると、次のメンバーは自動的に「2」、その次のメンバーは「3」というように連番が割り振られます。

ただし、すべてのメンバーに別々の数字を割り当てることも可能です。

(宣言セクション)
Private Enum Yakult
塩見 = 9
山崎 = 31
山田 = 1
村上 = 55
サンタナ = 25
中村 = 27
オスナ = 13
End Enum
----------------------------
Sub 列挙型2()
Debug.Print Yakult.塩見  '9
Debug.Print Yakult.山崎  '31
Debug.Print Yakult.山田  '1
Debug.Print Yakult.村上  '55
Debug.Print Yakult.サンタナ  '25
Debug.Print Yakult.中村  '27
Debug.Print Yakult.オスナ  '13
End Sub

一般的に、列挙型がよく使われるのは、列項目名をメンバーとして定義して、その項目が何列目にあたるかということを導くために用いることが多いと思います。

表のデータ全体を読み込んでマクロを組むような場合、どの項目が何番目の列に相当するかという点は、いちいち確認が必要になります。
また、列項目の並びが変更されたり、新しい列が追加された時でも、列挙型の宣言を更新するだけで、列が何番目にあるかを導けるので、プロシージャの中身を変更する必要がなくなります。

さらに、先頭の番号も変更できますので、読み込む表がA列から始まっていなくても定義することが可能となります。

 

 

5.配列変数の宣言方法

配列変数というのは、1つの変数の中に複数の値を持てるしくみを持っている変数のことです。

エクセル マクロ VBA 配列変数

上の図の卵のパックを考えてみてください。

1つの卵パックに10個の卵が入っています。
この卵パックに相当するものが配列変数となります。
この場合、5個の並びが2列あるということで、2次の配列変数と言えます。

これをマクロ風に書くとすれば、以下のようになります。

Dim 卵パック(5,2) As 卵
もしくは
Dim 卵パック(2,5) As 卵

次に、以下のようなエクセルの表を考えてみたいと思います。

A B C D
1 販売日 商品名 単価 販売個数
2 2022/7/25 りんご 250 20000
3 2022/7/26 みかん 100 50000

毎日の商品の売上の明細表みたいなものです。
3つの行(1~3)と4つの列(A~D)で構成されている表になります。

この表全体を1つの配列変数に入れるとしたら、どのような配列変数になるでしょうか?

項目名は日本語ですが、データには日付や文字列や数字があり、1つの型には収まりそうにありません。しかし、配列変数を用いると上記の表の値を1つの配列変数に含めることができます。

Sub 配列変数()
Dim uriage(3, 4) As Variant
Dim r As Integer
Dim c As Integer
For r = 1 To 3  '3行ある
  For c = 1 To 4  '4列ある
    uriage(r, c) = Cells(r, c).Value
    Debug.Print uriage(r, c)  '1つ1つのデータを表示
  Next c
Next r
End Sub

まず最初に配列変数の宣言ですが、
「uriage(3,4)」の意味を考えてみましょう。

配列変数を定義する場合は、変数名の後ろに括弧で、入れ物の数を書くようになっています。

例えば「x(3)」という配列は、3個の入れ物があるように思いますが、実際には4個の入れ物を持っています。ここが配列変数のややこしいところなのですが、以下のように考えてください。

「x(3)」・・・x(0), x(1), x(2), x(3)という4つの入れ物を持つことになります。

つまり、x(0)が先頭にあることで、全部で4つの入れ物になるということです。
この「x(3)」は1次の配列変数と呼びます。

しかし、実際のエクセルマクロで表のデータを配列変数に読み込む場合、0行や0列は存在しないので、uriage(3,4)のように3行分×4列分というように書いた方がイメージしやすいと思います。

つまり、uriage(3,4)は以下のようなマトリックスになります。

(0,0) (0,1) (0,2) (0,3) (0,4)
(1,0) (1,1) (1,2) (1,3) (1,4)
(2,0) (2,1) (2,2) (2,3 (2,4)
(3,0) (3,1) (3,2) (3,3) (3,4)

行や列に0を含んでいる部分は使わないで、黄色い部分を使ってエクセルの表のデータを読み込んでいると思ってください。

for ~ nextという構文は繰り返しを行う構文です。
エクセルの表を配列変数に読み込む場合は、行を1つ1つ変えながら、列のデータを1つ1つ読み込んでいくと手法をとります。

 

 

6.固定配列と動的配列の宣言方法

(1)固定配列

固定配列というのは、宣言する時点で配列に含まれる入れ物の個数がわかっている場合に使われます。

Dim uriage(3, 4) As Variant

固定配列の宣言方法は、もう1つあって、上記の表で0行や0列の部分の入れ物は使用しないというような場合は、以下のように書くこともできます。

Dim uriage(1 To 3, 1 To 4) As Variant

この場合、「1 To 3」とは、「1から始まって3で終わる」と考えてください。

(2)動的配列

動的配列というのは、最初に宣言する時点では、配列の入れ物の個数がわからないような場合に使われるものです。

プログラムの途中で入れ物の個数がわかった段階で定義したり、途中で入れ物の個数を変化させたり、一旦すべてクリアして、再定義したりできる配列変数です。

具体的には以下のような宣言になります。

Sub 動的配列()
Dim uriage As Variant
Dim rmax As Integer
rmax = Range("A100").End(xlUp).Row  '行の個数を求めている
ReDim uriage(rmax, 4)
Debug.Print rmax
End Sub

最初は、「Dim uriage As Variant」と宣言した時には、配列の個数は宣言していません。その後、行の個数を求めてから、「ReDim uriage(rmax, 4)」として再定義しています。

なお、配列宣言をVariant型で行う場合は、「Dim uriage As Variant」でも大丈夫ですが、配列宣言を固定の型で行う場合は「Dim uriage() As String」というように「()」を変数の後につけるようにしてください。

次に、動的配列の入れ物の個数を途中で変更する例になります。

Sub 動的配列2()
Dim namae() As String
ReDim namae(1 To 2)
namae(1) = "佐藤"
namae(2) = "鈴木"
ReDim Preserve namae(1 To 3)
namae(3) = "加藤"
Debug.Print namae(1)  '佐藤
Debug.Print namae(2)  '鈴木
Debug.Print namae(3)  '加藤
End Sub

ここでは、配列の再宣言(ReDim)を2回行っています。
2回目の宣言では、「ReDim Preserve」としていますが、この「Preserve」を入れることで、それまでの格納したデータを保持して再宣言するという意味になります。

ちなみに、「Preserve」を入れないで2回目を宣言した場合は、その前に格納したデータは消去されてなくなります。

次に、動的配列に直接データを入れることが出来る「Array関数」を見ておきましょう。

Sub 動的配列3()
Dim uriage As Variant
uriage = Array(#7/25/2022#, "りんご", 250, 20000)
Debug.Print uriage(0)  '2022/07/25
Debug.Print uriage(1)  'りんご
Debug.Print uriage(2)  '250
Debug.Print uriage(3)  '20000
End Sub

Array関数を使うことで、配列の入れ物の個数を定義することなしに、データを入れることができます。

 

 

7.配列変数のデータ削除方法

配列変数に格納されたデータを削除する場合は、「Erase」を使います。

Sub 配列の削除1()
Dim x(3) As String
x(0) = "りんご"
x(1) = "なし"
x(2) = "柿"
x(3) = "ぶどう"
Debug.Print x(0), x(1), x(2), x(3)  'りんご なし 柿 ぶどう
Erase x
Debug.Print x(0), x(1), x(2), x(3)  '空白を出力
End Sub

固定配列の場合は、「Erase」を行うと、配列の中のデータはクリアされますが、配列の入れ物はそのまま残ります。

一方、動的配列の場合は、「Erase」を行うと、配列の入れ物ごと消去されます。

Sub 配列の削除2()
Dim namae() As String
ReDim namae(1 To 2)
namae(1) = "佐藤"
namae(2) = "鈴木"
Erase namae
Debug.Print namae(1)  'エラーになってストップ
End Sub

動的配列を「Erase」した場合は、再度「ReDim」して配列の個数を宣言するようにしてください。

 

 

8.まとめ

今回は、変数の宣言方法について書いてみましたが、かなり長くなったような気がします。

エクセルマクロの場合、変数を定義しなくてもマクロが動く場合もありますが、途中でエラーが起きやすくなりますので、必ず変数は使用する前に宣言をするようにしてください。

なお、変数宣言を忘れないために、VBEの設定を変更しておく方法があります。

VBEの画面のメニューから「ツール」⇒「オプション」として、出てくる画面の「編集タブ」の中に「変数の宣言を強制する」というチェックボックスがありますので、ここにチェックを入れてOKボタンを押します。

この設定にしておいてから、標準モジュールを追加すると、その宣言セクションに「Option Explicit」という1文が表示されてきます。

この宣言をしておくことで、変数宣言をしないで変数を使用した時に、警告が出てくるようになります。

エクセルマクロでは、配列変数を使うと、マクロの速度も速くなって、効率的なプログラムを作ることができるようになります。

また、変数の型についても、しっかりと意識して宣言するようにしてください。特に数字の型については、正しく設定しないと異なる結果になるので注意してください。

次回のエクセルマクロは、繰り返しや条件分岐などを行う構文について説明する予定です。

エクセルマクロ(その3)ブックを切り替える

複数のエクセルファイルを切り替えながら作業するようなプログラムを作成する場合があります。

その場合、マクロプログラムが保存されたファイルと、通常のエクセルのファイルが画面上に同居する形になります。

マクロプログラムの実行は、必ずマクロを持っているファイルからスタートする必要があるのですが、他のエクセルファイルに移動して、そのファイル内で作業を行うこともできるのです。

通常、処理を行いたいエクセルファイルにマクロプログラムを組み込むことを考えると思いますが、処理を行うファイルが毎日データベースから出力されてくるファイルだったりした場合は、出力されたファイルで毎回マクロプログラムを組み込むことは効率的ではありません。

そこで、マクロを持つエクセルファイルは1つだけで、処理をするエクセルファイルを入れ替えながら、そのたびごとに処理を行うほうが効率的になります。

エクセル マクロ ブックの切替

このようなプログラムを組む場合は、それぞれのエクセルファイルを切り替えて作業する必要があり、ブックの切替えが必要になります。

今回は、ブックの作成、ブックの読み込み、ブックの切替について書いてみたいと思います。

前回までのブログ記事を紹介しておきます。必要があれば参照してください。
エクセルマクロ(その1)VBEの使い方を知ろう
エクセルマクロ(その2)セルの選択方法

 

 

1.ブックのファイル名とパス

ブックのことを説明する前に、マクロプログラムが入ったエクセルのファイルの保存方法について書いておきたいと思います。

通常のエクセルファイルの拡張子は、「.xlsx」なのですが、マクロプログラムが入ったファイルは、この形式では保存することができません。

最初に、マクロプログラムが入った(もしくはこれからマクロを組む予定の)ファイルを保存する時は、ファイルの種類を「Excelマクロ有効ブック(*.xlsm)」として保存するようにしてください。

ここでは、あらかじめ「マクロファイル.xlsm」というファイル名でデスクトップ上に保存されていると考えてください。

標準モジュールを追加してから、以下のプログラムを書いてみましょう。

Sub マクロブックのファイル名()
Debug.Print ThisWorkbook.Name
End Sub

Debug.Printは、その結果をイミディエイトウィンドウに表示させるコマンドです。
イミディエイトウィンドウが表示されていない場合は、VBEのメニューの「表示」から「イミディエイトウィンドウ」をクリックしてください。

エクセル マクロ ブックの保存

上記のように、ファイル名が表示されてきます。

この場合、ThisWorkbookという部分は、マクロを実行したファイルのことを指してします。ThisWorkbook.Nameで、ファイル名となります。

これに対して、アクティブなブック(一番前面に出てきているワークブック)のファイル名を調べる場合は、以下のようになります。

Sub アクティブブックのファイル名()
Debug.Print ActiveWorkbook.Name
End Sub

ActiveWorkbookというのが、一番前面に表示されているワークブックのことになります。

次に、ワークブックのパスについて調べてみましょう。

パスというのは、ファイルが保存されている場所の階層構造を示すものです。

Sub マクロブックのフォルダパス()
Debug.Print ThisWorkbook.Path
End Sub

これを実行すると、以下のように表示されますが、これはあくまでも私のケースなので、マクロファイルが保存された場所によって変化します。

エクセル マクロ フォルダパス

このパスでわかるのは、マクロファイルがどのフォルダに保存されているかというところまでです。

完全なファイルのパスを表示する場合は、以下のように書いてください。

Sub マクロブックのファイルパス()
Debug.Print ThisWorkbook.Path & "\" & ThisWorkbook.Name
End Sub

上記のコードの中に「\」という記号がありますが、日本語モードのパソコンでは半角の¥マークに相当すると思ってください。ネット上では「¥」マークはバックスラッシュ「\」に変換されて表示されます。(内部的には同一のコードです)

エクセル マクロ ファイルパス

上記のように、ファイルまでのパスが表示されてくると思います。
ここで、パスの中にある「¥」は、フォルダの階層を区切る記号と考えてください。

ファイルを開いたり、ファイルを保存したりする場合は、「ファイルまでのパス」が必要になります。

 

 

2.新しいブックの作成と保存

新しいブックの作成は、以下のプログラムになります。

Sub ブックの作成()
Workbooks.Add
End Sub

こんな簡単なコマンドで、新しいブックが作成されます。

作成されたブックは、まだ保存されていないのでファイル名がついていない状態です。おそらくBook1やBook2のような名前になっているはずです。

そこで、この新しいファイルを保存してみたいと思います。
ファイル名は、「新しいファイル.xlsx」という名前にしてみましょう。

新しいブックが一番前面にある状態で以下のマクロプログラムを実行してみてください。

Sub ブックを名前をつけて保存()
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & "新しいファイル.xlsx"
End Sub

このプログラムでは、マクロファイルと同じフォルダに、「新しいファイル.xlsx」という名前で保存されます。

ここで、ActiveWorkbookは一番前面にあるブックを指しています。
「SaveAs」は、「名前をつけて保存」という意味だと思ってください。

ちなみに、すでに保存されているファイルを再度保存する場合は、「Save」のみとなります。

Sub ブックの上書き保存()
ActiveWorkbook.Save
End Sub

 

 

3.エクセルファイルを開く

すでに存在しているエクセルファイルの開く場合についてですが、開く場合もそのファイルまでのファイルパスというものが必要になります。

まず、前の項目で作成した「新しいファイル.xlsx」を閉じてください。

今、このファイルは、デスクトップにありますので、ファイルまでのパスは、
「C:\Users\noko\Desktop\新しいファイル.xlsx」となります。
(実際にVBEに書く場合は、バックスラッシュは半角¥マークになります)
(ファイルパスの中の「noko」は私のパソコンのアカウント名です)

そこで、次にこのファイルを開くプログラムを書いてみましょう。

Sub ブックを開く()
Workbooks.Open "C:\Users\noko\Desktop\新しいファイル.xlsx"
End Sub

ブックを開くときは、「Workbooks.Open」の後に半角スペースを置いてから、開くファイルまでのパスを記述します。

これで、「新しいファイル.xlsx」が開いてアクティブになったと思います。

しかし、ここで問題なのは、開くファイルのパスをいちいち調べてマクロプログラムの中に記述するのは、かなり面倒だということです。

そこで、今度は誰でもブックを簡単に開ける方法をやってみましょう。

次のプログラムは、ブックを自分で選んで開く方法になります。

Sub ブックを自分で選択して開く()
Workbooks.Open Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
End Sub

ここで、「Application.GetOpenFilename(“Microsoft Excelブック,*.xls?”)」の部分が、ファイルを開くダイアログを出してくれる部分で、さらに「(“Microsoft Excelブック,*.xls?”)」の部分は、ファイルの種類を限定しています。

最後の「.xls?」の「?」の部分は、何かの文字が1文字あるという意味です。

さらに、上記のプログラムでは、開くダイアログで「キャンセル」されるエラー処理が行われていないので、正しくは以下のように記述します。

Sub ブックを自分で選択して開く2()
Dim OpenFileName As String
OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
If OpenFileName <> "False" Then
    Workbooks.Open OpenFileName
Else
    MsgBox "キャンセルされました"
End If
End Sub

いきなり、難しいプログラムになったと思います。

「Dim OpenFileName As String」というのは、変数を宣言している部分です。
変数というのは、いろんなものを入れることができる箱と考えてください。

Dimは、宣言するときに先頭に入れる文字です。
OpenFileNameというのが、変数の名前です。(勝手に考えていい名前です)
As Stringというのは、変数の型を指定する方法です。
Stringというのは、「文字列」の型であることを示しています。

つまり、日本語でいうと、
「私はOpenFileNameという名前の変数を宣言します。その変数の型は文字列です」
という意味になります。

変数については、今後の記事で詳しく説明する予定です。

次の「OpenFileName =・・・・」の部分ですが、
「Application.GetOpenFilename(“Microsoft Excelブック,*.xls?”)」は、前にも出てきたエクセルファイルを開くダイアログのことです。

実際にこれが実行されて、なにがしかのファイルをクリックして「開く」ボタンを押したとしましょう。

そうすると、そのファイルまでのファイルパスが「OpenFileName」に代入されるということになるわけです。

ところが、「開く」ボタンを押さずに「キャンセル」ボタンが押されたとします。
そうすると、「OpenFileName」には「False」という文字が代入されるということになります。つまり、この部分がエラー処理しなければならない部分です。

If OpenFileName <> “False” Then
Workbooks.Open OpenFileName
Else
MsgBox “キャンセルされました”
End If

この部分は、「If ~Else~End If」という条件分けの構文になっています。
その条件は、「OpenFileName <> “False”」になります。

ここで、見慣れない「<>」という記号があると思いますが、これは「イコールではない」ということを表す記号です。
この条件の意味は、「OpenFileName」は「False」とイコールではない時という条件になります。つまり、ファイルが正常に選択されて開くボタンが押された時という意味になります。この条件に合致する場合は、「Workbooks.Open OpenFileName」が実行され、選択したファイルが開くことになります。

「If ~Else~End If」の構文はいずれ詳しく説明しますが、
ここでは、条件が正しくない場合は、「Else」以下の命令を実行します。

つまり、ファイルを開かないで、キャンセルされた場合は、「MsgBox “キャンセルされました”」が実行されるという意味になります。

少し難しかったと思いますが、今回はファイルを自分で選択して開けるマクロプログラムがあるんだと思っていただければ大丈夫です。

 

 

4.ブックを切り替える

エクセルファイルが2個も3個も起動している時に、ウィンドウを切り替える時は、どのようにしたらいいのでしょうか?

人間であれば、エクセルの画面を見ながら、「これだ!」って見つけて切り替えると思います。しかし、プログラム上で切り替えるためには、そういうわけにはいきません。

そこで、ファイルを何らかの方法であらかじめ区別しておく必要があります。

マクロファイルは、最初から立ち上がっていますが、別のファイルを開いた場合には、そのファイルが一番上に表示されてきます。

もう1度、マクロファイルのウィンドウを出すのは、どうすればいいのでしょうか?

この解決方法としては、プログラムを起動した直後に、マクロファイルにニックネームを付けておいたり、新しく開いたファイルは、開いた直後にニックネームを付けておいたり、新しく作成したファイルも、作成した直後にニックネームを付けておけば、そのニックネームで呼び出すことができるのです。

このニックネームのことを、オブジェクト変数といいます。
つまり、それぞれのファイルをオブジェクトとして、変数に当てはめておくということができます。

変数の宣言は、Dimから始まることを前に述べましたが、変数の型がその場合重要になります。

Sub ブックを切り替える()
Dim macrofile As Workbook
Dim newfile As Workbook
'マクロファイルに名前をつける
Set macrofile = ActiveWorkbook
'新しいファイルを作成
Workbooks.Add
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & "NewBook.xlsx"
'新しいファイルに名前をつける
Set newfile = ActiveWorkbook
'マクロファイルに切り替える
macrofile.Activate
Range("A1").Value = "これはマクロブックです"
'新しいファイルに切り替える
newfile.Activate
Range("A1").Value = "これは新しいブックです"
'マクロファイルに切り替える
macrofile.Activate
MsgBox "処理が終わりました"
End Sub

ここで、重要なことは、変数の宣言です。
Dim macrofile As Workbook
Dim newfile As Workbook
というように「As Workbook」としてWorkbookオブジェクトの変数であることを宣言します。
書き方はいろいろあって、「As Object」や「As Variant」でもオブジェクト変数は宣言できるのですが、より具体的な方が分かりやすいので「As Workbook」としています。

このオブジェクト変数に、実際のワークブックを代入するときは、
Set macrofile = ActiveWorkbook
Set newfile = ActiveWorkbook
のように、「Set 変数名 = ActiveWorkbook」とします。

もちろん、ActiveWorkbookというのは、一番前面に表示されたワークブックのことなので、目的とするワークブックがアクティブになっている時点で、オブジェクト変数に代入する必要があります。

通常の変数であれば、「変数名 = 文字や数字」となりますが、
オブジェクト変数の場合は、必ず「Set 変数名 = オブジェクト」となりますので、覚えておいてください。

そして、ブックを切り替える時は、
macrofile.Activate
newfile.Activate
のように、「オブジェクト変数.Activate」とするだけでウィンドウが切り替わります。この場合、「.Activate」としているところが重要です。
前の記事で、Activateは1つのセルだけしか選択できないということを書いたと思いますが、今回の場合も、ウィンドウは1つしかアクティブにならないので、Activateを用います。

ちゃんとブックを切り替えて作業していることがわかるように、
それぞれのブックのA1セルに文字を代入しています。

セルに文字を代入する場合は、
Range(“A1”).Value = “これはマクロブックです”
というように、「セル位置.Value = “文字”」とします。

最後に処理が終わったことがわかるように、
MsgBox “処理が終わりました”
としていますが、一般のマクロプログラムを作成した場合にも、マクロの終了がわかるように、最後にこのメッセージを入れることがよくあります。

それと、コードの中にシングルクォーテーションを最初に入れたコメントが書いていると思います。

エクセルマクロの場合、半角のシングルクォーテーションを先頭に入れると、プログラムには含まれないコメントを入れることができます。

 

 

5.まとめ

今回は、エクセルのブックの新規作成方法や保存方法、既存のブックの開き方、そして、開かれた複数のブックの切替方法について説明しました。

エクセルブックは、ファイル名だけでは開いたり、保存したりすることができません。「ファイルパス」を正しく設定したり、取得したりすることが重要になります。

また、エクセルファイルを画面上で切り替える場合には、オブジェクト変数を定義して、「オブジェクト変数.Activate」で簡単に切り替えられることを覚えておいてください。

今回少しですが、変数が出てきていますので、次回は変数について説明したいと思います。

エクセルマクロ(その2)セルの選択方法

エクセルVBAは、単なるプログラムではなくて、エクセルと密接に関連したプログラムになっています。

その中でも最もよく使われるのが「セルの選択」というコマンドです。

今回は、この「セルの選択」に焦点を当てて、マクロプログラムを説明していきたいと思います。

なお、この記事は前回の記事の続きとして書いていますので、前回の記事を読みたい場合は、以下のリンクをクリックしてください。

★前回の記事
エクセルマクロ(その1)VBEの使い方を知ろう

 

1.マクロのエラー表示について

一応、前回の補足として、マクロのエラーのことを書いておきます。

記述したプログラムにエラーがある場合は、マクロを実行した時にエラー画面が出てくることがあります。

エクセル マクロ エラー画面

このようなエラー画面がでた場合、「終了」ボタンを押すと、マクロを強制的に終了することができます。

しかし、「終了」ボタンを押した場合、どこでエラーが発生したかを認識することができません。そこで、通常は「デバッグ」ボタンを押すようにしてください。

そうすると、エラーが起きている行が黄色く塗りつぶされて、エラーを見つけることができるようになります。

エクセル マクロ エラー解除

上記のように黄色に塗りつぶされた行にエラーの原因があります。

この場合、エラーを修正する場合は、上記の図の赤い丸で囲まれた四角のボタンを押して、デバッグモードをリセットしてください。それから、エラーのある行を修正するようにしてください。

 

 

2.セルを選択する

エクセルでは、セルを選択してから、何かを実行するという手順になります。ですので、最初の覚えていただくのは、セルの選択の方法です。

標準モジュールを挿入してから、以下のプログラムを書いてみましょう。

Sub セルの選択1()
Range("C3").Select
End Sub

プログラムのコマンドは、小文字で書いても自動で文字の先頭が大文字になりますが、この場合の、C3のCは、小文字で書いても大文字にはなりません。セル番地を書く時は、大文字で書くようにしてください。

ここで出てくるRangeというものは、「セル範囲」という意味だと思ってください。
このプログラムを実行すると、C3のセルが選択されます。

次に、複数のセル範囲を選択してみましょう。

Sub セルの選択2()
Range("C3:E8").Select
End Sub

このプログラムを実行すると、C3からE8までのセルの範囲が選択状態となります。
つまり、Rangeを用いると、複数のセル範囲を一度に選択できるようになります。

このRangeとは別に、セルを選択する方法にはもう1つあります。

Sub セルの選択3()
Cells(2,3).Select
End Sub

このCellsを用いると1つのセルを数字を使って選択することが可能になります。
Cells([行の値],[列の値])
というように書きます。

Cells(2,3)のセルは、2行目の3列目のセルとなって、C2のセルが選択されます。

このCellsを使うと、数字でセルを指定できるので、プログラムの応用性が上がって、複雑なプログラムを書くことができるようになります。

ただし、CellsはRangeと違って、複数のセルの範囲を選択することができません。
1つのセルだけの選択の時のみと考えてください。

一方、複数のセル範囲を選択するときに、RangeとCellsを一緒に使って選択する方法があります。

Sub セルの選択4()
Range(Cells(2, 3), Cells(4, 6)).Select
End Sub

この方法では、Rangeの中にCellsを2つ入れることで、セルの範囲を指定しています。応用的な使い方ですが、数字を使ってセル範囲を選択できる方法として覚えておいてください。

それと、注意点ですが、Selectというコマンドは、「選択する」という意味なんですが、基本的にマウスでクリックするとか、マウスで範囲を選択するという意味だと解釈してください。

たとえば、別のシートの範囲を選択するためには、シートを切り替えてから、セルを選択するという順番になります。いきなり別のシートの範囲をマウスで選択することができないように、RangeやCellsを使ってSelectする場合は今表示されているシートの中でしか有効になりません。

 

 

3.シートを移動する

それでは、シートを切り替える時はどうすればいいのでしょうか。
実は、これもSelectを使うことで切替が可能になります。

新しいシートを何個か作成してから、「Sheet1」を表示させた状態で、以下のマクロを実行してみましょう。

Sub シートの切替1()
Worksheets("Sheet2").Select
end Sub

このマクロを実行すると、シートは「Sheet2」に切り替わります。

この「Worksheets」というのは、Worksheetクラスというのがあって、たくさんあるシートのことを指していると考えてください。その中の「Sheet2」を指定して選択しますよという意味なんです。

この「Worksheets」は、単に「Sheets」と書いても大丈夫です。

Sub シートの切替1()
Sheets("Sheet2").Select
End Sub

「Sheet2」という名前を「データ」という名前のシート名に変えた場合は、以下のようになります。

Sub シートの切替1()
Sheets("データ").Select
End Sub

さらに、シートを数字で指定する方法もあります。

Sub シートの切替2()
Sheets(2).select
End Sub

「Sheet(2)」というのは、左から数えて2番目のシートという意味です。

この場合、注意していただきたいのは、シートを非表示にしても、非表示にしたシートも含んで何番目のシートかを指定する必要があるということです。

なので、非表示にしたシートがあるような場合は、シート名で指定する方が安全だと思います。

 

 

4.シートを追加して名前を変更する

シートを追加して、シート名をマクロで変更することができます。

例えば、新しいシートを追加して、そのシートの名前を「データ」と設定するというマクロを考えてみましょう。

まずは、シートの追加ですが、とても簡単です。

Sub シートの追加1()
Sheets.Add
End Sub

もちろん、Worksheets.addでも大丈夫です。

この場合、現在選択されているシートの1つ前に新しいシートが生まれます。

次に、追加したシートのシート名をつけてみましょう。

Sub シートの追加2()
ActiveSheet.Name = "データ"
End Sub

ここで出てくる「ActiveSheet」というのは、現在表示されているシートという意味です。シートを追加すると、追加されたシートがその時点で表示されているので、その表示されているシートの名前が、「ActiveSheet.Name」となります。

ActiveSheet.Name = “データ”

この行にあるイコールという意味は、「等しい」という意味ではなくて、「代入する」という意味だと考えてください。右側のものを左側に代入するという意味です。

そこで、上記のマクロを合体させると、

Sub シートの追加3()
Sheets.Add
ActiveSheet.Name = "データ"
End Sub

となります。

ここで注意していただきたいのは、同じシート名を複数のシートにつけることができないということです。もし、マクロ上で別のシートに同一名を指定した場合は、エラーとなります。

また、シート名には以下のような制約があります。

・全角、半角文字に関わらず「最大31文字」
・シート名を空欄(0文字)で設定することはできない
・「:」、「\」、「/」、「?」、「*」、「[」、「]」は使用できません。
・シングルクォーテーション、円マークも使用できません。

次に、少し難しくなるのですが、シートの位置を指定してシートを追加する方法についても書いておきます。

Sub シートの追加4()
Sheets.Add before:=Sheets(1)
End Sub

これは、シートの先頭にシートを追加する方法です。

Sheets.Addの後ろに半角スペースを入れてから、「before:=Sheets(1)」と書きます。
ここで出てくる「:=」という表記は、エクセルマクロでよく出てくるのですが、条件を書くときに使われる記号だと考えてください。Sheet(1)は先頭のシートを指しますので、そのシートの前にという意味になります。

逆に、シートの最後にシートを追加する方法も覚えておきましょう。

Sub シートの追加5()
Sheets.Add after:=Sheets(Sheets.Count)
End Sub

ここで出てくるSheets.Countはよく使われるフレーズです。Sheets.Countで現在存在しているすべてのシートの数を意味しています。

Sheets(Sheets.count)で、最後のシートを意味しており、その後ろということで、「after:=」という書き方になります。

 

 

5.セル範囲を相対的に移動させる

RangeやCellsを使うと、絶対的な位置でセルを選択することができますが、現在選択されているセルを基準として、相対的にセルを移動する方法についても書いておきます。

以下のプロシージャを書いてみてください。

Sub セルの相対的移動()
Range("C3").Select
ActiveCell.Offset(2, 1).Activate
End Sub

このマクロは、まずC3のセルを選択して、それから、現在選択されているセル(ActiveCell)を基準として行方向で2つ、列方向で1つ移動したセルを選択するというプログラムになっています。

ここで、「ActiveCell」は現在選択されているセルを表しています。
「ActiveCell.Offset」というのは、「ActiveCellを基準として」という意味です。
Offset([行方向での移動個数],[列方向での移動個数])と考えてください。

なお、ActiveCellで指定できるのは、1つのセルだけです。
Activateも1つのセルに対して使われるコマンドです。

以下にOffsetの具体例を書いておきます。

Offset(0,0)・・・移動しない
Offset(1,0)・・・下に1つ移動
Offset(0,1)・・・右に1つ移動
Offset(1,1)・・・下に1つ、右に1つ移動
Offset(-1,0)・・・上に1つ移動
Offset(0,-0)・・・左に1つ移動
Offset(-1,-1)・・・上に1つ、左に1つ移動

エクセル マクロ アクティブセル

イメージは、上の図のようになります。

さらに、選択された複数のセルの範囲を相対的に移動することもできます。

Sub セル範囲の相対的移動()
Range("C3:E5").Select
Selection.Offset(3, 3).Select
end sub

最初に、C3からE5のセル範囲を選択しています。
そのセル範囲のことは、次の行では「Selection」として扱います。
Selectionというのは、現在選択されている範囲という意味です。

このSelectionを基準として、Offsetで行で3つ、列で3つ移動を行っています。

エクセル マクロ Selection

このように、Offsetは、セル範囲に対しても移動を行うことができます。

ここで、出てきた「Activate」と「Select」の違いについてですが、Activateという場合は、1つのセルのみの選択になります。一方、「Select」は、1つ以上のセルを選択する場合に使用すると考えてください。

 

 

6.セルの選択範囲を変更する

現在選択されているセルを基準として、セルの選択範囲を変更するコマンドがあります。

Sub セルの選択範囲の変更()
Range("C3:D4").Select
Selection.Resize(3, 4).Select
End Sub

この場合のSelectionはC3~D4のセル範囲になります。
ここで使われている「Resize」はセル範囲を変更するという意味で、
Resize([行の個数],[列の個数])
という範囲に変更するという意味になります。

ここでの注意点は、
[行の個数]は1以上、[列の個数]も1以上の値を取るということです。
また、セル範囲の基準となるのは、一番左上のセルとなります。

イメージは以下のようになります。

エクセル マクロ Selection

この場合、resizeに指定する値は、行と列のセルの数であるということを覚えておいてください。

次に、上記の範囲が選択された状態で、ActiveCellの位置を変更するようにしてみましょう。

Sub アクティブセルの移動()
Range("C3:D4").Select
Selection.Resize(3, 4).Select
ActiveCell.Offset(2, 3).Activate
End Sub

このプログラムのポイントは、選択範囲をそのままにして、ActiveCellの位置だけを変更しているという点です。

Activateを使うことで、選択範囲の中でActiveCellの位置を変更することができます。

エクセル マクロ ActiveCell

実際には、このようなプログラムは稀だと思うのですが、セルを選択する場合のSelectとActivateの違いがよくわかる例として覚えていただくのがいいと思います。

 

 

7.シート全体のセルを選択する

シート全体の値を消去したい場合などに、シート全体を選択する必要があります。

この場合は、以下のようなマクロプログラムになります。

Sub シート全体を選択()
Cells.Select
End Sub

Cellsだけでシート全部のセルなので、覚えやすいと思います。

 

 

8.行や列を選択する

行全体、列全体を選択する場合について、いくつかの方法があります。

(1)3行目を選択する

Sub 行を選択1()
Rows(3).Select
End Sub

Rows(3)で3行目という意味です。

(2)3行目から5行目までを選択する

Sub 行を選択2()
Range("3:5").Select
End Sub

Rangeを使って、行3~5を選択しています。

(3)3行目から5行目までを選択する(その2)

Sub 行を選択3()
Range(Rows(3), Rows(5)).Select
End Sub

Rangeの中に、Rowsで指定して選択するやり方です。

(4)C列を選択する

Sub 列を選択1()
Range("C:C").Select
End Sub

C列だけを選択する場合は、Range(“C:C”)とします。

(5)C列を選択する(その2)

Sub 列を選択2()
Columns(3).Select
End Sub

Columnsを使うと、数字で列を選択できます。Columns(3)はC列になります。

(6)C列からE列までを選択する

Sub 列を選択3()
Range("C:E").Select
End Sub

Rangeで列番号の範囲を指定する方法です。

(7)C列からE列までを選択する(その2)

Sub 列を選択4()
Range(Columns(3), Columns(5)).Select
End Sub

Rangeの中にColumnsを使って指定する方法です。

(8)セルを基準にして2行目を選択する

Sub セル基準選択1()
Range("B2").EntireRow.Select
End Sub

1つのセルが属している行を指定する方法です。

1つのセルだけでなく、Rangeで複数のセルの範囲を指定することもできます。
Range(“B2:B4”).EntireRow.Select
と書くと2~4行をまとめて選択できます。

(9)セルを基準にして2列目を選択する

Sub セル基準選択2()
Range("B2").EntireColumn.Select
End Sub

1つのセルが属している列を指定する方法です。

1つのセルだけでなく、Rangeで複数のセルの範囲を指定することもできます。
Range(“B2:D2”).EntireColumn.Select
と書くとB~D列をまとめて選択できます。

 

 

9.まとめ

今回は、セルを様々な方法で選択する方法について書いてみました。
SelectやActivateの違いについても理解しておいてください。

エクセルの場合、分類すると
・ブック
・シート
・行
・列
・セル
という構造になっています。

これらの階層構造をどのように指定して選択していくかということが、プログラムを作る上で大切になります。

セルの指定は、RangeとCellsの2つの方法があります。
行の場合は、RangeとRows、列の場合は、RangeとColumnsとなります。
シートは、Worksheets(シート名)、もしくはWorksheets(番号)で指定します。
「Worksheets」は、「Sheets」と書いても同じことになります。

次回以降で、ブックについても選択の方法を学んでいきます。

エクセルマクロ(その1)VBEの使い方を知ろう

エクセルのマクロを勉強して使えるようになりたいという方は、まずVBE(Visual Basic Editor)の使い方をマスターする必要があります。

実のところ、世の中には多くのプログラミング言語はあるのですが、プログラムを組むための環境を整えるということと、エディターの機能を知っておくということがまず始めに大切なことです。

かといって全部を最初から知っておくのは無理なので、最低限の使い方を覚えながら、少しづつプログラムの作成方法を覚えていくのがいいと思います。

 

1.エクセルに「開発」タブを表示させよう

エクセルの初期状態では、VBAのための「開発」タブが表示されていません。
なので、まず最初は「開発」タブを表示させてみましょう。

「ファイル」タブをクリック、左のメニューから「オプション」をクリック、オプションの画面が出てきたら、左のメニューから「リボンのユーザー設定」をクリックします。

画面の右側に「メインタブ」が出てきていると思いますので、その中にある「開発」にチェックを入れて、右下の「OK」ボタンをクリックします。

これで、エクセルの画面の上部にあるタブの並びの中に「開発」という文字が現れてくると思います。

それでは、「開発」タブをクリックしてください。

エクセルマクロ 開発タブ

表示されるリボンの左端に、上記のようなものが表示されていると思います。
まず、ここに表示されているボタンの意味について説明しておきますね。

(1)Visual Basic
Visual Basic Editerを起動させるボタンです。このボタンをクリックすると、マクロプログラムを作成するためのウィンドウが新たに表示されます。

(2)マクロ
このボタンは、すでに作成されているマクロプログラムの一覧を表示させるものです。ここから、マクロプログラムの編集や実行を行うこともできます。

(3)マクロの記録
このボタンは、マクロを簡単に作ってみたい人のために用意されたもので、このボタンを押した後に、マクロ名を確認してOKすると、自分が行ったエクセルの操作をそのままマクロプログラムとして記述してくれるというありがたいものです。
操作が始まると、「マクロの記録」は「記録終了」というボタンになりますので、操作終了後は、必ず「記録終了」をクリックして終わらせる必要があります。

(4)相対参照で記録
エクセルには、絶対参照と相対参照という言葉がありますが、通常「マクロの記録」は絶対参照という形で行われます。これは選択したセルの位置が絶対参照的なものでプログラムが組まれるという意味です。
これに対して、「相対参照で記録」のボタンをONにしてから「マクロの記録」ボタンを押すと、最初に選択されているセルを基準にして、相対的なセルの位置を認識してプログラムが組まれることになります。
例えば、選択したセルの背景色を変更するマクロプログラムを作成したとすれば、絶対参照の場合は、常に同じセルの背景色を変更するだけですが、相対参照のプログラムでは、最初に不特定のセルをクリックしてマクロを実行させれば、その選ばれたセルの背景の色が変化するようになります。

(5)マクロのセキュリティ
このボタンを押すと、トラストセンターという画面が現れます。一番上に「マクロの設定」という項目があり、その下に4つのラジオボタンの選択があります。
初期状態では、「警告して、VBAマクロを無効にする」という所が選択されていると思います。この意味は、マクロを持っているエクセルファイル(*.xlsm)を開いた時に、エクセルの画面の上に「セキュリティの警告 マクロが無効にされました」という黄色い帯が出て、「コンテンツの有効化」ボタンをクリックすることで、マクロが実行可能になるという意味です。この設定はそのままにして変更しないでください。

 

2.VBE(Visual Basic Editor)を起動してみよう

それでは、開発タブの中の「Visual Basic」のボタンをクリックしてください。
以下のような画面が現れます。

エクセル VBEの画面

この画面は、エクセルの画面とは別のウィンドウとして現れてきますので、エクセルのウィンドウとVBEのウィンドウを左右に並べてディスプレイに表示するのがいいと思います。

ちなみに、この画面の出し方はもう1つあって、「Alt」+「F11」のキーで表示させることもできます。

 

3.標準モジュールを新しく作成しよう

マクロプログラムを書くための1つのメモ帳みたいなものが「標準モジュール」と呼ばれているものです。これは、何個でも作成することができます。

とりあえず、1つ作成してみましょう。

エクセル VBA 標準モジュール

メニューの「挿入」から「標準モジュール」をクリックします。

エクセル VBA 標準モジュール

上記のように真っ白い画面が右に出てきたと思います。ここにプログラムを書くことになります。

左側の上の欄に「プロジェクト」という部分があって、その中に「標準モジュール」という項目が出来て、さらにその配下に「Module1」というものが見えると思います。これが今作成した標準モジュールの名前になります。

実はこの「Module1」という名前は変更することもできます。左側の下の欄に「プロパティ」というところがありますが、その中に(オブジェクト名)という項目があります。その部分に書かれた「Module1」という部分の文字を変更することで、名前を変更できます。

それでは、試しに名前を「メイン」という名前に変更してみましょう。
「Module1」の文字を「メイン」に変更してEnterキーを押してみましょう。

エクセル VBA 標準モジュール

「Module1」が「メイン」に変更されました。

 

4.「プロシージャ」を新しく作成してみよう

プロシージャというのは、プログラムの1つの単位だと考えてください。
エクセルマクロには、プロシージャの種類が3つあります。

・Subプロシージャ
・Propertyプロシージャ
・Functionプロシージャ

PropertyプロシージャとFunctionプロシージャは、最初は難しいので覚えなくても大丈夫です。Subプロシージャをまず覚えてください。

Subプロシージャには、以下の2つがあります。

・Public Subプロシージャ
・Private Subプロシージャ

1つの小さなプログラムの場合は、それほど区別する必要はないのですが、複数のプロシージャが連携して、大きなプログラムを組むような場合に、大切になります。

Private Subプロシージャは、1つの標準モジュール内の範囲でのみ、相手のプロシージャと関連することができるものです。

これに対して、Public Subプロシージャは、複数の標準モジュールをまたいで、相手のプロシージャと関連することができます。

多くの場合、使われるのは、Public Subプロシージャとなります。

それでは、メニューの「挿入」から「プロシージャ」をクリックしてください。

エクセル VBA プロシージャ

そうすると、以下の画面が現れます。

エクセル VBA プロシージャ

名前という欄に「テスト」と入力してください。
プロシージャの名前には以下の条件があります。

(1)文字(英語か日本語)で始まっている
※数字から始まってはいけません。
(2)スペースや記号は使用できません。
※「_」(文字の途中でアンダーバーは使用できます)
※「.」については一部例外はあります。
(3)80文字以下で設定する必要があります。
(4)プログラムで使用するようなコマンドの文字は使えません。

種類は、「Subプロシージャ」、適用範囲は「Publicプロシージャ」という状態のまま、OKボタンを押してください。

Public Sub テスト()

End Sub

上記のように表示されたと思います。

実際には、プロシージャの挿入はメニューの挿入から行うことは稀で、直接モジュールの中に以下のように書いてEnterすることが一般的です。

Sub テスト() 

この場合、Publicは書いていませんが、単にSubと書いた場合は、自動的にPublicだと解釈されています。この場合、Subの後ろは半角スペース、最後の括弧は半角で名前のすぐ後にくっつけて書きます。

Sub テスト()

End Sub

Enterキーを押すと、自動的にEnd Subが表示されます。

もう1つ、その下にSubプロシージャを作成してみると、プロシージャの間に線が引かれていて、区別されることが分かります。

エクセル VBA プロシージャ

なお、同じ名前のプロシージャは設定してはいけませんので、必ず別名で作成してください。プロシージャ名は、いつでも変更可能です。なるべくわかりやすい名前で設定する方がいいでしょう。

マクロのプログラムは、Sub~End Subの間に記述することになります。

 

5.一番簡単なプログラムを作ってみよう

(1)メッセージボックスを出してみよう

以下のプログラムを記述してみましょう。

Sub テスト()
msgbox "こんにちは!"
End Sub

「msgbox」と小文字で書いても、自動で「MsgBox」に変換されます。

このプログラムを実行する場合は、MsgBoxと書かれている行内にまずカーソルを置いてください。

それから、以下のツールバーの三角ボタンをクリックします。

エクセル VBA プログラムの実行

エクセル VBA プログラムの実行

「こんにちは!」というメッセージボックスが現れますので、OKボタンを押してください。

この場合、OKボタンを押さないとプログラムは終了しないので、注意してください。

(2)Debug.Printをやってみよう

Debug.Printというのは、プログラムの途中で何かを表示させたいという時に使うコマンドです。

このコマンドを使う場合には、「イミディエイトウィンドウ」というものを画面上にあらかじめ表示させておく必要があります。

エクセル VBA イミディエイトウィンドウ

メニューの「表示」から「イミディエイトウィンドウ」をクリックしてください。

画面の下に「イミディエイト」という欄が現れます。

エクセル VBA イミディエイトウィンドウ

この「イミディエイトウィンドウ」は、Debug.Printのコマンドの表示先になるものです。その他の用途もあるのですが、今後紹介します。

それでは、以下のプログラムを記述してみてください。

Sub テスト2()
debug.print "こんにちは"
End Sub

「debug.print」と記述しても、自動で「Debug.Print」と変換されますので、コマンドは小文字で書いても大丈夫です。

それでは、カーソルをdebug.printの行のどこかに置いてから、実行の三角ボタンを押してみてください。

エクセル VBA イミディエイトウィンドウ

上記の図のように、イミディエイトの欄に「こんにちは」と表示されたら成功です。

 

6.まとめ

今回は、エクセルマクロの初心者の方に、マクロを作成するためのVBE(Visual Basic Editor)の簡単な使い方を見ていただきました。

エクセルマクロは、プログラムを初めて作成する人にも理解しやすいと思いますので、少しづつ作り方を覚えていくのがいいと思います。

最終的にはエクセルで複雑な操作を行いたいと思っている方も多いと思いますが、プログラムの上達は急がば回れで、基礎をきちんと理解することが最も大切です。

今後も、マクロの初心者向けに、わかりやすい記事を書いていきたいと思います。

Googleが作った子供のためのプログラミング教材です!

本日(2020/4/27)のGoogleのトップページのGoogleのロゴをたまたまクリックしたら、子供のためのプログラミング学習に最適の教材が出てきたので紹介することにしました。

子供のためのプログラミングは、「Scratch」という言語を使ってプログラムの部品をドラッグしながら、模式的にプログラムを作っていくというものです。

思考力と論理的な考え方を養うということが目的だと思います。

下の画像をクリックすると、新しい画面になりますので、中央の開始ボタンを押してください。

子供のためのプログラミング教材

このプログラミング教材の使い方ですが、プログラムの部品が4つあります。
(この部品は一番下に出てきます)

(1)前に進む
(2)左に回転
(3)右に回転
(4)動作を4回繰り返すための部品

ウサギさんがニンジンをとっていくゲームなのですが、プログラムの順番を考えて、上記の4つの部品を用意された枠の中にドラッグすることでプログラムを作っていきます。

プログラムが出来たら再生ボタンを押すと、ウサギさんが動いてニンジンをとっていきます。すべてのニンジンがとれるプログラムを作る必要があります。

失敗しても何度もできますし、時間制限はありません。

最初は簡単ですが、だんだん難しくなってきます。(6面あります)

全部クリアできれば、プログラムの基礎が身に付きます。

ポイントは、(4)の動作を4回繰り返す部品をうまくつかって、より効率的なプログラミングができるかどうかという点です。

ちなみに、(4)の部品を2重にして使うこともできます。

最初は大人でもかなり難しいと思いますが、学校のプログラミング教材として最適なサンプルだと思います。

是非、みなさんチャレンジしてください。