配列のある操作に関する限界(失敗談)
今日も、私の失敗談を一つ紹介。
このブログで何度か紹介している、こちらのクラスモジュール。
infoment.hatenablog.com
この中には、二つの配列を比較してその結果を配列として返す関数がある。
例えば、こちら二つの表を比較したい場合。
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を表している。
変更になったもの、削除されたもの、追加されたものがそれぞれ記されている。
業務でも重宝していた最中、突然、不具合の連絡があった。
上記のような簡易テストでは問題ないのに、本番で上手く行かない場合がある。
どうして?ということで、必死に原因を探して分かったこと。それは、
配列の要素に、ある文字数を超えるものが含まれる場合、行列入れ替えできないらしい
ってこと。確認のため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
家の環境はOffice 365で32767個だった。2の15乗が32768なので、何かそこら辺が関係しているのか。ちなみに、職場はExcel2013で、255個が限界だった。
それにしても、こんな落とし穴があったとは。
どう対策して良いか、今のところ具体的なアイディアが思い浮かばない。
そのうちに思いつくかもしれないので、それまでは注意して使うとしよう。
参考まで。