先介紹下背景,老板比較會省錢,我也比較懶,所以有些工作不想手工做,老板也不給上軟件(就算上,有些也比較瑣碎,不是度身定制軟件還不定合用),只好沒有條件創(chuàng)造條件。我所能做的也就是充分利用EXCEL以及VBA所帶來的便利,當(dāng)然過程中也沒少在EXCEL HOME上潛水(大部分都是現(xiàn)學(xué)現(xiàn)賣,用啥學(xué)啥,都是淚啊……)。 64位機(jī)器用 If you are the user of an application, consult your application documentation for details on how to use the appropriate driver. If you are an application developer using OLEDB, set the Provider argument of the ConnectionString property to “Microsoft.ACE.OLEDB.12.0” If you are an application developer using ODBC to connect to Microsoft Office Access data, set the Connection String to “Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=path to mdb/accdb file” If you are an application developer using ODBC to connect to Microsoft Office Excel data, set the Connection String to “Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=path to xls/xlsx/xlsm/xlsb file” 從頭再來,去找能兼容32位和64位的連接方法。 (啥,從頭再來,能找到么,算了放棄吧) 用代碼判斷當(dāng)前系統(tǒng)是32位還是64位然后選擇相應(yīng)的代碼執(zhí)行。(好吧,這個貌似容易一點,我選這個)
咱是講團(tuán)隊的人,所以有比較強(qiáng)烈的團(tuán)隊合作的需求,隨之而來的就是團(tuán)隊間需解決數(shù)據(jù)共享和數(shù)據(jù)交換的問題,光用EXCEL共享已經(jīng)不能滿足要求,就從壇子上學(xué)會了用EXCEL做前端,用ACCESS作為數(shù)據(jù)庫,并布置在局域網(wǎng)上,來實現(xiàn)某些數(shù)據(jù)的共享和交換。
切入正題,我可能屬于比較老套和落后的,一直用32位的系統(tǒng),最近才把電腦的系統(tǒng)換成了64位的WIN7,OFFICE也順便換成了64位的2013,問題就來了,原來用的好好的文件提示“運(yùn)行時錯誤‘3706’未找到提供程序。改程序可能為正確安裝。“。分析,上網(wǎng)查……等等,發(fā)現(xiàn)時ADO的問題,貌似說是ADO是32位下的組件,在64位下無法運(yùn)行(不知道到底是不是這個原因,就當(dāng)他是吧)。于是開始不死心嘗試引用不同的ADO版本,從2.8試到了6.1,都不行……
我當(dāng)時的心情…………我真想問候微軟他##,既然不能用,你為啥在64位的OFFICE上引用里還能看到ADO呢?這不是肯爹嗎!
一開始,網(wǎng)上看到的解決方法基本都是 放棄64位的OFFICE………………我沒有嘗試,因為我記得以前我同事64位XP+32位的OFFICE2007運(yùn)行不起來的情況(以前沒有意識到是這個問題,現(xiàn)在想來才覺得是同樣的問題),而且網(wǎng)上看到VB啥的貌似也有這個問題。所以我個人武斷的判斷這不是換個OFFICE就能解決的,應(yīng)該還是環(huán)境--64位WIN7的問題。
放棄64位系統(tǒng),我想過,不過不甘心浪費內(nèi)存,而且以后換新機(jī)器怎么辦,現(xiàn)在可基本都是64位的系統(tǒng)??偛灰姷美习遄寭Q新電腦我拒絕的吧,或者說那個8G內(nèi)存的機(jī)器跑32位的系統(tǒng)(會被笑話的)。
秉著存在就有道理的精神,繼續(xù)在網(wǎng)上挖……
兩篇博文,讓我看到了希望
這里,我先要感謝那兩位博主yandong_8212和張三豐,雖然我完全不認(rèn)識他們,他們也不知道我,不過這次正兒八經(jīng)幫了我一把
http://blog.163.com/yandong_8212/
http://blog.sina.com.cn/s/blog_3d1c581901011swc.html
他們兩位給出的解決方法基本是類似的,都是使用AccessDatabaseEngine(Microsoft Access Database Engine 2010 Redistributable http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c06b8369-60dd-4b64-a44b-84b371ede16d&displaylang=en)
兩位博主的博文,一位是需要先刪除OFFICE然后再安裝那個ENGINE,使用方法,大俠可能覺得太簡單,就么說,就轉(zhuǎn)了微軟官網(wǎng)介紹(一開始我也沒認(rèn)真看,哎……),苦了菜鳥我。
還有一位博主,是先安裝ENGINE,然后修改連接串(他沒要刪OFFICE,所以我先按他的方法試的)
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=文件路徑;HDR=YES;
32位機(jī)器用
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=文件路徑;HDR=YES
估計是我資質(zhì)有限,或者是什么地方設(shè)置發(fā)生了錯誤,如是修改后報錯。
不愿放棄,再回過頭去看微軟官網(wǎng)關(guān)于這個ENGINE的說明,安裝介紹里有如下一段
To use this download:
既然高大上的微軟都這么說了,那我也就試試看,居然就成了,我鏈接部分的代碼如下:
If you are connecting to Microsoft Office Excel data, add the appropriate Extended Properties of the OLEDB connection string based on the Excel file type:
File Type (extension) Extended Properties
---------------------------------------------------------------------------------------------
Excel 97-2003 Workbook (.xls) "Excel 8.0"
Excel 2007-2010 Workbook (.xlsx) "Excel 12.0 Xml"
Excel 2007-2010 Macro-enabled workbook (.xlsm) "Excel 12.0 Macro"
Excel 2007-2010 Non-XML binary workbook (.xlsb) "Excel 12.0"
Set cnn = New ADODB.Connection
cnn.Open "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=\\192.168.1.140\d_peizhi\peizhi.mdb"
Set RST = New ADODB.Recordset
Sql = "select * from peizhiNO1 order by ID"
RST.Open Sql, cnn, adOpenKeyset, adLockOptimistic
peizhi.Range("A2").CopyFromRecordset RST
RST.Close
那個開心啊,菜鳥我,終于為換新電腦做好了充分的準(zhǔn)備。
就我那點東西,難道以后還要分32位和64位兩個版本?顯然那不符合我偷懶的個性,于是我想讓他們兼容。
我能想出來的方法就兩個:
網(wǎng)上看到的判斷系統(tǒng)64位的方法基本上都要聲明API啥的,看了頭暈,貼上去能用,還用用,結(jié)果貼了幾個代碼都用不起來(資質(zhì)有限?。麛喾艞?,還是走我的野路子吧。
網(wǎng)上看到使用Application.OperatingSystem可以查到系統(tǒng)的版本,具體顯示的格式大概如下(我機(jī)器上的版本)
Windows (64-bit) NT 6.01
在32位的win7和XP上我也試了下,顯示的格式也是這樣,只不過括號里是32-bit和最后的版本號不一樣。
既然這樣,我就用InStr函數(shù)來判斷Application.OperatingSystem返回的值里面是否包含字符”64-bit“,如果不包含就認(rèn)為是32位的,如果包含,就認(rèn)為是64位的。定義了一個公共變量(為了方便其他位置調(diào)用),用來傳遞不同的鏈接代碼,給一段我的代碼(業(yè)余選手,多多指正)。
Public db_address As String, db_name As String, name01 As String, name02 As String, name03 As String, name04 As String, name05 As String, name06 As String, name11 As String, name12 As String, name13 As String, name14 As String, name15 As String, name16 As String, htnf As String
Public nv As String, nvn As String, nvl As String, oandn As String, myv As String
Public ct As String
Public Sub L_PEIZHI()
'---------------------------------------------------------------- 判斷系統(tǒng)是否為64位
re = InStr(1, Application.OperatingSystem, "64-bit", vbTextCompare)
If re = 0 Then
ct = "provider=Microsoft.jet.OLEDB.4.0;data source="
Else
ct = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ="
End If
'----------------------------------------------------------------- 載入基本配置
Set cnn = New ADODB.Connection
cnn.Open ct & "\\192.168.2.110\d_peizhi\peizhi.mdb"
Set rst = New ADODB.Recordset
Sql = "select * from peizhiNO1 order by ID"
rst.Open Sql, cnn, adOpenKeyset, adLockOptimistic
peizhi.Range("A2").CopyFromRecordset rst
db_address = peizhi.Cells(2, 3)
db_name = peizhi.Cells(3, 3)
name01 = peizhi.Cells(4, 3)
name02 = peizhi.Cells(5, 3)
name03 = peizhi.Cells(6, 3)
name04 = peizhi.Cells(7, 3)
name05 = peizhi.Cells(8, 3)
name06 = peizhi.Cells(9, 3)
name11 = peizhi.Cells(10, 3)
name12 = peizhi.Cells(11, 3)
name13 = peizhi.Cells(12, 3)
name14 = peizhi.Cells(13, 3)
name15 = peizhi.Cells(14, 3)
name16 = peizhi.Cells(15, 3)
htnf = peizhi.Cells(16, 3)
nv = peizhi.Cells(17, 3)
nvn = peizhi.Cells(18, 3)
nvl = peizhi.Cells(19, 3)
oandn = peizhi.Cells(20, 3)
myv = guanyu.Cells(1, 2)
End Sub
因為自己被64位這個問題折騰了一天,所以決定寫出來,供需要的人參考。
PS:第一次發(fā)這樣的帖子…………
附上64位AccessDatabaseEngine在百度云的下載地址,想該比微軟速度要快點的吧 http://pan.baidu.com/s/1pJ0jhFl
補(bǔ)充內(nèi)容 (2015-1-11 13:28):
后來發(fā)現(xiàn)Provider=Microsoft.ACE.OLEDB.12.0;Data Source=文件路徑;HDR=YES; 可以用的,看來是我原來寫的時候有沒注意到的細(xì)節(jié)