Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何根据数组中的值命名新工作表,并从原始数据集中复制关联的值?_Arrays_Excel_Vba - Fatal编程技术网

Arrays 如何根据数组中的值命名新工作表,并从原始数据集中复制关联的值?

Arrays 如何根据数组中的值命名新工作表,并从原始数据集中复制关联的值?,arrays,excel,vba,Arrays,Excel,Vba,我在p、Q、R列中有数据。我想通过R进行筛选,并为R列中的每个唯一项创建一个新工作表。此新工作表还将带来p和Q中的相关值 到目前为止,我已经学会了如何过滤R中的数据,并将唯一值放入数组中。对于数组中的每个值,我创建了一个名为Array1(I)的新表,因为出于某种原因,我无法将该值转换为字符串。如何以优化的方式实现这一点,以便为R中的每个唯一值创建一个新表,并将P和Q中相同行中的值也带到一起?这是我的密码: 另外,如何动态声明数组而不是硬编码?如何为列R使用动态范围 注意,数组中的值类似于6X98

我在p、Q、R列中有数据。我想通过R进行筛选,并为R列中的每个唯一项创建一个新工作表。此新工作表还将带来p和Q中的相关值

到目前为止,我已经学会了如何过滤R中的数据,并将唯一值放入数组中。对于数组中的每个值,我创建了一个名为Array1(I)的新表,因为出于某种原因,我无法将该值转换为字符串。如何以优化的方式实现这一点,以便为R中的每个唯一值创建一个新表,并将P和Q中相同行中的值也带到一起?这是我的密码:

另外,如何动态声明数组而不是硬编码?如何为列R使用动态范围

注意,数组中的值类似于6X985

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错误描述,“错误:&错误号”
呃,明白了
如果结束
端接头

谢谢!我详细地查看了代码。你能解释一下为什么要转换这个唯一的数组吗?它将二维数组转换成一维数组。