Excel VBA質問箱 IV

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

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


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

【70257】複数ファイルから、特定のデータを抽出 VBA初心者 11/10/24(月) 10:50 質問[未読]
【70261】Re:複数ファイルから、特定のデータを抽出 UO3 11/10/24(月) 17:06 回答[未読]
【70263】Re:複数ファイルから、特定のデータを抽出 kanabun 11/10/24(月) 17:32 発言[未読]

【70257】複数ファイルから、特定のデータを抽出
質問  VBA初心者  - 11/10/24(月) 10:50 -

引用なし
パスワード
   こんにちは、VBA初心者です。
過去のファイルを管理しやすいように、VBAにて検索&表示画面を作ろうかと思ったんですが、うまくいきません。。
色々なサイトで紹介されているプログラミングを参考に、以下のコードを作成しました。

複数個ある、過去ファイルから条件に合う行をそれぞれ一行ずつコピーして一覧を作成したいのですが、フィルタまではうまく動くのですが、タイトル行を削除しようとするとエラーになります。
(下記プログラムで★の部分)
どうやら原因はtbl.Rows.Count の値が1になっているようなのですが、最後の「 Workbooks(b4Table.Name).Close SaveChanges:=False」をコメントアウトして、ファイルを表示してみるとタイトル行以外にも一行表示されています。。。

VBA上級者の皆様の力を貸して下さい。よろしくお願いします!
ちなみにExcel2007を使ってます。

Sub display()

Dim b4Table As Object
Dim fso As Object
Dim CasNo, Row As Integer
Dim CalNo As String

Set fso = CreateObject("Scripting.FileSystemObject")
Row = 7
Application.ScreenUpdating = False
  
   For Each b4Table In fso.GetFolder(ThisWorkbook.Path & "\before\").Files
  
    CalNo = "A" & Row
    
    Workbooks.Open Filename:=ThisWorkbook.Path & "\before\" & b4Table.Name
    
    If ActiveSheet.AutoFilterMode Then
      ActiveSheet.AutoFilterMode = False
    End If

    Workbooks(b4Table.Name).Worksheets(1).Range("1:500").AutoFilter _
    field:=5, Criteria1:=ThisWorkbook.Worksheets(1).Range("C2")
    Range(CalNo).CurrentRegion.Select
    Set tbl = Range(CalNo).CurrentRegion.SpecialCells(xlCellTypeVisible)
    MsgBox ("tbl.Rows.Count = " & tbl.Rows.Count)

      ★tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, tbl.Columns.Count).Select
      tbl.Copy ThisWorkbook.Worksheets(1).Range(CalNo)
      tbl.AutoFilter
   
     Workbooks(b4Table.Name).Close SaveChanges:=False
    
    Row = Row + 1
   Next

Application.ScreenUpdating = True

Set fso = Nothing

End Sub

【70261】Re:複数ファイルから、特定のデータを抽出
回答  UO3  - 11/10/24(月) 17:06 -

引用なし
パスワード
   ▼VBA初心者 さん:

こんにちは

Range(CalNo) の正体(?)が不明ですがリスト内のセル(おそらく左上隅?)でしょうね。
で、
Set tbl = Range(CalNo).CurrentRegion.SpecialCells(xlCellTypeVisible)
これは、表示された領域を取得するわけですが、その領域は、非表示領域が間にありますから
飛び飛びの領域ですね。(Areaが複数はいっています)
で、 tbl.Rows.Count とやると、その最初の領域(タイトル行を含む最初の連続した領域)の行数になります。
なので、仮に最初に表示された行が2行目でなければ最初の領域はタイトル行のみになりますので
行数は1ということになります。

もし、おやりになりたいことがタイトル行をのぞいた抽出データをコピペするということなら

With ActiveSheet
  Intersect(.AutoFilter.Range, .AutoFilter.Range.Offset(1)).Copy Sheets("目的のシート名").Range("目的のセル")
End With
こんなコードでいけると思いますが。

【70263】Re:複数ファイルから、特定のデータを抽出
発言  kanabun  - 11/10/24(月) 17:32 -

引用なし
パスワード
   ▼VBA初心者 さん:こんにちは〜

>フィルタまではうまく動くのですが、タイトル行を削除しようとするとエラーになります。
>(下記プログラムで★の部分)
>どうやら原因はtbl.Rows.Count の値が1になっているようなのですが、

この理由は UO3 さんのご説明のとおりです。

検証方法として、2行目が条件に一致するデータ行だとすると、
Rows.Countが 「2」を返し、
2行目も3行目も条件一致していれば、Rows.Countは「3」になるので、
フィルタかけたとき、Rows.Countの値は Visibleな1行目のタイトル行に
と連続するAreaの行数を返していることが分かります。

ただ、抽出するのは
> それぞれ一行ずつコピーして

ということなので、
この際 AutoFilterで抽出しなくても、5列目を【Match関数】で検索して、
マッチした行をコピーする方法に切り替えてもいいのでは?
抽出条件が ある文字列とかある日付のときならば。

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