【问题标题】:If [ComboBox] Is Null Statement in VBA/Access 2007如果 [ComboBox] 在 VBA/Access 2007 中为 Null 语句
【发布时间】:2011-04-16 12:23:42
【问题描述】:

我有一个包含一个 ComboBox (YearToBeBuilt) 和两个文本框字段 (CostYearofExpenditureCost) 的表单。所有控件都链接到一个主表,一旦在表单上进行选择/输入,该表就会更新。

我在 VB 中编写了一个名为ReCalcIt()的过程,它在调用时执行以下过程:

Private Sub ReCalcIt()
If Me.YearToBeBuilt = "" Then
    Me.YearofExpenditureCost = Me.Cost
Else
    Me.YearofExpenditureCost = Me.Cost * (1 + 0.031) ^ (Me.YearToBeBuilt - 2010)
End If
End Sub

当我写这篇文章时我认为这会做以下事情:

如果 ComboBox [YearToBeBuilt] 为空白(例如 - 未进行选择),则 文本框[YearOfExpenditureCost] 将返回文本框[Cost] 的值。否则,将执行YearofExpenditureCost 的计算。

但这并没有按应有的方式工作

我做错了什么?我是 VBA n00b 所以也许我的语法不正确?

【问题讨论】:

  • 您真的想在计算的最后部分使用指数吗?您意识到Me.Cost * (1 + 0.031) ^ (Me.YearToBeBuilt - 2010) 相当于 x^N,其中 N 是 YearToBeBuilt 和 2010 之间差异的结果,所以如果 N=3,它将是 Me.Cost * (1 + 0.031) 的三次方?跨度>

标签: ms-access forms ms-access-2007 vba


【解决方案1】:

试试看

If Len(Me.YearToBeBuilt & vbNullString) = 0

所以代码将如下所示:

Private Sub ReCalcIt()
If Len(Me.YearToBeBuilt & vbNullString) = 0 Then
    Me.YearofExpenditureCost = Me.Cost
Else
    Me.YearofExpenditureCost = Me.Cost * (1 + 0.031) ^ (Me.YearToBeBuilt - 2010)
End If
End Sub

【讨论】:

  • 你太棒了——这正是我想要的!非常感谢!所以因为我试图理解这一点......基本上组合框中的空白选择被解释为字符串值?因此,您必须告诉表单,如果字符串值 = 0,则执行此操作……等等。其他……等等?对吗?
  • 是的,你是对的。将它解释为一个字符串,查看它的长度并检查它是否为 0。我认为它也应该在没有 vbNullString 部分的情况下工作 - 你应该测试它,但这样更安全。
  • 有趣——谢谢!仅供参考-我的情况需要 & vbNullString ...我对其进行了测试,如果没有包含它,它就无法工作。
【解决方案2】:

通常的说法是:

If IsNull(MyControl) Then

另请参阅:Access VBA: If Form Value <> NULL then run query else, end if. - not doing anything

【讨论】:

  • Access 的最新版本默认允许在表设计器中使用 ZLS。我不知道这是否会导致 ZLS 的存储,除非您执行特定操作,但仅使用 Not IsNull() 对于不允许 ZLS 的字段只能 100% 可靠地工作。
  • 我已经使用 Access 2010 和一个基于表格的表格进行了测试,该表格是故意设置为允许 ZLS 的。即使绑定到此类控件的字段(列)被空格填充,该控件也会由 If IsNull(ctl) 返回。
  • 真的吗?好吧,这对我来说似乎是一个错误。如果您使用 Null 作为默认值(未知)并使用 ZLS 表示“已知为空白”怎么办?如果绑定到该字段的控件无论存储哪个值都返回 Null,则它完全否定允许存储 ZLS 的值。唔。再读一遍,你说如果它有空格,它也会返回为 Null 吗?这对我来说真的很令人担忧。
【解决方案3】:

在我看来,这可能取决于组合框的格式?如果是数字,那么

If Len(Me.YearToBeBuilt & vbNullString) = 0

不起作用。因为 Me.YearToBeBuilt 的值为 0,所以上面返回 1。

我想知道是否有更强大的方法?也许

Me.YearToBeBuilt.ListIndex = -1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 2012-06-16
    相关资源
    最近更新 更多