一尘不染

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

sql

怀疑在VBA ADO和Sql查询中…

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

在adodc1中具有“名称”,“部门”列,有时其具有“ 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

阅读 173

收藏
2021-03-08

共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 Function

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

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

与…具有相同的效果

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

我读过Access MVP(艾伦·布朗(Allen Browne?))说,Nz()无论如何,这是更好的选择。

2021-03-08