访问VBA对象所需的错误

时间:2014-01-18 15:49:10

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

之前可能已经回答了这个问题,但在寻找时,我找不到适合我情况的答案。我正在编写一个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

-OH!忘了提到我想这样做,因为这些表实际上是链接到SQL服务器后端的表...我也一直在试图找出如何打开与SQL服务器的连接并通过操作表来操作表VBA代码,而不必在Access中链接它们......但这是另一个帖子

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

2 个答案:

答案 0 :(得分:1)

我认为问题就在于行

If Value.waveset > 0 Then

哪个应该是

waveset.Value > 0 Then

.Value是一个属性 - 它出现在对象之后,但它本身并不是一个对象。因此,要求.waveset的{​​{1}}属性会出错。

同样的事情在几行之后再次发生:

Value

@HansUp在评论中提出的建议很好。在模块顶部写下ElseIf Value.waveset = 0 Then ,然后点击Option Explicit。您的代码将生成错误。添加表格

的陈述
Debug->Compile

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

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

Dim waveset

略高于

Dim ii As Integer

For ii = 0 To 10000
  ...

但这不是你的问题所在。

答案 1 :(得分:1)

是的,...如果Value.waveset> 0 ...确实给出了一个错误对象

需要更改两行,但需要使用这种语法---

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