Excel VBA

【Excel VBA】【マクロ】【Tips】Sgn関数はExcel64bit版では使えない?

こんにちは!Lenocoです。本日も見てくださりありがとうございます。

今回はSgn関数についてのTips回です!!!

Sgn関数のエラー

会社勤めをしていたときに、今まで問題なく動いていたのに急にマクロが動かなくなる、ということがありました。

Sgn関数のところでエラーになっていました。
今まで動いていたのになぜ?となったのですが、エラーがでるのはどうやら64bit版のExcelだったようで、32bit版では問題なく動いていました。

Sgn関数とは

そもそもSgn関数で何をしているかというと、
カッコに入っているのは配列で、配列が定義されているか(データが入っているか)を見ています。

Dim tempArray() As String

If Sgn(tempArray) = 0 Then
  '①定義されていないときはこっち
Else
  '②定義されているときはこっち
End If

上記の場合、配列の宣言はしていますが配列数の定義はしていません。
この場合配列がいくつか、ということをどこにも定義していないため、Sgn関数の戻り値は0となりIf文の①に入ります。
以下はどうでしょうか。

Dim tempArray() As String
Redim tempArray(5)

If Sgn(tempArray) = 0 Then
  '①定義されていないときはこっち
Else
  '②定義されているときはこっち
End If

こちらの場合は、変数宣言のあとにRedmで配列数を定義しているため、If文の②に入ります。

32bit版、64bit版どちらでも動くようにするために

32bit版、64bit版どちらでも動くようにするにはどうしたらようでしょうか?
私が対応したやり方です。

Dim tempArray() As String
Redim tempArray(0)

If tempArray(0)="" Then
  '①tempArray(0)が空のときはこっち
Else
  '②tempArray(0)が空でないときはこっち
End If

最初に「Redim tempArray(0)」で配列を一つ分定義します。
今回はString型なので、tempArray(0)が空かどうかを見て判定しています。

たいていの場合、①に入ったときにtempArray(0)に文字列を入れていくと思うのですが、
もしtempArray(0)に空欄が入る可能性がばるのであれば、初期値として絶対に入らない文字列を入れておくと良いです。

Dim tempArray() As String
Redim tempArray(0)
tempArray(0)="dummy"

If tempArray(0)="dummy" Then
  '①tempArray(0)が空のときはこっち
Else
  '②tempArray(0)が空でないときはこっち
End If

上記のようにしておけば、tempArray(0)に「dummy」という文字列が入っていたら「まだデータが入っていない状態だ」と判断することができます。

Sgn関数は動きが不安定という記事を見たことがあるので、
もしかしたらなるべく使わないほうが良いのかもしれません・・・

難しい・・

Lenoco

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です