ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 6839|回复: 9

[分享] 关于如何在窗体间传递参数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-4-5 22:25 | 显示全部楼层 |阅读模式
如何在窗体间传递(包括发送、接收、回传)参数。这是一个 ACCESS 开发者经常碰到的问题。多数 ACCESS 开发者应掌握以下几种参数传递的方式。
由于我们需要讲述的是参数的来回传递,所以在讲述各种方式的时候我们需要从两个方面来讲述,一方面是发送参数的窗体,一方面是接收参数的窗体。

1、直接对指定窗体进行操作,比如:
发送参数的窗体的代码如下:
'窗体 FormNameA 发送参数
'窗体 FormNameB 接收参数,窗体 FormNameB 其实是一个公用窗体,他可以被其他多个窗体调用,处理数据后返回数据给发送方窗体(比如窗体 FormNameA)
Function ParameterSend1()
    DoCmd.OpenForm "FormNameB"
    If IsLoaded("FormNameB") = True Then
        Forms("FormNameB").Controls("ControlInTheForm").Value = "Value"
    End If
End Function

Function IsLoaded(ByVal strFormName As String) As Boolean
' 如果指定窗体在窗体视图或数据表视图中打开,返回 True。
    Dim oAccessObject As AccessObject
   
    Set oAccessObject = CurrentProject.AllForms(strFormName)
    If oAccessObject.IsLoaded Then
         If oAccessObject.CurrentView <> acCurViewDesign Then
            IsLoaded = True
        End If
    End If
End Function

接收参数的窗体无需任何代码。

如果接收参数的窗体在将数据处理后需要回传该如何呢?
代码如下:
Function ParameterResponse1()
    If IsLoaded("FormNameA") = True Then
        Forms("FormNameA").Controls("ControlInTheForm").Value = "Value"
    End If
End Function

优点:代码直接;参数不易丢失;回传对象确定简单明了
缺点:没有主、从关系;回传对象确定简单不利于重用

