公式更改单元格值时的function放置,形状错误和执行代码
好的,所以我已经烧了一整天,在这个圈子里读书。
情况
在单元格N279:O279中名为“分析”的工作表上,我已经命名了范围CL1_W_F
在单元格N280:O280中名为“分析”的工作表上,我已命名范围CL2_W_F
在单元格N281:O281中名为“分析”的工作表上,我已命名范围CL3_W_F
这些单元格中的数字是公式的结果
在单元格J30中名为“张贴”的工作表上,我有公式“Min(CL1_W_F)”
在名为“发布”的工作表上,我有1张图片和3个文本框。 我能够重新命名并使用graphics和形状(“单车载荷”),形状(“卡车和拖车载荷”)或形状(“卡车列车载荷”)的形状(“三重贴标签”
目的
我试图实现的是当J30的值小于1且大于或等于0.3时,将4个形状的可见性变为真。 当值超出testing值时,则应将可见性设置为False。
我曾经尝试过
我读了一系列不同的选项来监视单元格J30由于公式而发生的变化,但在这个过程中我迷失了方向,并且感到困惑。 然后,我读了一些关于将你想要发生的变化embedded到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)中,当我尝试在单元格J30中input“= Capacity_Factor_Fetch2”时,无法调用该函数。 然而,我可以使用“F8”来完成它,并且它做了我想要的。 然后,我将代码复制并粘贴到“Module1”中。 这使我从工作表中调用它,但我现在得到编译错误:子或function未定义。 当我点击“确定”清除错误窗口时,改变可见性状态的第一行突出显示“形状”一词。
所以我现在坚持要么无法调用的代码,或者能够调用不能编译的代码。
A)为什么我有错误和如何解决这些问题的帮助,B)更优雅的解决scheme,可能需要勺子喂养我。
UDF(用户定义的函数)应该只返回一个值。 它不应该做任何事情。 特别是它不能以Sub
方式改变单元格的值。 这个错误将会消失,如果你使用形状Sheets("POSTING").Shapes("Single Truck Load")
完全限定的引用Sheets("POSTING").Shapes("Single Truck Load")
但是会出现下一个错误,这是循环引用,因为你试图获得来自J30
的值,该公式所在的单元格将调用该函数。
您可以在“分析” Private Sub Worksheet_Change
中创build一个Private Sub Worksheet_Change
,如果命名范围CL1_W_F
内容发生了变化,将会作出反应。
像这样:
工作表类模块中的代码“分析”:
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
中的值直接改变,那么在我看来这将是最好的方法。
使用下面的代码你的方法也可以工作,但只能作为一个易失性函数。 这不是我的build议,但是如果指定范围CL1_W_F
中的值没有被直接改变,那将是必要的。
Module
的代码用作Formula =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的评论,你也可以在表单“Posting”中有一个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
在这里代表工作表“发布”。 Me
是其他一些语言中的类模块中的默认引用。
感谢罗里,这将是最好的方法。