패턴별·VBA 집계 매크로를 만들어 보았다.
개요
ExcelVBA를 이용한 데이터 추출 패턴에 대해 대략적으로 정리한다는 기사가 됩니다. 몇가지 패턴에 크게 나누어 정리해 두는 것으로, 향후 실시하는 개개의 태스크에 대한 공통화를 실시할 수 있어, 재현성이 높은 추상 부분을 만들 수 있다고 생각했습니다.
매크로를 만들 때 조심하는 것
・모듈 강도가 높다(취급하는 데이터에 대해서 고유의 처리가 정리되어 있다)
・모듈 결합도가 낮다(클래스나 메소드를 변경해도 다른 부분에 영향을 미치지 않는다)
・모듈 입도가 적절하다(클래스나 메소드의 책무가 균등하게 분할되어 있어, 각각의 기능 배분도 공평하게 배치되어 있다)
이러한 부분에 유의하면서 기술을 실시해 갑니다.
매크로에 필요한 기능
매크로에 요구되는 기능으로서는 데이터를 1개소에 모아 오는 것이 많습니다. 예를 들어 각 시트에 흩어져 있는 것이나 폴더내의 책에 흩어져 있는 것, 웹 페이지나 텍스트 파일이 소스가 됩니다. 게다가 인쇄나 레이아웃, 테이블의 결합, 메일 송신등이 요구된다, 라고 하는 이미지를 가지고 있습니다.
①Each Sheets To One Sheet
각 시트에 데이터가 흩어져 있으며, 그 중 하나의 시트에 기재하는 프로그램입니다.
다른 시트에 데이터가 저장됩니다.
추출 버튼을 누르면 다음과 같이 표시됩니다.
EachSheetToOneSheet
Sub EachSheetsToOneSheet()
Exportpage = 1
StartPage = 2
EndPage = ActiveWorkbook.Sheets.Count
' 抽出
For i = StartPage To EndPage
Call Extract(Sheets(Exportpage), Sheets(i))
Next
'後処理
Sheets(Exportpage).Activate
n = 3
Do While Range("A" & n) <> ""
If Not IsNumeric(Range("A" & n).Value) Then
Rows(n).Delete
End If
n = n + 1
Loop
End Sub
Function Extract(PastePage As Worksheet, CopyPage As Worksheet)
PastePage_EndRow = PastePage.Cells(Rows.Count, 2).End(xlUp).Row + 1
CopyPage.Range("A1").CurrentRegion.Copy Destination:=PastePage.Range("A" & PastePage_EndRow)
End Function
②Each Books To One Sheet
각 통합 문서의 데이터를 시트로 추출합니다. 데이터 목록은 폴더에 있습니다.
이력서에 데이터가 저장됩니다.
이것들을 추출해 갑니다. 폴더는 전체 경로로 지정하거나 파일 대화 상자 형식으로 사용자에게 위임합니다.
eachBookToOneSheet
Type PersonalData
Name As String
Direction As String
Birthday As String
PhoneNumber As String
End Type
Sub EachBooksToOneSheet()
Rem 貼り付け先
Dim PasteWorkBook As Workbook: Set PasteWorkBook = ThisWorkbook
Dim PasteWorkSheet As Worksheet: Set PasteWorkSheet = ThisWorkbook.Sheets(1)
Dim LastRow As Long: LastRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
Rem コピー元
Dim CopyWorkBook As Workbook
Dim CopyWorksheet As Worksheet
Dim CopyData As PersonalData:
Dim CopyFolderName As String
Dim CopyFileName As String
Dim folderPath As String
CopyFolderName = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1)
CopyFileName = Dir(CopyFolderName & "*.xls*")
Do While CopyFileName <> ""
Rem コピー元
Workbooks.Open CopyFolderName & CopyFileName
Set CopyWorkBook = ActiveWorkbook
Set CopyWorksheet = CopyWorkBook.Sheets(1)
Set CopyData = New PersonalData
CopyData.Name = CopyWorksheet.Range("C6")
CopyData.Direction = CopyWorksheet.Range("B15")
CopyData.Birthday = CopyWorksheet.Range("B9")
CopyData.PhoneNumber = CopyWorksheet.Range("H11")
Rem 貼り付け先
Dim LastRow As Long: LastRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
Cells(LastRow, 1) = CopyData.Name
Cells(LastRow, 2) = CopyData.Direction
Cells(LastRow, 3) = CopyData.Birthday
Cells(LastRow, 4) = CopyData.PhoneNumber
CopyWorkBook.Close
CopyFileName = Dir()
Loop
End Sub
③Extraction
하나의 시트 중에서 조건을 지정하고 채워진 항목만을 꺼내는 것입니다.
이하에서는 인구가 100만명 이하의 항목만을 추출해 왔습니다.
Extraction
Sub Extraction()
Rem コピー元
Dim CopyBook As Workbook: Set CopyBook = ThisWorkbook
Dim CopySheet As Worksheet: Set CopySheet = ThisWorkbook.Sheets(1)
Dim CopyRange As Range: Set CopyRange = CopySheet.Range("A1").CurrentRegion
Rem 貼り付け先
Dim PasteBook As Workbook: Set PasteBook = ThisWorkbook
Dim PasteSheet As Worksheet: Set PasteSheet = ThisWorkbook.Sheets(2)
Dim LastRow As Long
Dim FirstRow As Long: FirstRow = 2 'Because Header Exists
Dim Limit As Long: Limit = 1000000
Rem 抽出
CopyRange.Copy Destination:=PasteSheet.Range("A1")
PasteSheet.Activate
LastRow = PasteSheet.Cells(Rows.Count, 1).End(xlUp).Row
Stop
For CurrentRow = LastRow To FirstRow Step -1
If Range("G" & CurrentRow) >= Limit Then
Rows(CurrentRow).Delete
End If
Next
End Sub
고찰
범용적으로 사용되게 하는 프로그램을 쓰고 싶고, 돌아다니는 표현을 하고 있는 부분도 있을까 생각합니다. 값을 2차원 배열에 격납하고 나서 처리를 실시하면 빠르기 때문에, 이 근처도 과제로서 가고 싶습니다. 덧붙여서 배열을 실시하는 경우와 그렇지 않은 경우를 비교하면, 배열을 이용했을 경우에 실행 속도가 1/3이 되었다고 하는 기사가 있습니다. 그 밖에 고속화의 테크닉등 있으면 알고 싶습니다만・・・ 만약 있는 분, 코멘트란등에서 가르쳐 주셨으면 합니다.
끝에
VBA는 프로그램을 시작하는 입구에 좋은 교재라고 생각합니다. HTML이나 CSS도 훌륭한 프로그래밍 언어입니다만, 마크업 언어라고 하는 부류에 카테고리화 되어 있어 변수나 배열, 함수나 클래스등의 개념이 없기 때문에, 프로그래밍 감각을 잡는 소재로서는 조금 부족한 느낌이 들고 합니다. 한편으로 갑자기 C언어나 Java를 해내면, 출처에서 어려운 개념과 대치하게 됩니다. 또 셀 자체가 출력의 인터페이스가 되어 있어, 아티팩트의 결과를 Excel로 간편하게 볼 수 있다는 것도 매력적입니다. (요점은, 프로그램의 결과를 엑셀상에서 간단하게 볼 수 있군요!)
Reference
이 문제에 관하여(패턴별·VBA 집계 매크로를 만들어 보았다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Yt330110713/items/fbdcb3092c18c0a606d0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)