2012-04-19 439 views
4

我在使用VBA执行SQL查询并将结果复制到Excel工作表时遇到问题。SQL查询只返回一个字段的完整结果

当子程序执行时,它只复制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 
+2

您应该发布您的子代码,以便我们尝试回答这个问题 – Lamak 2012-04-19 12:44:58

+0

您在哪里定义'rst'? – Lamak 2012-04-19 12:59:08

+0

对不起,现在在原帖子中的声明 – 2012-04-19 13:02:27

回答

1

我想我已经找到了解决办法,这要归功于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

我想您的问题与最后一行相同,当您尝试复制工作表上的记录时。尝试这样的事情(代码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 
+0

恐怕没有奏效。它确实在列的头部打印了字段名称,但我仍然遇到与丢失数据相同的问题。不过谢谢! – 2012-04-19 13:37:21

+0

@LiamBarrett - 你对这个子上的每个查询都有这个问题? – Lamak 2012-04-19 13:42:15

+0

不,只有在这一个特定的查询中,我试过其他人,他们都很好。这很奇怪。我能想到的唯一的事情就是它必须是数据库字段的实际内容,这在某种程度上导致了问题。 – 2012-04-19 13:46:08

7

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

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

检查类型显示它是一些其他类型的工作,所以没有线索。

然而,因为它是(在这种情况下的文本字段)的特定字段,我决定尝试改变我的SQL查询来投的问题领域,改变:

SELECT Col1, Col2, Col3 FROM TableName 

...到...

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

...并突然显示所有数据(包括任何尾随列)。

1

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

按照提示投射我的数据,我深入挖掘了我的查询并注意到结果集中隐藏了空值。从记录集中null的外观中,除了该空值之外的任何结果(由该特定列排序)都不会粘贴到我的工作表上。

或者伪代码:

SELECT DISTINCT a,b,e 
FROM DATASET 

其中C列将包含空值。

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