配列のある操作に関する限界(失敗談)

今日も、私の失敗談を一つ紹介。
f:id:Infoment:20200820230209p:plain

このブログで何度か紹介している、こちらのクラスモジュール。
infoment.hatenablog.com

この中には、二つの配列を比較してその結果を配列として返す関数がある。
例えば、こちら二つの表を比較したい場合。
f:id:Infoment:20200820230329p:plain

Sub Test()
    Dim arr1 As Variant
        arr1 = Range("A2:B4")
    Dim arr2 As Variant
        arr2 = Range("A7:B9")
        
    With New VBAProject.ArrayEdit
        .source_array = arr1
        .CompareResultArray arr2
        .PasteArray "D2", , , , ptTable, True, case_edited
    End With
End Sub

結果がコチラ。表1から見た表2を表している。
f:id:Infoment:20200820230749p:plain

変更になったもの、削除されたもの、追加されたものがそれぞれ記されている。
業務でも重宝していた最中、突然、不具合の連絡があった。

上記のような簡易テストでは問題ないのに、本番で上手く行かない場合がある。
どうして?ということで、必死に原因を探して分かったこと。それは、

配列の要素に、ある文字数を超えるものが含まれる場合、行列入れ替えできないらしい

ってこと。確認のため2行2列の配列を作成し、最初の要素を一文字ずつ増やし、都度行列の入れ替えをしてみよう。

Sub Test()
    Dim arr(1, 1) As Variant
    Dim i As Long
    Dim temp As Variant
    
        On Error Resume Next
        Do
            i = i + 1
            arr(0, 0) = WorksheetFunction.Rept("あ", i)
            temp = WorksheetFunction.Transpose(arr)
        Loop While Err.Number = 0
        
        MsgBox i - 1 & " 個が限界です"
End Sub

f:id:Infoment:20200820231540p:plain

家の環境はOffice 365で32767個だった。2の15乗が32768なので、何かそこら辺が関係しているのか。ちなみに、職場はExcel2013で、255個が限界だった。

それにしても、こんな落とし穴があったとは。
どう対策して良いか、今のところ具体的なアイディアが思い浮かばない。

そのうちに思いつくかもしれないので、それまでは注意して使うとしよう。

参考まで。