Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2375 / 13645 ツリー ←次へ | 前へ→

【68407】検索値を指定して一致した行をコピー ののか 11/3/3(木) 10:50 質問[未読]
【68409】Re:検索値を指定して一致した行をコピー kanabun 11/3/3(木) 11:45 発言[未読]
【68410】Re:検索値を指定して一致した行をコピー ののか 11/3/3(木) 12:48 発言[未読]
【68412】Re:検索値を指定して一致した行をコピー ののか 11/3/3(木) 13:42 質問[未読]
【68414】Re:検索値を指定して一致した行をコピー neptune 11/3/3(木) 14:43 発言[未読]
【68415】Re:検索値を指定して一致した行をコピー kanabun 11/3/3(木) 14:51 発言[未読]
【68417】Re:検索値を指定して一致した行をコピー ののか 11/3/3(木) 15:30 質問[未読]
【68418】Re:検索値を指定して一致した行をコピー kanabun 11/3/3(木) 16:38 発言[未読]
【68419】Re:検索値を指定して一致した行をコピー ののか 11/3/3(木) 17:28 お礼[未読]
【68416】Re:検索値を指定して一致した行をコピー kanabun 11/3/3(木) 15:17 発言[未読]

【68407】検索値を指定して一致した行をコピー
質問  ののか  - 11/3/3(木) 10:50 -

引用なし
パスワード
   いつもお世話になってます。
複数シート 2004〜2010 全7シートの中に大量のデータがあります。
全部つなげたいのですが行数が足りません。
そこで分類ごとにデータを抜き出したいのですが、

各シート2004〜2010の1行目は表題が入ってます。
検索値はとりあえずAAでお願いします。英数字2ケタです。
検索する列はC列2行目からで各シートによってデータ数はバラバラです。
抽出データのコピー先は事前にシートを作成しておきますのでシート名はAAでお願いします。

まとめ
複数シートのC列を検索値AAと比べて一致した行をシートAAにコピーする。

以上です。申し訳ありませんが宜しくお願い申し上げます。

【68409】Re:検索値を指定して一致した行をコピー
発言  kanabun  - 11/3/3(木) 11:45 -

引用なし
パスワード
   ▼ののか さん:こんにちは〜

>まとめ
>複数シートのC列を検索値AAと比べて一致した行をシートAAにコピーする。

AutoFilterとかAdvancedFilterを使ったらどうですか?

概略の手順
複数シートのC列に検索値AAでフィルタをかけて、可視行をを
シートAAの最終行のつぎに一括コピーする。

【68410】Re:検索値を指定して一致した行をコピー
発言  ののか  - 11/3/3(木) 12:48 -

引用なし
パスワード
   オートフィルターで作業しようとしましたが、
なにぶんデータが大量ですので時間がものすごくかかってします・・・。
本当は検索値と一致するシート名のシートに行で移動させたいのですが。

【68412】Re:検索値を指定して一致した行をコピー
質問  ののか  - 11/3/3(木) 13:42 -

引用なし
パスワード
   ▼kanabun さん:
>概略の手順
>複数シートのC列に検索値AAでフィルタをかけて、可視行をを
>シートAAの最終行のつぎに一括コピーする。

複数シートのC列に検索値AAでフィルタをかけるってどうすればいいですか?
複数のシートを選択してオートフィルターかけれませんが・・・。
AdvancedFilterってなんですか?
無知で申しわけありません。

【68414】Re:検索値を指定して一致した行をコピー
発言  neptune  - 11/3/3(木) 14:43 -

引用なし
パスワード
   ▼ののか さん:
kanabun さんではないですが、

>AdvancedFilterってなんですか?
フィルタオプションはVBAでいうとAdvancedFilterとなります。

フィルタオプションの作業をマクロの記録でコード化して参考にしては
如何?

【68415】Re:検索値を指定して一致した行をコピー
発言  kanabun  - 11/3/3(木) 14:51 -

引用なし
パスワード
   ▼ののか さん:

>複数シートのC列に検索値AAでフィルタをかけるってどうすればいいですか?
>複数のシートを選択してオートフィルターかけれませんが・・・。

言葉足らずでしたが、もちろん複数シートに<一括で>フィルタをかける
ということではありません。
対象シート(「2004」〜「2010」)をループして順にフィルタをかけ、
抽出行を「AA」シートに転記していく、という意味です。

