VBA를 사용하여 여러 파일 기반에 열로 분할 엑셀 시트
엑셀 시트에 빅 데이터가 있고 열의 일부 데이터를 기반으로 해당 시트를 여러 시트로 배포해야합니까? 이것은 매우 기본적인 작업이지만 시간이 많이 걸립니다.
예를 들어,이 데이터가 있습니다. 이 데이터에는 날짜, 작성자 및 제목이라는 열이 있습니다. 작가 열에는 각 제목의 작가 이름이 있습니다. 각 작가의 데이터를 별도의 시트로 가져오고 싶습니다.
이 작업을 수동으로 수행하려면 다음을 수행해야합니다.
-
하나의 이름을 필터링합니다. 필터링 된 데이터를 복사합니다. 시트를 추가합니다. 데이터를 붙여 넣습니다. 시트의 이름을 바꿉니다. 각각에 대해 위의 5 단계를 모두 반복합니다.
이 예에서는 이름이 세 개뿐입니다. 수백 개의 이름이 있다고 상상해보십시오.
데이터를 다른 시트로 어떻게 분할 하시겠습니까? 그것은 많은 시간이 걸리고 당신도 고갈시킬 것입니다.
시트를 여러 시트로 분할하는 위의 프로세스를 자동화하려면 다음 단계를 따르십시오.
Alt + F11을 누릅니다. 그러면 Excel 용 VB 편집기가 열립니다. 새 모듈 추가 * 모듈의 코드 아래 복사.
Sub SplitIntoSheets() With Application .ScreenUpdating = False .DisplayAlerts = False End With ThisWorkbook.Activate Sheet1.Activate 'clearing filter if any On Error Resume Next Sheet1.ShowAllData On Error GoTo 0 Dim lsrClm As Long Dim lstRow As Long 'counting last used row lstRow = Cells(Rows.Count, 1).End(xlUp).Row Dim uniques As Range Dim clm As String, clmNo As Long On Error GoTo handler clm = Application.InputBox("From which column you want create files" & vbCrLf & "E.g. A,B,C,AB,ZA etc.") clmNo = Range(clm & "1").Column Set uniques = Range(clm & "2:" & clm & lstRow) 'Calling Remove Duplicates to Get Unique Names Set uniques = RemoveDuplicates(uniques) Call CreateSheets(uniques, clmNo) With Application .ScreenUpdating = True .DisplayAlerts = True .AlertBeforeOverwriting = True .Calculation = xlCalculationAutomatic End With Sheet1.Activate MsgBox "Well Done!" Exit Sub Data.ShowAllData handler: With Application .ScreenUpdating = True .DisplayAlerts = True .AlertBeforeOverwriting = True .Calculation = xlCalculationAutomatic End With End Sub Function RemoveDuplicates(uniques As Range) As Range ThisWorkbook.Activate Sheets.Add On Error Resume Next ActiveSheet.Name = "uniques" Sheets("uniques").Activate On Error GoTo 0 uniques.Copy Cells(2, 1).Activate ActiveCell.PasteSpecial xlPasteValues Range("A1").Value = "uniques" Dim lstRow As Long lstRow = Cells(Rows.Count, 1).End(xlUp).Row Range("A2:A" & lstRow).Select ActiveSheet.Range(Selection.Address).RemoveDuplicates Columns:=1, Header:=xlNo lstRow = Cells(Rows.Count, 1).End(xlUp).Row Set RemoveDuplicates = Range("A2:A" & lstRow) End Function Sub CreateSheets(uniques As Range, clmNo As Long) Dim lstClm As Long Dim lstRow As Long For Each unique In uniques Sheet1.Activate lstRow = Cells(Rows.Count, 1).End(xlUp).Row lstClm = Cells(1, Columns.Count).End(xlToLeft).Column Dim dataSet As Range Set dataSet = Range(Cells(1, 1), Cells(lstRow, lstClm)) dataSet.AutoFilter field:=clmNo, Criteria1:=unique.Value lstRow = Cells(Rows.Count, 1).End(xlUp).Row lstClm = Cells(1, Columns.Count).End(xlToLeft).Column Debug.Print lstRow; lstClm Set dataSet = Range(Cells(1, 1), Cells(lstRow, lstClm)) dataSet.Copy Sheets.Add ActiveSheet.Name = unique.Value2 ActiveCell.PasteSpecial xlPasteAll Next unique End Sub
SplitIntoSheets () 프로 시저를 실행할 때 시트는 주어진 열을 기준으로 여러 시트로 분할됩니다. 시트에 버튼을 추가하고이 매크로를 할당 할 수 있습니다.
작동 원리
위의 코드에는 두 가지 절차와 하나의 기능이 있습니다. 두 프로시 저는 SplitIntoSheets (), CreateSheets (uniques As Range, clmNo As Long)이고 하나의 함수는 RemoveDuplicates (uniques As Range) As Range입니다. 첫 번째 절차는 SplitIntoSheets ()입니다. 이것이 주요 절차입니다. 이 절차는 주어진 열에서 고유 한 이름을 가져 오도록 변수와 RemoveDuplicates를 설정 한 다음 시트를 만들기 위해 해당 이름을 CreateSheets로 전달합니다.
RemoveDuplicates는 이름을 포함하는 범위 인 하나의 인수를 사용합니다.
중복 항목을 제거하고 고유 한 이름이 포함 된 범위 개체를 반환합니다.
이제 CreateSheets가 호출됩니다. 두 가지 인수가 필요합니다. 첫 번째는 고유 한 이름이고 두 번째는 열 번호입니다. 우리는 데이터를 더 적합하게 만들 것입니다. 이제 CreateSheets는 고유 항목에서 각 이름을 가져와 각 이름별로 주어진 열 번호를 필터링합니다. 필터링 된 데이터를 복사하고 시트를 추가 한 다음 여기에 데이터를 붙여 넣습니다. 그리고 데이터는 몇 초 만에 다른 시트로 분할됩니다.
여기에서 파일을 다운로드 할 수 있습니다.
시트로 분할
파일 사용 방법 :
-
Sheet1에 데이터를 복사합니다. A1에서 시작해야합니다.
버튼을 클릭하여 시트로 분할 * 분할하려는 열 문자를 입력하십시오. 확인을 클릭하십시오.
-
이와 같은 메시지가 표시됩니다. 시트가 분할되었습니다.
데이터를 별도의 시트로 분할하는 방법에 대한 기사가 도움이 되었기를 바랍니다. 이것 또는 Excel의 다른 기능에 대해 의문이 있으시면 아래 댓글 섹션에서 자유롭게 질문하십시오.