[ 本帖最后由 lrlxxqxa 于 2011-5-19 13:35 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-4-5 22:25 | 显示全部楼层

2、可以使用全局变量来传递参数

2、可以使用全局变量来传递参数
在模块中用 PUBLIC 申明一个变量
Public strParameter2 As String

发送参数的窗体代码如下:
Function ParameterSend2()
    strParameter2 = "Value"
    DoCmd.OpenForm "FormNameB"
End Function

接收参数的窗体需要在“打开”事件中编程
Private Sub Form_Open(Cancel As Integer)
    'Function ParameterSend2()
    '接收方主动去全局变量中询问,然后赋值给窗体上的控件
    Me.ControlName.Value = strParameter2 = "Value"
End Sub

如果需要回传,则代码类似方法1
Function ParameterResponse2()
    If IsLoaded("FormNameA") = True Then
        Forms("FormNameA").Controls("ControlInTheForm").Value = "Value"
    End If
End Function

优点:代码直接;有主从关系;回传对象确定简单明了
缺点:参数容易丢失,特别是出现未处理错误时所有变量将被重置;回传对象确定简单不利于重用

[ 本帖最后由 lrlxxqxa 于 2011-5-19 13:36 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-4-5 22:26 | 显示全部楼层

3、使用Docmd.OpenForm 的一个参数 OpenArgs 来传递参数,并使其回传可以通用

3、使用Docmd.OpenForm 的一个参数 OpenArgs 来传递参数,并使其回传可以通用。
OpenArgs说明请参考帮助:

OpenArgs     可选 Variant 型。字符串表达式,用于设置窗体的 OpenArgs 属性。而后该设置可用于窗体模块中的代码,例如 Open 事件过程。OpenArgs 属性也可以在宏和表达式中引用。

例如,假定打开的是一个客户列表的连续窗体。如果希望当窗体打开时焦点移到特定的客户记录上,则可以使用 openargs    参数指定客户名称,然后使用 FindRecord 方法,将焦点移到指定的客户名称的记录上。

该参数仅在 Visual Basic 中才可用。

但是为了满足可重用的条件,在生成参数时需要特殊处理一下:
strParameter = "Return" & ";" & Me.Name & ";" & ActiveControl.Name & ";"

以 "参数值;窗体名;控件名;" 这样的字符串格式发送 OpenArgs 参数,这里取的是当前窗体的当前控件,实际操作中也可以更改。
发送参数的窗体代码如下:
Dim strParameter as String
strParameter = "Return" & ";" & Me.Name & ";" & ActiveControl.Name & ";"
DoCmd.OpenForm "FormNameB", , , , , , strParameter

接收参数的窗体则需要对窗体的OpenArgs属性进行处理
sub command1_click()
    If IsNull(Me.OpenArgs) = False Then
        Dim strA() As String
        strA = Split(Me.OpenArgs, ";")
        If strA(0) = "Return" Then
            Forms(strA(1)).Controls(strA(2)).Value = Me.TypeName.Value
            DoCmd.Close acForm, Me.Name
        End If
    End If
end sub

这样,接收方窗体既可以接收参数,也可以处理参数,还能够按照发送方(主控方)窗体的要求回传数据到指定位置。

优点:有主从关系;回传对象可由主控方定义;利于窗体的重复调用
缺点:代码相对复杂;参数不能永久保存

[ 本帖最后由 lrlxxqxa 于 2011-5-19 13:36 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-4-5 22:28 | 显示全部楼层

4、使用AccessObjectProperty对象的自定义属性来传递、存储参数

4、使用AccessObjectProperty对象的自定义属性来传递、存储参数
在AccessObjectProperties 集合中就包含了某个ACCESS对象的自定义属性。读者可以使用AccessObjectProperties集合中AccessObjectProperty对象的Add方法来给特定对象(如:Form对象)来添加用户自定义属性。Add方法的语法如下:
expression.Add(PropertyName, Value)

发送参数的窗体的代码如下:
Dim strParameter as String
strParameter = "Return" & ";" & Me.Name & ";" & ActiveControl.Name & ";"
CurrentProject.AllForms("FormNameB").Properties.Add "Parameter4", strParameter
DoCmd.OpenForm "FormNameB"

接收参数的窗体的代码如下:
sub command1_click()
    On Error Resume Next
    If IsNull(CurrentProject.AllForms(Me.Name).Properties("Parameter4")) = False Then
        Dim strA() As String
        strA = Split(CurrentProject.AllForms(Me.Name).Properties("Parameter4"), ";")
        If strA(0) = "Return" Then
            Forms(strA(1)).Controls(strA(2)).Value = Me.TypeName.Value
            DoCmd.Close acForm, Me.Name
        End If
    End If
end sub

有点:有明确的主从关系;回传对象可由主控方定义;利于窗体的重复调用;参数可以永久保存
缺点:代码更复杂,需掌握的对象较多;

[ 本帖最后由 lrlxxqxa 于 2011-5-19 13:36 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-4-5 22:30 | 显示全部楼层

其他方法

还有其他方法,比如:使用窗体的既有属性:Caption、Tag 等属性传递参数关于其他方法;将参数存储在表中等等,基本优缺点类似上述方法这里就不再叙述了。

[ 本帖最后由 lrlxxqxa 于 2011-5-19 13:36 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-4-5 22:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

引来源:web521.com 的一篇资料.

1、使用openargs

在调用的窗体使用如下语句:

docmd.openform "被调用的窗体", , , , , , "参数值"

在被调用的窗体使用me.openargs即可获取传递过来的参数

2、使用全局变量

先设置一个全局变量,例如:gstrPara,

Public gstrPara as string

在调用之前传递参数值给这个全局变量

gstrPara="参数值"

docmd.openform "被调用的窗体"

在被调用的窗体里使用gstrPara即可获取传递过来的参数

3、使用tag标记

将要传递的参数放置在调用窗体的tag标记里

在被调用的窗体里通过调用 forms("调用的窗体").tag 来获取参数值

4、使用模块变量

在调用窗体设置一个公共的模块变量 mstrPara

将要传递的参数放置在调用窗体的mstrPara变量里

在被调用的窗体里通过调用 forms("调用的窗体").mstrPara 来获取参数值

5、直接获取

如果参数来自调用窗体的控件,也可直接调用

在被调用的窗体里直接引用调用窗体的控件的值 如:forms("调用的窗体").控件名.value

6、多个参数传递

如果需要传递多个参数,可将参数合并到一个变量里传送(使用指定符号隔开),然后在被调用窗体再拆分这些变量,以达到多个参数传递的效果。

不过,因为一般传递两个参数的时候,多数一个是变量,一个是窗体本身,

所以我常用的方法也是比较实用的方法是:

在调用窗体使用如下语句:

docmd.openform "被调用的窗体", , , , , , "参数值"

而在被调用的窗体里设置一个模块变量 mfrmSrc

在被调用的窗体的open或load事件中设置

set mfrmSrc= screen.activeform

这时mfrmSrc就指向原来的调用窗体(因为在窗体未完全加载好前,屏幕上激活的窗体是原来的窗体)

使用mfrmSrc你可以获取调用窗体上所有控件及相关的值,并且不需要事先知道原来窗体的名称,具有比较强的通用性。

应该还有更多更好的参数传递方法,不一一举例,也希望大家共同讨论这个话题,相关回复请发表评论。

[ 本帖最后由 lrlxxqxa 于 2011-5-19 13:36 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-4-22 22:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
好文章!!!

TA的精华主题

TA的得分主题

发表于 2011-5-11 13:44 | 显示全部楼层
有没有实倒参考一下?谢谢!

TA的精华主题

TA的得分主题

发表于 2011-5-12 16:47 | 显示全部楼层
慢慢学习了,谢楼主。有附件会更好参考学习。

TA的精华主题

TA的得分主题

发表于 2011-5-16 17:00 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-11 14:08 , Processed in 0.023548 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表