半角チルダ

ExcelVBA、その他。
覚え書きや、補足資料などのスクラップブック。
end-u(1037781)

■AutoFilter FilterModeでのFillRightメソッド

2009-02-04 22:00:00 | 雑記
知らなかったのは私だけかもしれませんが、FillRight メソッドを使えば
AutoFilter 抽出後の可視セルデータを --> 同状態の可視セルのみへ コピーができるのですね。
FillRight メソッドなのでコピー先は限定されますが。

▼サンプルシートを作るマクロ
Sub sample()
  With Sheets.Add
    .Range("A1:C1").Value = [{"f1","f2","f3"}]
    With .Range("B2:C10")
      .Formula = "=int(rand()*10)"
      .Value = .Value
    End With
    .Range("4:4,7:7").ClearContents
    .Range("A4,A7,A11:A12").Value = 1
    .Range("B4,B7,B11").Select
    SendKeys "~"
    Application.CommandBars.FindControl(ID:=226).Execute
    .Range("B12").Value = "end"
    .Range("A1").Select
    .Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:=1
    .Range("B2:B12").Interior.Color = vbYellow
    .ShowAllData
  End With
End Sub

▼こんなデータができます。



▼以下、手作業です。 A列 1 でフィルタ抽出し、B列を選択します。



▼右下コーナーにカーソルを合わせて右にフィルドラッグします。



▼右へコピーされます。



▼オートフィルタを解除してみると、ちゃんと可視セルにだけコピーされています。



(確認環境は[win2000/xl2000][winXP/xl2003])


ついでですが、上記動作をマクロ記録してみると
Sub Macro1()
'
' Macro1 Macro
' マクロ記録日 : 2009/2/4 ユーザー名 : no name
'

'
  Selection.AutoFilter Field:=1, Criteria1:="1"
  Range("B4:B12").Select
  Selection.FillRight
End Sub

これをそのまま実行しても何も起きません。

Range("B4:C12").Select

と、Select範囲を変えれば機能します。
つまり、手動操作と同じ結果を記録マクロで得るなら B4:C12セルを選択して[ Ctrl ]キー+[ r ]キー同時押し。
...のほうが良さそうです。

もうちょっと使えそうな感じで書いてみると以下。
Sub test()
  With ActiveSheet
    If .AutoFilterMode And .FilterMode Then
      With .AutoFilter.Range.Columns(2)
        If WorksheetFunction.Subtotal(3, .Cells) > 1 Then
          Intersect(.Cells, .Offset(1)).Resize(, 2).FillRight
        End If
      End With
    End If
  End With
End Sub




(2009.02.05追記)
...微妙に勘違いしてるような?

上記の手動操作の例が悪いですね。
最初から
>B4:C12セルを選択して[ Ctrl ]キー+[ r ]キー同時押し。
の例にしておけば良かったです。
同じフィルドラッグ操作でも、 FilterMode によって実行されるメソッドが違うのでした。
単純に、『オートフィルタ抽出状態での[右方向へのコピー]は可視セルだけが対象になる。』という話な...だけ?

#どうも充電が足りなかったようです XD
Comment
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする