- ベストアンサー
同一フォルダ内の特定の行を抽出し一覧にする方法
- マクロを利用して、同一フォルダ内の複数のエクセルファイルから特定の列に数値が入っている行を抽出し、一覧表にする方法について教えてください。
- 60個のCSVファイルをエクセルに変換したファイルに対して、特定の列に入力されている数値を抽出し、一覧表として表示したいです。
- 初心者ですが、エクセルファイルを開いて特定の列に数値が入っている行を抽出して一覧にするマクロの実装方法を教えてください。
- みんなの回答 (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 ' ' ===========================
その他の回答 (2)
- cj_mover
- ベストアンサー率76% (292/381)
' ' ==========標準モジュール==========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)
' ' ==========標準モジュール==========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 ' ' ===========================
補足
cj_moverさん早速の回答ありがとうございます。 今更の補足になりますが、複数人で使用することを考えています。 マクロを登録したファイルと統合するファイルを同一フォルダに保存しておき作業することを想定しています。 絶対参照ではなく、特に指定をしなくても同一フォルダ内を処理するようなことはできないのでしょうか。 最初に書いておけば良かったのですが、教えていただけると助かります。
お礼
素早い回答をありがとうございました。 補足のお願いにも臨機応変に対応していただき、大変助かりました。