【问题标题】:Access VBA Object Required Error访问 VBA 对象所需的错误
【发布时间】:2014-02-07 23:42:08
【问题描述】:

这可能以前已经回答过了,但是在寻找时,我找不到适合我情况的答案。我正在编写一个 Access 2003 表单按钮来运行 If/Then 并在单击时根据该语句执行一些命令。但是,每次单击时我都会收到“需要对象”错误。我对 VBA 代码还比较陌生,所以请温柔一点。

代码如下:

Private Sub Button_Click()
On Error GoTo Err_Button_Click

Dim Db As Object

Set Db = CurrentDb

Dim waveset As DAO.Recordset

Set waveset = Db.OpenRecordset("SELECT countervalue FROM dbo_tblSettings")

Dim orderfile As String

orderfile = "\\serverfolder\serverfile.csv"

If Value.waveset > 0 Then

MsgBox "Orders Already Imported; Please Proceed to Next Step", vbOKOnly, "Step Complete"

GoTo Exit_Button_Click
    ElseIf Value.waveset = 0 Then

    DoCmd.RunSQL "DELETE FROM dbo_tblOrders", True

    DoCmd.TransferText acImportDelim, , "dbo_tblOrders", orderfile, True

    DoCmd.RunSQL "UPDATE dbo_tblOrders INNER JOIN dbo_MainOrderTable ON dbo_tblOrders.[channel-order-id]=dbo_MainOrderTable.[order-id] " _
    & "SET dbo_MainOrderTable.[order-id] = dbo_tblOrders.[order-id], dbo_MainOrderTable.[channel-order-id] = dbo_tblOrders.[channel-order-id], " _
    & "dbo_MainOrderTable.[Order-Source] = 'Amazon'" _
    & "WHERE dbo_tblOrders.[sales-channel]='Amazon';", True

    DoCmd.RunSQL "UPDATE dbo_AmazonOrderTable INNER JOIN dbo_tblOrders ON dbo_AmazonOrderTable.[order-id]=dbo_tblOrders.[channel-order-id] " _
    & "SET dbo_AmazonOrderTable.[order-id] = dbo_tblOrders.[order-id], dbo_AmazonOrderTable.[channel-order-id] = dbo_tblOrders.[channel-order-id], " _
    & "dbo_AmazonOrderTable.[sales-channel] = 'Amazon' " _
    & "WHERE dbo_tblOrders.[sales-channel]='Amazon';", True

    DoCmd.RunSQL "UPDATE dbo_tblSettings SET countervaule=1", True
Else
GoTo Exit_Button_Click
End If

Exit_Button_Click:
Exit Sub

Err_Button_Click:
MsgBox Err.Description
Resume Exit_Button_Click

End Sub

-哦!忘了提我想这样做,因为这些表实际上是链接到 SQL 服务器后端的表......我也一直在试图弄清楚如何打开与我的 SQL 服务器的连接并通过以下方式操作表VBA 代码,而无需在 Access 中链接它们......但这完全是另一篇文章

任何帮助将不胜感激。谢谢

【问题讨论】:

  • Value.waveset 看起来很可疑。它应该是什么?确保在代码模块的声明部分中包含Option Explicit,然后从VB 编辑器的主菜单运行调试->编译。当你这样做时,你的代码编译是否没有错误?
  • 我首先要确保On Error GoTo Err_Button_Click 有一个相应的标签/代码。我只看到Exit_Button_ClickErr_DotComBBWTableRefresh_Click:...
  • 对不起,我试图去掉所有对实际业务的引用...Err_DotComBBWTableRefresh_Click 应该是 Err_Button_Click...:/

标签: sql vba ms-access ms-access-2003


【解决方案1】:

我认为问题出在线路

If Value.waveset > 0 Then

应该是这样的

waveset.Value > 0 Then

.Value 是一个属性——它出现在对象之后,但它本身并不是一个对象。因此,请求Value.waveset 属性会出错。

几行之后同样的事情又发生了:

ElseIf Value.waveset = 0 Then

@HansUp 在他的评论中给出的建议是一个很好的建议。在模块顶部写Option Explicit,然后点击Debug->Compile。您的代码会产生错误。添加表单的语句

Dim waveset

到函数的顶部。仅声明您打算使用的变量。任何剩余的错误现在都是由于拼写错误或其他语法/逻辑错误,并且会更容易被发现。

如果您确定知道特定变量的类型,那么声明为该类型会稍微高效一些;所以

Dim ii As Integer

For ii = 0 To 10000
  ...

效率略高于

Dim ii
For ii = 0 To 10000

但这不是你的问题。

【讨论】:

  • 所有很棒的信息!即使它与我的问题无关:D 我喜欢学习新的代码/语言,谢谢!
  • @user3208525 您是否尝试过这些调试步骤?他们有帮助吗?您是否更接近于找出导致问题的对象?您可以一次单步执行代码(在函数开头附近设置断点,然后单步执行)。或者关闭错误处理并在发生错误时点击“调试”。然后,您可以查看发生错误的行中的变量。
  • 是的,对于像我这样的新手来说是完美的建议:) 这是对象属性的排序......我猜你会这么说。 donPablo 的回答实际上解决了我的问题。感谢大家的大力帮助!喜欢这个网站。
  • @user3208525 因为 donPablo 的回答解决了您的问题,您应该将他的回答标记为“已接受”(带有小复选标记)。
【解决方案2】:

是的,...如果 Value.waveset > 0 ... 确实会给出错误 Object Required

两行都需要改,但需要是这个语法---

If  waveset.Fields("countervalue").Value > 0
...
ElseIf waveset.Fields("countervalue").Value = 0 Then

【讨论】:

  • +1 用于仔细阅读代码以找出解决方案的正确语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多