【问题标题】:VBA Access Runtime Error 440 Automation errorVBA 访问运行时错误 440 自动化错误
【发布时间】:2014-01-14 07:41:34
【问题描述】:

我不确定是什么导致了这个错误,希望得到一些帮助,了解我犯了什么错误导致了这个错误,以及如何纠正这个问题的帮助或建议 下面是我收到错误的一段代码。 调试标记在第 7 行“Feb = (Me.BillRate * DayNum) * Me.Util_”

    Set dayRs = db.OpenRecordset("SELECT WrkDays FROM WrkDays ORDER BY WrkMonth;")
    dayRs.MoveFirst
    Set DayNum = dayRs.Fields("WrkDays")
    While Not dayRs.EOF
        Jan = (Me.BillRate * DayNum) * Me.Util_
        dayRs.MoveNext
        Feb = (Me.BillRate * DayNum) * Me.Util_
        dayRs.MoveNext
        Mar = (Me.BillRate * DayNum) * Me.Util_
        dayRs.MoveNext
        Apr = (Me.BillRate * DayNum) * Me.Util_
        dayRs.MoveNext
        May = (Me.BillRate * DayNum) * Me.Util_
        dayRs.MoveNext
        Jun = (Me.BillRate * DayNum) * Me.Util_
        dayRs.MoveNext
        Jul = (Me.BillRate * DayNum) * Me.Util_
        dayRs.MoveNext
        Aug = (Me.BillRate * DayNum) * Me.Util_
        dayRs.MoveNext
        Sep = (Me.BillRate * DayNum) * Me.Util_
        dayRs.MoveNext
        Oct = (Me.BillRate * DayNum) * Me.Util_
        dayRs.MoveNext
        Nov = (Me.BillRate * DayNum) * Me.Util_
        dayRs.MoveNext
        Dec = (Me.BillRate * DayNum) * Me.Util_
    Wend

我猜测根据我如何构建此代码,我很可能会在“Feb”行之后的代码行中遇到类似的错误。所以我想更清楚地理解这个错误,以便我可以更正未来发生的错误。

更新 在与 Hans 合作后,他指出我使用了 recordset.getrows 方法,该方法完成了与我试图减少头痛的相同过程。非常感谢汉斯

【问题讨论】:

  • 我恳请您重命名Me.Util_。使用下划线肯定会产生问题,可能包括您正在处理的问题。
  • 我认为Set DayNum = dayRs.Fields("WrkDays") 行需要进入While 循环内。
  • 不幸的是 Me.Util_ 基于一个我无法控制重命名的字段。你能解释为什么 Set DayNum = dayRs.Fields("WrkDays") 线应该在循环内吗?
  • 因为dayRs.Fields("WrkDays") 大概会随着每条新记录而变化,所以你必须让它保持新鲜。

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


【解决方案1】:

不幸的是,该特定错误消息的细节相当薄。

我的第一个建议是禁用这条线...

'Set DayNum = dayRs.Fields("WrkDays")

那么在其余代码中无论您在何处使用DayNum,都直接引用该字段值。

'Jan = (Me.BillRate * DayNum) * Me.Util_  ' use the following instead
Jan = (Me.BillRate * dayRs!WrkDays.Value) * Me.Util_ ' .Value should not be needed here; use it anyway

但是,我不确定该建议是否能解决问题。如果不是, 在Feb = 行设置断点并调查记录集当前行的状态和所有实体的值...

While Not dayRs.EOF
    Jan = (Me.BillRate * dayRs!WrkDays.Value) * Me.Util_
    dayRs.MoveNext
    Feb = (Me.BillRate * dayRs!WrkDays.Value) * Me.Util_ ' <-- set break point on this line

在即时窗口中...

' are we perhaps at EOF already?
? dayRs.EOF
' confirm you still get the same error with this ...
? (Me.BillRate * dayRs!WrkDays.Value) * Me.Util_
' examine the components
? (Me.BillRate * dayRs!WrkDays.Value)
? Me.BillRate
? dayRs!WrkDays.Value
? Me.Util_

