Arrays 如何根据数组中的值命名新工作表,并从原始数据集中复制关联的值?
我在p、Q、R列中有数据。我想通过R进行筛选,并为R列中的每个唯一项创建一个新工作表。此新工作表还将带来p和Q中的相关值 到目前为止,我已经学会了如何过滤R中的数据,并将唯一值放入数组中。对于数组中的每个值,我创建了一个名为Array1(I)的新表,因为出于某种原因,我无法将该值转换为字符串。如何以优化的方式实现这一点,以便为R中的每个唯一值创建一个新表,并将P和Q中相同行中的值也带到一起?这是我的密码: 另外,如何动态声明数组而不是硬编码?如何为列R使用动态范围 注意,数组中的值类似于6X985Arrays 如何根据数组中的值命名新工作表,并从原始数据集中复制关联的值?,arrays,excel,vba,Arrays,Excel,Vba,我在p、Q、R列中有数据。我想通过R进行筛选,并为R列中的每个唯一项创建一个新工作表。此新工作表还将带来p和Q中的相关值 到目前为止,我已经学会了如何过滤R中的数据,并将唯一值放入数组中。对于数组中的每个值,我创建了一个名为Array1(I)的新表,因为出于某种原因,我无法将该值转换为字符串。如何以优化的方式实现这一点,以便为R中的每个唯一值创建一个新表,并将P和Q中相同行中的值也带到一起?这是我的密码: 另外,如何动态声明数组而不是硬编码?如何为列R使用动态范围 注意,数组中的值类似于6X98
Sub testarray()
Dim TestRg As Excel.Range
Dim Array1(50) As Variant
Dim SheetName As String
Dim i, j, k As Integer
i = 1
Set TestRg = Range("R1:R36879")
TestRg.AdvancedFilter Action:=xlFilterInPlace, Unique:=True
For Each c In TestRg.SpecialCells(xlCellTypeVisible)
Array1(i) = c.Value
'SheetName = CStr(c.Value)
Worksheets.Add.Name = i
i = i + 1
Next c
j = i - 1
i = 1
Worksheets("Sheet1").ShowAllData
For Each c In Range("S3:S" & j)
c.Value = Array1(i)
i = i + 1
Next c
k = 1
For Each d In Range("T3:T" & j)
d.Value = k
k = k + 1
Next d
End Sub代码本身有点高级,我添加了注释以帮助理解。我希望这有助于:
Sub tgr()
Dim wsData As Worksheet
Dim wsNew As Worksheet
Dim rngData As Range
Dim xlCalc As XlCalculation
Dim arrUnq() As Variant
Dim strSheetName As String
Dim UnqIndex As Long
Dim i As Long
Set wsData = Sheets("Sheet1")
Set rngData = wsData.Range("R1", wsData.Cells(Rows.Count, "R").End(xlUp))
'Disable application items to let code run faster
With Application
xlCalc = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
End With
'Re-enable all the application items just in case there's an error
On Error GoTo CleanExit
'Get the list of unique values from rngData, sorted alphabetically
'Put that list into the arrUnq array
With Sheets.Add
rngData.AdvancedFilter xlFilterCopy, , .Range("A1"), True
.UsedRange.Sort .UsedRange, xlAscending, Header:=xlYes
arrUnq = Application.Transpose(.Range("A2", .Cells(Rows.Count, "A").End(xlUp)).Value)
.Delete
End With
For UnqIndex = LBound(arrUnq) To UBound(arrUnq)
'Verify a valid worksheet name
strSheetName = arrUnq(UnqIndex)
For i = 1 To 7
strSheetName = Replace(strSheetName, Mid(":\/?*[]", i, 1), " ")
Next i
strSheetName = Trim(Left(WorksheetFunction.Trim(strSheetName), 31))
'Check if worksheet name already exists
If Not Evaluate("ISREF('" & strSheetName & "'!A1)") Then
'Sheet doesn't already exist, create sheet
Sheets.Add(After:=Sheets(Sheets.Count)).Name = strSheetName
End If
Set wsNew = Sheets(strSheetName)
wsNew.UsedRange.Clear
'Filter for the unique data
With rngData
.AutoFilter 1, arrUnq(UnqIndex)
'Copy the data from columns P:R to the new sheet
Intersect(wsData.Range("P:R"), .EntireRow).SpecialCells(xlCellTypeVisible).Copy wsNew.Range("A1")
End With
Next UnqIndex
rngData.AutoFilter 'Remove any remaining filters
CleanExit:
With Application
.Calculation = xlCalc
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
End With
If Err.Number <> 0 Then
MsgBox Err.Description, , "Error: " & Err.Number
Err.Clear
End If
End Sub
Sub-tgr()
将wsData设置为工作表
新建为工作表
暗rngData As范围
作为XLC计算的尺寸XLC
Dim arrUnq()作为变量
Dim strSheetName作为字符串
尺寸与长度相同
我想我会坚持多久
设置wsData=图纸(“图纸1”)
设置rngData=wsData.Range(“R1”,wsData.Cells(Rows.Count,“R”).End(xlUp))
'禁用应用程序项以使代码运行更快
应用
xlCalc=.Calculation
.Calculation=xlCalculationManual
.ScreenUpdate=False
.EnableEvents=False
.DisplayAlerts=False
以
'重新启用所有应用程序项,以防出现错误
返回CleanExit时出错
'从rngData获取按字母顺序排序的唯一值列表
'将该列表放入arrUnq数组
与床单。添加
rngData.AdvancedFilter xlFilterCopy、.Range(“A1”),真
.UsedRange.Sort.UsedRange,xl升序,标题:=xlYes
arrUnq=Application.Transpose(.Range(“A2”),.Cells(Rows.Count,“A”).End(xlUp)).Value)
.删除
以
对于UnqIndex=LBound(arrUnq)到UBound(arrUnq)
'验证有效的工作表名称
strSheetName=arrUnq(UnqIndex)
对于i=1到7
strSheetName=Replace(strSheetName,Mid(“:\/?*[]”,i,1),“”)
接下来我
strSheetName=Trim(左(工作表函数Trim(strSheetName),31))
'检查工作表名称是否已存在
如果不计算(“ISREF(“&strSheetName&“!A1)”),则
'工作表不存在,请创建工作表
Sheets.Add(之后:=Sheets(Sheets.Count)).Name=strSheetName
如果结束
设置wsNew=图纸(strSheetName)
wsNew.UsedRange.Clear
'筛选唯一数据
与恩格达塔
.自动过滤器1,arrUnq(UnqIndex)
'将数据从P:R列复制到新工作表
Intersect(wsData.Range(“P:R”),.EntireRow).SpecialCells(xlCellTypeVisible).复制wsNew.Range(“A1”)
以
下一个UnqIndex
rngData.AutoFilter'删除所有剩余的筛选器
清洁出口:
应用
.Calculation=xlCalc
.ScreenUpdate=True
.EnableEvents=True
.DisplayAlerts=True
以
如果错误号为0,则
MsgBox错误描述,“错误:&错误号”
呃,明白了
如果结束
端接头
谢谢!我详细地查看了代码。你能解释一下为什么要转换这个唯一的数组吗?它将二维数组转换成一维数组。