2012-03-28 143 views
0

我试图创建一个宏,将拉动一些数据到Excel 2003从SQL Server 2005Excel VBA中的SQL Server数据导入“类型不匹配错误”

的SQL代码是在这个宏,以及部分此代码来自Excel中单元格中的值。这可以在某种程度上起作用,但是当我用于SQL代码的Excel单元格中的数据超过公式预览中的一行(或大约170个字符)时,出现“类型不匹配”错误。否则,它会正常工作。

With ActiveSheet.QueryTables.Add(Connection:=Array(_ 
"OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Data  Source=anglobisql;Use Procedure for Prepare=1;Auto " _ 
    , _ 
    "Translate=True;Packet Size=4096;Workstation ID=MyIDHere;Use Encryption for Data=False;Tag with column collation when possible=F" _ 
    , "alse;Initial Catalog=DATABASENAME"), Destination:=Range("A1")) 
    .CommandType = xlCmdSql 
    .CommandText = Array("SELECT COLUMN1, COLUMN2 FROM TABLENAME (nolock) WHERE COLUMN1 IN (" & ActiveWorkbook.Sheets("Sheet1").Range("e607").Value & ")") 
    .Name = "DATABASE TABLENAME" 
    .FieldNames = True 
    .RowNumbers = False 
    .FillAdjacentFormulas = False 
    .PreserveFormatting = True 
    .RefreshOnFileOpen = False 
    .BackgroundQuery = True 
    .RefreshStyle = xlInsertDeleteCells 
    .SavePassword = False 
    .SaveData = True 
    .AdjustColumnWidth = True 
    .RefreshPeriod = 0 
    .PreserveColumnInfo = True 
    .SourceConnectionFile = _ 
    "H:\My Data Sources\DATABASE TABLENAME.odc" 
    .Refresh BackgroundQuery:=False 

很明显,所有的数据库名和表名都是正确填写的。

知道为什么这要塌下来(是否有字符数限制,还是因为单元格的值继续到在Excel公式预览栏中的下一行就失败了呢?这怎么可能是固定的?

很多赞赏,

亚历

+0

32,767个字符为一个Excel细胞的极限。我的猜测是你所有的数据都被插入到一个Cell(A1)中。 – 2012-03-28 14:04:04

+0

不太确定您是指输入还是输出。 对于输出:当sql查询正常工作数据通过不同的单元格时,所以这不是问题 对于输入:截止似乎是大约170个字符,所以再次32,767不是问题。 – alexei7 2012-03-28 14:09:38

+0

我可以看到在Excel中的“编辑OLE DB查询”的“命令文本”中似乎确实存在文本限制,但是我再次认为我很好。 – alexei7 2012-03-28 14:13:57

回答

0

不应该有致有超过170个字符的Excel单元格中的任何问题。我建议分割线的错误出来,以帮助准确地找到问题的所在。

替换此:

.CommandText = Array("SELECT COLUMN1, COLUMN2 FROM TABLENAME (nolock) WHERE COLUMN1 IN (" & ActiveWorkbook.Sheets("Sheet1").Range("e607").Value & ")") 

有了这个:

Dim rng As Range, sSql As String 
    Set rng = ActiveWorkbook.Sheets("Sheet1").Range("e607") 
    Debug.Print "Range.Value = |" & rng.Value & "|" 
    sSql = "SELECT COLUMN1, COLUMN2 FROM TABLENAME (nolock) WHERE COLUMN1 IN (" & rng.Value & ")" 
    Debug.Print "SQL = |" & sSql & "|" 
    .CommandText = sSql 

Debug.Print打印到即时窗口,因此您可以仔细检查这两个变量都拿着你所期望的是什么。在调试字符串时,我喜欢使用|而不是",因为我在字符串中几乎没有|

此外,我不打扰使用Array()CommandTextConnection。为了可读性,我会重做你的第一行,看起来像这样。

With ActiveSheet.QueryTables.Add(_ 
     Connection:="OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI" _ 
       & ";Persist Security Info=True;Data Source=anglobisql" _ 
       & ";Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096" _ 
       & ";Workstation ID=MyIDHere;Use Encryption for Data=False" _ 
       & ";Tag with column collation when possible=False;Initial Catalog=DATABASENAME" _ 
     , Destination:=Range("A1")) 
0

这是通过去除所述阵列文本解决这样

.CommandText = Array("SELECT COLUMN1, COLUMN2 FROM TABLENAME (nolock) WHERE ... 

变得

.CommandText = ("SELECT COLUMN1, COLUMN2 FROM TABLENAME (nolock) WHERE ...