2016-08-19 8 views
0

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 

ほとんどの場合、これは動作し、スピードの問題を解決します。これは、テーブルの任意の列にフィルタがある場合に機能しなくなります。これまで通り、配列はテーブルから正しくコピーされますが、正しくコピーされません。フィルタによって隠された最初のセルの前のすべてのセルは正しく処理されますが、非表示のセルは変更されず、非表示セルの後のセルは配列の最初の値に設定されます。

これは、セルがフィルタによって非表示になっている場合にのみ表示され、ワー​​クシートの行が非表示になっている場合には表示されません。

これはなぜ起こるのですか?フィルターがあってもアレイを適切に再適用する方法はありますか?そうでない場合は、フィルタを一時的に削除して変更を加え、同じフィルタを元の位置に戻す方法はありますか?それともスピードを犠牲にしないより良い方法ですか?

ご協力いただければ幸いです。ありがとう!

+0

フィルターを取り外して終了したら適用することはできますか?また、https://stackoverflow.com/documentation/excel-vba/1107/vba-best-practices/5925/switch-off-functionality-during-macro-execution#t=201608192213553239107 – Slai

+0

を削除してみてください。それを再適用することはできますが、現在のフィルタに関する情報を取得する方法はわかりません。そして、私はすでにスクリーン更新と計算を無効にしていましたが、イベントを無効にしてみましたが、それほど速くはありません。 – SudoNim

答えて

0

自動フィルター状態をキャプチャする別の投稿hereのコードが見つかりました。

Sub ReDoAutoFilter() 
    Dim w As Worksheet 
    Dim filterArray() 
    Dim currentFiltRange As String 
    Dim col As Integer 

Set w = ActiveSheet 

' Capture AutoFilter settings 
With w.AutoFilter 
    currentFiltRange = .Range.Address 
    With .Filters 
     ReDim filterArray(1 To .Count, 1 To 3) 
     For f = 1 To .Count 
      With .Item(f) 
       If .On Then 
        filterArray(f, 1) = .Criteria1 
        If .Operator Then 
         filterArray(f, 2) = .Operator 
         filterArray(f, 3) = .Criteria2 'simply delete this line to make it work in Excel 2010 
        End If 
       End If 
      End With 
     Next f 
    End With 
End With 

'Remove AutoFilter 
w.AutoFilterMode = False 

' Your code here 

' Restore Filter settings 
For col = 1 To UBound(filterArray(), 1) 
    If Not IsEmpty(filterArray(col, 1)) Then 
     If filterArray(col, 2) Then 
      w.Range(currentFiltRange).AutoFilter field:=col, _ 
      Criteria1:=filterArray(col, 1), _ 
      Operator:=filterArray(col, 2), _ 
      Criteria2:=filterArray(col, 3) 
     Else 
      w.Range(currentFiltRange).AutoFilter field:=col, _ 
      Criteria1:=filterArray(col, 1) 
     End If 
    End If 
Next col 
End Sub 

既知の問題は、基準をフィルタ]ドロップダウンのツリービューコントロールからの選択に基づいて日付フィルタをキャプチャする方法を見つけることができないということです。

+0

ありがとう!私はこの回避策が私にとってはうまくいくと思っていますが、まず最初に何がうまくいかなかったのかを知りたい – SudoNim

関連する問題