4

フィルター処理された範囲の値を配列にコピーすると、問題なく機能するようです。配列には、フィルター処理されたセルとフィルター処理されていないセルの両方の値が含まれます。ただし、配列の内容をフィルター処理された範囲にコピーして戻すと、結果が理解できなくなります。

これが私のコードです:

Sub test()
    Dim rangecopy() As Variant

    rangecopy() = Range(Cells(2, 1), Cells(14, 3)).Value
    For c = LBound(rangecopy, 1) To UBound(rangecopy, 1)
        rangecopy(c, 1) = c
        rangecopy(c, 2) = c * 10
        rangecopy(c, 3) = c * 100
    Next
    Range(Cells(2, 1), Cells(14, 3)).Value = rangecopy()
End Sub

次のような結果になるはずです。ここでは、マクロが配列を範囲にコピーしたときに、範囲はフィルタリングされていませんでした。

Imgur

範囲が列Dでフィルター処理されている場合(「NO」がフィルターで除外されている場合)、結果は次のようになります。

Imgur

まず、フィルタリングされたセルは更新されません。次に、列Bのほとんどのセルは配列の最初の列(4、5、6)から値を取得しますが、他のいくつかのセルは配列の2番目の列から正しく値を取得します(10)。最後の2行は#N/Aエラーで埋められています。これはそのように機能するはずですか?Office2010を使用しています。

4

1 に答える 1

3

VBAの内部動作についての知識を持っている人が、あなたの質問についてより多くの洞察を提供してくれることを本当に望んでいます。私は以下を共有することができます:

まず、意図したとおりに機能しています。ただし、これが設計である理由や、割り当てプロセスで正確に何が起こっているのかはわかりません。

同様の問題を引き起こすケースはたくさんあります。たとえば、フィルタをオンにして(一部の行が非表示になっている)、数式を入力(ドラッグ)しようとすると、非表示の行は入力されないという同様の結果が表示されますが、(相対的な)参照には影響します式で。一方、フィルタリングされた範囲に手動でコピーして貼り付けると、データは(意図したとおりに)非表示の行に貼り付けられます。

オートフィルター範囲の一部である参照された範囲は、実際には連続していないようです*。Range.Addressを使用しても、これが常に明らかになるとは限りません。また、Range.Areasをループすることもありません。例を変更すると、「実際の」エラーがどこにあるかがわかります。

Dim r1 as range
Dim r2 as range

Set r1 = Sheet1.Range("A1:B5") 'some numbers in a range
Set r2 = Sheet2.Range("A2:B6") 'same-size range underneath a filtered header

r1.Copy Destination:=r2

すべての行が表示されているときに機能します。Sheet2のフィルターが非表示の行を作成すると、結果は「実行時エラー '1004':...コピー領域と貼り付け領域が同じサイズと形状ではありません」になります。一方、「手動」/クリップボード方式を使用すると、非表示の行に対して機能します。

r1.Copy    
r2.PasteSpecial (xlPasteValues)

配列を範囲に割り当てると(最初のブロックのように)クリップボードがバイパスされるため、エラーが発生するはずです(代わりに、誤った結果が表示されます)。

私が知っている唯一の解決策は、範囲をループして各セルに値を割り当てることです。

For i = 1 to LastRow
  For j = 1 to LastCol
    Sheet1.Cells(i,j).Value = myArr(i,j)
  Next
Next

または(より良い)オートフィルターを削除し、配列を範囲に割り当ててから、フィルターを再適用します。

*技術的には連続しているため、範囲は複数の範囲/領域で構成されていると言った方がよい場合がありますが、.Addressを使用してもこれは示されず、Range.Areasをループしようとすると領域は1つだけになります。

于 2012-04-27T16:35:57.603 に答える