• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:同一フォルダ内の複数ブックの特定の行を抽出し一覧)

同一フォルダ内の特定の行を抽出し一覧にする方法

このQ&Aのポイント
  • マクロを利用して、同一フォルダ内の複数のエクセルファイルから特定の列に数値が入っている行を抽出し、一覧表にする方法について教えてください。
  • 60個のCSVファイルをエクセルに変換したファイルに対して、特定の列に入力されている数値を抽出し、一覧表として表示したいです。
  • 初心者ですが、エクセルファイルを開いて特定の列に数値が入っている行を抽出して一覧にするマクロの実装方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

' ' ==========標準モジュール==========Re8303136 ' ' 追加オーダー + 修正 Sub データ統合()   Const sExtention As String = ".xlsx"  ' ◆拡張子◆要指定!!(".xls" ? ".csv" ? ".xlsm" ? or ?)   Dim wshtNew As Worksheet   Dim sFullPath As String   Dim sEscName As String   Dim sF As String   Dim flg1st As Boolean   sFullPath = ThisWorkbook.Path & "\"   sEscName = ThisWorkbook.Name   sF = Dir(sFullPath & "*" & sExtention)   If sF = "" Then     MsgBox sFullPath & " に " & sExtention & "ファイル は見つかりません"     Exit Sub   End If   Application.ScreenUpdating = False   Set wshtNew = Worksheets.Add   flg1st = True   Do While sF <> ""     If sF <> sEscName Then       Debug.Print sF       With Workbooks.Open(sFullPath & sF)         .Worksheets(1).Cells(2, 2).CurrentRegion.Copy _               Destination:=wshtNew.Cells(Rows.Count, 1).End(xlUp).Offset(1)         .Close False       End With       flg1st = False     End If     sF = Dir()   Loop   With wshtNew     If flg1st Then       Application.DisplayAlerts = False       .Delete       Application.DisplayAlerts = True       Application.ScreenUpdating = True       MsgBox sFullPath & " に " & sExtention & "ファイル は見つかりません"     Else       .Name = Format(Now, "yymmddhhmm")       With .UsedRange.Rows(0)         .Formula = "=""項目 ""&COLUMN()"         .Value = .Value       End With       Application.ScreenUpdating = True       If MsgBox("出来。続けてフィルタ?", vbYesNo) = vbYes Then Call フィルタ     End If   End With End Sub Sub フィルタ()   Dim rtn   With ActiveSheet     If .AutoFilterMode Then .AutoFilterMode = False     Do     rtn = VBA.Array(Application.InputBox(Prompt:="抽出対象列を選択して", Title:="フィルタ", Default:="D:D", Type:=8))       If TypeName(rtn(0)) <> "Range" Then         MsgBox "キャンセル"         Exit Sub       ElseIf rtn(0).Areas.Count > 1 Or rtn(0).Columns.Count > 1 Then         MsgBox "ひとつの列を選んで"       ElseIf Application.Intersect(rtn(0), .UsedRange) Is Nothing Then         MsgBox "表の中の列を選んで"       Else         Exit Do       End If     Loop     Set rtn = rtn(0).EntireColumn     rtn.AutoFilter Field:=1, Criteria1:="<>"   End With   MsgBox Split(rtn.Address(0, 0), ":")(0) & "列、空白でない行を抽出。"   Set rtn = Nothing:  rtn = Empty End Sub ' ' ===========================

snow66
質問者

お礼

素早い回答をありがとうございました。 補足のお願いにも臨機応変に対応していただき、大変助かりました。

その他の回答 (2)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

