2016年7月10日日曜日

【VBAリファレンス】いっちょまえに変数を語ってみよう。

さて、このブログ開設時、最初に記事にしたのが変数でしたが
今回は変数についてもう少し掘り下げて書いてみたいと思います。

以前の記事:【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
--------------------------------

サンプル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で読み込めばいいんだけど…
でも、プロシージャを分けるキリが悪いところだったりして
ついつい、長ったらしく記述したり…


みなさんはこんな悪い大人にならないように気を付けてください!

2016年7月5日火曜日

【VBAリファレンス】ステップイン機能とブレークポイントを上手に使ってデバック作業を制する。

コーディング作業にも慣れてくると
恐れることなく、バンバン長いコードを書いていけるようになります。

そうすると、いつの間にかこんなに長いコードを書いていたのかと
自分で自分を褒めたくなる半面、ちょっと怖くなります。

特に、集中して一気に記述して
いざ実行!ってボタンを押して
即エラー表示がされたりします。
私の場合よくやるのは、変数の宣言し忘れとか
If文のEndIfの記述忘れという、クソツマンネーエラーが多いので
そんな時は、周りの誰にもばれない表情で
シレっと修正してコードを実行します。

しかし、中にはエラーの原因、理由などが
よくわからなく、何度も同じ箇所でデバック対応を余儀なくされることがあります。

短いコードならまだしも、先述したとても長いコードを書いてしまったときは
恐怖を超えて狂気すら感じます。

私の場合、1回の実行で完了まで10~30分時間を要するコードを書いたり
しかも、エラーは出てないが期待している
処理結果が得られないことなどもあり、そういった場合
どこが間違っているか分からない事象が発生した場合
文字通り頭を抱えてしまいます。

毎回、スタートから完了までを通すわけには行かないので
そういったときは、まずある程度の箇所に目処を付けたうえで
ステップインで進めます。

ステップインとは、そのプロシージャの1行目から
1行ずつコードを実行していく方法です。

まず、サンプルコードです。
------------------------------------
Sub test()

Dim i As Long, j As Long

'掛け算の結果を出すFor文
For i = 1 To 9
    For j = 1 To 9
 
    Cells(j, i) = i * j
 
    Next j
Next i

End Sub
------------------------------------
実行結果は以下の通りとなります。





























これをステップインで実行する場合
コードの記述まで行った後
画面の開発のタブマクロ作成したプロシージャ名を選択ステップ インをクリックします。




























そうすると、VBE画面が表示され、
現在の進行箇所が黄色く表示されます。
そして、次の行に移動するにはファンクションの8番(F8キー)を押します。

実行最初の画面


F8キーを1回押した状態


F8キーを2回押した状態


F8キーを押しっぱなしにすると、
ものすごいスピードでブルブルン!って実行状態を見ることが出来ます。

一つ一つの実行結果を確認するには
もってこいの機能です。
もちろん、Excelの画面を開きながらやれば
もちろん画面反映を確認しながら進めることも出来ます。

また、Forの動きなどは、
このステップインを見ていると、どういった動きをしているのか
目で確認できるので、非常に良いと思います。


ただし、先述したとてつもなく長いコードを記述した際
しかも、確認したい箇所は最後の方
その上、それまでの箇所にFor文を連掛けしているなど
不都合の女神に微笑まれた場合は
任意の場所までは一気に実行するという方法もあるのです。

それはブレークポイントの設定です。

下図赤枠内ジャンプさせたい列辺り


クリックすると、赤黒い●マークがつきます。


ステップイン実行後、このブレークポイントを実行すると
その箇所までは、通常のコードを実行したスピードで
コードが実行されます。

その後、F8を押せば、1行ずつステップイン作業が実行されます。
その後、すべてのコードを実行する場合は
F5(実行ボタン)か四角のリセットボタンを押せば
作業の継続かストップを選択できます。

是非、この機能を活用して無駄のないデバック作業を行ってください。

私の場合、デバック作業のいらない完璧なコードばかりではなく
たくさんのエラーを経験した方が
よりよりコードが書けるようになると信じてます。