公式更改单元格值时的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是其他一些语言中的类模块中的默认引用。

感谢罗里,这将是最好的方法。