[[20050410182653]] 『VBA:オートフィルタデータの上から7番目まで』(KUHIKUHI) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA:オートフィルタデータの上から7番目まで』(KUHIKUHI)

[マクロでオートフィルタのかかったデータの上から7番目まで]

オートフィルターをかけた状態で、20行あるとします。
その一番上のセル(B2)から下に7番目までのセルを別のシートにコピーしたいのですが、

 Range("b2:b7").Copy
と、指定したらだめでした。
よく考えたら当たり前なのですが、フィルタをかけてあるデータの上から7番目を指定してコピーする方法をお教えいただけないでしょうか?
マクロを使用していますので、マクロの記述方法をお教えいただきたいのですが。

OS:WinXP OFFICE:Excel2003


 フィルタ後に、ctrl + shift + * で連続セル範囲を選択し、
 編集>ジャンプ>可視セル
 して、コピー&貼り付けした後、不要行を削除しては?

 ちょっと難しいですが、offset や resize を使えば、
 希望の行だけコピーすることも可能でしょう。
  (INA)


INA様ご返答ありがとうございます。

実は、オートフィルターをかけた後のデータを7行ごとに別シートの別の列にコピーしたいのです。

具体的にいうと、

  A B
 1あ 4
 2い 6
 3う 4
 4え 1
 5お 4
 6か 1
 7き 4
 8く 4
 9け 4
 10こ 6
 11さ 4
 12し 4

のようなデータが100行ほどあり、それを、B列のデータ(日付)でフィルターをかけて、4日に対応するA列のデータを別シートに7データごとに別々の列にコピーしたいのです。

別シート

  A B C D
 1あ × し ×
 2う ×    
 3お ×
 4き ×
 5く ×
 6け ×
 7さ ×         ※ “×”は手入力するセル

1〜7人のデータはA列へ、7〜14人のデータはC列にコピーしたいので、オートフィルターをかけた状態で抽出したい列のデータを7データごとに取得したいのですが、一度、別の作業シートにすべてのデータを取り出して7行ごとにコピーする方法ならできたのですが、できれば作業シートにコピーすることなく実行できればと、、、

offset resize ちょっと勉強してみます。
ありがとうございました。
(KUHIKUHI)


 おはようございます。
ぱっとしませんが、ふたつ考えてみました。
よかったら参考にしてください。
Option Explicit
Sub てすと()
Dim MyA As Variant, MyAry() As Variant
Dim i As Long, j As Long, k As Long, n As Long, x As Long
With Sheets("Sheet1")
    MyA = .Range("A1", .Range("A65536").End(xlUp)).Resize(, 2).Value
End With
k = 2
ReDim MyAry(1 To 7, 1 To k)
For i = 1 To UBound(MyA, 1)
    If MyA(i, 2) = 4 Then
        j = j + 1
        MyAry(j, x + 1) = MyA(i, 1)
        If j = 7 Then
            k = k + 2: j = 0: x = x + 2
            ReDim Preserve MyAry(1 To 7, 1 To k)
        End If
    End If
Next
With Sheets("Sheet2")
    .Cells.ClearContents
    If k < 257 Then
        With .Range("A1").Resize(7, UBound(MyAry, 2))
            .Value = MyAry
            .EntireColumn.AutoFit
        End With
    Else
        MsgBox "処理能力を超えました。"
    End If
End With
Erase MyA, MyAry
End Sub
Sub てすとに()
Dim SR As Range, C As Range, MyTbl As Range
Dim MyCri As String
Dim i As Long, k As Long
Dim MyFlag As Boolean
MyCri = 4
Application.ScreenUpdating = False
With Sheets("Sheet1")
    .AutoFilterMode = False
    .Range("A1").AutoFilter Field:=2, Criteria1:=MyCri
    Set MyTbl = .AutoFilter.Range.Columns(1).SpecialCells(12)
    Sheets("Sheet2").Cells.ClearContents
    If MyTbl.Cells.Count > 1 Then
        k = 1
        For Each C In MyTbl
            If C.Offset(, 1).Value = MyCri Then
                If MyFlag = False Then Set SR = C: MyFlag = True
                i = i + 1
                If i Mod 7 = 0 Then
                    .Range(SR.Address, .Range(C.Address)).Copy _
                            Destination:=Sheets("Sheet2").Cells(1, k)
                    k = k + 2: MyFlag = False
                    If k > 256 Then GoTo MyLine
                End If
            End If
        Next
        If i Mod 7 <> 0 Then
            .Range(SR.Address, .Range(SR.Address).End(xlDown)).Copy _
                                Destination:=Sheets("Sheet2").Cells(1, k)
        End If
    End If
End With
MyLine:
Sheets("Sheet1").AutoFilterMode = False
Application.ScreenUpdating = True
If k > 256 Then MsgBox "処理能力を超えました。"
Set MyTbl = Nothing
Set SR = Nothing
End Sub
(SoulMan)

Soul Man さんおはようございます!

うわぁ。
ほんとうにありがとうございます。
これから出社なので、まだ実行していませんが、会社でやってみます。
もちろん必ず報告させていただきますので、これからもよろしくお願いいたします。

 実は(エクセルの学校)は毎日訪問していていろいろ勉強させていただいております。
 こちらはレスも速攻で帰っててくるのでいつも楽しく拝見しています。これからもがんばってください。(KUHIKUHI)


 >できれば作業シートにコピーすることなく実行できればと、、、
 私はよく使いますけど、こだわる理由は何でしょうか?
 新規ブックを作業シートとして利用して、
 使用後は保存せずに破棄すれば、とくに支障はないと思いますけど・・・
  (INA)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.