Excel 2013で作業していて、VBAでマクロを作成していますが、列内のすべてのセルに値を割り当てようとしています。リストオブジェクト(テーブル)。フィルターによって隠されているものもあります。個々のセルに個別に値を割り当てることは、プロセスを大幅に遅くしていたように思えました。範囲をバリアント配列にコピーし、配列を繰り返して値を変更し、配列を範囲にコピーし直すことを提案しました。Excel VBA、フィルターによって隠されたセルを含む、配列からリストオブジェクトへの書き込み
varray = table.DataBodyRange.Columns(columnIndex).Value
For i = 1 to UBound(varray, 1)
If (condition) then
varray(i, 1) = i
End If
Next i
table.DataBodyRange.Columns(columnIndex).Value = varray
ほとんどの場合、これは動作し、スピードの問題を解決します。これは、テーブルの任意の列にフィルタがある場合に機能しなくなります。これまで通り、配列はテーブルから正しくコピーされますが、正しくコピーされません。フィルタによって隠された最初のセルの前のすべてのセルは正しく処理されますが、非表示のセルは変更されず、非表示セルの後のセルは配列の最初の値に設定されます。
これは、セルがフィルタによって非表示になっている場合にのみ表示され、ワークシートの行が非表示になっている場合には表示されません。
これはなぜ起こるのですか?フィルターがあってもアレイを適切に再適用する方法はありますか?そうでない場合は、フィルタを一時的に削除して変更を加え、同じフィルタを元の位置に戻す方法はありますか?それともスピードを犠牲にしないより良い方法ですか?
ご協力いただければ幸いです。ありがとう!
フィルターを取り外して終了したら適用することはできますか?また、https://stackoverflow.com/documentation/excel-vba/1107/vba-best-practices/5925/switch-off-functionality-during-macro-execution#t=201608192213553239107 – Slai
を削除してみてください。それを再適用することはできますが、現在のフィルタに関する情報を取得する方法はわかりません。そして、私はすでにスクリーン更新と計算を無効にしていましたが、イベントを無効にしてみましたが、それほど速くはありません。 – SudoNim