|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
先介绍下背景,老板比较会省钱,我也比较懒,所以有些工作不想手工做,老板也不给上软件(就算上,有些也比较琐碎,不是度身定制软件还不定合用),只好没有条件创造条件。我所能做的也就是充分利用EXCEL以及VBA所带来的便利,当然过程中也没少在EXCEL HOME上潜水(大部分都是现学现卖,用啥学啥,都是泪啊……)。
咱是讲团队的人,所以有比较强烈的团队合作的需求,随之而来的就是团队间需解决数据共享和数据交换的问题,光用EXCEL共享已经不能满足要求,就从坛子上学会了用EXCEL做前端,用ACCESS作为数据库,并布置在局域网上,来实现某些数据的共享和交换。
切入正题,我可能属于比较老套和落后的,一直用32位的系统,最近才把电脑的系统换成了64位的WIN7,OFFICE也顺便换成了64位的2013,问题就来了,原来用的好好的文件提示“运行时错误‘3706’未找到提供程序。改程序可能为正确安装。“。分析,上网查……等等,发现时ADO的问题,貌似说是ADO是32位下的组件,在64位下无法运行(不知道到底是不是这个原因,就当他是吧)。于是开始不死心尝试引用不同的ADO版本,从2.8试到了6.1,都不行……
我当时的心情…………我真想问候微软他##,既然不能用,你为啥在64位的OFFICE上引用里还能看到ADO呢?这不是肯爹吗!
一开始,网上看到的解决方法基本都是 放弃64位的OFFICE………………我没有尝试,因为我记得以前我同事64位XP+32位的OFFICE2007运行不起来的情况(以前没有意识到是这个问题,现在想来才觉得是同样的问题),而且网上看到VB啥的貌似也有这个问题。所以我个人武断的判断这不是换个OFFICE就能解决的,应该还是环境--64位WIN7的问题。
放弃64位系统,我想过,不过不甘心浪费内存,而且以后换新机器怎么办,现在可基本都是64位的系统。总不见得老板让换新电脑我拒绝的吧,或者说那个8G内存的机器跑32位的系统(会被笑话的)。
秉着存在就有道理的精神,继续在网上挖……
两篇博文,让我看到了希望
这里,我先要感谢那两位博主yandong_8212和张三丰,虽然我完全不认识他们,他们也不知道我,不过这次正儿八经帮了我一把
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,使用方法,大侠可能觉得太简单,就么说,就转了微软官网介绍(一开始我也没认真看,哎……),苦了菜鸟我。
还有一位博主,是先安装ENGINE,然后修改连接串(他没要删OFFICE,所以我先按他的方法试的)
64位机器用
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=文件路径;HDR=YES;
32位机器用
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=文件路径;HDR=YES
估计是我资质有限,或者是什么地方设置发生了错误,如是修改后报错。
不愿放弃,再回过头去看微软官网关于这个ENGINE的说明,安装介绍里有如下一段
To use this download:- 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 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" - 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”
既然高大上的微软都这么说了,那我也就试试看,居然就成了,我链接部分的代码如下:
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
那个开心啊,菜鸟我,终于为换新电脑做好了充分的准备。
就我那点东西,难道以后还要分32位和64位两个版本?显然那不符合我偷懒的个性,于是我想让他们兼容。
我能想出来的方法就两个:
- 从头再来,去找能兼容32位和64位的连接方法。 (啥,从头再来,能找到么,算了放弃吧)
- 用代码判断当前系统是32位还是64位然后选择相应的代码执行。(好吧,这个貌似容易一点,我选这个)
网上看到的判断系统64位的方法基本上都要声明API啥的,看了头晕,贴上去能用,还用用,结果贴了几个代码都用不起来(资质有限啊),果断放弃,还是走我的野路子吧。
网上看到使用Application.OperatingSystem可以查到系统的版本,具体显示的格式大概如下(我机器上的版本)
Windows (64-bit) NT 6.01
在32位的win7和XP上我也试了下,显示的格式也是这样,只不过括号里是32-bit和最后的版本号不一样。
既然这样,我就用InStr函数来判断Application.OperatingSystem返回的值里面是否包含字符”64-bit“,如果不包含就认为是32位的,如果包含,就认为是64位的。定义了一个公共变量(为了方便其他位置调用),用来传递不同的链接代码,给一段我的代码(业余选手,多多指正)。
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()
'---------------------------------------------------------------- 判断系统是否为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:第一次发这样的帖子…………
附上64位AccessDatabaseEngine在百度云的下载地址,想该比微软速度要快点的吧 http://pan.baidu.com/s/1pJ0jhFl
补充内容 (2015-1-11 13:28):
后来发现Provider=Microsoft.ACE.OLEDB.12.0;Data Source=文件路径;HDR=YES; 可以用的,看来是我原来写的时候有没注意到的细节 |
评分
-
2
查看全部评分
-
|