' ' ==========標準モジュール==========Re8303136D Sub データ統合()   Const sExtention As String = ".xlsx"  ' ◆拡張子◆要指定!!(".xls" ? ".csv" ? ".xlsm" ? or ?)   Dim wshtNew As Worksheet   Dim sFullPath As String   Dim sEscName As String   Dim sF As String   Dim flg1st As Boolean   sFullPath = ThisWorkbook.Path & "\"   sEscName = ThisWorkbook.Name   sF = Dir(sFullPath & "*" & sExtention)   If sF = "" Then     MsgBox sFullPath & " に " & sExtention & "ファイル は見つかりません"     Exit Sub   End If   Application.ScreenUpdating = False   Set wshtNew = Worksheets.Add   flg1st = True   Do While sF <> ""     If sF <> sEscName Then       Debug.Print sF       With Workbooks.Open(sFullPath & sF)         .Worksheets(1).Cells(2, 2).CurrentRegion.Offset(1 + flg1st).Copy _               Destination:=wshtNew.Cells(Rows.Count, 1).End(xlUp).Offset(1)         .Close False       End With       flg1st = False     End If     sF = Dir()   Loop   If flg1st Then     wshtNew.Delete     Application.ScreenUpdating = True     MsgBox sFullPath & " に " & sExtention & "ファイル は見つかりません"   Else     wshtNew.Rows(1).Delete     wshtNew.Name = Format(Now, "yymmddhhmm")     Application.ScreenUpdating = True     If MsgBox("出来。続けてフィルタ?", vbYesNo) = vbYes Then Call フィルタ   End If End Sub Sub フィルタ()   Dim rtn   With ActiveSheet     If .AutoFilterMode Then .AutoFilterMode = False     Do     rtn = VBA.Array(Application.InputBox(Prompt:="抽出対象列を選択して", Title:="フィルタ", Default:="D:D", Type:=8))       If TypeName(rtn(0)) <> "Range" Then         MsgBox "キャンセル"         Exit Sub       ElseIf rtn(0).Areas.Count > 1 Or rtn(0).Columns.Count > 1 Then         MsgBox "ひとつの列を選んで"       ElseIf Application.Intersect(rtn(0), .UsedRange) Is Nothing Then         MsgBox "表の中の列を選んで"       Else         Exit Do       End If     Loop     Set rtn = rtn(0).EntireColumn     rtn.AutoFilter Field:=1, Criteria1:="<>"   End With   MsgBox Split(rtn.Address(0, 0), ":")(0) & "列、空白でない行を抽出。"   Set rtn = Nothing:  rtn = Empty End Sub ' ' ===========================

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

' ' ==========標準モジュール==========Re8303136D Sub データ統合()  '  実行するメインプロシージャ   Const sFullPath As String = "C:\Users\ユーザー名\Documents\hooge"  ' ◆フォルダ◆要指定!!   Const sExtention As String = ".xlsx"  ' ◆拡張子◆要指定!!   Dim wshtNew As Worksheet   Dim sEscName As String   Dim sF As String   Dim flg1st As Boolean   sEscName = ThisWorkbook.Name   sF = Dir(sFullPath & "\*" & sExtention)   If sF = "" Then     MsgBox sFullPath & " に " & sExtention & "ファイル は見つかりません"     Exit Sub   End If   Application.ScreenUpdating = False   Set wshtNew = Worksheets.Add   flg1st = True   Do While sF <> ""     If sF <> sEscName Then       Debug.Print sF       With Workbooks.Open(sFullPath & "\" & sF)         .Worksheets(1).Cells(2, 2).CurrentRegion.Offset(1 + flg1st).Copy _               Destination:=wshtNew.Cells(Rows.Count, 1).End(xlUp).Offset(1)         .Close False       End With       flg1st = False     End If     sF = Dir()   Loop   If flg1st Then     wshtNew.Delete     Application.ScreenUpdating = True     MsgBox sFullPath & " に " & sExtention & "ファイル は見つかりません"   Else     wshtNew.Rows(1).Delete     wshtNew.Name = Format(Now, "yymmddhhmm")     Application.ScreenUpdating = True     If MsgBox("出来。続けてフィルタ?", vbYesNo) = vbYes Then Call フィルタ   End If End Sub Sub フィルタ()  '  オプション   Dim rtn   With ActiveSheet     If .AutoFilterMode Then .AutoFilterMode = False     Do     rtn = VBA.Array(Application.InputBox(Prompt:="抽出対象列を選択して", Title:="フィルタ", Default:="D:D", Type:=8))       If TypeName(rtn(0)) <> "Range" Then         MsgBox "キャンセル"         Exit Sub       ElseIf rtn(0).Areas.Count > 1 Or rtn(0).Columns.Count > 1 Then         MsgBox "ひとつの列を選んで"       ElseIf Application.Intersect(rtn(0), .UsedRange) Is Nothing Then         MsgBox "表の中の列を選んで"       Else         Exit Do       End If     Loop     Set rtn = rtn(0).EntireColumn     rtn.AutoFilter Field:=1, Criteria1:="<>"   End With   MsgBox Split(rtn.Address(0, 0), ":")(0) & "列、空白でない行を抽出。"   Set rtn = Nothing:  rtn = Empty End Sub ' ' ===========================

snow66
質問者

補足

cj_moverさん早速の回答ありがとうございます。 今更の補足になりますが、複数人で使用することを考えています。 マクロを登録したファイルと統合するファイルを同一フォルダに保存しておき作業することを想定しています。 絶対参照ではなく、特に指定をしなくても同一フォルダ内を処理するようなことはできないのでしょうか。 最初に書いておけば良かったのですが、教えていただけると助かります。