我正在尝试创建一个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!错误。
我应该如何设置其格式,以便不必在引用的单元格周围使用引号?
传递单元格本身(不带引号):
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
您遇到了两个麻烦制造者和几个问题。
一个是您的工作表中存储有大写字母的记忆。我经常遇到这个问题,我也不知道如何解决。即使我给该函数起了另一个名字,保存,关闭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“公共”的标记更为清晰。