'--------------------- 標準モジュール
Option Explicit
Sub AAの抽出転記_AutoFilter()
dim AAsheet as worksheet
dim ws as worksheet

set AAsheet = ActiveWorkbook.Worksheets("AA")'転記先シート
For Each ws in ActiveWorkbook.Worksheets
  if isnumeric(ws.Name) then
    with ws.cells(1).currentregion
     .Autofilter 3, "AA"
     if .Columns(1).SpecialCells(xlVisible).Count>1 then
       .Copy AAsheet.cells(rows.count,1).end(xlUp).offset(1)
     end if
     .Autofilter
    end with
  end if
next
End Sub


>AdvancedFilterってなんですか?
メニュー[データ]-[フィルタ]のサブメニューに
 ・ オートフィルタ
 ・ フィルタオプションの設定
ってありますよね?
後者が AdvancedFilter のことです。

AutoFilter は 対象シート上で条件に合わない行を隠す(非表示にする)
機能なので、別シートへ転記するには元表にフィルタをかけてから
全範囲をCOPYして転記先シートへ送らないといけないですが、

AdvancedFilter(フィルタオプションの設定)機能を使えば、
抽出と転記を同時にやってくれますので、画面がチラついたりする
ことなく処理が早く済みます。
ただ、抽出条件をセルのどこかに書いておかないといけないので、
とりあえずAutoFilterで処理してみて、AutoFilterでできないことはないが
より速く処理したい、という要求が高まってから挑戦してもいいかな?
と思ってました。

#neptune さん、フォローありがとうございます。

【68416】Re:検索値を指定して一致した行をコピー
発言  kanabun  - 11/3/3(木) 15:17 -

引用なし
パスワード
   ▼ののか さん:
>オートフィルターで作業しようとしましたが、
>なにぶんデータが大量ですので時間がものすごくかかってします・・・。
>本当は検索値と一致するシート名のシートに行で移動させたいのですが。

先ほど掲示板に投稿したコード、実際にExcel標準モジュールに書いて
実行してみました。

Option Explicit
Sub AAの抽出転記_AutoFilter()
 Dim AAsheet As Worksheet
 Dim ws As Worksheet
 Dim fCount As Long
 Dim CopyTo As Range

 With ActiveWorkbook.Worksheets
   On Error Resume Next
   Set AAsheet = .Item("AA") '転記先シート
   On Error GoTo 0
   If AAsheet Is Nothing Then
     If MsgBox("「AA」シートがありません。作成しますか?", _
       vbOKCancel) = vbOK Then
       Set AAsheet = .Add(After:=.Item(.Count))
       AAsheet.Name = "AA"
     Else
       Exit Sub
     End If
   Else
     AAsheet.UsedRange.ClearContents
   End If
 End With
      
 For Each ws In ActiveWorkbook.Worksheets
   If IsNumeric(ws.Name) Then
     ws.AutoFilterMode = False
     With ws.Cells(1).CurrentRegion
      .AutoFilter 3, "AA"
      If .Columns(1).SpecialCells(xlVisible).Count > 1 Then
        Set CopyTo = AAsheet.Cells(Rows.Count, 1).End(xlUp)
        fCount = fCount + 1
        If fCount = 1 Then
         .Copy CopyTo
        Else
         Intersect(.Cells, .Offset(1)).Copy CopyTo.Offset(1)
        End If
      End If
      .AutoFilter
     End With
   End If
 Next
 MsgBox "抽出転記しました", vbInformation

End Sub

