excel - 为什么我的函数在子程序没有失败的地方失败?
问题描述
我有一个执行以下操作的子程序:
Dictionary
使用对象在数组中查找重复项- 如果在数组中找到重复项,则提供该重复项的运行计数。
以下是我的 sub 返回的示例:
Sub 完全按预期工作,所以我将它翻译成一个函数,以便在我正在处理的程序的一部分中使用它,但我无法让我的函数正确返回结果。
下面是我的子工作:
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 中的函数示例:
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
我究竟做错了什么?
解决方案
在我看来RunningCntOfOccsInArr = OutPut_Array(RowIndex,1)
只是返回For Next
循环的最后一个值。我建议通过 Variant 数据类型将函数重新定义为数组并将For Next
循环更改为
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 调用它时,您需要定义一个数组来保存您的函数值(因此不会每次都调用它)和一个嵌套循环来遍历这些返回值。
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
推荐阅读
- python - 具有列表值的字典键
- mongodb - 测试 Webflux REST API 的正确方法
- python - Python脚本,让它更短
- html - 删除我在网上找到的这个轮播下方的大空白?
- node.js - 如果使用 express 应用程序测试,Sinon 存根不起作用
- javascript - JSON.stringify() 和 JSON.parse() 是否更改数据类型?
- google-cloud-platform - gcloud 命令行中等效于 Cloud Run 的 Secret 是什么?
- javascript - 在 iframe 中嵌入 Metabase 问题会显示标题、图例和控件,但不会显示内容
- modelica - 如何让Modelica中的包角函数可以区分?
- mysql - 用 Like 搜索替换动态 AND 可以吗?