在vba-excel和Sql查询中需要帮助

时间:2012-03-07 03:25:21

标签: sql excel-vba ado vba excel

怀疑在vba ADO和Sql查询...

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

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

在adodc2中有“名称”,“部门”,“教派”栏目

我想要的是当我运行Query..Vba时需要检查adodc1是否有Sect列..如果它有两个工作表通常的联合

希望以空值返回..

以下代码取自“”根据我的需要改变

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

联合“Sect”像往常一样..联合作为空值

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

1 个答案:

答案 0 :(得分:2)

  

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(Allen Browne?)说这比Nz()更好。