Arrays 将动态错误数组打印到工作表

Arrays 将动态错误数组打印到工作表,arrays,excel,Arrays,Excel,我无法将错误数组打印到某个范围。我相当肯定我的大小调整不正确,但我不知道如何修复它。我创建了一个测试add,它只添加了a列和B列中的垃圾数据,但通常AddPartError会从不同的子/函数中调用,然后在主脚本进程结束时,数组应该转储到一个工作表中。以下是相关功能: Sub testadd() For Each i In ActiveSheet.Range("A1:A10") Call AddPartError(i.value, i.Offset(0, 1)) Next i tmp =

我无法将错误数组打印到某个范围。我相当肯定我的大小调整不正确,但我不知道如何修复它。我创建了一个测试add,它只添加了a列和B列中的垃圾数据,但通常AddPartError会从不同的子/函数中调用,然后在主脚本进程结束时,数组应该转储到一个工作表中。以下是相关功能:

Sub testadd()
For Each i In ActiveSheet.Range("A1:A10")
    Call AddPartError(i.value, i.Offset(0, 1))
Next i
tmp = PartErrors
PrintArray PartErrors, ActiveWorkbook.Worksheets("Sheet1").[D1]
Erase PartErrors
tmp1 = PartErrors
PartErrorsDefined = 0
End Sub

Sub PrintArray(Data As Variant, Cl As Range)
    Cl.Resize(UBound(Data, 1), 2) = Data
End Sub

Private Sub AddPartError(part As String, errType As String)
    If Not PartErrorsDefined = 1 Then
        ReDim PartErrors(1 To 1) As Variant
        PartErrorsDefined = 1
    End If
    PartErrors(UBound(PartErrors)) = Array(part, errType)
    ReDim Preserve PartErrors(1 To UBound(PartErrors) + 1) As Variant
End Sub

您的代码有点难以理解,但redim会清除数组中的数据,因此我认为您需要使用“Preserve”关键字

下面是一些示例代码,您可以通过这些代码了解它的工作原理,但您需要花一些时间研究如何将其融入到代码中

祝你好运

Sub asda()

'declare an array
Dim MyArray() As String

'First time we size the array I do not need the "Preserve keyword
'there is not data in the array to start with!!!
'Here we size it too 2 by 5
ReDim MyArray(1, 4)

'Fill Array with Stuff
For i = 0 To 4
MyArray(0, i) = "Item at 0," & i
MyArray(1, i) = "Item at 1," & i
Next



' "Print" data to worksheet
Dim Destination1 As Range
Set Destination1 = Range("a1")
Destination1.Resize(UBound(MyArray, 1) + 1, UBound(MyArray, 2) + 1).Value = MyArray


'Now lets resize that arrray
'YOU CAN ONLY RESIZE THE LAST SIZE OF THE ARRAY - in this case 4 to 6...
ReDim Preserve MyArray(1, 6)
For i = 5 To 6
MyArray(0, i) = "New Item at 0," & i
MyArray(1, i) = "New Item at 1," & i
Next


'and let put that next to our first list
' "Print" data to worksheet
Dim Destination2 As Range
Set Destination2 = Range("A4")
Destination2.Resize(UBound(MyArray, 1) + 1, UBound(MyArray, 2) + 1).Value = MyArray


End Sub

您的代码有点难以理解,但redim会清除数组中的数据,因此我认为您需要使用“Preserve”关键字

下面是一些示例代码,您可以通过这些代码了解它的工作原理,但您需要花一些时间研究如何将其融入到代码中

祝你好运

Sub asda()

'declare an array
Dim MyArray() As String

'First time we size the array I do not need the "Preserve keyword
'there is not data in the array to start with!!!
'Here we size it too 2 by 5
ReDim MyArray(1, 4)

'Fill Array with Stuff
For i = 0 To 4
MyArray(0, i) = "Item at 0," & i
MyArray(1, i) = "Item at 1," & i
Next



' "Print" data to worksheet
Dim Destination1 As Range
Set Destination1 = Range("a1")
Destination1.Resize(UBound(MyArray, 1) + 1, UBound(MyArray, 2) + 1).Value = MyArray


'Now lets resize that arrray
'YOU CAN ONLY RESIZE THE LAST SIZE OF THE ARRAY - in this case 4 to 6...
ReDim Preserve MyArray(1, 6)
For i = 5 To 6
MyArray(0, i) = "New Item at 0," & i
MyArray(1, i) = "New Item at 1," & i
Next


