Board logo

標題: [發問] ADO Select問題 [打印本頁]

作者: 蒼雪    時間: 2019-11-4 23:06     標題: ADO Select問題

大家好,小弟最近在接觸VBA內使用ADO來取得資料。

這邊有個疑問,在我的標題欄為日期,取得會有問題...

資料來源:
[attach]31384[/attach]

寫法如下:
  1. Sub ado_test()

  2. Dim cnn As Object, rst As Object
  3. Dim Mypath As String, Str_cnn As String
  4. Dim sql As String, i As Long

  5. Set cnn = CreateObject("adodb.connection")
  6. Mypath = ThisWorkbook.FullName

  7. If Application.Version < 12 Then
  8.     Str_cnn = "Provider=Microsoft.jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & Mypath
  9. Else
  10.     Str_cnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & Mypath
  11. End If

  12. cnn.Open Str_cnn

  13. '---------------------------------'
  14. sql = "select 項次,機台名稱,2019/1/1 from [工作表2$] where 機台名稱='A01'"

  15. Set rst = cnn.Execute(sql)

  16. Range("A1").CurrentRegion.ClearContents

  17. For i = 0 To rst.Fields.Count - 1
  18.     Cells(1, i + 1) = rst.Fields(i).Name
  19. Next i

  20. [A2].CopyFromRecordset rst


  21. cnn.Close

  22. Set cnn = Nothing
  23. Set rst = Nothing

  24. End Sub
複製代碼
執行結果:
[attach]31385[/attach]

標題欄的日期部分,不能正確列出,且下方數值帶出錯誤。

若是使用 select * from [工作表2$] where 機台名稱='A01'

可以正確列出
,但由於我的標題欄為日期,一年日期365加上一些前置的標題約有375。

而語法中的Execute(sql),標題欄Fields.Count最多只有255。

有辦法解決嗎?
作者: jcchiang    時間: 2019-11-28 10:17

回復 1# 蒼雪
將2019/1/1前後加上[ ]試試
EX:[2019/1/1]
作者: 蒼雪    時間: 2019-11-30 09:09

回復 2# jcchiang

經過嘗試,他會顯示一個錯誤訊息。

無值提供給一或多個必要參數。
[attach]31478[/attach]
[attach]31479[/attach]   

看來是增加 [ ],所造成的。
作者: jcchiang    時間: 2019-12-2 12:13

回復 3# 蒼雪

Execl欄位類別請改成文字
作者: 蒼雪    時間: 2019-12-2 22:35

回復 4# jcchiang


    有,我有嘗試過將標題欄的日期修改成文字過。

    但是,只要將 [ ] 加上,他就會跳出上面所顯示的錯誤訊息。
作者: jcchiang    時間: 2019-12-3 12:36

回復 5# 蒼雪

[attach]31488[/attach]
作者: 蒼雪    時間: 2019-12-3 21:37

回復 6# jcchiang


執行上是沒有問題了。

不過在增加日期部分稍不方便,由於是文字最後拖曳會變成2019/1/365 ...。

不過謝謝您的解惑,真的很謝謝。
---

另外還想請教,若是資料field從2019/1/1 ~ 2019/12/31。

資料再找到8月底之後的資料都load不出,這有辦法解決嗎?
作者: 蒼雪    時間: 2019-12-3 22:00

回復  jcchiang


執行上是沒有問題了。

不過在增加日期部分稍不方便,由於是文字最後拖曳會變成201 ...
蒼雪 發表於 2019-12-3 21:37


我用公式解決日期拖曳問題了...

利用 =text(D1,"yyyy/m/d") 即可以解決,需要第二部分的解答...
作者: jcchiang    時間: 2019-12-4 09:04

回復 7# 蒼雪
這就是你所說的問題
而語法中的Execute(sql),標題欄Fields.Count最多只有255。

不然就是用公式去搜尋所需資料
=HLOOKUP("2019/12/10",工作表2!C:NC,MATCH("A02",工作表2!B:B),FALSE)

=HLOOKUP("查詢日期",要查日期的範圍位置,MATCH("機台名稱",要查機台名稱的範圍位置),FALSE)
作者: 蒼雪    時間: 2019-12-4 20:18

本帖最後由 蒼雪 於 2019-12-4 20:21 編輯

回復 9# jcchiang


在同一份workbook內可以用公式。

因為長期使用的情況下,資料量會很龐大。

而公式判斷式下多了之後,雖然取得的資料表面上不到10個字元。

可是其實公式占很多,常常到後面檔案就很肥大。

其實,主要的是...

我想在另外一份workbook執行ADO,透過ADO不開啟檔案來取得資料。

這樣檔案也就不至於太大...
作者: jcchiang    時間: 2019-12-5 08:20

回復 10# 蒼雪
1.不同的工作表還是可以用公式抓取
=HLOOKUP("2019/12/10",[SQL欄位名稱為日期.xlsm]工作表2!C:NC,MATCH("A01",[SQL欄位名稱為日期.xlsm]工作表2!$B:$B),FALSE)
紅字部份為資料來源檔案名稱
2.如果還是要使用ADO只能建議將資料Table修改成符合資料架構的格式,否則仍會遇到相同問題
作者: 蒼雪    時間: 2019-12-10 19:25

回復 11# jcchiang


    好,謝謝您。
   
   看來,我需要將資料儲存方式改變...。




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)