オブジェクト型変数や誤字脱字などVBAで初心者がやりそうなミスについて

経理の仕事ができるようになるためには最低限簿記2級の知識に加えて、いかに「ミスをしないための方法やテクニック又はミスしそうな場所」を理解できるようになるかが重要です。

 

なぜそのような方法やテクニックが必要になってくるかというと、日々膨大な量の情報を処理しなければいけないので、ただ単純に仕事に取り組んでいるだけだとどうしてもどこかでミスが出てしまうからです。

 

それと同様にプログラミングで仕事ができるようになるためには、プログラミング言語の知識はもちろん、それ以外にも何らかのノウハウが必要だと思われます。

 

最近『続ExcelVBAのプログラミングのツボとコツがゼッタイにわかる本』を読みながら本の内容を実際にプログラミングしていたのですが、経理業務で「ミスをしないための方法やテクニック又はミスしそうな場所」に当たる部分ではないかと思うところがありました。

 

今回はそのことについて、忘れず整理するために備忘録という意味でも書いていこうと思います。

通常の変数の型とオブジェクト変数の型の違いについて

「あれ、なんで動かないんだ?」

 

『続ExcelVBAのプログラミングのツボとコツがゼッタイにわかる本』を見ながらコードを入力していて、なぜか動かないという時がありました。どこが間違っているのか画面上のコードと本に書かれているコードを何度も見比べながら順番にチェックしていったのですが、どうしても間違っている箇所が見つかりません。

 

VBAを勉強していると「変数」とか「型」といった概念が出てきます。VBAにおける通常の変数や型というのは『VBAエキスパート公式テキスト Excel VBA ベーシック』には次のように書かれています。

p.62

変数とは、値を一時的に保存しておき、いつでも好きなときに取り出せる一時的な記憶領域です。しばしば変数は「箱のようなもの」と喩えられます。

(中略)

変数には型という概念があります。これは、変数に入れる値によって、専用の変数を使うという仕組みです。たとえば、文字を入れる変数なら文字列型として宣言し、整数を入れる変数であれば長整数型として宣言するようなやり方です。

 

わかりやすく言えば「丸い箱」とか「四角い箱」があって、丸い箱には「数値」しか入れられないけど、四角い箱には「文字」が入れられるみたいなイメージです。

 

もう少し詳しく書くと、例えば「i」という変数を宣言して、その型をInteger型にすると、iには-32,768から32,767までの数値が入れられるようになります。

 

変数と型について以上が「通常」の形なのですが、この言葉を使った理由はVBAにおいてこの範囲に含まれない変数や型も出てくるからです。それが「オブジェクト変数」というものです。

 

オブジェクト変数と型について『VBAエキスパート公式テキスト Excel VBA スタンダード』には次のように書かれています。

p.50

オブジェクトを格納する変数をオブジェクト変数と呼びます。オブジェクト変数は、格納されたオブジェクトと同等に扱えますので、たとえばセル(Rangeオブジェクト)を格納したオブジェクト変数では、Rangeオブジェクトが持つValueやFormulaなどのプロパティ、InsertやDeleteなどのメソッドが使用できます。

 

オブジェクト変数を宣言するときは、変数の型に格納するオブジェクトの型を指定します。

【オブジェクト型変数の宣言例】

Dim buf As Range       セルを格納する型

Dim buf As Worksheet   ワークシートを格納する型

Dim buf As Range         ブックを格納する型

通常の変数は数値や文字列を入れられるのですが、引用したオブジェクト変数というものは数値や文字列ではなくエクセルの「セル」や「ワークシート」「ブック」を格納できる変数になります。

 

そしてオブジェクト変数専用の

  • Range
  • Worksheet
  • Workbook

といった型を使わなければなりません。

 

以上のように、VBAには変数や型に関するルールがあります。そういった知識はあったのですが、実際にコードを入力するとなるとそのことにはなかなか気づくことができませんでした。

 

『続ExcelVBAのプログラミングのツボとコツがゼッタイにわかる本』の中のコードを入力している時に次のような部分で躓きました。

p295
Const TMP_CELL As  String = "A1"

Private Sub fmHoliColorChange_Click()     
    Dim tmpRange As Range   '指定した色の取得に使うセル
 
    Set tmpRange = Range(TMP_CELL)   '指定した色の取得に使うセルを用意
    tmpRange.Activate   '同セルをアクティブ化

以上のコードの部分で処理を実行してもエラーが出てしまいます。何が違うんだろうかと思いながら、15分ぐらい画面と本書とをにらめっこしていてやっと気づきました。型が違っていたということに。

 

具体的にどこが違っていたのかというと、Dim tmpRange As RangeをDim tmpRange As integerにしてしまっていました。Rangeにしなければいけないところをintegerにしてしまっていたのです。

 

一見すると簡単に見つかりそうなのですが、本書のコードをずっと入力していると、変数や型は基本的に通常のものなので、今回のコードを入力する時も無意識的に通常の型にしてしまったのではないかと思われます。

 

経理の仕事でもこういうことは結構ありました。例えば毎月の支払先の表をつくる時に、取引先ごとの会社名とか口座番号、口座の種類、金額を入力していくのですが、どの企業も基本的には口座の種類は「普通預金」なんです。

 

でも時々「当座預金」の会社もあって、他の企業の普通預金の流れで当座預金の所を普通預金にしてしまったりなど、自分が経理の仕事を初めて最初の頃にそういったミスを結構していまいた。

 

