返回列表 上一主題 發帖

執行階段錯誤13 型態不符合

執行階段錯誤13 型態不符合

本帖最後由 joey0415 於 2010-6-25 19:21 編輯

小弟將錄製的代碼(已成功可用)

改成比較好看的代碼(失敗)

可以幫我看看是哪媬欞~嗎?

小弟改變sql語句的寫法,常常sql語句很短的時候,兩種方法都行,一但sql的語句變長時,就會有下面的錯誤
  1. Sub day150_1()
  2. '
  3. ' day150_1 Macro
  4.     Sheets("Sheet1").Select
  5.     Range("A1").Select
  6.     With ActiveSheet.QueryTables.Add(Connection:= _
  7.         "ODBC;DRIVER=SQL Server;SERVER=.;UID=sa;PWD=abcd1234;APP=2007 Microsoft Office system;WSID=CS5111;DATABASE=stock" _
  8.         , Destination:=Range("A1"))
  9.         .CommandText = Array( _
  10.         "select a.*,b.*,c.*,d.*" & Chr(13) & "" & Chr(10) & " from dbo.Stock a" & Chr(13) & "" & Chr(10) & "left join dbo.CreditExchange b on a.sdate=b.sdate and a.stockid=b.stockid" & Chr(13) & "" & Chr(10) & " left join dbo.NLDL c on a.sdate=c.sdate and a.stockid=c.stockid " & Chr(13) & "" & Chr(10) & " left join dbo." _
  11.         , _
  12.         "CompTrade d on a.sdate=d.sdate and a.stockid=d.stockid" & Chr(13) & "" & Chr(10) & " where   a.stockid>1000 and a.stockid<2000  and a.sdate>='2009-11-09'  order by a.stockid  ,a.sdate" & Chr(13) & "" & Chr(10) & "" _
  13.         )
  14.         .Name = "day150_1"
  15.         .FieldNames = True
  16.         .RowNumbers = False
  17.         .FillAdjacentFormulas = False
  18.         .PreserveFormatting = True
  19.         .RefreshOnFileOpen = False
  20.         .BackgroundQuery = True
  21.         .RefreshStyle = xlInsertDeleteCells
  22.         .SavePassword = True
  23.         .SaveData = True
  24.         .AdjustColumnWidth = True
  25.         .RefreshPeriod = 0
  26.         .PreserveColumnInfo = True
  27.         .Refresh BackgroundQuery:=False
  28.     End With
  29. End Sub
複製代碼
錯誤代碼:


就是這句有問題
  .CommandText = Array(ssql)
  1. Sub day150_11()
  2. '
  3. ' day150_1 Macro
  4. Dim ssql As String
  5. ssql = ""
  6. ssql = ssql & "select a.*,b.*,c.*,d.* from dbo.Stock a" & Chr(13)
  7. ssql = ssql & "left join dbo.CreditExchange b on a.sdate=b.sdate and a.stockid=b.stockid" & Chr(13)
  8. ssql = ssql & "left join dbo.NLDL c on a.sdate=c.sdate and a.stockid=c.stockid" & Chr(13)
  9. ssql = ssql & "left join dbo.CompTrade d on a.sdate=d.sdate and a.stockid=d.stockid" & Chr(13)
  10. ssql = ssql & "where  a.stockid>1000 and a.stockid<2000 and a.sdate>='2009-11-09'" & Chr(13)
  11. ssql = ssql & "order by a.stockid ,a.sdate" & Chr(13)


  12.     Sheets("Sheet1").Select
  13.     Range("A1").Select
  14.     With ActiveSheet.QueryTables.Add(Connection:= _
  15.         "ODBC;DRIVER=SQL Server;SERVER=.;UID=sa;PWD=abcd1234;APP=2007 Microsoft Office system;WSID=CS5111;DATABASE=stock" _
  16.         , Destination:=Range("A1"))
  17.     .CommandText = Array(ssql)
  18.         .Name = "day150_1"
  19.         .FieldNames = True
  20.         .RowNumbers = False
  21.         .FillAdjacentFormulas = False
  22.         .PreserveFormatting = True
  23.         .RefreshOnFileOpen = False
  24.         .BackgroundQuery = True
  25.         .RefreshStyle = xlInsertDeleteCells
  26.         .SavePassword = True
  27.         .SaveData = True
  28.         .AdjustColumnWidth = True
  29.         .RefreshPeriod = 0
  30.         .PreserveColumnInfo = True
  31.         .Refresh BackgroundQuery:=False
  32.     End With
  33. End Sub
複製代碼

您的sql字串用錯了! 少了&

錯誤
ssql = ssql "select a.*,b.*,c.*,d.* from dbo.Stock a" & Chr(13)
正確
ssql = ssql & "select a.*,b.*,c.*,d.* from dbo.Stock a" & Chr(13)

全部都有少喔~
若是我回答,使您滿意,請您讓我知道!                  
若是我的回覆,您仍有其他見解,也請您不嗇指教!

TOP

您的sql字串用錯了! 少了&

