
下記のように情報が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
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
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
No.2
- 回答日時:
ご質問に提示されたデータでは見出し行がないようですが、オートフィルターというからには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
No.1
- 回答日時:
フィルタリストを取得しリストを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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
VBA オートフィルター繰り返し
Visual Basic(VBA)
-
Excel VBAでオートフィルタで抽出した列データを別シートの最終行にコピーするには
Visual Basic(VBA)
-
オートフィルタのリストを順番に印刷できるマクロ
Windows Vista・XP
-
-
4
excelのマクロで該当処理できなければ飛ばして進むにはどうすればよいのでしょうか
Visual Basic(VBA)
-
5
Excel VBAでオートフィルタで抽出したデータの一部だけ貼り付けるには(第2弾)
Excel(エクセル)
-
6
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
7
VBA・オートフィルタで抽出・貼り付けをFor~Nextで実現するには?
Excel(エクセル)
-
8
【マクロ】対象データを別シートの最終行の下へ貼り付けをしたい。
Excel(エクセル)
-
9
【マクロ】オートフィルターのA列のリストを順番に、行数によっては印刷の向きを指定して印刷したい!
Excel(エクセル)
-
10
オートフィルタで抽出したデータを別シートの最終行に追加させたい。
Excel(エクセル)
-
11
vba フィルター 複数条件 3つ以上 完全一致除外
Visual Basic(VBA)
-
12
【VBA】【ユーザーフォーム_ListBox】オートフィルタで絞りこんだ値だけを取り出したい
Visual Basic(VBA)
-
13
【EXCEL】【VBA】空欄は飛ばして処理する方法を教えて下さい。
Excel(エクセル)
-
14
エクセルVBAで5行目からオートフィルタモードに設定したいたい
Excel(エクセル)
-
15
エクセルVBAで、条件に一致するセルへ移動
Excel(エクセル)
-
16
エクセルで複数のシートのクリアをしたいです
Excel(エクセル)
-
17
VBAで文字列を数値に変換したい
Excel(エクセル)
-
18
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
19
VBAを何回も作り直して、容量が増えた
Excel(エクセル)
-
20
エクセルVBAでフィルタ抽出部分のみのコピー
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
オートフィルタで未入力(空白...
-
エクセルで時刻(8:00~20:00)...
-
ACCESSでスペースの抽出
-
エクセルでオートフィルタのボ...
-
オートフィルタで選択した項目...
-
スプレッドシートのチェックボ...
-
エクセル関数で、数字の入った...
-
エクセルで、条件に一致した行...
-
VBA オートフィルタで抽出した...
-
エクセル2007のオートフィルタ...
-
【EXCEL】条件に一致した最新デ...
-
Openofficeのオート...
-
エクセルのオートフィルタで最...
-
EXCELで2つの数値のうち大きい...
-
Excelで隣のセルと同じ内容に列...
-
PowerPointで表の1つの列だけ...
-
エクセルで二つの数字の小さい...
-
「B列が日曜の場合」C列に/...
-
列の足し算(Z+1=AA)につ...
-
妊娠祝い もらったことある
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでオートフィルタのボ...
-
エクセルで時刻(8:00~20:00)...
-
エクセルのオートフィルタで最...
-
Excelのオートフィルタで非表示...
-
エクセル関数で、数字の入った...
-
エクセルの偶数行(奇数行)の抽出
-
オートフィルタで選択したデー...
-
オートフィルタは金額の桁カン...
-
エクセルで指定期間内に在職す...
-
エクセルで、条件に一致した行...
-
オートフィルタを見出し行選択...
-
エクセルにて、フィルタをかけ...
-
access マクロでのフィルタの...
-
可視セルを対象としたcountifが...
-
Excel共有ブックのオートフィル...
-
オートフィルタで3つ以上の条...
-
エクセルで隔週をもとめる
-
【EXCEL】条件に一致した最新デ...
-
データの抽出を教えてください
-
なぜShowAllDataだとうまく行か...
おすすめ情報