将单元格作为VBA中UDF中的参数传递的正确方法是什么?

问题描述 投票:1回答:2

我正在尝试创建一个UDF,该UDF使用引用的单元格的值,针对某个范围测试该值,并根据其是否适合该范围,将导致显示“ X”或“ O”。这是我可以使用它的唯一方法:

代码:

Public Function ASE(cellRef As Variant)

    Dim setpointU As Integer, setpointL As Integer
    Dim enabled As String, disabled As String

    cellValue = Range(cellRef).Value
    setpointL = 50
    setpointU = 100
    enabled = "O"
    disabled = "X"

        If cellValue >= setpointL Or cellValue <= setpontU Then
            ASE = enabled
        Else
            ASE = disabled
        End If

End Function

公式栏中的功能: = AsE(“ D7”)//(由于某种原因,它会自动将小写s变为小写)结果: X其他可能有用的信息: D7的值是24,它来自单元格的函数= VALUE(Imported!B5)

详细地说,只有在满足两个条件时,才能使它在技术上起作用:1)当我在引用的单元格周围的函数中使用引号时,以及2)当参数cellRef为Variant时。如果我不使用引号[= ASE(D7)而不是= ASE(“ D7”)],则它不起作用。如果我将cellRef的数据类型更改为Range或String,它将无法正常工作。它只会返回#VALUE!错误。

我应该如何设置其格式,以便不必在引用的单元格周围使用引号?

excel vba parameter-passing user-defined-functions
2个回答
2
投票

传递单元格本身(不带引号):

Public Function ASE(cellRef As Range)

    Dim setpointU As Integer, setpointL As Integer
    Dim enabled As String, disabled As String

    cellValue = cellRef.Value
    setpointL = 50
    setpointU = 100
    enabled = "O"
    disabled = "X"

        If cellValue >= setpointL Or cellValue <= setpointU Then
            ASE = enabled
        Else
            ASE = disabled
        End If

End Function

2
投票

您遇到了两个麻烦制造者和几个问题。

一个是您的工作表中存储有大写字母的记忆。我经常遇到这个问题,我也不知道如何解决。即使我给该函数起了另一个名字,保存,关闭Excel,重新启动并重新命名,Excel也会记住大写错误。因此,我要做的是永久更改名称。

另一个是在cellRef As Variant中含糊不清。如您所知,变体可以是任何东西,并且Excel直到到达cellValue = Range(cellRef).Value时才下定决心。那时它需要是一个字符串,因此要用引号引起来。当然,D7是一个范围。但是,cellValue = Range(cellRef).Value没有任何意义。如果cellValue = cellRef.Value是范围,则应为cellRef。您将选择权留给了Excel,并承认,在这种情况下,它已尽力而为。

代码顶部缺少Option Explicit出现问题。它将提醒您cellValue的声明丢失以及Or cellValue <= setpontU Then的变量名称中的拼写错误。打开VB编辑器的工具菜单。从选项菜单中选择编辑器选项卡,然后选中“需要变量声明”。 VBA会在其后创建的所有代码表中自动插入Option Explicit。只有这样,您才能放心地忘记它。

最后,请记住,函数的返回也必须具有数据类型。由于您不声明任何内容,因此返回将是变体。显然,您的函数返回一个字符串。是的,Excel和VBA将对其进行整理。但是,在您的一点合作下,他们可以做得更好。至少您可以分享您所知道的。完成后,您的代码可能如下所示。

Function ASE(cellRef As Range) As String

    Dim cellValue As Variant
    Dim upperSetpoint As Integer, lowerSetpoint As Integer

    cellValue = cellRef.Value
    lowerSetpoint = 50
    upperSetpoint = 100

    If cellValue >= lowerSetpoint And cellValue <= upperSetpoint Then
        ASE = "O"                   ' enabled
    Else
        ASE = "X"                   ' disabled
    End If
End Function

请注意,您的情况中也发现了逻辑错误。任何值都必须是> = SetpointL或<= setpointU。因此,您的函数只能返回“ O”。如果同时使用逻辑And将这两个条件作为先决条件,则有所不同。

作为结束语,除非被声明为“私有”,否则所有过程均为“公共”。那么,将过程声明为“公共”又有什么意义呢?仅标记not“公共”的标记更为清晰。

© www.soinside.com 2019 - 2024. All rights reserved.