`
tangleilei
  • 浏览: 13913 次
  • 来自: 上海
社区版块
存档分类
最新评论

vba command call procedure

 
阅读更多

simple sample

▲连接Oracle数据库

    Set cnn = CreateObject("ADODB.Connection")
     cnn.Open "Provider=msdaora;Data Source=dl580;User Id=emssxjk;Password=emssxjk;"


    dl580是tnsnames.ora中配置的服务名。

▲创建记录集recordset

    Set rst = CreateObject("ADODB.Recordset")
     sqls = "select * from tb_city"
     Set rst = cnn.Execute(sqls)

    这儿的SQL语句除了查询语句select以外,也可以用insert、update、delete等命令,也可以用truncate table这样的命令。这些SQL语句也可以用command对象完成。command对象还可以进行存储过程的调用并传递参数。


▲记录集结果的引用

Excel VBA 通过ADO取到数据后,有如下引用方式(假定记录集名字为rst):

1、字段数量:rst.fields.count;

2、字段名称:rst.fields(0).name,0表示第一个字段,其它字段分别是1,2,...rst.fields.count-1;

3、字段值:rst(0)或者rst(0).Value或者rst.fields(0).value,0表示第一个字段,也可以用字段名代替,如:rst("city");

4、整个记录集: Range("a2").CopyFromRecordset rst命令将记录集保存到A2单元格开始的工作表中;

5、记录移动:取数后记录定位在第一条,rst.movenext可以移动到下一条,结尾标志:rst.eof = true,Excel VBA只支持向前移动(rst.movenext);

6、记录数:rst.RecordCount是反馈记录数的,但在VBA中却总是反馈-1,不过可以根据rst.eof判断有无查询结果,如果rst.eof= true就表示查询结果为空。

▲调用存储过程

1、连接数据库,如前;

2、定义存储过程

     Set cmd = CreateObject("ADODB.Command")

    Set cmd.ActiveConnection = cnn
     cmd.CommandText = "zfqf_bag2mail"   '存储过程名称,有两个参数
     cmd.CommandType = adCmdStoredProc

3、参数赋值

     cmd.Parameters(1).Value = Cells(row1, pos_acc)
      cmd.Parameters(2).Value = Cells(row1, pos_lab)
4、执行存储过程

    cmd.Execute

这个存储过程的结果保存在表中,通过查询语句得到结果,没有通过变了返回。



1,不带参数的,直接在连接或Recordset 中用“EXEC 过程名”调用即可。
Private Sub cmdPrepareNewMinSalary_Click()
     Dim conEmployees As ADODB.Connection
     Dim strProcedure As String
    
     Set conEmployees = Application.CurrentProject.Connection
     strProcedure = "CREATE PROCEDURE SetNewMinSalary " & _
                    "AS " & _
                    "Update Employees " & _
                    "SET HourlySalary = 12.50;"
    
     conEmployees.Execute strProcedure
     conEmployees.Close
End Sub
调用程序如下:
Private Sub cmdNewMinSalary_Click()
     Dim conEmployees As ADODB.Connection
     Dim strProcedure As String
    
     Set conEmployees = Application.CurrentProject.Connection
     strProcedure = "EXECUTE SetNewMinSalary;"
    
     conEmployees.Execute strProcedure
     conEmployees.Close
End Sub

2,带一个参数的,也可以直接调用,如下例子
Private Sub cmdCreateProcedure_Click()
     Dim conEmployees As ADODB.Connection
     Dim strProcedure As String
    
     Set conEmployees = Application.CurrentProject.Connection
     strProcedure = "CREATE PROCEDURE SetNewMinSalary " & _
                    "(NewMinSalary Currency) " & _
                    "AS " & _
                    "Update Employees " & _
                    "SET HourlySalary = NewMinSalary " & _
                    "WHERE HourlySalary < NewMinSalary;"
                   
     conEmployees.Execute strProcedure
    
     MsgBox "The new stored procedure has been created."
     conEmployees.Close
End Sub

调用时直接输入一个参数。
Private Sub cmdExecuteProcedure_Click()
     Dim conEmployees As ADODB.Connection
     Dim strProcedure As String
    
     Set conEmployees = Application.CurrentProject.Connection
     strProcedure = "EXECUTE SetNewMinSalary 14.50;"
    
     conEmployees.Execute strProcedure
    
     MsgBox "The minimum hourly salary has been set to 14.50/hr"
     conEmployees.Close
End Sub

3:最麻烦的是带有多参数的,如下面的例子带有两个参数。
直接从SQL server复制过程如下:
CREATE PROCEDURE [dbo].[Max_2ExcelDB]
(
         @Territory varchar(10)='All',
         @Country varchar(10)='CN'
)
AS
         set nocount on
         if @Territory='All'
                 BEGIN
                         select * from CustomerDB
                         set nocount off
                 END
         else
                 begin
                         select a.* from CustomerDB a left join DistributorDB b
                         on a.Distributor=b.Distributor
                         where b.Territory in (@Territory,'Open') and a.Country=@Country
                 end
         set nocount off
调用程序如下,这时候就要请出ADODB.Command对象了:
Sub CallmyProc()
     Dim conn As ADODB.Connection
     Dim MyProc As ADODB.Command
    
     Dim sSql As String
     Dim SrcArr

     Set conn = New ADODB.Connection
     Set MyProc = New ADODB.Command
     conn.ConnectionString = connStr(1)
     conn.Open
    
     If conn.State = adStateOpen Then
         With MyProc
             .ActiveConnection = conn
             .Prepared = True
             .CommandText = "Max_2ExcelDB"
             .CommandType = adCmdStoredProc
             .Parameters.Append .CreateParameter("@Territory", adChar, adParamInput, 10, "South")
             .Parameters.Append .CreateParameter("@Country", adChar, adParamInput, 10, "CN")
             ThisWorkbook.Sheets("sheet4").Cells(1, 1).CopyFromRecordset .Execute
         End With
     Else
         MsgBox " 无法打开数据库"
     End If

     conn.Close
     Set conn = Nothing
     Set MyProc = Nothing
End Sub

4,更麻烦的是带有多参数,还有返回参数的,也是用Adodb.command对象解决。下面代码来自网络http://www.officefans.net/cdb/viewthread.php?tid=91224:
Set 连接 = CreateObject("ADODB.Connection")
Set 过程 = CreateObject("ADODB.Command")
连接.Open "Driver={SQL Server};Server=192.168.1.2;Database=数据库名_A;uid=共用登录;pwd=123456"
起始日期="2007-12-1"
截止日期="2008-3-1"
With 过程
.ActiveConnection = 连接
.Prepared = True
.CommandText = "vba_分数统计"
.CommandType = 4
.Parameters.Append .CreateParameter("@起始日期", 200, 1, 20, 起始日期)  ‘append 与后面的点. 需要加空格,即将createparameter返回值传给append方法。
.Parameters.Append .CreateParameter("@截止日期", 200, 1, 20, 截止日期)
.Parameters.Append .CreateParameter("@姓名", 200, 1, 50, Worksheets(2).Cells(2, 1).Value)
.Parameters.Append .CreateParameter("@返回分数", 2, 2)
.Execute
Worksheets(1).Cells(1,1).Value = .Parameters("@返回分数")
.Close
Set 连接 = Nothing
end with

create PROCEDURE pro1 
       @id int=10,
       @count int output
AS
BEGIN
	select  @count=COUNT(*) from test1 where id>@id;
end

既能返回数据集又能输出参数。
With command
    .ActiveConnection = con
    .CommandType = adCmdStoredProc
    .CommandText = "pro1"
    .Parameters.Append .CreateParameter(Name:="@id", Value:=0, Type:=adInteger)
    .Parameters.Append .CreateParameter(Name:="@count", Type:=adInteger, Direction:=adParamOutput)
    Set rs = .Execute()
    MsgBox .Parameters("@count").Value
End With



-----------------------------
分享到:
评论

相关推荐

    VBA Call WebService

    在“VBA Call WebService”的场景中,我们关注的是如何使用VBA来调用Web服务,尤其是通过SoapToolkit进行通信。 SoapToolkit是一个用于创建和消费SOAP(Simple Object Access Protocol)消息的工具,它使得VBA能够...

    dvb画圆源码VBA工程

    vba工程,画圆,源码 vba工程,画圆,源码 vba工程,画圆,源码 vba工程,画圆,源码 vba工程,画圆,源码

    commandbars应用

    在Microsoft Office应用程序中,"CommandBars"对象是VBA(Visual Basic for Applications)和宏编程中的一个重要概念,它主要用于管理用户界面中的各种命令按钮、菜单和工具栏。本资料包显然是一个关于`CommandBars`...

    二维码小工具 -VBA_二维码vba_二维码_二维码生成_VBa_VBA二维码_

    二维码小工具 - VBA_二维码vba_二维码_二维码生成_VBa_VBA二维码是一个使用VBA(Visual Basic for Applications)编程实现的Excel宏工具,它允许用户在Excel环境中生成二维码。VBA是Microsoft Office套件中内置的一...

    WPS支持VBA 7.1版本 VBA For WPS

    VBA(Visual Basic for Applications)是一种在Microsoft Office套件中广泛使用的编程语言,允许用户自定义功能、创建宏和自动化工作流程。WPS Office,作为Microsoft Office的替代品,也开始支持VBA,尤其是VBA 7.1...

    AutoCAD-VBA命令大全.zip_AutoCAD_VBA_CAD VBA 命令_VBa_autocad vba_cad命

    AutoCAD VBA(Visual Basic for Applications)是一种强大的编程工具,专为AutoCAD用户设计,用于扩展和自动化CAD软件的功能。这个“AutoCAD-VBA命令大全.zip”文件包含了一个名为“AutoCAD-VBA命令大全.doc”的文档...

    WPS支持VBA 7.1版本 VBA For WPS 2019(1)插件,大家打开vba组件所需

    本文将深入探讨WPS Office对于VBA(Visual Basic for Applications)的支持,特别是关于VBA 7.1版本及其相关的插件,以帮助用户更好地理解和利用这一功能。 VBA是Microsoft Office中内置的一种编程语言,允许用户...

    VBA代码助手专业版_VBa_VBA代码助手_

    VBA(Visual Basic for Applications)是Microsoft Office套件中内置的一种编程语言,它允许用户自定义各种应用程序的功能,包括Excel、Word、PowerPoint等。VBA代码助手专业版是一款专门针对VBA编程的辅助工具,...

    进销存管理系统(Excel VBA实现)_ExcelVBA_VBa_进销存_vba进销存管理_VBA进销存

    在Excel中结合VBA(Visual Basic for Applications)实现进销存管理,可以提供一种便捷且自定义化的解决方案,尤其适合中小企业或个人使用。下面将详细介绍这种系统的基本构成和关键功能,以及VBA在其中的应用。 ...

    VBA代码助手专业版3.7.8.0

    VBA代码库收藏管理, VBA中文代码库输入提示, VBA变量名首字母输入提示 VBA函数过程输入提示, VBA代码自动对齐排版, VBA代码混淆, VBA工程密码破解, Excel VBA模块隐藏保护, VBA颜色修改器, VBA代码行号显示 ...

    EXCEL VBA各种常用命令

    标题:EXCEL VBA各种常用命令 描述:本文汇总了VBA(Visual Basic for Applications)在Excel中的常用命令、对象、属性及用法,旨在帮助用户掌握自动化办公文档的高级技巧,提高工作效率。 ### 一、工作表保护与...

    EXCEL VBA函数手册.rar_Excel VBA_VBA excel_VBa_excel_vba excel

    vba函数说明,几乎所有vba函数的说明及实例

    【免费下载】ExcelVBA和WordVBA教程.rar

    VBA(Visual Basic for Applications)是Microsoft Office套件中内置的一种编程语言,它允许用户自定义功能、自动化任务,极大地提升了工作效率。本教程主要聚焦于Excel VBA和Word VBA,这两个工具在日常办公中有着...

    VBA manual(微软官方VBA手册)

    VBA手册是微软官方提供的关于Visual Basic for Applications(VBA)编程语言的指南,它主要面向使用MS Office 2010或MS Excel VBA进行自动化任务和创建宏的用户。VBA是为Office套件量身打造的编程语言,用于控制文档...

    VBA课件VBA入门

    VBA课件适用于VBA入门VBA入门VBA入门VBA入门VBA入门

    VBA操作数据库实例

    VBA(Visual Basic for Applications)是Microsoft Office套件中内置的一种编程语言,它允许用户自定义功能、自动化任务,甚至可以操作外部数据源,如数据库。在这个“VBA操作数据库实例”中,我们将深入探讨如何...

    文件目录管理VBA自动生成 (1)_VBA目录生成_VBa_VBA文件目录自动生成_vba自动目录_

    VBA代码通常包含模块(Module)、过程(Procedure)和变量声明。在VBA环境中,我们可以创建Sub过程来执行文件搜索和目录生成的任务。 以下是一个简单的VBA代码示例,用于遍历指定文件夹及其子文件夹,获取所有文件...

    VBA WPSVBA WPSVBA WPS

    VBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA WPSVBA ...

    Excel VBA视频教程 80集

    第001集:宏与VBA 第002集:VBA中的语句、对象、方法与属性 第003集:循环语句 第004集:判断语句 第005集:VBA变量 第006集:函数与公式 第007集: VBE编辑器 第008集:VBA分支与End语句 第009集: excel文件操作 第010集:...

Global site tag (gtag.js) - Google Analytics