【问题标题】:Need help in vba-excel and Sql query在 vba-excel 和 Sql 查询方面需要帮助
【发布时间】:2012-03-07 03:25:20
【问题描述】:

vba ADO 和 Sql 查询中的疑问...

我有 2 张工作表,即 adodc1,adodc2(在一个工作簿中)

在 adodc1 中有“Name”、“Dept”列,有时它有“Sect”列

在 adodc2 中有"Name","Dept","sect" 列

我想要的是当我运行 Query..Vba 需要检查 adodc1 是否有 Sect 列..如果它有联合,则两张纸通常有其他

想要返回空值..

以下代码取自“”,根据我的需要进行了修改

它将做的是两个工作表中的联合名称和部门列..现在我想查询 adodc1 是否有列“sect”..如果它有

union "Sect" 像往常一样 else .. union 作为空值

Sub connecttoexcel()

Dim cn As Object
Dim rs As Object
Dim strFile As String
Dim strCon As String
Dim strSQL As String
Dim s As String
Dim i As Integer, j As Integer

strFile = ActiveWorkbook.FullName
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile & ";Extended Properties=""Excel 12.0 XML;HDR=Yes;IMEX=1"";"
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Open strCon
'here i want some stuff
strSQL = "Select Name, Dept from [Adodc1$] Union Select Name, Dept from [Adodc2$];"
rs.Open strSQL, cn
Worksheets("Sheet3").Cells(2, 1).CopyFromRecordset rs
Set rs = Nothing
End Sub

【问题讨论】:

    标签: sql excel ado vba


    【解决方案1】:

    vba需要检查adodc1是否有Sect列

    我建议您使用 Connection 对象的OpenSchema 方法来发现列是否存在,例如类似:

    Set rs = cn.OpenSchema(adSchemaColumns, Array(Empty, Empty, "Adodc1$")
    rs.Filter = "COLUMN_NAME = 'Sect'"
    If rs.RecordCount = 1 Then
       ' Column exists
       ...
    

    当涉及到检查 50 列时,我认为会更加困难......

    rs.Filter = "COLUMN_NAME = 'Sect' OR COLUMN_NAME = 'Name' OR COLUMN_NAME = 'Dept' ...
    

    或使用数组等在循环中测试每个。

    是否可以在sql查询中使用NZ函数

    NZ() 函数不是 Access SQL 的函数,它是这里用来访问 Excel 数据的函数。相反,它是 MS Access 对象模型的一部分。简而言之,除非您从 Access VBA 项目运行它,否则 NZ() 不可用。但是解决方法很简单,例如

    Nz(Dept, '{{NONE}}')
    

    效果和

    一样
    IIF(Dept IS NULL, '{{NONE}}', Dept)
    

    我读过 Access MVP(艾伦布朗?)说这比 Nz() 更可取。

    【讨论】:

    • 感谢您的回复...当涉及到检查 50 列时,我认为这将更加困难...是否可以在 sql 查询中使用 NZ Function ..
    • strSQL = "Select Name,Dept,IIF(Sect IS NULL,'',Sect) from [Adodc1$] UNION Select Name,Dept,Sect from [Adodc2$];"我在此处粘贴是否正确.. 但它没有为 1 个或多个参数提供任何值..
    • @SathishKothandam:当所有列都出现在两个工作表上时,对我有用。 p.s.我建议您使用 AS 子句为该表达式命名,例如...IIF(Sect IS NULL,'',Sect) AS Sect, ...
    • Ya .. 它也尝试过 (strSQL = "Select Name,Dept,IIF(Sect IS NULL,'',Sect) AS Sect from [Adodc1$] UNION Select Name,Dept,Sect from [Adodc2$];") 但它会抛出错误(由别名 'sect' 在 quary 定义 sect 列表中引起的循环引用)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    相关资源
    最近更新 更多