求助,EXCEL通过VBA *** 作SQL数据库

求助,EXCEL通过VBA *** 作SQL数据库,第1张

在EXCEL 的 代码编辑窗口,使用菜单 工具-引用,勾选

Microsoft ActiveX Data Object 26 Library 或其他版本

这样引用了VB的ADODB对象模型,其他使用办法与VB环境完全一样。

sql一般用在多条件查询,对数据库读写等。

1 VBA如何建立sql连接

A.在VBA Project 窗口中,“工具—引用—Microsoft ActiveX Data Objects 20 Library”,如下图所示

B. VBA语句

Private Sub CommandButton1_Click()

Dim cnn As ADODBConnection’定义变量

Dim sql$, Stext$, i As Integer

Worksheets(3)CellsClear

Stext = IIf(TextBox1Value = "", "", TextBox1Value)

Set cnn = CreateObject("adodbconnection")’生成对象

cnnOpen "Provider=MicrosoftJetOLEDB40;Extended Properties=Excel 80;Data Source=" & ThisWorkbookFullName’打开数据库

If TextBox1 = "" Then

sql = "select from [sheet2$]"’sql语句

Else

sql = "select from [sheet2$] where 姓名 like '" & TextBox1Value & "'"

End If

Worksheets(3)[a1]CopyFromRecordset cnnExecute(sql)’执行sql语句

cnnClose

Set cnn = Nothing

End Sub

2 sub text()

Dim cnn As ADODBConnection’定义变量

Dim rs as adodbrecordset

Set cnn = CreateObject("adodbconnection")’生成对象,若定义变量时为Dim cnn As New ADODBConnection,此句可省略

cnnOpen "Provider=MicrosoftJetOLEDB40;Extended Properties=Excel 80;Data Source=" & ThisWorkbookFullName’打开数据库

sql = "select from [sheet2$] where 姓名 like '" & TextBox1Value & "'"

rsopen sql,cnn,adOpenKeysetadLockOptimistic’生成查询记录,为后面出书数据准备

Worksheets(3)[a1]CopyFromRecordset rs

end sub

________________________________________________________________________

以下根据网络整理

2 Select SQL语句

SELECT FROM table_name WHERE column1 = xxx [AND column2 > yyy] [OR column3 <> zzz]

''表示全部的栏位都列出来,如果不全部列出,则可以写字段名称如 学号,姓名……;WHERE 之后是接条件式,把符合条件的资料列出来,table_name如果为工作表名称,书写格式[工作表名$],下同。

SELECT column1,AVG(column2) FROM table_name GROUP BY column1 HAVING AVG(column2) > xxx

说明: 1GROUP BY: 以column1 为一组计算 column2 的平均值必须和 AVG、SUM等整合性查询的关键字一起使用。2HAVING : 必须和 GROUP BY 一起使用作为整合性的限制。

复合性的查询:SELECT FROM table_name1 WHERE EXISTS (SELECT FROM table_name2 WHERE conditions )

说明:1WHERE 的 conditions 可以是另外一个的 query。2 在此是指存在与否。

SELECT column1,columns2,FROM table_name

说明:把table_name 的特定栏位资料全部列出来

SELECT COUNT () FROM table_name WHERE column_name = xxx

说明:查询符合条件的资料共有几笔。

1计算出总和,所选的栏位必须是可数的数字形态。2除此以外还有 AVG() 是计算

SELECT SUM(column1) FROM table_name

说明:平均、MAX()、MIN()计算最大最小值的整合

SELECT FROM table_name1 WHERE column1 BETWEEN xx AND yy

说明:BETWEEN 表示 column1 的值介於 xx 和 yy 之间。

3 update SQL语句

UPDATE table_name SET column1='xxx' WHERE conditoins

说明:1更改某个栏位设定其值为'xxx'。

2conditions 是所要符合的条件、若没有 WHERE 则整个 table 的那个栏位都会全部被更改。

4 deletesql语句

删除资料: DELETE FROM table_name WHERE conditions

说明:删除符合条件的资料。

说明:关于WHERE条件后面如果包含有日期的比较,不同数据库有不同的表达式

5.SQL中通配符用

• "%" 表示零个或多个,

• "_"表示任何单一字符

• [charlist] 字符列中的任何单一字符

• [^charlist] [!charlist] 不在字符列中的任何单一字符

• select from databasename where fieldname like '%XX%'

• SELECT FROM Persons WHERE City LIKE '[AOF]%'

• 从上面的 "Persons" 表中选取居住的城市以 "A" 或 "O" 或 "F" 开头的人

• SELECT FROM Persons WHERE City LIKE '[!AOF]%'

• 从上面的 "Persons" 表中选取居住的城市不以 "A" 或 "O" 或 "F" 开头的人

看你在什么环境下面用vba,

一般来说,将文本内容读出来,传递给给vba中设置sql语句的变量即可

比如excel的例子:

set

rsread

=

new

adodbrecordset

sqlstr

=

你所读到的文本文件内容

rsreadopen

sqlstr,

cnn,

adopenkeyset,

