2017-01-11 94 views
0

第一篇文章,在這裏。我試圖在Excel中做一個動態查詢,從MySQL中有大約3M記錄的表中檢索數據。我用三個變量來縮小結果。每個變量都是SQL中IN語句的列表。我控制電子表格中列表中出現的項目數量和項目數量。變量/列表是這樣:Excel&MySQL - 運行時錯誤'13':類型不匹配

  • X = 「AA」, 「BB」, 「CC」 ...
  • Y = 「DDDDD」, 「EEEEE」, 「FFFFF」 ...
  • Z = 1,2,3,4,5 ...

如果僅存在1-2在每個列表中,或者如果一個列表很長,其它的是隻有一個項目的項目代碼工作細或者。如果所有列表都很長,則會發生問題:「運行時錯誤'13':類型不匹配」。

當查詢成功時,彈出窗口會要求我輸入數據庫的密碼。當它失敗時,錯誤發生在密碼提示之前,導致我相信這是vba/Excel端的問題,也許是某種容量問題。

關於解決錯誤原因的任何建議?下面的代碼。非常感謝!

Dim X As String 
Dim Y As String 
Dim Z As String 

X = Range("Filter_X").Value 
Y = Range("Filter_Y").Value 
Z = Range("Filter_Z").Value 

ThisWorkbook.Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Data" 

With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _ 
"ODBC;DRIVER={MySQL ODBC 5.3 ANSI Driver};UID=root;;DATABASE=mydatabase;PORT=3306;" _ 
    , Destination:=Range("$A$1")).QueryTable 

    .CommandText = Array(_ 
     "SELECT subquery.*" & Chr(10) & _ 
      "FROM (" & Chr(10) & _ 
         "SELECT *" & Chr(10) & _ 
         "FROM mydatabase.mytable" & Chr(10) & _ 
         "WHERE (mytable.Xfield IN (" & X & "))) subquery" & Chr(10) & _ 
      "WHERE (subquery.Yfield IN (" & Y & ")) AND (subquery.Zfield IN (" & Z & "))") 
    .RowNumbers = False 
    .FillAdjacentFormulas = False 
    .PreserveFormatting = True 
    .RefreshOnFileOpen = False 
    .BackgroundQuery = True 
    .RefreshStyle = xlInsertDeleteCells 
    .SavePassword = False 
    .SaveData = True 
    .AdjustColumnWidth = True 
    .RefreshPeriod = 0 
    .PreserveColumnInfo = True 
    .ListObject.DisplayName = "Pivot_data" 
    .Refresh BackgroundQuery:=False 
End With 
+0

錯誤發生在哪一行?你的琴絃可能會變得太長? – JanB

+0

以下所有代碼都突出顯示進入調試:'.CommandText = Array(_ 「SELECT subquery。*」&Chr(10)&_ 「FROM(」&Chr(10)&_ 「SELECT *」&Chr (10)&_ 「FROM mydatabase.mytable」&Chr(10)&_ 「WHERE(mytable.Xfield IN(」&X&「)))subquery」&Chr(10)&_ 「WHERE(subquery .Yfield IN(「&Y&」))AND(subquery.Zfield IN(「&Z&」))「)' –

+0

對於字符串,多長時間太長?我認爲這不是問題,因爲當其他人短缺時,長期工作會起作用。 –

回答

0

嘗試使用此方法避免使用陣列:

.CommandText = _ 
    "SELECT subquery.*" & Chr(10) & _ 
     "FROM (" & Chr(10) & _ 
        "SELECT *" & Chr(10) & _ 
        "FROM mydatabase.mytable" & Chr(10) & _ 
        "WHERE (mytable.Xfield IN (" & X & "))) subquery" & Chr(10) & _ 
     "WHERE (subquery.Yfield IN (" & Y & ")) AND (subquery.Zfield IN (" & Z & "))" 

即通過SQL查詢直接作爲字符串而不是陣列。

(這應該也會更有效,因爲array(...)返回一個變量數組而不是字符串)。

+0

是的!它的工作,輝煌!非常感謝! –

相關問題