5

我在使用 VBA 执行 SQL 查询并将结果复制到 Excel 工作表中时遇到问题。

当子执行时,它只复制 256 的倍数的行(因此第 256、512、768 等行是唯一填充到 Excel 中的行)。我从数据库中复制任何其他字段都没有问题。此外,当我在 MySQL 中运行相同的查询时,它工作正常。作为 SQL 和 VBA 的新手,我看不出这个特定字段会造成麻烦的任何原因。我唯一能想到的是它的内容是一个始终以下划线开头的字符串(我只提到这一点是因为它是它与其他一些字段之间的唯一区别)。

有人对为什么会发生这种情况有任何想法吗?

干杯,

利亚姆

编辑:这是有问题的代码片段。老实说,我不确定看到代码是否会有所作为,因为它在其他情况下工作得很好,但话又说回来,这就是我是新手的原因:)

        Dim con As ADODB.Connection
        Dim rst As ADODB.Recordset

        Set con = New ADODB.Connection
        Set rst = New ADODB.Recordset

        con.ConnectionString = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=ipaddress;UID=userID;PWD=password;DATABASE=jiradb;OPTION=16427;"
        con.Open

        sql = "SELECT TEMPO_DATA FROM gssd_worklog WHERE WORK_DATE BETWEEN '2012-01-01' AND '2012-03-31'"

        'Open Recordset'
        rst.Open sql, con

        'Copy Data to Excel'
        Set ws = ActiveSheet

        ws.Range("A2").CopyFromRecordset rst
4

5 回答 5

9

我昨天遇到了一个非常相似的问题,并在研究时发现了这个线程,所以想添加我的“解决方案”,以防它帮助其他人。

为了完善问题描述,我发现它适用于我的数据集中的一个特定字段,有趣的是,如果我重新排序查询,它适用于每个后续字段。添加尾随或删除较早的字段对我的问题列没有影响。

检查类型显示它与其他一些确实有效的字段类型相同,因此也没有任何线索。

但是,由于它是一个特定字段(在本例中为文本字段),我决定尝试将我的 SQL 查询更改为 CAST 问题字段,更改:

SELECT Col1, Col2, Col3 FROM TableName

...到...

SELECT Col1, Col2, CAST(Col3 AS VARCHAR(8)) AS Col3 FROM TableName

...突然出现所有数据(包括任何尾随列)。

于 2012-11-16T09:03:05.200 回答
3

当您尝试复制工作表上的记录时,我认为您的问题出在最后一行。尝试这样的事情(代码从http://msdn.microsoft.com/en-us/library/aa223845(v=office.11 ​​).aspx 修改):

For iCols = 0 to rs.Fields.Count - 1
    ws.Cells(1, iCols + 1).Value = rst.Fields(iCols).Name
Next
ws.Range("A2").CopyFromRecordset rst
于 2012-04-19T13:12:16.653 回答
3

感谢 Lamak 的帮助,我想我已经找到了解决方案:

rst.Open sql, con

Dim iRows As Integer
For iCols = 0 To rst.Fields.Count - 1
    ws.Cells(1, iCols + 1).Select
    With Selection
        .Value = rst.Fields(iCols).Name
        .Font.Bold = True
        .EntireColumn.AutoFit
    End With
Next iCols

iRows = 2

While Not rst.EOF
    For iCols = 0 To rst.Fields.Count - 1
        ws.Cells(iRows, iCols + 1).Value = rst.Fields(iCols).Value
    Next iCols
    rst.MoveNext
    iRows = iRows + 1
Wend

问题似乎一直试图一次将所有字段从记录集中复制出来,逐个字段和逐行复制记录似乎可以解决问题。

于 2012-04-20T09:16:54.870 回答
1

我在使用记录集时遇到了类似的问题。它会在 SQL 查询中很好地返回一组客户结果,但不会将结果粘贴到某些客户的工作表中。

按照转换数据的提示,我深入研究了查询,并注意到结果集中隐藏了空值。从记录集中出现的空值来看,超出该空值(按该特定列排序)的任何结果都不会粘贴到我的工作表上。

或者在伪代码中:

SELECT DISTINCT a,b,e
FROM DATASET

其中 c 列将包含一个空值。

所以我的解决方案:在 Excel 中使用它之前,在 SQL 中删除结果集中的重复值和空值。

于 2014-06-16T09:26:31.123 回答
0

我打赌你的问题是记录集(在内存中)没有完全填充来自数据源的数据。这是 ADO 记录集的已知行为。

最简单的解决方法是在“.CopyFromRceordset rst”方法调用之前执行“rst.movelast” - 此方法将确保使用数据源中的数据完全加载记录集。

您的 RBAR (Row By Agnonizing Row) 替代过程通过使用 .movenext 方法顺序移动记录集中的记录来实现相同的结果(这会导致 ADO 代码在记录指针移动通过加载的记录时不断加载新数据)内存中的数据页)。

于 2019-06-11T15:15:53.530 回答