在名为" Analysis"的工作表上在单元格N279:O279中,我将范围命名为CL1_W_F
在名为" Analysis"的工作表上在单元格N280:O280中,我将范围命名为CL2_W_F
在名为" Analysis"的工作表上在单元格N281:O281中,我将范围命名为CL3_W_F
这些单元格中的数字是公式
的结果在名为"发布"的工作表上在单元格J30中,我有公式" Min(CL1_W_F)"
在名为"发布"的工作表上我有1张图片和3个文本框。我能够重命名它们并使用形状(" Triple Posting Sign")操作它们的图片和形状(" Single Truck Load"),形状(" Truck and Trailer)装载")或形状("卡车列车装载")
我想要实现的是当J30中的值小于1且大于或等于0.3时,将4个形状的可见性变为True。当值超出测试值时,可见性应设置为False。
我读了很多不同的选项来监控细胞J30因为它的公式而发生变化,但是我在这个过程中迷失了方向。然后我读了一些关于将你想要发生的变化嵌入到FUNCTION调用中的内容,这听起来很简单,所以我尝试了以下内容
Function Capacity_Factor_Fetch2() As Long
Dim Status As Boolean
Dim Da_Range As Range
Set Da_Range = Sheets("Analysis").Range("CL1_W_F")
Status = False
If Sheets("POSTING").Range("j30").Value < 1 And Sheets("POSTING").Range("j30").Value >= 0.3 Then
Status = True
End If
Shapes("Single Truck Load").Visible = Status
Shapes("Truck and Trailer Load").Visible = Status
Shapes("Truck Train Load").Visible = Status
Shapes("Triple Posting Sign").Visible = Status
Capacity_Factor_Fetch2 = WorksheetFunction.Min(Da_Range)
End Function
我遇到的问题是我最初将它放在sheet6(POSTING)中,当我尝试输入&#34; = Capacity_Factor_Fetch2&#34;时无法调用该函数。在单元格J30中。然而,我可以使用&#34; F8&#34;它做了我想要的。然后我将代码复制并粘贴到&#34; Module1&#34;中。这允许我从工作表中调用它,但我现在得到编译错误:Sub或Function未定义。当我单击确定以清除错误窗口时,单词&#34; Shapes&#34;在更改可见性状态的第一行上突出显示。
所以我现在无法调用有效的代码,或者无法调用无法编译的代码。
任何帮助A)为什么我有错误以及如何解决它们,B)一个更优雅的解决方案,可能需要勺子喂我。
答案 0 :(得分:1)
UDF(用户定义函数)应该只返回一个值。它不应该做任何其他事情。特别是它不能以Sub
的方式改变单元格值。如果您对形状Sheets("POSTING").Shapes("Single Truck Load")
使用完全限定的引用,则错误将消失,但随后将出现下一个错误,这是因为您尝试从J30
获取值时的循环引用。公式所在的单元格调用函数。
您可以在“分析”工作表中找到Private Sub Worksheet_Change
,如果指定范围CL1_W_F
中的某些内容发生了变化,它会作出反应。
像这样:
工作表类模块中的代码“Analysis”:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
On Error GoTo mEnd
If Not Intersect(Target, Me.Range("CL1_W_F")) Is Nothing Then
Status = False
If Sheets("POSTING").Range("J30").Value < 1 And Sheets("POSTING").Range("J30").Value >= 0.3 Then
Status = True
End If
Sheets("POSTING").Shapes("Single Truck Load").Visible = Status
End If
mEnd:
Application.EnableEvents = True
End Sub
此方法仅在命名范围CL1_W_F
中的值直接更改时才有效,因为如果值因其他单元格的更改而更改,则不涉及Private Sub Worksheet_Change
。如果直接更改了命名范围CL1_W_F
中的值,那么在我看来这将是最好的方法。
使用以下代码,您的方法也可以工作,但仅作为易失性函数。这不是我的建议,但如果指定范围CL1_W_F
中的值未直接更改,则必须这样做。
Module
中的代码,用作公式=Capacity_Factor_Fetch2()
Public Function Capacity_Factor_Fetch2() As Double
Application.Volatile
Dim Status As Boolean
Dim Da_Range As Range
Dim dMin As Double
Set Da_Range = Sheets("Analysis").Range("CL1_W_F")
dMin = WorksheetFunction.Min(Da_Range)
Status = False
If dMin < 1 And dMin >= 0.3 Then
Status = True
End If
Sheets("POSTING").Shapes("Single Truck Load").Visible = Status
'Sheets("POSTING").Shapes("Truck and Trailer Load").Visible = Status
'Sheets("POSTING").Shapes("Truck Train Load").Visible = Status
'Sheets("POSTING").Shapes("Triple Posting Sign").Visible = Status
Capacity_Factor_Fetch2 = dMin
End Function
截至Rory的评论,您可以在“发布”表格中找到Private Sub Worksheet_Calculate()
,如下所示:
工作表类模块中的代码“发布”:
Private Sub Worksheet_Calculate()
Status = False
If Me.Range("J30").Value < 1 And Me.Range("J30").Value >= 0.3 Then
Status = True
End If
Me.Shapes("Single Truck Load").Visible = Status
End Sub
Me
这里代表工作表“Posting”,因为此代码位于此工作表的类模块中。 Me
是类模块中的默认引用,例如其他语言中的this
。
这真的是最好的方法,感谢Rory。