'and let put that next to our first list
' "Print" data to worksheet
Dim Destination2 As Range
Set Destination2 = Range("A4")
Destination2.Resize(UBound(MyArray, 1) + 1, UBound(MyArray, 2) + 1).Value = MyArray


End Sub

嗯。我做了一点检查,这不起作用的原因是因为您的
PartErrors的数组结构

PartErrors是一个一维数组,您将向其中添加数组,因此当您实际需要二维数组时,您将使用锯齿数组(或数组数组数组)而不是多维数组

所以要解决这个问题,我认为您需要考虑将数组更改为2d。像下面这样的

Private Sub AddPartError(part As String, errType As String)

    If Not PartErrorsDefined = 1 Then
        ReDim PartErrors(1 To 2, 1 To 1) As Variant
        PartErrorsDefined = 1
    End If

    PartErrors(1, UBound(PartErrors, 2)) = part 'Array(part, errType)
    PartErrors(2, UBound(PartErrors, 2)) = errType

    ReDim Preserve PartErrors(1 To 2, 1 To UBound(PartErrors, 2) + 1) As Variant
End Sub


注意。您还需要转换数组以适应指定的范围。

确定。我做了一点检查,这不起作用的原因是因为您的
PartErrors的数组结构

PartErrors是一个一维数组,您将向其中添加数组,因此当您实际需要二维数组时,您将使用锯齿数组(或数组数组数组)而不是多维数组

所以要解决这个问题,我认为您需要考虑将数组更改为2d。像下面这样的

Private Sub AddPartError(part As String, errType As String)

    If Not PartErrorsDefined = 1 Then
        ReDim PartErrors(1 To 2, 1 To 1) As Variant
        PartErrorsDefined = 1
    End If

    PartErrors(1, UBound(PartErrors, 2)) = part 'Array(part, errType)
    PartErrors(2, UBound(PartErrors, 2)) = errType

    ReDim Preserve PartErrors(1 To 2, 1 To UBound(PartErrors, 2) + 1) As Variant
End Sub


注意。您还需要变换数组以适应指定的范围。

会发生什么?你有错误吗?还是什么都没发生?你能提供更多的信息吗?这些值被分配给PartErrors,但没有打印到工作表中。没有错误。您是否可以尝试
Debug.Print Cl.Resize(UBound(数据,1),2)。在PrintArray子组件中找到
。。检查中间窗口,看看它是否符合您的期望。另外,您如何知道将值指定给parterror?在哪里声明PartErrors?抱歉,PartErrors和PartErrorsDefined都是在模块级别声明的:
Private PartErrors()作为变量Private PartErrorsDefined
Address被定义为$D$1:$E$11,这将是A列和B列中包含10项的预期范围。会发生什么?你有错误吗?还是什么都没发生?你能提供更多的信息吗?这些值被分配给PartErrors,但没有打印到工作表中。没有错误。您是否可以尝试
Debug.Print Cl.Resize(UBound(数据,1),2)。在PrintArray子组件中找到
。。检查中间窗口,看看它是否符合您的期望。另外,您如何知道将值指定给parterror?PartErrors在哪里声明?抱歉,PartErrors和PartErrorsDefined都是在模块级别声明的:
Private PartErrors()作为变量Private PartErrorsDefined
Address被定义为$D$1:$E$11,这将是A列和B列中包含10项的预期范围。只调用一次常规的ReDim来初始化数组,很像你的例子。对所有后续的重拨调用重拨保留。如果将我的代码粘贴到模块中(确保声明PartErrors和在模块级别定义的PartErrors),请在tmp=PartErrors处设置断点,并在包含a列和B列数据的工作表上运行它,您将能够在“局部变量”窗口中看到填充的数据确实存在-它不是空的。常规的ReDim只调用一次以初始化数组,就像您的示例中一样。对所有后续的重拨调用重拨保留。如果将我的代码粘贴到模块中(确保声明PartErrors和在模块级别定义的PartErrors),将断点设置为tmp=PartErrors,并在包含a列和B列数据的工作表上运行它,您将能够看到“局部变量”窗口中填充的数据确实存在-它不是空的。这就是我的问题所在。非常感谢你的帮助@没问题。如果您提供可以复制/粘贴并运行的代码,那么就更容易提供帮助。你的代码就是这样:)这就是我的问题所在。非常感谢你的帮助@没问题。如果您提供可以复制/粘贴并运行的代码,那么就更容易提供帮助。您的代码就是这样做的:)