【问题标题】:Transform Sub to UDF getting (#VALUE!)将 Sub 转换为 UDF 得到 (#VALUE!)
【发布时间】:2017-06-27 06:02:18
【问题描述】:

我有一个运行良好的程序Sub。我想将其转换为自定义函数,但是当我在 Excel 中使用此函数时出现错误(#VALUE!

Function ТридцатьТРи(Diapozon As Integer)
    'для п/пр

    Dim k, n As Integer
    Dim parRange As Range

    Set parRange = Range("Diapozon")
    k = 0
    n = 0
    For Each Cell In parRange.Rows
        If Cell.Offset(0, 1).Value = 1 And k = -1 Then
            n = n - 1
        End If
        If Cell.Value = 1 And k = -1 Then
            n = n + 1
        End If

        If Cell.Value = 1 Then
            k = k + 1
            If k = 2 Then
                k = -1

            End If
        End If
        If Cell.Value = 2 Or Cell.Value = 3 Then
            k = 0
        End If
    Next Cell

    ТридцатьТРи = n

End Function

【问题讨论】:

  • 您正在将一个范围传递给一个需要整数的函数。您永远不会使用函数的输入。是否有一个命名范围“Diapozon”?

标签: vba excel user-defined-functions custom-function


【解决方案1】:

试试下面的 UDF 代码(不确定你想用 UDF 中的逻辑实现什么),但它可以工作(没有得到#VALUE!)。

由于您想将 Range 对象传递给 UDF(根据您的屏幕截图),您还需要在 Function 代码中定义它。

代码

Function cyrilic(Diapozon As Range) As Long

    Dim k As Long, n As Long
    Dim C As Range

    k = 0
    n = 0

    For Each C In Diapozon.Rows
        If C.Offset(0, 1).Value = 1 And k = -1 Then
            n = n - 1
        End If

        If C.Value = 1 And k = -1 Then
            n = n + 1
        End If

        If C.Value = 1 Then
            k = k + 1
            If k = 2 Then
                k = -1
            End If
        End If
        If C.Value = 2 Or C.Value = 3 Then
            k = 0
        End If
    Next C

    cyrilic = n

End Function

【讨论】:

    【解决方案2】:

    这显然是一个工作表函数,您需要输入您之前使用命名范围“diapozon”定义的范围作为输入范围。

    Function cyrillic(rng As Range)
    
        Dim k, n As Integer
        Dim parRange As Range
    
        Set parRange = rng
        k = 0
        n = 0
        For Each Cell In parRange.Rows
    
        If Cell.Offset(0, 1).Value = 1 And k = -1 Then
        n = n - 1
        End If
    
        If Cell.Value = 1 And k = -1 Then
        n = n + 1
        End If
    
        If Cell.Value = 1 Then
        k = k + 1
        If k = 2 Then
        k = -1
    
        End If
        End If
        If Cell.Value = 2 Or Cell.Value = 3 Then
        k = 0
        End If
    
    
        Next Cell
    
        cyrillic = n
    
    End Function
    

    只需输入:=cyrillic("R1:RX") 即可。

    【讨论】:

    • 我按照你说的改了代码,但是结果是一样的(#Value!)
    • 好的,那么问题可能不在于函数,而在于输入。您的文件看起来如何,是否有问题,或者您是否更改了某些“Diapozon”命名范围以影响代码?
    • 我用 PrintScreen 编辑我的问题,你能看一下吗?
    猜你喜欢
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多