vba的子程序或函数的参数传递和返回值

本文介绍了VBA编程的基础概念,包括子程序与函数的作用范围、静态变量的特点、option Explicit语句的作用及变量声明方法,并展示了如何在Access中编写及调用过程。

1、子程序和函数

 

1)

 

如果过程适用于整个应用程序,则范围为公共,否则为私有

如果是静态变量,则过程在反复调用时,其内部变量值仍保持

调用这些过程的方法是

call 过程名

2)option Explicit语句表示

变量在使用必须声明

声明的方式是

dim 变量名 as 类型

3)vba代码通常放置在2个位置

A)窗体类模块等access现有类模块

B)模块

可以编写所有窗体、报表公用的代码



 

 

2、参数接收

function test(name as String)

   MsgBox("my name is"& name)

end function

'下面是按钮事件

private sub cmdmsg_click()

   call test("张三")

end sub

 3、子程序等返回值

function test(name as String) as String

   test="my name is"& name

end function

<think>嗯,用户询问的是CAD VBA中自定义函数程序的区别。这个问题很专业,看来用户正在深入学习CAD二次开发。 参考用户提供的引用资料[2],里面有完整的函数子程序代码示例,非常适合作为分析素材。用户贴出的代码恰好包含了FunctionSub的典型用法,真是及时雨。 先看函数部分:那个juxing函数定义得很规范,有明确的Double类型参数AcadLWPolyline返回值类型。特别注意它最后通过Set赋值返回图形对象,这是VBA函数返回对象的标准写法。函数内部完成矩形绘制后,并没有直接执行阵列操作,说明函数更侧重"生成"功能。 再看子程序CommandButton1_Click:典型的Sub结构,Private限定作用域。它调用了juxing函数获取矩形对象,然后立即对这个对象执行阵列操作。这里展示了子程序作为"执行者"的特点——直接引发CAD图形变化。 用户可能在实际编程时遇到了困惑:比如该用函数还是子程序处理绘图操作?者不理解为什么有些代码能返回值有些不能。需要特别强调返回值这个核心差异,因为这在调试代码时非常关键——函数可以放在赋值语句右边,子程序只能单独调用。 用户提供的引用[1]提到VBA内置函数的使用规范,虽然不直接相关,但提到"VBA."前缀的用法,这个细节可以补充说明自定义函数调用时不需要加前缀,避免混淆。 考虑到用户正在学习,补充了关于参数传递调试的建议。特别是错误处理部分,因为CAD开发中图形操作容易出错,子程序里写On Error更实用。最后留的思考题特意选了参数传递这个函数特有的优势,帮助用户巩固理解。 </think>在CAD VBA中,自定义函数(`Function`)程序(`Sub`,子过程)的核心区别如下: --- ### **1. 返回值差异** - **`Function`** 必须通过函数名返回一个值(如对象、数值、字符串等)。 示例(引用[2]): ```vba Function juxing(...) As AcadLWPolyline '声明返回矩形对象 Set juxing = ThisDrawing.ModelSpace.AddLightWeightPolyline(jx_pt) '通过函数返回值 End Function ``` 调用时必须用 `Set` 接收返回值: ```vba Set xiangti = juxing(500, 600, 3000, 800) '返回值赋给xiangti ``` - **`Sub`** 无返回值,仅执行操作(如绘图、修改属性)。 示例(引用[2]): ```vba Private Sub CommandButton1_Click() '无返回值 Set xiangti = juxing(...) '调用函数并绘图 retObj = xiangti.ArrayRectangular(...) '执行阵列操作 End Sub ``` --- ### **2. 调用方式** - **`Function`** 可作为表达式的一部分赋值给变量: ```vba Dim rect As AcadLWPolyline Set rect = juxing(0, 0, 100, 50) '赋值调用 ``` - **`Sub`** 必须独立调用,不能参与赋值: ```vba CommandButton1_Click '直接调用,无赋值 ``` --- ### **3. 设计目的** - **`Function`** 封装**可复用计算逻辑**,例如生成特定图形(矩形、圆)、数学计算等。结果用于后续操作。 - **`Sub`** 封装**执行流程**,例如响应按钮事件、批量修改图形属性、组合多个函数完成复杂任务。 --- ### **4. 参数传递** - **两者均可使用参数** 但 `Function` 的参数常用于生成结果(如输入坐标生成矩形),而 `Sub` 的参数多用于控制操作(如行距、列距)。 --- ### **5. 常见用途对比** | **特性** | `Function` | `Sub` | |-------------------|--------------------------------|--------------------------------| | 返回值 | 必有(对象、数值等) | 无 | | 调用方式 | 赋值语句 (`Set`/`=`) | 独立语句 | | 典型场景 | 生成图形、计算数据 | 事件响应(如按钮点击)、流程控制 | | 能否修改对象属性 | 可以(但主要目的是返回值) | 主要用途 | > 引用[2]中同时演示了两者:`juxing` 函数生成矩形对象,`CommandButton1_Click` 子过程调用函数并对结果阵列。 --- ### **关键总结** - ✅ **用 `Function`**:需要**返回结果**(如生成图形对象、计算结果)。 - ✅ **用 `Sub`**:仅需**执行操作**(如响应事件、批量处理图形)。 - 🔧 混合使用:通常用 `Sub` 调用 `Function`,结合两者优势(如先计算再操作)[^2]。 --- ### 相关问题 1. 如何在CAD VBA中让函数返回多个值? 2. `Sub` 能否通过参数传递修改调用者的变量? 3. 为什么函数返回对象时必须用 `Set`? 4. CAD VBA中如何避免函数子程序命名冲突? > 提示:引用[2]的代码展示了 `Function` 返回对象 `Sub` 调用函数的典型场景,是理解两者协作的范例[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值