【VBA로 만들어 보았다】 복수 파일로부터 치아 빠져 데이터를 취득해, 다른 파일에 리스트를 출력한다.
5187 단어 VBA사용해 보았습니다.
환경 제약으로 Python 개발 환경을 구축 할 수 없었고, 오랫동안 VBA로 구축했습니다. 제대로 매치한 것이 그물에 구르지 않았기 때문에 기사로 했습니다.
개발 환경
데이터 취득원의 파일군
이러한 파일을 대상으로 데이터를 추출합니다. 이 【메시지】와 【오류/주의 구분】을 취득합니다.
【구현】getMsgList.xlsm
출력용 템플릿입니다 (2 시트 구성). VBA는 여기에 구현됩니다.
도구의 참조 설정은 다음과 같습니다.
Sub GetMsgList()
Application.ScreenUpdating = False
'リストの頭の行、
Dim countWorkSheets As Long
countWorkSheets = 2
'初期化
Dim IniRows As Long
IniRows = Sheets(1).Cells(Rows.count, 2).End(xlUp).Row
Sheets(1).Range(Cells(2, 1), Cells(10000, 4)).ClearContents
Worksheets(2).Activate
ActiveSheet.Range(ActiveSheet.Cells(2, 1), ActiveSheet.Cells(10000, 5)).ClearContents
Sheets(1).Activate
'ファイル操作のオブジェクトを定義する
Dim objFso As FileSystemObject
Set objFso = New FileSystemObject
'相対パスから絶対パスを取得
Dim sPath As String
sPath = objFso.GetAbsolutePathName(ThisWorkbook.path & "\msg\")
'パスが取れてるかどうかをイミディエイトで確認
Debug.Print (sPath)
'ファイル数をカウントする。
Dim FileInt As Long
FileInt = objFso.GetFolder(sPath).files.count
'ファイルがない場合はエラーにして終わる
If (FileInt < 0) Then
MsgBox "フォルダがありません。"
Set objFso = Nothing
Exit Sub
'ファイルが存在する場合は処理を続行する
End If
Dim targetFile As file
'存在するファイル分ループする
For Each targetFile In objFso.GetFolder(sPath).files
'ファイルが取れてるかどうかをイミディエイトで確認
Debug.Print (targetFile)
' '改めてこのワークシートをアクティベートしておく
' ThisWorkbook.Activate
'取得したファイルを開く 以下ブックのwith句
With Workbooks.Open(targetFile.path, UpdateLink:=False)
'取得したファイルを開く 以下シートのwith句
With .Sheets(1)
'最終行の取得
Dim LastRow As Long
LastRow = .Cells(Rows.count, 5).End(xlUp).Row
Debug.Print (LastRow)
'縦で検索して、値の先頭から最後まで繰り返す
Dim countRow As Long
For countRow = 8 To LastRow
'空でない場合
If Not IsEmpty(.Cells(countRow, 5).Value) Then
Cells(countWorkSheets, 1) = countWorkSheets - 1
Cells(countWorkSheets, 2) = .Cells(countRow, 5)
Cells(countWorkSheets, 3) = .Cells(countRow, 6)
Cells(countWorkSheets, 4) = Dir(targetFile)
countWorkSheets = countWorkSheets + 1
End If
Next countRow
End With
Application.DisplayAlerts = False
.Close
Application.DisplayAlerts = True
End With
Next targetFile
'一応このシートをアクティベートしておく
Sheets(1).Activate
Dim ThisLastRow As Long
'末行を取得し、rangeでコピーする。
ThisLastRow = Cells(Rows.count, 1).End(xlUp).Row
Debug.Print (ThisLastRow)
'rangeを流用し、コピー
ActiveSheet.Range(Cells(2, 2), Cells(ThisLastRow, 3)).Copy Destination:=Sheets(2).Range("B2")
'アクティベートを変更する。
Worksheets(2).Activate
'重複の削除
ActiveSheet.Range("B1").CurrentRegion.RemoveDuplicates Columns:=Array(2, 3), Header:=xlYes
'ソートを行う。
ActiveSheet.Sort.SortFields.Clear
ActiveSheet.Range("A1").CurrentRegion.Sort key1:=ActiveSheet.Range("B2"), key2:=ActiveSheet.Range("C2"), Order1:=xlAscending, Header:=xlYes
'末行を取得しNoを振る。
Dim ListMargeLastRow As Long
ListMargeLastRow = ActiveSheet.Cells(Rows.count, 2).End(xlUp).Row
Debug.Print (ListMargeLastRow)
Dim countMargeRow As Long
For countMargeRow = 2 To ListMargeLastRow
ActiveSheet.Cells(countMargeRow, 1) = countMargeRow - 1
Next countMargeRow
'罫線を引く。
Dim bs As Borders
Set bs = ActiveSheet.Range("A1").CurrentRegion.Borders ' 上下左右の罫線
bs.LineStyle = xlContinuous
Set objFso = Nothing
End Sub
데이터 출력 결과
버튼에 매크로를 등록하고 실행합니다. 그러자 보시다시피 출력할 수 있었습니다. 죄송합니다.
Reference
이 문제에 관하여(【VBA로 만들어 보았다】 복수 파일로부터 치아 빠져 데이터를 취득해, 다른 파일에 리스트를 출력한다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kankigyo2/items/c83885752b0b99d44c62텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)