我正在运行一个子程序,它基本上从一张表中获取数据,在其上运行 SQL 查询并将结果存入另一张表中。我注意到,虽然它“正确”运行,但应该包含字母的字段最终并未显示出来(粘贴为空白)。我有什么遗漏的吗?代码如下:
Sub sql_group()
Dim connection As New ADODB.connection
Dim rs As New ADODB.Recordset, arr As Variant, rs1 As New ADODB.Recordset
Dim sh As Worksheet, SQLQuery As String
Set sh = ThisWorkbook.Worksheets("Sheet1")
'Create second query string, join with another query and then pull amount from query and everything else from sheet
connection.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Workbooks(1).FullName & _
";Extended Properties=""Excel 12.0;HDR=YES;"";"
SQLQuery = "Select * from [TEMP$] "
rs.Open SQLQuery, connection
With sh
.Cells.ClearContents
For i = 0 To rs.Fields.Count - 1
.Cells(1, i + 1).Value = rs.Fields(i).Name
Next i
.Range("A2").CopyFromRecordset rs
End With
rs.Close
connection.Close
Set rs = Nothing
Set connection = Nothing
End Sub
我尝试了不同的提供程序类型,更改了数据源/数据转储位置的字段,将所需字段的数据类型更改为常规,但没有看到任何成功。
问题是 ADODB 期望有具有字段类型的列。在常规数据库中,每一列都有一个类型(字符串、数字、日期...),因此不会有问题。
在 Excel 中,没有每列类型之类的东西,您可以将每种类型的数据放入每种类型的单元格中。因此,驱动程序尝试通过分析前 n 行的内容来猜测字段类型(始终无法计算出 n 的值)。如果主要有数字,则该列被视为数字列,如果主要有字符串,则该列被视为字符串。
现在,在您的数据中,您的至少一列中似乎有混合值(数字和字符串)。如果驱动程序猜测该列是数字,并且您发出命中字符串数据的 SQL 命令,则内容将被设置为 null,因为它无法转换为数字。这就是您在结果中看不到这些值的原因。
通常,如果你在一列中混合数据类型,这是一个设计缺陷,但当然我无法判断你的特殊情况。如果您的数据需要这样,最好的办法是将整个列格式化为“文本” - 在这种情况下,驱动程序会将所有内容视为字符串并复制所有数据。缺点:复制的数据实际上是一个字符串,不再是数字,即使它看起来像一个数字。
看看下面的例子:
现在让你的代码针对它运行,结果表包含: