【问题标题】:VBA code works in one box, throws an error in anotherVBA 代码在一个盒子里工作,在另一个盒子里抛出错误
【发布时间】:2021-06-04 17:38:05
【问题描述】:

好的,简短的背景,我有一个表单,上面有 3 个组合框。 其中两个组合框绑定到同一个确切的表,即帐户表。它们之间使用的查询略有不同,见下文。

在一个盒子 cmb_GA 中,我已将盒子属性“On Not in List”设置为以下代码段:

Private Sub cmb_GA_NotInList(NewData As String, Response As Integer)

Dim cnn As New ADODB.Connection
Dim strSQL As String
Dim password As String
Dim bytUpdate As Byte

On Error GoTo ErrHandler

Set cnn = CurrentProject.Connection


bytUpdate = MsgBox("Do you want to add " & NewData & " to the Accounts list?", vbYesNo, "Not in list of Accounts!")

If bytUpdate = vbYes Then
    password = InputBox("Enter New Account Password")
    strSQL = "INSERT INTO tbl_Accounts(Login, PW) " & "VALUES 
                      ('" & NewData & "@mcsnet.org' , '" & password & "')"
    Debug.Print strSQL
    cnn.Execute strSQL
    Response = acDataErrAdded
    Call AuditLogs("txt_DN", "New")

ElseIf bytUpdate = vbNo Then

    Response = acDataErrContinue
    Me!cmb_GA.Undo


End If


Exit Sub


ErrHandler:

    MsgBox Err.Number & ": " & Err.Description, vbOKOnly, "Error"

End Sub

请注意,对于此处的格式化,我在“VALUES”之后添加了一个额外的 CR,这在实际代码中不存在,除此之外,还有一些已删除的 cmets,所见即所得。

此代码完美运行。 100% 做我想做的事。

我还有另一个组合框 cmb_IA

我使用相同的代码(是的,回想起来我可能应该将其作为一个模块完成,但我还没有。)

问题在于它会引发错误。 “您输入的文本不是列表中的项目。从列表中选择一个项目,或输入与列出的项目之一匹配的文本。”

我查看了属性,在属性表上找不到两个框之间的区别:以下是两个框的数据选项卡:

以下是两个查询的相关 SQL:

SELECT *
FROM tbl_Accounts
WHERE tbl_Accounts.Association LIKE "*Device*";

SELECT *
FROM tbl_Accounts
WHERE tbl_Accounts.Association LIKE "*Intune*";

我认为这个问题很明显,但让我直截了当地说,这里发生了什么?有没有办法抑制这个错误?两个组合框都必须让用户向它们添加新信息,因为此表单的目的是注册新设备、手机和平板电脑,以及每个设备使用的安全帐户和公司帐户。最让我困惑的是,这个错误只出现在一个组合框上。

编辑添加来自引发错误的部分的代码:

Private Sub cmb_IA_NotInList(NewData As String, Response As Integer)

Dim cnn As New ADODB.Connection
Dim strSQL As String
Dim password As String
Dim bytUpdate As Byte

On Error GoTo ErrHandler

Set cnn = CurrentProject.Connection


bytUpdate = MsgBox("Do you want to add " & NewData & " to the Accounts list?", vbYesNo, "Not in list of Accounts!")

If bytUpdate = vbYes Then
    password = InputBox("Enter New Account Password")
    strSQL = "INSERT INTO tbl_Accounts(Login, PW) " & "VALUES ('" & NewData & "@mcsnet.org' , '" & password & "')"
    Debug.Print strSQL
    cnn.Execute strSQL
    Response = acDataErrAdded
    Call AuditLogs("txt_DN", "New")

ElseIf bytUpdate = vbNo Then

    Response = acDataErrContinue
    Me!cmb_IA.Undo


End If


Exit Sub


ErrHandler:

    MsgBox Err.Number & ": " & Err.Description, vbOKOnly, "Error"

End Sub

有人建议我显示由 Access 生成的 RowSource SQL,所以它在这里工作:

SELECT qry_DeviceAccounts.AccountIDKey, qry_DeviceAccounts.Login, qry_DeviceAccounts.PW
FROM qry_DeviceAccounts
ORDER BY qry_DeviceAccounts.[Login];

不工作:

SELECT qry_SecurityAccounts.AccountIDKey, qry_SecurityAccounts.Login, qry_SecurityAccounts.PW
FROM qry_SecurityAccounts
ORDER BY qry_SecurityAccounts.[Login];

【问题讨论】:

  • 应该已经发布了组合框不起作用的过程,而不是工作代码。
  • 从字面上看是相同的代码,但可以肯定的是,我会编辑并把它放在适当的位置,完成,就像我说的那样,现在我想更多地考虑它,可能实际上应该是一个单独的模块,因为它会可能至少再调用一次。
  • 为什么在查询语句中显示 *?这不在 RowSource 中。 RowSource 将查询显示为源,而不是表。显示实际的 RowSource SQL。
  • 可能想发布到允许附加文件并提供数据库进行分析的论坛。

标签: sql vba ms-access


【解决方案1】:

我不敢相信我之前没有看到它。这是两个查询之间差异的结果,以及它们过滤帐户信息的方式。我需要在 INSERT 语句期间设置要过滤的新帐户信息,但尚未完成。由于另一个处理的是表中某个字段的默认值,因此它与那个人的 INSERT 语句无关。

故事的道德,检查你的领域,并确保你仔细阅读每个人在做什么。我正忙着在我的 VBA 中寻找错误,我忘了检查我的 SQL。

【讨论】:

  • 很高兴你修好了。不要以为我会使用查询作为组合框的来源。我只会在 RowSource SQL 中引用表并使用过滤条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 2020-08-23
  • 2021-11-02
  • 1970-01-01
相关资源
最近更新 更多