KB4512501エラー(プロシージャの呼び出し、または引数が不正です)

8/26にマクロが動かなくなったという連絡があり、見てみると、 「プロシージャの呼び出し、または引数が不正です」が出るようになっていました。 調べてみると2019/8/14のWindowsUpdateのKB4512501で、Variant型の変数に空配列を渡すと、エラーになるように改訂されたらしいです。これは不具合っぽいので遠からず直すと思われますが現状不透明。 なのでその回避策の例。戻り値が Variant型 なので、配列でなく、空文字列を返すようにしてみました。
Variant型の変数に空配列を渡すのは、C言語でいうヌルポインタを渡すようなイメージなので、セキュリティ上好ましくないということなんですかね…。ああ面倒。
①「配列格納」で、1件も無い場合は、空配列でなく""を返すようにした。
Private Function 配列格納(QRシート As Worksheet, 開始行 As Integer, 列 As Integer) As Variant
Dim 配列 As Variant
Dim 行 As Integer
Dim 終了行 As Integer
Dim n As Integer
配列 = Array()
n = 0
終了行 = 開始行 + 9 '10個のカラムなので9足したものが終了行
For 行 = 開始行 To 終了行
If (QRシート.Cells(行, 列).Value <> "") Then 'ヌルでなければ格納
n = n + 1
ReDim Preserve 配列(n - 1) 'リサイズ
配列(n - 1) = QRシート.Cells(行, 列)
End If
Next 行
If (n > 0) Then
配列格納 = 配列
Else
配列格納 = "" '2019/6/27 KB4512501エラー(プロシージャの呼び出し、または引数が不正です)対策追加 ヌル配列でなく空白文字列を返すようにする
End If
End Function
②配列格納の戻り値を使う「抽出チェック」で、引数が""の場合は、空配列として扱うようにした。
Private Function 抽出チェック(文字列 As Variant, 抽出条件 As Variant, 除外条件 As Variant) As Boolean
Dim n As Integer
Dim 繰り返し数 As Integer
抽出チェック = False
If IsArray(抽出条件) Then
繰り返し数 = local_UBound(抽出条件) 'UBoundの戻り値=配列個数-1
If (繰り返し数 >= 0) Then 'ヌル配列でなければ
For n = 0 To 繰り返し数
If (文字列 = 抽出条件(n)) Then '文字列が一致すれば抽出
抽出チェック = True
End If
Next n
Else
抽出チェック = True '条件の記入が無ければ全抽出
End If
Else
抽出チェック = True '条件の記入が無ければ全抽出
End If
If (抽出チェック = True) Then '抽出条件を満たした場合、続けて除外条件を確認
If (IsArray(除外条件)) Then
繰り返し数 = local_UBound(除外条件) 'UBoundの戻り値=配列個数-1
'Debug.Print 繰り返し数
If (繰り返し数 >= 0) Then 'ヌル配列でなければ
For n = 0 To 繰り返し数
'Debug.Print 文字列 & " " & 除外条件(n)
If (文字列 = 除外条件(n)) Then '文字列が一致すれば除外
抽出チェック = False
End If
Next n
End If
Else
抽出チェック = True '条件の記入が無ければ全抽出
End If
End If
End Function
ディスカッション
コメント一覧
まだ、コメントがありません