从单元格调用函数时返回错误的值

时间:2017-04-14 19:01:48

标签: excel vba excel-vba

首先发布yall。

长话短说,在Excel中,当我从一个单元调用以下函数(它在自己的模块中)时,它返回错误的值。从sub调用它时,以及当我单步调试代码(到最后)时,函数返回正确的值,但是当我从Excel调用它时,它返回一个不同的值。背景底部。

我尝试过的事情

  • 使其成为公共职能
  • 给它一个参数
  • 更改功能和/或模块名称
  • 将其移出模块
  • 重新启动Excel
  • 一堆随机的东西

正是这个特定功能正在给我这个问题,更简单的功能就是他们所说的。我必须假设它与Excel正在执行的事件的顺序有关,或者函数可以更改的Excel部分的限制。

Function ActiveDisciplineFilters()

    Application.Volatile 'makes the function update automatically
    Dim disccolumn As Range
    Dim uniquedisc() As String
    Dim uniquediscstring As String

    'create a string of unique values from the Discipline column
    i = 0
    If Range("LayerList[Discipline]").SpecialCells(xlCellTypeVisible).Address = Range("LayerList[Discipline]").Address Then
        ActiveDisciplineFilters = "None"
        Exit Function
    End If

    For Each cell In Range("LayerList[Discipline]").SpecialCells(xlCellTypeVisible)
        If InStr(1, uniquediscstring, cell.Value) = 0 Then
            If i <> 0 Then
                uniquediscstring = uniquediscstring & ", " & cell.Value
            Else
                uniquediscstring = cell.Value
                i = 1
            End If
        End If
    Next

    ActiveDisciplineFilters = uniquediscstring

End Function

背景

在Excel中,我有一张桌子。我将所有数据都放在该表的一个特定列中,并在该范围内创建一个唯一值的字符串(以逗号分隔)。该字符串必须放在另一个单元格中,原因我不需要进入。如果将过滤器应用于列,则唯一值会自动更新。

当我从一个sub调用它时,Excel会给我正确的答案,当我从一个单元格中调用它时,会给出错误的答案吗?

1 个答案:

答案 0 :(得分:1)

不幸的是,没有一个SpecialCells方法适用于UDF。如果您需要从工作表中将其作为公式运行,那么您的代码应该是这样的:

Function ActiveDisciplineFilters()

    Application.Volatile 'makes the function update automatically
    Dim disccolumn As Range
    Dim uniquedisc() As String
    Dim uniquediscstring As String
    Dim i As Long
    Dim cell As Range
    Dim bHidden As Boolean

    'create a string of unique values from the Discipline column
    i = 0

    For Each cell In Range("LayerList[Discipline]").Cells
        If cell.EntireRow.Hidden = False Then
            If InStr(1, uniquediscstring, cell.Value) = 0 Then
                If i <> 0 Then
                    uniquediscstring = uniquediscstring & ", " & cell.Value
                Else
                    uniquediscstring = cell.Value
                    i = 1
                End If
            End If
        Else
            bHidden = True
        End If
    Next

    If Not bHidden Then uniquediscstring = "None"
    ActiveDisciplineFilters = uniquediscstring

End Function