t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBAでアホな実験 ~ Not演算子は何個連続で使えるか

二重否定文…それは時に控えめな肯定を、時に強い肯定を生み出す日本語のテクニックである。

控えめな肯定の例「できなくもない」
強い肯定の例「やらねばならない」

なんてことを考えてたら、そういやNotって二個以上つなげても大丈夫なんかしらと、アホなことを思いついたので、これは検証せねばならない。

実際にやってみた。

Sub hoge()
    a = 100
    If Not Not IsNumeric(a) Then
        MsgBox "数値に違いない!!"
    Else
        MsgBox "数値ではない"
    End If
End Sub

f:id:t-hom:20170430053159p:plain

おお、どうやら問題ないようだ。

では4個ならどうか。

Sub fuga()
    a = 100
    If Not Not Not Not IsNumeric(a) Then
        MsgBox "数値と言えなくもない"
    Else
        MsgBox "数値ではない"
    End If
End Sub

f:id:t-hom:20170430053339p:plain

いけてるね。
ちょっとこの先は数値ではなくTrueに対して反転していこう。

Sub piyo()
    If Not Not Not Not Not Not Not Not Not Not _
    Not Not Not Not Not Not Not Not Not Not _
    Not Not Not Not Not Not Not Not Not Not _
    Not Not Not Not Not Not Not Not Not Not _
    Not Not Not Not Not Not Not Not Not Not _
    Not Not Not Not Not Not Not Not Not Not _
    True Then
        MsgBox "Hello"
    Else
        MsgBox "GoodBye"
    End If
End Sub

こんなのも問題なく実行できた。


これ無限につなげていけるんじゃないの?
と行コピーしまくってたら…
f:id:t-hom:20170430054504p:plain

えっ、そんなところに限界が!?

数えてみると、行継続文字は24個、つまり25行目までで限界らしい。

またひとつ賢くなった。
いや、ひとつアホになったかな。。

いいだろう。
それなら改行なしでやってやる。

てことでNotをコピペで注入して右へ右へと伸ばしていく。
f:id:t-hom:20170430055532p:plain

あれっ?
f:id:t-hom:20170430055752p:plain
いつのまにやら二行目に。。。

一行目の最終を確認すると、1023桁。
f:id:t-hom:20170430060006p:plain

このあとスペース1個は入ったけれど、それ以上1文字も入らない。
つまりVBEの1行の最大桁数は1024桁だということ!

まぁどうでもいい知識。

ということは、Notの限界個数は計算で求まる。
まず一行目は「If 」がスペース込みで3文字、最後の行結合文字「_」で1文字、あとはスペース込みの「Not 」4文字が何個入るかということ。

(1024-3-1) / 4 = 255個

255個入る!と思ったら最初のゼロ文字目を1桁と数えるらしく、結局254個だった。文字数でいうと1行に1023文字しか入らないわけね。
気を取り直して二行目。

(1023 - 1) / 4 = 255.5

ということでNotが255個、試してみたらちゃんと入った。

最終行は「True Then」を引いて、

(1023 - 9) / 4 = 253.5

Notが253個

トータルすると、
254個 + (255個 * 23行) + 253個 = 6372個!!

理論上、Not演算子は6372個連続で使えるということに。

ではジャンジャンコピーしていこう。
f:id:t-hom:20170430061806p:plain

あれ・・・?
f:id:t-hom:20170430050848p:plain

からの。。
f:id:t-hom:20170430050543p:plain
そんなまさか!

Excel様の堪忍袋の緒が切れた。。
エラーも出してくれない。

さすがにそんなアホはもう知らんと。

どうやら一定数を超えるとバグるらしい。MSさん、しっかりデバッグしてくださいよ~。
…まずはお前の頭をデバッグしてこいと言われそうだな。

さて、仕方ないのでここから数個づつ配置しながらバグが発生するポイントを探ったところ…

ついに。。完成!
f:id:t-hom:20170430052035p:plain

今回の検証では3621個というのが限界値のようだ。
ちなみに環境はWin7 32bit Office2010 Pro 32bit。

はい、おしまい。
あー疲れた。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。