![Excel 수식 쿼리 - 특정 시트에 데이터를 자동 복사하는 방법](https://rvso.com/image/1518690/Excel%20%EC%88%98%EC%8B%9D%20%EC%BF%BC%EB%A6%AC%20-%20%ED%8A%B9%EC%A0%95%20%EC%8B%9C%ED%8A%B8%EC%97%90%20%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC%20%EC%9E%90%EB%8F%99%20%EB%B3%B5%EC%82%AC%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
답변1
다음 매크로는 기본 시트를 그룹으로 분할합니다. 열과 행의 수는 중요하지 않습니다. 매크로는 시트 이름과 코드 이름 간의 매핑에 의존하므로 마지막 열만 중요합니다. 주어진 코드 값을 가진 시트가 존재하지 않으면 기록은 기본 시트에 그대로 유지됩니다. 필수 항목이므로 코드 이름은 마지막 열에 있어야 합니다.
Option Explicit
'Assumptions:
'The Code is in the last column
Sub DataSplitter()
Application.ScreenUpdating = False
On Error Resume Next
Dim noOfRows As Long
Dim noOfColumns As Long
Dim noOfRowsInCodeSheet As Variant
Dim i As Long 'counter
Dim j As Long 'counter
Dim sE As Boolean 'sheet exists flag
Dim sheetEmpy As Boolean
Dim code As String
Dim c As New Collection 'store noOfRowsInCodeSheet
Dim cRows As New Collection 'rows to delete
j = 1
'check how many columns
Do While Len(Cells(1, j).Value) > 0
j = j + 1
Loop
noOfColumns = j - 1
'check how many rows
i = 1
Do While Len(Cells(i, 1).Value) > 0
i = i + 1
Loop
noOfRows = i - 1
'loop through the data
For i = 2 To noOfRows
code = Cells(i, noOfColumns).Value
'check if sheet exists
If Sheets(code) Is Nothing Then
sE = False ' sheet with code name does not exist
Else
sE = True ' sheet with code name exists
End If
'if sheet exists then check the noOfRows based on code
If sE = True Then
noOfRowsInCodeSheet = c.Item(code)
If noOfRowsInCodeSheet Is Empty Then
'the sheet was not visited during this execution
'check no of rows in code sheet
j = 1
Do While Len(Sheets(code).Cells(j, 1).Value) > 0
j = j + 1
Loop
noOfRowsInCodeSheet = j - 1
If noOfRowsInCodeSheet = 0 Then
'add headers
For j = 0 To noOfColumns
Sheets(code).Cells(1, j).Value = Cells(1, j).Value
Next j
noOfRowsInCodeSheet = noOfRowsInCodeSheet + 1
End If
If noOfRowsInCodeSheet >= 1 Then
noOfRowsInCodeSheet = noOfRowsInCodeSheet + 1
'populate rows
For j = 1 To noOfColumns
'Sheets(code).Cells(noOfRowsInCodeSheet, j).Value = Cells(i, j).Value 'it works but looses formatting
Cells(i, j).Copy
Sheets(code).Cells(noOfRowsInCodeSheet, j).PasteSpecial Paste:=xlPasteFormats
Sheets(code).Cells(noOfRowsInCodeSheet, j).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Next j
c.Remove code
c.Add Item:=noOfRowsInCodeSheet, Key:=code
cRows.Add Item:=i, Key:=CStr(i)
End If
End If
Else
'if sheet does not exist then do nothing (it's possible to _
'automatically add it if required)
End If
Next i
‘Uncomment to MOVE (cut-paste) rows (3 below lines)
‘Comment to COPY (copy-paste) rows (3 below lines)
For j = cRows.Count To 1 Step -1
Rows(cRows.Item(j)).EntireRow.Delete
Next j
Application.ScreenUpdating = True
End Sub