Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.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
Excel 为什么我的函数在子程序没有失败的情况下失败?_Excel_Vba_Function_Dictionary_Multidimensional Array - Fatal编程技术网

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

我有一个子程序,它执行以下操作:

  • 使用
    字典
    对象在数组中查找重复项
  • 如果在阵列中发现重复项,请提供该重复项的运行计数 以下是my 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 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”实现,并赞扬了您如何使用我的函数。祝福男人!