Board logo

標題: [發問] VBA 用表格內某欄位資料查詢ACCESS資料 [打印本頁]

作者: toxin    時間: 2012-4-27 16:52     標題: VBA 用表格內某欄位資料查詢ACCESS資料

上網爬過很多文但是都沒辦法成功
可以請各位大大幫個忙嗎
查詢結果存入同列之後

PS一開始就卡住了...型別 'ADODB.Connection' 未定義。= =網路上寫的工具-引用也不行....
作者: alexliou    時間: 2012-4-28 06:53

回復 1# toxin

這有兩個方法解決

1)    在Excel VBA 使用到 ADO 前先嵌入 ADO Library
其做法為在VBA編輯器中, 使用 工具>設定引用項目
這樣會帶出 "設定引用項目"視窗
於其中核取 "Microsoft ActiveX Data Objects x.x Library"選項 (選擇最新版本的ADO)
如此即可於VBA中取用ADO的函式庫
   
2)    如果你沒有將 ADO Library 嵌入
在宣告時你就不能宣告物件變數為ADODB .Connection  ( ex. Dim DB As ADODB.Connection)
而只能宣告為一般物件變數  (Dim DB As Object)
建立時你不能使用  Set DB = New   ADODB.Connection 這樣的語法
而要用   DB = CreateObject("Adodb.Connection")
作者: Min    時間: 2012-4-29 18:36

'引用 Microsoft ActiveX Data Objects 2.x Library
Dim Cnnl As New ADODB.Connection '你是不是忘了new
Cnnl.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=D:\TEST.mdb; "
作者: toxin    時間: 2012-5-2 09:11

不好意思
如果含密碼的話要加什麼?
作者: alexliou    時間: 2012-5-2 14:18

回復 4# toxin
假如你用的是Access 的databae
connection string 應該是以下的型式
"Driver={Microsoft Access Driver (*.mdb)};Dbq=d:\databasename.mdb;Uid=yourid;Pwd=yourpassword"
或是
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\databasename.mdb;Jet OLEDB:Engine Type=5;Uid=yourid;Pwd=yourpassword"   這樣也行
作者: toxin    時間: 2012-5-8 09:56

回復 5# alexliou
ok了
感謝大大
可以另外詢問一下
要查詢排序後第一筆資料
網路上講access可以用一般sql指令
但是下了
SELECT TOP 1 件號, 單價, 廠商 FROM 單價明細 WHERE 件號  = '00002E-A'  ORDER BY 1 DESC

SELECT * 件號, 單價, 廠商 FROM 單價明細 WHERE 件號  = '00002E-A'  ORDER BY 1 DESC
一樣都會出現3筆排序過的資料= =

另外查詢條件'00002E-A'可以用range代替嗎?
作者: alexliou    時間: 2012-5-9 16:19

1. Access 的確支援SQL語法
SELECT TOP 1 件號, 單價, 廠商 FROM 單價明細 WHERE 件號  = '00002E-A'  ORDER BY 1 DESC
看起來沒有錯 應該要顯示第一筆資料

2. 查詢條件'00002E-A'可以用range內的值代替
作者: toxin    時間: 2012-5-10 08:19

回復 7# alexliou
感謝alexliou大大
還是有以下幾個問題
1.理論上應該是只有一筆資料,但是實際上件號相同的都會出現= =
2.請問一下要如何查詢?都失敗說= =
如果方便的話可以幫小弟看一下檔案嗎?
如附件[attach]10885[/attach]
先在此感謝大大
作者: alexliou    時間: 2012-5-10 20:06

回復 8# toxin
1. 在與Order by合用時, TOP 述詞不會在相等值中做選擇。
在您的例子裡, 有三筆資料的件號為00002E-A
Top述詞並非根據資料在資料庫的順序來區分誰先誰後,
而是依據Order By 欄位的值來區分
所以它無法區分這三筆的先後順序, 所以查詢會傳回 3 筆記錄

2. 傳回的recordset中有三筆紀錄, 如果要針對個別紀錄做處理
可以利用迴圈配合recordset的Movenext方法與EOF屬性來處理

3.您也可以改變Order by的欄位, ex .改為 Order by 廠商
如果同一件號同一廠商只有一筆紀錄
那就會只傳回一筆紀錄
如果同一件號同一廠商還是有多筆紀錄
但價格都不同
就可以再增加一個order by欄位
如 Order by 廠商, 單價 desc
作者: toxin    時間: 2012-5-11 09:39

回復 9# alexliou

感謝alexliou大大回覆
說明的很清楚...但是依資料輸入情況來講...好像不太能夠靠其他條件做排序找到所需要的資料
所以只好全部都先寫出來了....要靠inputbox來決定要那一筆資料...
不過碰到一件怪事...把Select  top 1改成Select  *
就會碰到錯誤= =...所以暫時先下Select  top 100(因某些件號明明有好幾筆資料卻只出現一筆)
作者: alexliou    時間: 2012-5-11 15:45

本帖最後由 alexliou 於 2012-5-12 06:29 編輯
回復  toxin alexliou 發表於 2012-5-11 15:44

* 代表所有的欄位
你已經寫了要選取哪些欄位  
所以 * 就不需要了
要改成
SELECT  件號 , 單價, 廠商 FROM 單價明細 WHERE 件號  = '00002E-A'  ORDER BY 1 DESC
或是
SELECT * FROM 單價明細 WHERE 件號  = '00002E-A'  ORDER BY 1 DESC

PS.  ORDER BY 1 DESC 似乎也不需要
因為Where 條件已指定件號'00002E-A'
查詢結果只有一種件號
就沒有排序的必要了
作者: toxin    時間: 2012-5-11 15:59

回復 11# alexliou


   了解了
感謝alexliou大大
作者: toxin    時間: 2014-1-16 11:40

[attach]17269[/attach]回復 11# alexliou

請問一下
如果件號後面還有東西
假設
00002E-A 1
00002E-A 2
如附件
這兩筆也要一起顯示的話
我原本設定的語法
strSQL = "SELECT TOP 10 件號, 單價, 廠商 FROM 單價明細 WHERE 件號 = '00002E-A' "
請問要怎麼改?




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