私のパソコンで問題なく動作したExcelのプログラムが、他のパソコンでは、「コンパイルエラー SubまたはFunctionが定義されていません。」とエラーが発生し動作しませんでした。
この記事では、その時の発生原因と対処法について、私の備忘録もかねてご紹介します。

エラーの原因は64ビット版Officeと32ビット版Officeによるデータ型の違い
Googleで「コンパイルエラー vba clnglng」で検索した結果、AIによる概要で以下の回答が表示されました。
64ビット版OfficeでVBAが実行されている際に、32ビット版で作成されたVBAコードが利用できないことが原因です。64ビット版と32ビット版のデータ型が異なるため、例えばCLngLng(64ビット長の整数)が32ビット版で定義されていない、または互換性がない場合にエラーが発生します。
要するに、64ビット版では動作するが、32ビット版ではエラーが発生するということのようです。
私がプログラムしたパソコンのExcelは64ビット版で、動作しなかったパソコンのExcelは32ビット版でした。

CLngLng関数でコンパイルエラーが発生した場合の対処法
CLngLng関数を使った理由は、データを比較するため、数値に変換する必要があったからです。
私が所属している医療福祉業界では、事業所番号や受給者番号が10桁の数値で取り扱われています。そのため、データ型Longは、「-2,147,483,648 から 2,147,483,647」の範囲までしか対応しておらず、データ型LongLongに変換して比較していました。
32ビット版のパソコンでも動作できるよう、文字列のデータとして取り扱い比較するためCStr関数を代わりに使うことにしました。
'同じサービス提供月、事業所、受給者番号のとき
If MyData2 Like "*" & MyData Then
'配列に" "で分割して格納
Arr = Split(MyData2)
OutAry(y, 0) = CDate(Arr(0))
OutAry(y, 1) = CDate(Arr(1))
OutAry(y, 2) = CStr(Arr(2)) 'CLngLng() → CStr()に変更
OutAry(y, 3) = CStr(Arr(3)) 'CLngLng() → CStr()に変更
y = y + 1
Str = Str & Format(Arr(0), "yyyy年m月、")
End If
省略
'サービス提供月、事業所番号、受給者番号が一致
If MyAry(i, 2) = OutAry(y, 1) And _
CStr(MyAry(i, 3)) = OutAry(y, 2) And _
CStr(MyAry(i, 5)) = OutAry(y, 3) Then
'請求月
For x = 0 To y - 1 '最後の請求月は読み込まないように-1
If MyAry(i, 1) = OutAry(x, 0) Then
DelRow(j) = i + 2 '削除行格納
j = j + 1
End If
Next
End If
※変更箇所がわかるようプログラムの一部を抜粋しているだけなので、参考程度でお願いします。
CLngLng関数からCStr関数に変更した結果、プログラム自体も問題なく動作し、32ビット版のExcelでもコンパイルエラーが発生せずに動作することが確認できました。
まとめ
この記事では、LongLong型を使ったことによる64ビット版と32ビット版の違いによりコンパイルエラーが発生したときの対処法についてご紹介しました。
今回の場合は、データを比較するためLongLong型を使っただけなので、比較するデータをどちらも文字列(String型)に変換することで対処できました。
Excel VBAでは、データ型を意識しないとエラーに気づかず「動作がおかしい、思ったようにうまく動かない」といったことがよくあります。プログラムを作るときは、データ型を意識してプログラムを作るようにしましょう。
コメント