之前可能已经回答了这个问题,但在寻找时,我找不到适合我情况的答案。我正在编写一个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中链接它们......但这是另一个帖子
任何帮助将不胜感激。感谢
答案 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