通常、SGN関数は引数に渡した値の正負を判定するために使われます。
◼︎Sgn(num)
numの判定 | 戻り値 |
---|---|
num > 0 | 1 |
num = 0 | 0 |
num < 0 | -1 |
でもこんなことしないですよね普通。
みなさん
if sgn(num) = 1 then …
なんて書くよりは
if num > 0 then …
なんて風に素直に書きますよね。
そもそもこんなドマイナーな関数を使うより、誰でも知っているような書き方をするはずで、現場によっては使った場合可読性が低いと怒られるでしょう。
なので、主にこの関数の活躍の場は上記のOfficeデベロッパーセンターの説明外の用法にあるようです。
なんと、以下のように配列の初期化が行われているかどうかを判別するために使われちゃったりします。
◼︎Sgn(array)
arrayの判定 | 戻り値 |
---|---|
arrayが初期化されていない状態 | 0 |
arrayが初期化済みの状態 | -16064 |
◼︎SGN関数の用法
Private Sub testSgn()
'未初期化配列の宣言
Dim sgnArray() As Variant
If Sgn(sgnArray) = 0 Then
MsgBox "配列:sgnArrayは初期化されていません"
Else
MsgBox "配列:sgnArrayは初期化済みです"
End If
'初期化済み配列の宣言
Dim sgnArray2(2) As Variant
If Sgn(sgnArray2) = 0 Then
MsgBox "配列:sgnArray2は初期化されていません"
Else
MsgBox "配列:sgnArray2は初期化済みです"
End If
End Sub
結果はもちろん'未初期化配列の宣言
Dim sgnArray() As Variant
If Sgn(sgnArray) = 0 Then
MsgBox "配列:sgnArrayは初期化されていません"
Else
MsgBox "配列:sgnArrayは初期化済みです"
End If
'初期化済み配列の宣言
Dim sgnArray2(2) As Variant
If Sgn(sgnArray2) = 0 Then
MsgBox "配列:sgnArray2は初期化されていません"
Else
MsgBox "配列:sgnArray2は初期化済みです"
End If
End Sub
・配列:sgnArrayは初期化されていません
・配列:sgnArray2は初期化済みです
となります。
ただし、この使い方どのサイトでも「よく分からないけどこうなる」と書いてあります。
さてつかみどころのないSgn関数ですが、
筆者の現場ではツールリリース後に早速「環境によってこの使い方をすると落ちる」という厄介な事象に見舞われ、無事別の方法で対処しました。勘弁してください。
こういうことってvbaに限らずよくあるのですが、
やっぱりわからないものを分からないまま使うって怖いですね。
ちなみに配列の初期化済み確認方法はここに詳しいです。