패턴별·VBA 집계 매크로를 만들어 보았다.

19087 단어 VBAExcel데이터
안녕하세요, Motty입니다. 이번에는 매크로에 대한 기사가됩니다.

개요



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로 간편하게 볼 수 있다는 것도 매력적입니다. (요점은, 프로그램의 결과를 엑셀상에서 간단하게 볼 수 있군요!)

좋은 웹페이지 즐겨찾기