オブジェクト型変数や誤字脱字など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にしてしまっていたのです。

 

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

 

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

 

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

 

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

 

コメント