adlockoptimistic

rsreadmovefirst

首先在工具 引用 中引入ADO组件(全名叫Microsoft ActiveX Data什么的,很好好找),然后声明一个连接变量 conn as ADODBConnetion用来连接数据库,这里需要连接字符串,不知道你是什么类型数据库,所以连接字符串无法给出,再声明一个数据集变量ds as ADODB DATASET用于执行SQL语句并返回结果集,得到结果集之后就可以访问里面的内容了

可能是以下7个原因引起的,要分不同情况具体对待

1、Office(Access)的补丁更新造成的

最近office2016版本 2019版本的很多都出现这个问题了 ,是因为Office(Access)的补丁更新造成的。微软的Access有几次补丁出现过这个bug, 解决办法是一是退回之前稳定的版本,二是更新到最最新的版本

一般 使用帐户-更新选项-立即更新 一下即可

2、如果是Office2010 ,看是否网友xc555这种情况,可参考他的解决方法

先安装office 2010 sp2补丁,再卸载office 2010 sp2补丁 重启就成功了

PS:在网上找了N个解答,一直无法解决,看到一篇文章(说:sp2补丁会将vb编译器升至71,虽未解决)但受启发,尝试先安装sp2补丁,再卸载,结果就成功了

3、是因为中英文系统变化引起

中文系统做的程序到英文系统会出现这个问题,换系统 或 在英文系统重新设计相关窗体,而且模块使用可能遇到问题。或者在出现这个提示后选取消,再 *** 作几次,就不再出现,对有问题的功能重新设计 (千万不要点确定)

4、VBA环境或版本改变导致的

将C:\Program Files\Microsoft Office\root\VFS\ProgramFilesCommonX64\Microsoft Shared\VBA目录中的文件恢复至安装状态,出现这个问题的原因是VBA程序被修改,必须恢复未被修改的版本。 只要把旧版路径为vba\vba71下的vbe7dll文件拷贝替换到新安装的vba\vba71下替换就可以了 (先备份)

5、可能是VBA真正损坏了

可先备份当前数据库,再使用Access的压缩修复功能修复一下

6、还有可能是不同的版本混合交叉打开导致的(不兼容)

网友出现过:我的计算机上安装了Access 2010,并对前端Access文件的复制版本进行了一些更新。我重命名了更新的副本以替换原始访问文件,并将旧文件放在备份文件夹中。我需要在第二天进行另一次更新,但使用的***连接使访问前端文件成为一种痛苦,所以我远程进入一个承载该文件的服务器,并使用该服务器的Access 2007应用程序进行更新。文件版本是2007-2010,因此我不认为它会导致任何错误更新。但是,我不知道为什么。

在进行这些更新时,我从未更新过任何vba,也没有收到除了sql函数错误以外的任何类型的错误。每次都成功保存并压缩和修复前端。然后我的最终用户开始接收宏和vba错误,这些错误阻止他们打开文件或输入任何信息。我发现vba模块已从文件中完全删除。此外,每次使用Access 2010在自己的计算机上打开文件时,原始备份的每个备份和副本都会损坏,即使我没有单击“确定”继续删除VBA模块。如果没有收到vba错误,我无法打开单个文件。用户通过在Intranet站点上下载自己的副本来访问前端文件,这样就不会损坏实际的文件。当我尝试这样做时,文件仍然被损坏,甚至损坏了原始文件。我的同事能够找到一个干净的备份,最终用户能够恢复工作,但我不能触摸文件,否则它也会损坏。即使我使用shift+open跳过开始代码,我仍然会收到错误。我的同事正在运行Access 2013,在打开备份文件副本时未收到任何这些错误。

试过:

紧凑型维修

反编译/重新编译

Access 2010版本为14072245000(32位),因此已下载Office 2010 SP2

反编译不起作用,因为打开文件时我会立即收到vba错误(shift+open)。我没有新的访问更新要下载。我不能恢复到以前的版本,因为这不是我的公司可以接受的解决方案。我没有尝试将对象导入新的前端文件,因为每次打开文件时,都会删除或损坏VBA模块,因此无法导入或导出它们。我会失去所有的vba模块,因为我不是最初的开发人员,我不知道包括什么。我正在尝试更新2013年的访问权限,但这可能需要一段时间。

我读到的关于这个问题的所有信息都表明,当不同版本的access尝试打开同一个文件时,会发生这种情况,但是如果我使用access 2007和2010打开的文件的版本是2007-2010,为什么我仍然会得到这个错误如果这是2007年的问题,为什么我在使用2010年的同时还要损坏在使用2007年软件之前制作的每个备份文件,特别是如果其他人在使用2010年、2013年和2016年的时候能够很好地访问该文件

7、如果还不行,尝试将所有对象导入到一个新数据库文件

希望可帮到您!,也可关注我

以上就是关于求助,EXCEL通过VBA *** 作SQL数据库全部的内容,包括:求助,EXCEL通过VBA *** 作SQL数据库、vba sql查询、VBA可以读取.sql文件来执行里面的多条语句吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10136211.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存