希望这种努力会揭示一些可以导致修复的东西。

【讨论】:

  • dayRs 是单字段记录集。这适用于记录集吗?
  • 我想不出它不能正常工作的任何原因,但你的代码让我感到困惑。我能建议的最好的就是尝试一下。
  • 是的,我能称之为最好的方法是尝试一种可能的解决方案。我正在尝试您现在发布的内容,看看我可以做什么
  • 好吧,我有一个想法,但我不确定如何去做。有没有办法用表中的值填充数组?因为这样会更容易解决我的问题。
  • 请先尝试我建议的更改。这应该是一个快速的测试。如果需要,也许我们可以稍后讨论其他方法。
【解决方案2】:

如果您只是在寻找每月的天数(或工作日),则使用 VBA 日期函数可能会做得更好。例如,信息here

您的要求可能更复杂——也许给定月份的天数由用户指定。在这种情况下,您需要修复循环结构。 While...Wend 将光标移过记录集,MoveNext 也是如此。

While Not dayRs.EOF
    ...
    dayRs.MoveNext
    ...
    dayRs.MoveNext
    ...
    dayRs.MoveNext
    ...
Wend

尝试注释掉 WhileWend 行。你的代码运行一样吗?

【讨论】:

  • 我不确定我理解你的意思。我的理解是 dayRs.MoveNext 命令告诉程序移动到 dayRs Recordset 中的下一条记录。这是我一开始就有很多问题的部分,所以我会对可能的替代解决方案非常感兴趣。我需要从该记录集所指向的表中提取一系列值(这基本上是各个月份的工作日)然后我需要执行您在 dayRs.MoveNext 之间的行上看到的分配数学以获得那些分配的。如果有更好的方法,我会全力以赴。
  • WrkDays 有 12 条记录吗?如果是这样,您似乎想确定每月计费。我认为确实有更简单的方法来处理这个问题。我想知道Util_中有什么数据?
  • 它是对收入预测的计算。账单费率是他们计费时间的价值。 “”是 VBA 用于实际列名中的“%”符号的占位符。 Util 是他们小时的百分比,可以被认为是“计费”小时。所以它的账单率 *(当月的工作日 *40)* 利用率百分比,它给出了预期收入的预测。
  • WrkDays 有 12 条记录吗?
【解决方案3】:

这仅适用于 12 条记录,或者更重要的是,可以使用更少或更多的记录。 一段时间后,您可能会发现您有更多记录。

   Set dayRs = db.OpenRecordset("SELECT  WrkMonth, SUM( WrkDays )FROM WrkDays GROUP BY  WrkMonth  ORDER BY WrkMonth;")
   dayRs.MoveFirst
   Do While not dayRs.EOF
    DayNum = dayRs.Fields("WrkDays")
    SELECT CASE WrkMonth;
     CASE 1
      Jan = (Me.BillRate * DayNum) * Me.Util_daysRs
     CASE 2
      Feb = (Me.BillRate * DayNum) * Me.Util_daysRs
     CASE 3
      Mar = (Me.BillRate * DayNum) * Me.Util_daysRs
     CASE 4
      Apr = (Me.BillRate * DayNum) * Me.Util_daysRs
     CASE 5
      May = (Me.BillRate * DayNum) * Me.Util_daysRs
     CASE 6
      Jun = (Me.BillRate * DayNum) * Me.Util_daysRs
     CASE 7
      Jul = (Me.BillRate * DayNum) * Me.Util_daysRs
     CASE 8
     Aug = (Me.BillRate * DayNum) * Me.Util_daysRs
     CASE 9
      Sep = (Me.BillRate * DayNum) * Me.Util_daysRs
     CASE 10
      Oct = (Me.BillRate * DayNum) * Me.Util_daysRs
     CASE 11
      Nov = (Me.BillRate * DayNum) * Me.Util_daysRs
     CASE 12
      Dec = (Me.BillRate * DayNum) * Me.Util_daysRs
    SELECT END
   daysRs.movenext
   Loop 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 2010-09-22
    相关资源
    最近更新 更多