I am trying to split data in sheet 1 to multiple sheets based on the name column in cell A3 onwards. The problem that I am facing is I'm unable to track down the data if there are gap in between. Example the name starts from A3 to A100 and in between cell A10, A20 & A30 is empty the program will only track down value from A3 to A9. The other problem for me is to specify the header. The header that I want to use start from cell A2, B2, C2 & D2 and this program show the header as A1, B1, C1 & D1 as there are value in that cell. This is my code.
Private Sub CommandButton1_Click()
Dim ws As Worksheet, Rng As Range, cc
Dim temp As Worksheet, CostC As Range, u
Set ws = Sheets("Sheet1") 'where your original data. adjust to suit
Set Rng = ws.Range("a1").CurrentRegion.Resize(, 15)
Set CostC = ws.Range("a3", ws.Range("a" & Rows.Count).End(xlUp))
u = UNIQUE(CostC)
Application.ScreenUpdating = 0
For Each cc In u
With Rng
.AutoFilter field:=1, Criteria1:="=" & cc
On Error Resume Next
Set temp = Sheets(cc)
On Error GoTo 0
If Not temp Is Nothing Then
DoThis:
.SpecialCells(xlCellTypeVisible).Copy temp.Range("A1")
Else
Set temp = Sheets.Add
temp.Name = cc
GoTo DoThis
End If
.AutoFilter
End With
Set temp = Nothing
Next
Application.ScreenUpdating = 1
End Sub
Function UNIQUE(r As Range)
Dim a, v
If IsArray(r.Value) Then
a = r.Value
With CreateObject("scripting.dictionary")
.comparemode = vbTextCompare
For Each v In a
If Not IsEmpty(v) Then
If Not .exists(v) Then .Add v, Nothing
End If
Next
If .Count > 0 Then UNIQUE = .keys
End With
Erase a
Else
UNIQUE = r.Value
End If
End Function
Here's a slightly less-optimized but simpler to follow version:
Private Sub CommandButton1_Click()
Dim ws As Worksheet, c As Range
Dim temp As Worksheet, CostC As Range, u
Set ws = Sheets("Sheet1")
Set CostC = ws.Range(ws.Range("A3"), ws.Range("A" & Rows.Count).End(xlUp))
For each c in CostC.Cells
u = trim(c.Value)
If len(u) > 0 then
Set temp = Nothing '<<EDIT
On Error Resume Next
Set temp = Sheets(u)
On Error GoTo 0
If temp is Nothing then
Set temp = Sheets.Add()
ws.Range("A2").Resize(1, 15).Copy temp.range("a1") 'copy headers
temp.Name = u
End If
c.resize(1, 15).copy temp.cells(rows.count,1).end(xlup).offset(1,0)
End if 'have name
Next c
End Sub
使用ColumnDifferences
方法返回一个范围,然后使用该范围的Areas(1)
属性将数据复制到新的工作表中,然后可以删除数据并重复或遍历这些区域并复制它们。
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.