我在使用VBA执行SQL查询并将结果复制到Excel工作表时遇到问题。
当sub excecutes时,它只复制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
答案 0 :(得分:7)
我昨天遇到了一个非常类似的问题,在研究过程中发现了这个问题,所以想要添加我的“解决方案”,以防其它人帮助。
为了优化问题描述,我发现它应用于我的数据集中的一个特定字段,有趣的是,如果我重新排序查询,则应用于每个后续字段。添加尾随或删除早期字段对我的问题列没有任何影响。
检查类型显示它与某些其他字段的工作类型相同,因此也没有任何线索。
但是,由于它是一个特定的字段(在本例中是一个文本字段),我决定尝试将我的SQL查询更改为CAST问题字段,更改:
SELECT Col1, Col2, Col3 FROM TableName
...到...
SELECT Col1, Col2, CAST(Col3 AS VARCHAR(8)) AS Col3 FROM TableName
...突然显示所有数据(包括任何尾随列)。
答案 1 :(得分: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
答案 2 :(得分:2)
感谢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
问题似乎是尝试立即从记录集中复制所有字段,按字段逐行复制记录字段并逐行解决问题。
答案 3 :(得分:1)
我使用记录集时遇到了类似的问题。它会在SQL查询中返回一组客户结果,但不会将结果粘贴到某些客户的工作表中。
按照提示投射我的数据后,我在查询中深入挖掘并注意到结果集中隐藏了空值。从记录集中null的外观开始,我的工作表上不会粘贴超出该null值的结果(由该特定列排序)。
或伪代码:
SELECT DISTINCT a,b,e
FROM DATASET
其中列c将包含空值。
所以我的解决方案:在Excel中使用它之前,在SQL中删除结果集中的重复项和空值。
答案 4 :(得分:0)
我敢打赌,您的问题是(内存中的)记录集没有完全用数据源中的数据填充。这是ADO记录集的已知行为。
最简单的解决方法是在调用“ .CopyFromRceordset rst”方法之前,先执行“ rst.movelast”,并且此方法将确保使用数据源中的数据完全加载记录集。
您的RBAR(行合并行)替代过程通过使用.movenext方法顺序移动记录集中的记录来实现相同的结果(这导致ADO代码在记录指针移动时不断加载新数据)通过内存中加载的数据页)。