- 締切済み
VBA オートフィルタで抽出したものを連続貼り付け
下記のように情報が100近くまで存在した場合に、オートフィルターで一つずつ抽出したものをコピーし、新規シートに貼り付けたいのですが、どうすれば良いのでしょうか? 1 1 1 2 2 2 3 3 3 たとえばシート1に 1 1 1 シート2に 2 2 2 といったように処理したいので、教えて下さい。 vbaの参考書とサンプルを見て下記のように作成したのですが上手くいきません。 どんな本を読めば作成出来るようになるのかわからず、質問させていただきました。 ub オートフィルター() Dim myRng As Range Dim mySht As Worksheet Set myRng = _ Worksheets(1).Range("A1").CurrentRegion With Worksheets Set mySht = .Add(after:=.Item(.Count)) End With With myRng .AutoFilter field:=1, Criteria1:=8 On Error Resume Next .Resize(.Rows.Count - 1).Offset(1).Copy mySht.Range("A1") .SpecialCells(xlCellTypeVisible).Copy mySht.Range("A1").AutoFilter mySht.Range("A1").AutoFilter If Err.Number <> 0 Then Application.DisplayAlerts = False mySht.Delete Application.DisplayAlerts = True End If On Error GoTo 0 End With Set myRng = Nothing Set mySht = Nothing End Sub
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- merlionXX
- ベストアンサー率48% (1930/4007)
ANo2 merlionXXです。 見出し行がある場合のほうの記述に抜けがありました。 修正します。 Sub test01() '見出し行がある場合 Dim ws(1) As Worksheet Dim myW Dim i As Long Set myDic = CreateObject("Scripting.Dictionary") Set ws(0) = ActiveSheet Set myRng = ws(0).Range("A1").CurrentRegion myW = myRng.Columns(1).Value For i = 1 To UBound(myW) If Not myDic.Exists(myW(i, 1)) Then myDic.Add myW(i, 1), "" End If Next i With ws(0) For i = 2 To myDic.Count .AutoFilterMode = False myRng.Rows(1).AutoFilter myRng.AutoFilter Field:=1, Criteria1:=myDic.keys()(i - 1) Set ws(1) = Sheets.Add(after:=Sheets(Sheets.Count)) myRng.Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).Copy ws(1).Range("A1") Next i End With End Sub
- merlionXX
- ベストアンサー率48% (1930/4007)
ご質問に提示されたデータでは見出し行がないようですが、オートフィルターというからには1行目に見出し行がないのが不思議です。 (見出しなしでオートフィルターを設置すると、1行目は常に表示されますので) 単に省略しただけなのでしょうか? 一応、最初のデータに見出し行がある場合と、ない場合の二つの例を書きます。 別シートに転記の際は、ご提示のように見出し行はつけていません。 フィルタをかけるための重複なしのリストの作成には.Dictionaryオブジェクトを利用しました。 ご参考まで。 Sub test01() '見出し行がある場合 Set myDic = CreateObject("Scripting.Dictionary") Set ws(0) = ActiveSheet Dim i As Long Set myRng = ws(0).Range("A1").CurrentRegion myW = myRng.Columns(1).Value For i = 1 To UBound(myW) If Not myDic.Exists(myW(i, 1)) Then myDic.Add myW(i, 1), "" End If Next i With ws(0) For i = 2 To myDic.Count .AutoFilterMode = False myRng.Rows(1).AutoFilter myRng.AutoFilter Field:=1, Criteria1:=myDic.keys()(i - 1) Set ws(1) = Sheets.Add(after:=Sheets(Sheets.Count)) myRng.Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).Copy ws(1).Range("A1") Next i End With End Sub Sub test02() '見出し行がない場合 Dim ws(1) As Worksheet Dim myW Dim myDic As Object Dim i As Long Set myDic = CreateObject("Scripting.Dictionary") Set ws(0) = ActiveSheet ws(0).Rows("1").Insert Shift:=xlDown Set myRng = ws(0).Range("A1").CurrentRegion myW = myRng.Columns(1).Value For i = 2 To UBound(myW) If Not myDic.Exists(myW(i, 1)) Then myDic.Add myW(i, 1), "" End If Next i With ws(0) For i = 1 To myDic.Count .AutoFilterMode = False myRng.Rows(1).AutoFilter myRng.AutoFilter Field:=1, Criteria1:=myDic.keys()(i - 1) Set ws(1) = Sheets.Add(after:=Sheets(Sheets.Count)) myRng.Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).Copy ws(1).Range("A1") Next i End With End Sub
- xls88
- ベストアンサー率56% (669/1189)
フィルタリストを取得しリストをLoopしながらオートフィルタしてみます。 Dim mySht As Worksheet Dim myRng As Range Dim fnRng As Range Dim c As Range Dim myData() As String '---フィルタリスト Dim fn As Long '---Field番号 Dim flg As Boolean Dim i As Long ReDim myData(0) fn = 1 Set myRng = Worksheets(1).Range("A1").CurrentRegion Set fnRng = myRng.Columns(fn).Resize(myRng.Rows.Count - 1).Offset(1) 'リスト For Each c In Range(fnRng.Address) If myData(0) = "" Then myData(0) = c.value Else flg = False For i = 0 To UBound(myData) If myData(i) = c.value Then flg = True Exit For End If Next If Not flg Then ReDim Preserve myData(UBound(myData) + 1) myData(UBound(myData)) = c.value End If End If Next 'オートフィルタ With myRng For i = 0 To UBound(myData) With Worksheets Set mySht = .Add(after:=.Item(.Count)) End With .AutoFilter Field:=fn, Criteria1:=myData(i) .Resize(.Rows.Count - 1).Offset(1).Copy mySht.Range("A1") Next End With ≪参考≫ リストの取得は、下記掲示板でSALINGERさんのコードを使わせて頂きました。 特定のセル範囲を重複無しで配列に格納する http://q.hatena.ne.jp/1249216965