こちらではシート枚数とデータが少ないせいか、
一瞬で終わりましたが。(^^

処理速度が気になるようでしたら AdvancedFilter に移行ですね。

【68417】Re:検索値を指定して一致した行をコピー
質問  ののか  - 11/3/3(木) 15:30 -

引用なし
パスワード
   ▼kanabun さん:
▼neptune さん:

ありがとうございました。
処理できましたが、コピーと質問に書きましたが移動に変更したいです。
元のシートに残らないようにVBAを変更してほしいのですが・・・
可能でしょうか?
わがまま言って申しわけありませんが宜しくお願いします。

Sub AAの抽出転記_AutoFilter()
dim AAsheet as worksheet
dim ws as worksheet

set AAsheet = ActiveWorkbook.Worksheets("AA")'転記先シート
For Each ws in ActiveWorkbook.Worksheets
  if isnumeric(ws.Name) then
    with ws.cells(1).currentregion
     .Autofilter 3, "AA"
     if .Columns(1).SpecialCells(xlVisible).Count>1 then
       .Copy AAsheet.cells(rows.count,1).end(xlUp).offset(1)
     end if
     .Autofilter
    end with
  end if
next
End Sub

【68418】Re:検索値を指定して一致した行をコピー
発言  kanabun  - 11/3/3(木) 16:38 -

引用なし
パスワード
   ▼ののか さん:
>移動に変更したいです。
>元のシートに残らないようにVBAを変更してほしいのですが・・・

フィルタで抽出した範囲を(Copyではなく)、Cut すればいいと思うが、
不連続行に対して Cut&Pasteはできないので、
作業列に「1」を全行書き込んでおいてから、
フィルタかけて抽出された行の作業列だけ「空白」に置き換えてから、
作業列でSortかけると、抽出行が元表の下方に集合するので、
作業列が空白の範囲(単一エリア)を Cutして「AA」シートに貼り付ける
ようにしました。

Sub AAデータの移動_AutoFilter()
 Dim AAsheet As Worksheet
 Dim ws As Worksheet
 Dim fCount As Long
 Dim cFrom As Range
 Dim CopyTo As Range
 Dim n As Long, m As Long
 
 With ActiveWorkbook.Worksheets
   On Error Resume Next
   Set AAsheet = .Item("AA") '転記先シート
   On Error GoTo 0
   If AAsheet Is Nothing Then
     If MsgBox("「AA」シートがありません。作成しますか?", _
       vbOKCancel) = vbOK Then
       Set AAsheet = .Add(After:=.Item(.Count))
       AAsheet.Name = "AA"
     Else
       Exit Sub
     End If
   Else
     AAsheet.UsedRange.ClearContents
   End If
 End With
      
 For Each ws In ActiveWorkbook.Worksheets
   If IsNumeric(ws.Name) Then
     ws.AutoFilterMode = False
     With ws.Cells(1).CurrentRegion
      m = .Columns.Count
      .Columns(m + 1).Value = 1  '作業列に1を書き込む
      .AutoFilter 3, "AA"
      n = .Columns(1).SpecialCells(xlVisible).Count
      If n > 1 Then
        fCount = fCount + 1
        Set CopyTo = AAsheet.Cells(Rows.Count, 1).End(xlUp)
        If fCount = 1 Then
          .Rows(1).Copy CopyTo   '項目行のコピー
        End If
        Set cFrom = Intersect(.Cells, .Offset(1))
        cFrom.Columns(m + 1).ClearContents '可視行だけClear
        .AutoFilter  'フィルタ解除して ↓作業列で並び替え
        cFrom.Resize(, m + 1).Sort Key1:=cFrom.Columns(m + 1), _
           Header:=xlNo
        '作業列が空白の行だけ移動
        cFrom.Resize(n - 1).Offset(.Rows.Count - n).Cut CopyTo(2)
      Else
        .AutoFilter
      End If
      .Columns(m + 1).Clear
     End With
   End If
 Next
 
 MsgBox "抽出転記しました", vbInformation

End Sub

最初のCopyの方法で、処理速度はどんな程度だったのですか?
次々要求を挙げるのでなく、コードを理解することが大切です。
分からないところがあったら、質問してください。

【68419】Re:検索値を指定して一致した行をコピー
お礼  ののか  - 11/3/3(木) 17:28 -

引用なし
パスワード
   ▼kanabun さん:

>最初のCopyの方法で、処理速度はどんな程度だったのですか?
>次々要求を挙げるのでなく、コードを理解することが大切です。
>分からないところがあったら、質問してください。

勉強になります。処理速度はほぼ一瞬で終わりました。
まだまだ使いこなせないです。見れば大体はわかりますが、
いざ自分で書くとなるとほんとに難しいです。
今は皆さんのアドバイス等を変更したりして使ってます。

本当に助かりました。ありがとうございました。
また、宜しくお願い致します。

2375 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free