Excel VBAマクロでデータ型を間違えて10分以上ハマったorz

全身ユニクロファッションだった [twitter:@jasmine88_] です。こんにちは!

以前、職場で上司に頼まれて、ピボットテーブルで集計したものに手を加えてまとめるVBAマクロを組んだ。
それから1ヶ月。いくつか追加してほしい機能があるというので、手直しすることに。

どんなマクロ?

入力されたデータをピボットテーブルで集計し、そこから計算して分析するマクロをつくった。

    LastCell_Row = Cells(65535, 1).End(xlUp).Row
    LastCell_Col = Cells(4, 256).End(xlToLeft).Column

こんな感じで最終行と最終列を取得し、それをもとに色々と付け足していく感じ。

手直ししてると…

いくつか手直ししていく。

取得した最終行をもとに、右隣りに項目を追加していく。
ピボットテーブルに集計されたデータをもとに計算。

    Cells(4, LastCell_Col + 1).Value = "消費税"
    Cells(6, LastCell_Col + 1).FormulaR1C1 = _
        "=ROUND(GETPIVOTDATA(""合計金額"",R3C1,""番号"",R[-1]C1)*0.05,0)"

同様にいくつかの項目を追加。ここまでは何も問題なし。

問題発生!

さらに追加したこの一文でエラー発生

    Range(Cells(4, LastCell_Col), Cells(LastCell_Row, LastCell_Col)).Select


実行時エラー '1004':
アプリケーション定義またはオブジェクト定義のエラーです。

何故だ…
すぐに色々調べて、ActiveSheets を指定しなおしたり、色々試してみたけどどれもうまくいかない。

10分以上悩み続けて、コードを初めから読み直していると…

    Dim LastCell_Row As String
    Dim LastCell_Col As String

最終行、最終列を取得する前に変数名を定義していた。String 型で。
String って文字列型じゃんorz

最初にマクロを組んだ時のデータ型のミスが原因だった。恨むぞ1ヶ月前の自分…

    Dim LastCell_Row As Integer
    Dim LastCell_Col As Integer

きちんと整数型に直して、再度実行。
今度は無事成功!!

まとめ

変数名を定義するとき、正しいデータ型をつかわないと大変なことになりますよってお話。

なぜ途中まで文字列型でも上手くいったのか
Cells(4, LastCell_Col + 1).Value = "消費税"

という記述では、「LastCell_Col + 1」で一度計算することで、数として扱われたのではないかと。
Cellsプロパティでは、行・列のインデックスをそれぞれ整数で指定しなければいけないので、
文字列である LastCell_Col ではエラーが出た。

単純な事なのに、なかなか気付けなかったorz

おまけ 今回使ったデータ型
データ型 名称
String 文字列型
Integer 整数型