錯誤
ssql = ssql "select a.*,b.*,c.*,d.* from dbo.Stock a" & Chr(13)
正 ...
Min 發表於 2010-6-27 21:46



小弟貼語法時,其實是有&,但是最後並沒有出現,請min大大幫我看一下,跑出來的狤果如下圖


   
ssql.gif
2010-6-28 17:47

TOP

小弟貼語法時,其實是有&,但是最後並沒有出現,請min大大幫我看一下,跑出來的狤果如下圖
joey0415 發表於 2010/6/28 05:49 PM


勞駕將檔案PO上來~
若是我回答,使您滿意,請您讓我知道!                  
若是我的回覆,您仍有其他見解,也請您不嗇指教!

TOP

回復 4# Min


這個檔案本來很大,我刪了很多欄,只保留前面幾欄與長度,請幫我看看

謝謝版主


    8888.zip (364.28 KB)

TOP

ssql = ""
ssql = ssql & vbCrLf & "select a.*,b.*,c.*,d.*"
ssql = ssql & vbCrLf & "from dbo.Stock a"
ssql = ssql & vbCrLf & "left join dbo.CreditExchange b on a.sdate=b.sdate and a.stockid=b.stockid"
ssql = ssql & vbCrLf & "left join dbo.NLDL c on a.sdate=c.sdate and a.stockid=c.stockid"
ssql = ssql & vbCrLf & "left join dbo.CompTrade d on a.sdate=d.sdate and a.stockid=d.stockid"
ssql = ssql & vbCrLf & "where a.stockid>1000 and a.sdate>='2010-06-09'  "
ssql = ssql & vbCrLf & "order by a.stockid,a.sdate"

改用這樣的方式 看起來比較整齊喔...
剛剛小弟看了老半天,發現.... 會不會是您query的value太大 所以commandtext放不下...
若是我回答,使您滿意,請您讓我知道!                  
若是我的回覆,您仍有其他見解,也請您不嗇指教!

TOP

回復 6# Min


    會不會是您query的value太大 所以commandtext放不下


小弟也覺得是如此,但是小弟不會改,請閔大幫忙

謝謝

TOP

回復  Min


    會不會是您query的value太大 所以commandtext放不下


小弟也覺得是如此,但是小弟 ...
joey0415 發表於 2010/6/29 02:03 PM



不好意思 我也沒用過您這種方式存取DataBase
但您可以參考ADO的方式 http://forum.twbts.com/viewthread.php?tid=712&extra=
若是我回答,使您滿意,請您讓我知道!                  
若是我的回覆,您仍有其他見解,也請您不嗇指教!

TOP

回復 8# Min


請問版主,你用的是mysql,小弟是指sql server

小弟的主機:test
帳號:abc
密碼:123
資料庫:stock


假設小弟查詢是某資料表如:dbo.stockname

小弟的語句是:select * from dbo.stockname

請問怎麼修改呢?

謝謝版主幫小弟一步步除錯,請問一下如果用版主的寫法,那sql語句的長短就不會限制了嗎?
  1. Sub ADO_QueryTable()
  2.     Dim Cnnl As New ADODB.Connection
  3.     Dim Rst As New ADODB.Recordset
  4.     Dim SQL As String
  5.     Dim lCol As Long
  6.     Dim lRow As Long
  7.    
  8.     Cnnl.Open "Driver={MySQL ODBC 3.51 Driver};Server=TEST;Port=3306;Database=TEST;CharSet=big5;Uid=TEST;Pwd=TEST;Option=16387"  '連接System

  9.     SQL = "SELECT COL0,COL1,COL2,COL3,COL4,COL5 FROM TABLE"
  10.     Rst.Open SQL, Cnnl, adOpenKeyset, adLockOptimistic
  11.     Do Until Rst.EOF
  12.         For lCol = 0 To Rst.Fields.Count - 1
  13.             Cells(lRow, lCol + 1).Value = Rst(lCol)
  14.         Next
  15.         lRow = lRow + 1
  16.         Rst.MoveNext
  17.     Loop
  18.    
  19.     Set Cnnl = Nothing
  20.     Set Rst = Nothing
  21. End Sub
複製代碼

TOP

回復  Min


請問版主,你用的是mysql,小弟是指sql server

小弟的主機:test
帳號:abc
密碼:12 ...
joey0415 發表於 2010/6/30 12:32 AM


1.
sql server connection範例如下
Cnnl.Open "Provider=MSIDXS.1; Data Source=path to file Indexing Service"

2.
SQL 請您看第十行~

3.
至於SQL的長短...
不懂您的意思!

如果是指 quero的資料 那塞爆excel沒問題.. 但塞爆因該沒有意義... 所以因該是只能放65535*255!
那如果您指的是sql變數 長短問題.. 那可以查一下string上限~
若是我回答,使您滿意,請您讓我知道!                  
若是我的回覆,您仍有其他見解,也請您不嗇指教!

TOP

        靜思自在 : 成功是優點的發揮,失敗是缺點的累積。
返回列表 上一主題