こんにちは!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
[…] https://lenoco.tokyo/?p=136 […]