公式更改单元格时的函数放置,形状错误和执行代码值

时间:2015-10-28 07:36:18

标签: excel vba excel-vba

好的,所以我已经烧了一天的时间阅读这个并绕圈子走了。

状况

在名为" 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)一个更优雅的解决方案,可能需要勺子喂我。

1 个答案:

答案 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。