【问题标题】:Compare Excel value to SQL table If statements.将 Excel 值与 SQL 表 If 语句进行比较。
【发布时间】:2016-12-20 01:45:09
【问题描述】:

如果 excel 中的单元格包含在 SQL 表中找到的相同数据,我是否可以使用 VBA 搜索 SQL 表并返回是/否结果?

我在 Excel 工作表中有客户记录,我需要在其中比较记录 ID (A1) 如果匹配,我需要逐个单元格地将其与“客户”表进行比较,如果是...我需要某种类型如果值存在或不存在,则从 sql 输出。

示例: 如果 Cell.A1 是 = SQLTableA 好的' 别的 “不”

我觉得我很接近,但无法从 sql 获得正确的输出。

enter code here
Option Explicit
Dim cell As Range
Dim CustRow As Range

Const SQLConStr As String = "Driver={SQL Server} ;Server=<svrname>;Database=CustData; UID=user; PWD=<pass>"

Sub connectTODB()

Dim CustDataConn As ADODB.Connection
Dim CustDataCMD As ADODB.Command
Dim rs As ADODB.Recordset


Set CustDataConn = New ADODB.Connection
Set CustDataCMD = New ADODB.Command
Set rs = New ADODB.Recordset

CustDataConn.ConnectionString = SQLConStr
CustDataConn.Open
CustDataCMD.ActiveConnection = CustDataConn


Dim CustValue As String
CustValue = "ACP"


Dim strSQL As String
strSQL = "SELECT * FROM [CustData].[dbo].[CustomerData] WHERE (CustomerData.Client='" & CustValue & "')"



With rs
.ActiveConnection = CustDataConn
'open strsql

'.Open "IF EXISTS(SELECT * FROM [CustData].[dbo].[CustomerData] WHERE CustomerData.Client = 'ACA') Print 'Yes' Else Print 'No'" '(notworking)
'.Open "IF EXISTS(SELECT Client FROM CustData.dbo.CustomerData WHERE  CustomerData.Client = 'hdh') Print 'Yes' Else Print 'No'" '(notworking)
.Open "IF EXISTS(SELECT Client FROM CustData.dbo.CustomerData WHERE  CustomerData.Client = 'hdh')"

Workbooks("<file>.xlsm").Worksheets("CustOutput").Range("A2").CopyFromRecordset rs

.Close
End With

CustDataConn.Close
Set rs = Nothing
Set CustDataConn = Nothing


End Sub

【问题讨论】:

  • 是的,您可以这样做。我会为 Excel 中的命名单元格和存储的 proc 调用拍摄
  • 我只写了其中一个here。由于它得到了疯狂的评论,我不愿意再做一次。
  • 你想用IF EXISTS(SELECT做什么?如果您只想将一个值复制到一个单元格中 - 您不需要copyfromrecordset。只需正确设置连接字符串,并使用您想要返回的特定字段进行查询。然后将rs!YourFieldName分配给单元格

标签: mysql sql-server vba excel


【解决方案1】:

您可以使用ADODB.Recordset.Filter 属性仅返回匹配的记录。如果没有匹配的记录,则ADODB.Recordset.BOF 将返回 true。

With rs
    .ActiveConnection = CustDataConn
    .Open strSQL

    .Filter = "CustomerData.Client = 'ACA'"
    Debug.Print IIf(.BOF, "No", "Yes")

    .Filter = "CustomerData.Client = 'hdh'"
    Debug.Print IIf(.BOF, "No", "Yes")

    'Clear Filter
    .Filter = ""

    Workbooks("<file>.xlsm").Worksheets("CustOutput").Range("A2").CopyFromRecordset rs

    .Close
End With

【讨论】:

  • 感谢 Thomas Inzina。
  • 我无法使用提供的答案。不同的运行时错误和输出结果是错误的。 (我是新来的提问,我很难用代码回答......)
【解决方案2】:

有人可以在这里检查我的理解...

这将打开连接并发送字符串,然后过滤我的值,过滤后.BOF 将返回为假,我将答案更改为“是/否”结果并将其输出到单元格... .

我之前没有使用过BOF(EOF)值,微软的描述更难理解……但是……

如果 BOF = True(则该值不存在 > 改为“否”)

如果 BOF = False(则该值确实存在 > 更改为“是”)

所以..

enter code here

With rs

.ActiveConnection = CustDataConn
.Open strSQL
.Filter = "Client = 'ABC'"
Workbooks("file.xlsm").Worksheets("CustOutput").Range("A2") = IIf(.BOF, "No", "Yes")
.Close

End With

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    相关资源
    最近更新 更多