今回は変数についてもう少し掘り下げて書いてみたいと思います。
以前の記事:【VBAリファレンス】変数は宣言してください。お願いします。
先日仕事中にハッと気づいた経験談を兼ねて
書いてみます。
変数には、整数型(Long)や文字列(String)をはじめとして
たくさんの型が存在します。
しかし、使い方を間違えると、
結果としてとんでもない結果を引き起こすことがあるわけです。
中でも、数字の取り扱いには細心の注意を払っていただきたいと思います。
一番わかりやすい例をコードで記述してみます。
サンプルその1
--------------------------------
Sub test()
Dim a As Long
a = 123
MsgBox a + a
End Sub
--------------------------------
サンプルその2
--------------------------------
Sub test()
Dim a As String
a = 123
MsgBox a + a
End Sub
--------------------------------
Sub test()
Dim a As String
a = 123
MsgBox a + a
End Sub
--------------------------------
サンプル1の結果
サンプル2の結果
サンプル1は整数型、つまり数字として扱われています。
その為、数字(123)+数字(123)でその結果246という値になります。
変わって、サンプル2に代入されているのは文字列型、
つまり、テキストとして扱われます。
その為、テキスト(123)&テキスト(123)でその結果123123と扱われます。
では、以下のサンプルの場合どうなるでしょう。
--------------------------------
Sub test()
Dim a As String
Dim b As Long
a = 123
b = a
MsgBox b + b
End Sub
サンプル1の結果
サンプル2の結果
サンプル1は整数型、つまり数字として扱われています。
その為、数字(123)+数字(123)でその結果246という値になります。
変わって、サンプル2に代入されているのは文字列型、
つまり、テキストとして扱われます。
その為、テキスト(123)&テキスト(123)でその結果123123と扱われます。
では、以下のサンプルの場合どうなるでしょう。
--------------------------------
Sub test()
Dim a As String
Dim b As Long
a = 123
b = a
MsgBox b + b
End Sub
--------------------------------
最初にString(文字列)型のaとLong(整数)型のbを宣言した後
aに123を代入しています。
その後、bの箱にaを代入します。
ここで、bに代入された123の型はどうなっているか…
答えはこうです。
変数とは名の通り、値が変わるものですが
代入された値は、その変数の型にならうようにされています。
数字の場合、文字としても、整数としても使用するものなので
代入されたとの変数の型に変更されます。
※つまり、最初のaの変数に"こんにちは"と代入すると、
bの変数で型が一致せず、コンパイルエラーが発生します。
その為、数字の取り扱いには十分に注意していただきたいと思います。
データサイエンティスト系のお仕事をしていると、
特に注意が必要です。
For文を2重3重にくるくる回しまくって、
実際セルの結果として入力すべき数値とが入り組んでくると
変数の宣言も混乱してしまいがちです。
コメントなどを使って上手く変数の管理をしてみてください。
あと、変数の宣言方法について
訂正というか、この頃発見したことがあるので
合わせて記載させてください。
変数の宣言時
--------------------------------
Dim i As Long
Dim j As String
--------------------------------
こういった記述方法は基本ですが、
宣言する変数が多くなったとき1列で記述する方法についてです。
正解の宣言例
--------------------------------
Dim i As Long, j As Long
Dim x As String, y As String
--------------------------------
間違った宣言例
--------------------------------
Dim i, j As Long
Dim x, y As String
--------------------------------
宣言をつなげる場合は
変数名とAsと型とカンマで1セットとし、そのあと引き続き記述します。
間違った宣言例はどうなるかというと、
実際にLong型で宣言されているのはjのみ
String型で宣言されているのはyのみとなっており、
iとxはVariant型で宣言されたことになります。
Variant型なので、不都合が生じることはあまりないでしょうが(いや、実際にはあるかも)
きっちりと型を宣言して処理を進める癖を身に付けるためにも
横着はしないようにしましょう。
でも、変数が増えるとほんと面倒になるんですよね~。
いや、プロシージャを分けて、Callで読み込めばいいんだけど…
でも、プロシージャを分けるキリが悪いところだったりして
ついつい、長ったらしく記述したり…
みなさんはこんな悪い大人にならないように気を付けてください!