ですから、今回のようにほとんどは通常の変数を使うのだけれど、場合によってオブジェクトを使った変数というのもある、ということを頭に入れておかなればいけないなと思いました。

 

ステートメントや関数を使う時は大文字や小文字に注意する

これは当たり前といえば当たり前なのですが、VBAでコードを入力する時はアルファベットの大文字と小文字に注意しないといけない、ということです。なぜなら、コードの中で1文字でも間違っていると動作しないからです。

 

プログラミングを長年経験してきている人にとっては当たり前のことだと思います。けれども初心者の自分にとってはなかなか意識しづらかった部分であり、「あぁ、こういう所も合ってないとエクセルって反応してくれないんだな」と気づいた点でもありました。

 

その点に気づいたのは、『続ExcelVBAのプログラミングのツボとコツがゼッタイにわかる本』の中の次の部分です。

p.329
Public Sub ドロップダウン列幅調整()
   Dim myControl As Control

   For Each myControl In Me.Controls
       If TypeName(myControl) = "ComboBox" Then
           Debug.Print myControl.Name
       End If   
   Next myControl
End Sub

 

引用したコードの内容として、まずmyControlをコントロール型の変数として宣言。For Each…Nextステートメントでフォーム上のコントロールをmyControlに順番に格納していきます。

 

次にTypeName関数でmyControlの中で「ComboBox」のコントロールの名前をイミディエイトウィンドウに出力していくというコードです。

 

この 「If TypeName(myControl) = “ComboBox” Then」の行の「ComboBox」の部分で躓きました。というのは、ComboBoxとしなければいけない部分を「combobox」としていたからです。

 

どこがおかしいのかというと、頭文字の大文字のCを小文字の「c」にしてしまっていたのと、次のBoxのBを小文字の「b」にしてしまっていました。

 

この部分でエラーが出てしまい、これに気づくのに30分くらいずっと画面と本とを見比べていました。

 

普通に入力していればVBEが自動的に調整してくれるのですが、ダブルクォーテーションで囲まれているので、VBEはcomboboxというコントロールの種類としてではなく、単純に「文字列」として認識してしまっていたのだと思います。

 

コードを入力する時は以上のように、大文字と小文字の違いとか、VBEがどのようにコードを認識しているのか、といった部分にも注意していかなければならないんだということがわかりました。

単純な誤字脱字でつまづく

経理の仕事で数値の計算をしていると、桁数を間違えたり1と7を見間違えたりといったことがあります。それと同様に、実際に仕事でコードを入力していると、次のような単純なミスもあるんじゃないかなぁと思いました。

 

例えば具体的にどんなものが考えられるかというと、「単純な誤字脱字」もあり得るのではないでしょうか。

 

『続ExcelVBAのプログラミングのツボとコツがゼッタイにわかる本』を読みながらコードを入力していた時に、以下のページで次のようなことがありました。

p339
For cnt = FIRST_DAY To daysInMonth

引用したコードはFor…Nextステートメントで処理の回数を指定しているのですが、このコードの「daysInMonth」で躓きました。

 

どうして躓いたのかというと、daysInMonthのつづりの最後の「h」を「n」にしてしまっていたからです。

 

単純すぎるくらい単純なミスなのですが、この部分に気付くのに1時間くらいかかりました。というのも、このページやコードの前後の部分を何度チェックしてもどこにもミスがあるとは思えなかったからです。

 

最初にこことここが違っている、と言われれば特に注意しなくても簡単に気づけますが、よくよく見てみるとhとnって似てないでしょうか?上の棒の部分があるかないかだけで、それ以外の部分は同じ形なので、この部分に気づくのに非常に苦戦しました。

 

プログラミングに詳しい人であれば、VBEのウォッチウィンドウとかコードアシスト機能とかを使って、もっと簡単に探すことがきると思います。自分はまだそのような上手い使い方はわからないので、自力で探すハメになりました。

まとめ

今回は『続ExcelVBAのプログラミングのツボとコツがゼッタイにわかる本』の中にあるコードを実際にエクセルのVBEに入力していったら、「こんなミスが出ました」といったことを書きました。

 

最初に1周読んだ時の感覚として本書の「5章」の「フォームから期間とデザインを指定可能にしよう」がすごい難しく感じました。単純にそこに書かれているコードの内容が難しいというのもありましたし、「コードを使ってフォームの幅や高さを調整する」なんてことができるのも本書を読むまでは知りませんでした。

 

ですからもう1周読んでちゃんと本書を理解してから、3週目に実際に手を使って画面上にコードを入力していくという形をとったのですが、そういった中でも今回書いたようなミスが出たのはいろいろと勉強になりました。

 

今回のようなやり方でもミスが出たというのは、実際に仕事でコードを入力するようになれば、もっと考えられないミスが出てくることも十分考えられます。そうなった時に様々なパターンの修正方法も理解しておく必要があるんじゃないかと思いました。

 

例えばVBEのコードアシスト機能で、ポップアップに表示されるものを上手く利用してなるべく手入力をしないとか、VBEのデバッグ機能でクイックウォッチやウォッチウィンドウをもっと上手く利用できるようにするなど、

 

実際にコードを入力していく上で、VBAにはどんなステートメントや関数があるかを覚えていくということの他に「VBEのデバッグ機能」とか「どういった部分で自分は間違いやすいのか」を理解することも今回の件で重要だなぁと思いました。

あわせて読みたい

こんな記事も読まれています

コメント