Excel 为什么我的函数在子程序没有失败的情况下失败?
我有一个子程序,它执行以下操作:Excel 为什么我的函数在子程序没有失败的情况下失败?,excel,vba,function,dictionary,multidimensional-array,Excel,Vba,Function,Dictionary,Multidimensional Array,我有一个子程序,它执行以下操作: 使用字典对象在数组中查找重复项 如果在阵列中发现重复项,请提供该重复项的运行计数 以下是my sub返回内容的示例: Sub完全按照预期工作,因此我将其转换为函数,以便在我正在处理的程序中使用它,但我无法使函数正确返回结果 下面是我的工作分包: Sub GetRuningCounts() Dim dict As Object Dim i As Long Dim Source_Array, OutPut_Array Application.Sc
字典
对象在数组中查找重复项Sub GetRuningCounts()
Dim dict As Object
Dim i As Long
Dim Source_Array, OutPut_Array
Application.ScreenUpdating = False
Set dict = CreateObject("Scripting.Dictionary")
Source_Array = Sheet1.Range("A2").CurrentRegion.Value2
ReDim OutPut_Array(LBound(Source_Array, 1) To UBound(Source_Array, 1), 1 To 1)
'On Error Resume Next
For i = LBound(Source_Array, 1) To UBound(Source_Array, 1)
dict(Source_Array(i, 21)) = dict(Source_Array(i, 21)) + 1
OutPut_Array(i, 1) = dict(Source_Array(i, 21))
Next i
Sheet2.Range("A1").Resize(UBound(OutPut_Array, 1)).Value = OutPut_Array
End Sub
我的UDF:
Function RunningCntOfOccsInArr(ByRef Source_Array As Variant, ByRef RowIndex As Long, ByVal ColIndex As Integer) As Long
Dim ditc As Object
Dim RowIndex As Long
Dim OutPut_Array As Variant
If IsArray(Source_Array) = False Then
Exit Function
ElseIf IsArrayAllocated(Source_Array) = False Then
Exit Function
ElseIf (ColIndex < LBound(Source_Array, 2)) Or (ColIndex > UBound(Source_Array, 2)) Then
Exit Function
End If
Set dict = CreateObject("Scripting.Dictionary")
ReDim OutPut_Array(LBound(Source_Array, 1) To UBound(Source_Array, 1), 1 To 1)
For RowIndex = LBound(Source_Array, 1) To UBound(Source_Array, 1)
dict(Source_Array(RowIndex, ColIndex)) = dict(Source_Array(RowIndex, ColIndex)) + 1
OutPut_Array(RowIndex, 1) = dict(Source_Array(RowIndex, ColIndex))
RunningCntOfOccsInArr = OutPut_Array(RowIndex,1)
Next RowIndex
End Function
Sub Test_GetRunningCountss()
Dim i As Long
Dim Data_Array
Application.ScreenUpdating = False
Data_Array = Sheet1.Range("A2").CurrentRegion.Value2
For i = LBound(Data_Array, 1) To UBound(Data_Array, 1)
If RunningCntOfOccsInArr(Data_Array, i, 21) Mod 2 = 0 Then
Sheet2.Cells(i, 2).Value2 = "Even"
Else
Sheet2.Cells(i, 2).Value2 = "Odd"
End If
Next i
End Sub
我做错了什么?在我看来好像
运行cntofoccsinarr=OutPut\u数组(RowIndex,1)
只是为下一个循环返回的最后一个值。我建议通过变量数据类型将函数重新定义为数组,并将下一个循环的更改为
Function RunningCntOfOccsInArr(ByRef Source_Array As Variant, ByRef RowIndex As Long, ByVal ColIndex As Integer) As Variant
'....Other Code Here....
For RowIndex = LBound(Source_Array, 1) To UBound(Source_Array, 1)
dict(Source_Array(RowIndex, ColIndex)) = dict(Source_Array(RowIndex, ColIndex)) + 1
OutPut_Array(RowIndex, 1) = dict(Source_Array(RowIndex, ColIndex))
Next RowIndex
RunningCntOfOccsInArr = OutPut_Array
在调用它的子函数中,需要定义一个数组来保存函数值(因此它不是每次都被调用),并定义一个嵌套循环来循环这些返回值
Sub Test_GetRunningCountss()
Dim i As Long
Dim i2 as Long
Dim Data_Array
Dim returnArray() As Variant
Application.ScreenUpdating = False
Data_Array = Sheet1.Range("A2").CurrentRegion.Value2
For i = LBound(Data_Array, 1) To UBound(Data_Array, 1)
returnArray = RunningCntOfOccsInArr(Data_Array, i, 21)
For i2 = LBound(returnArray) to UBound(returnArray)
If returnArray(i2, 1) Mod 2 = 0 Then
Sheet2.Cells(i2, 2).Value2 = "Even"
Else
Sheet2.Cells(i2, 2).Value2 = "Odd"
End If
Next i2
Next i
End Sub
在我看来,RunningCntOfOccsInArr=OutPut_数组(RowIndex,1)
只返回下一个循环的的最后一个值。我建议通过变量数据类型将函数重新定义为数组,并将下一个循环的更改为
Function RunningCntOfOccsInArr(ByRef Source_Array As Variant, ByRef RowIndex As Long, ByVal ColIndex As Integer) As Variant
'....Other Code Here....
For RowIndex = LBound(Source_Array, 1) To UBound(Source_Array, 1)
dict(Source_Array(RowIndex, ColIndex)) = dict(Source_Array(RowIndex, ColIndex)) + 1
OutPut_Array(RowIndex, 1) = dict(Source_Array(RowIndex, ColIndex))
Next RowIndex
RunningCntOfOccsInArr = OutPut_Array
在调用它的子函数中,需要定义一个数组来保存函数值(因此它不是每次都被调用),并定义一个嵌套循环来循环这些返回值
Sub Test_GetRunningCountss()
Dim i As Long
Dim i2 as Long
Dim Data_Array
Dim returnArray() As Variant
Application.ScreenUpdating = False
Data_Array = Sheet1.Range("A2").CurrentRegion.Value2
For i = LBound(Data_Array, 1) To UBound(Data_Array, 1)
returnArray = RunningCntOfOccsInArr(Data_Array, i, 21)
For i2 = LBound(returnArray) to UBound(returnArray)
If returnArray(i2, 1) Mod 2 = 0 Then
Sheet2.Cells(i2, 2).Value2 = "Even"
Else
Sheet2.Cells(i2, 2).Value2 = "Odd"
End If
Next i2
Next i
End Sub
如果您感兴趣,可以使用一个简单的countifs()公式来完成。从工作表中调用的函数只能影响调用它的单元格。一般来说,您可以(有一些例外,让我们不要离题)只使用函数将值返回给函数的调用方。同样值得注意的是:您不能(同样地,一般情况下,出于充分的理由)使用UDF来操纵环境。我不完全确定你在这里做什么,但是你在给循环中的函数赋值,这似乎有问题。Output\u Array
应该是函数的返回值吗?@ScottCraner哦,我知道。事实上,它将是countif(A$2:A2,A2)
。唉,这是从一个大的记录集读取结果,数组将用于一个非常小的复杂程序中。函数Dim ditc As Object>dict中有一个输入错误。这可以通过一个简单的countifs()公式来完成,如果您感兴趣。从工作表中调用的函数只能影响从中调用它的单元格。一般来说,您只能使用函数向函数的调用方返回值(有些例外,我们不要离题)。同样值得注意的是:您不能(同样地,一般情况下,出于充分的理由)使用UDF来操纵环境。我不完全确定你在这里做什么,但是你在给循环中的函数赋值,这似乎有问题。Output\u Array
应该是函数的返回值吗?@ScottCraner哦,我知道。事实上,它将是countif(A$2:A2,A2)
。唉,这是从一个大型记录集
数组中读取结果,这个数组将用于一个非常小的复杂程序中。当Object>Dict将i2
中的i
更改为Sheets2.Cells(i2,2).Value2
时,函数Dim ditc中出现了一个输入错误,就是这样!我太感谢你了,伙计!哦,那是我的错。谢谢你指出这一点,我编辑了答案以反映这一点。很高兴能帮忙!不用担心,我的朋友,我很高兴它能工作!前几天我写了关于这个问题的文章,但最后我自己回答了这个问题,并在那里发布了我的原始功能。我只是去编辑了它,以包含您的“Sub”实现,并赞扬了您如何使用我的函数。祝福男人!我将Sheets2.Cells(i2,2).Value2
中的i2
更改为I
,成功了!我太感谢你了,伙计!哦,那是我的错。谢谢你指出这一点,我编辑了答案以反映这一点。很高兴能帮忙!不用担心,我的朋友,我很高兴它能工作!前几天我写了关于这个问题的文章,但最后我自己回答了这个问题,并在那里发布了我的原始功能。我只是去编辑了它,以包含您的“Sub”实现,并赞扬了您如何使用我的函数。祝福男人!