私が構築したこのマクロは機能しますが、より高速なバージョンまたはより短い時間で同じことを行うフォーミュラを望んでいます。
私が持っているもの:
For Each cell In Range("Table_Query_1[[#Data],[Reason2]]")
For Each PossibleValue In Range("F2", Range("F2").End(xlDown))
If Len(cell) = 0 Then
If (InStr(UCase(cell.Offset(0, 1)), UCase(PossibleValue)) <> 0) Then
cell.Value = PossibleValue.Value
End If
Else
Exit For
End If
Next
If Len(cell) = 0 Then
cell.Value = cell.Offset(0, -1)
End If
Next
次の配列式で何かを機能させることができる唯一の他の方法
=IF(ISNA(MATCH($F$3:$F$10,[@Extra Info],0)),[@Reason],$F$3:$F$10)
しかし、これは行 4 と 9 の場合のように部分一致では機能しません。また、この配列数式が vba マクロよりもはるかに高速であることに疑問を持っています。また、テストの維持がさらに必要になるという事実もあります。この場合、値の範囲 (F2:f3) は、その式を常に更新する必要があるか、元の範囲を F2:F100 のように作成する必要があるため、それだけ時間がかかります。
したがって、値の範囲内の任意の値 (この場合は F2:F3) が現在の行の Extra Info 列内にある場合、その行の Reason2 (Offset(0, -1) )) 一致した値に等しい。しかし、何も見つからない場合は、その行 (オフセット(0,1)) の理由を使用してください。
そして2番目の問題は、QueryTableが更新された後にマクロを実行する必要があることですが、変更されるクエリ内のセルにセル変更イベントとして設定すると、最終的なクエリテーブルがインポートされる前にマクロが実行されて終了します。並べ替えました。