首页 > 解决方案 > 引用 Excel 电子表格会导致 VBA 宏代码出现问题

问题描述

我的电子表格中有 2 个标签。

选项卡 1 - 此选项卡包含一个 Worksheet_Change 宏,它从目标单元格中​​获取值,稍后在我的针对表的选择查询中使用。

选项卡 2 - 我在此选项卡中有一个与 SQL 数据库连接的表,它基本上显示 SQL 表中的所有数据。

代码看起来像这样......

If Not Intersect(Target, [A:A]) Is Nothing Then
    Dim conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim Val1 As String
    Dim strSQL As String
    
    
    Set conn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    
    'Check if there's value in A, if not set to No Fille
    Val1 = Trim(Target.Value)
    If IsEmpty(Val1) = True Or Val1= "" Then
        Target.Interior.ColorIndex = 0
    Exit Sub
    End If
    
    'Now open the connection.
    conn.Open strConn
    
    strSQL = "SELECT 1 FROM table1 where ID= '" & Val1 & "'"
    Debug.Print strSQL
    
    rs.Open strSQL, conn
    
    If rs.BOF And rs.EOF Then
        Target.Interior.ColorIndex = 3  
    Else
        Target.Interior.ColorIndex = 4
    End If
    
    conn.Close
    Set rs = Nothing
    Set conn = Nothing
End If

这是正在发生的事情。我进入选项卡 2 并获取一个 ID,比如说 Test123(这是有效的,因为我在测试之前已经检查过它),然后我进入选项卡 1 并将其粘贴到 A2 中。我的宏执行,但是将单元格着色为值无效。

本质上,执行这部分代码是因为 EOF 和 BOF 都为真(返回值为 -1)

If rs.BOF And rs.EOF Then
    Target.Interior.ColorIndex = 3 

我在 strSQL 中添加了一个 Debug.Print 来检查查询,这就是它的样子(注意第 2 行的单引号)

SELECT 1 FROM table1  where ID= 'Test123
'

知道为什么会发生这种情况以及如何解决吗?我在 A 列中的任何单元格中输入的任何其他值在 SQL 查询中看起来都正确,如下所示:

 SELECT 1 FROM table1  where ID= 'Test1'

有什么办法为什么单引号行出现在第二行,我有一种感觉,这正是它导致问题的原因。

@蒂姆威廉姆斯

我按照你的指示做了,它看起来像这样:来自即时窗口的确切结果。

B              66 
G              71 
4              52 

               13 

               10 

标签: sqlexcelvba

解决方案


如果您认为有空格干扰 Val1,这里发布了一个可能有效的函数:

https://excelfox.com/forum/showthread.php/155-Trim-all-Cells-in-a-Worksheet-VBA#post1092

代码由 Rick Rothstein 提供

Function CleanTrim(ByVal S As String, Optional ConvertNonBreakingSpace As Boolean = True) As String
    Dim X As Long, CodesToClean As Variant
    CodesToClean = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, _
         21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 127, 129, 141, 143, 144, 157)
    If ConvertNonBreakingSpace Then S = Replace(S, Chr(160), " ")
    For X = LBound(CodesToClean) To UBound(CodesToClean)
        If InStr(S, Chr(CodesToClean(X))) Then S = Replace(S, Chr(CodesToClean(X)), "")
    Next
    CleanTrim = WorksheetFunction.Trim(S)
End Function

推荐阅读