ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

如何让Function过程在任意工作表里的VBA调用?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2004-5-25 10:13 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:XLA加载宏开发

在编写Excle应用程序过程当中,发现有许多完全一样的代码需要在不同的工作表里调用,如果在每个工作表里都编写或复制同样的代码总觉得效率不高,同时程序代码也会过于冗长。我曾在论坛里问过这个问题,似乎没有人真正解决了我的问题。我知道可以将Function 过程另存为加载宏然后在Excle里通过工具菜单里的加载宏来调用自定义的函数。但经过这样处理的Function只能在工作表里的单元格里使用,并不能在VBA宏代码里使用!!我需要的是将某些完全一样的VBA动作(很多动作并不是简单的进行数字计算统计,有些Function中甚至还包括打开工作表,删除工作表,保存工作表等等动作)编成Function过程让任意工作表里的VBA调用,下面的Function只是我经常要用到的其中的一个,我还有很多Function过程也同样需要让别的工作表调用。

我相信还有许多朋友有同样的需求和困惑,我在这里再次发起这个话题,希望对我们编程有更多的启发,也希望各路高手纷纷拿出自己的绝活来指点指点我等菜鸟。

Public Function recon(sh As Variant, col As String, row As Integer) '该函数用于统计数据库里记录个数 'sh代表某个工作薄中的某个工作表,col代表列号如"A",row代表行号如3 Dim check As Boolean recodernum = row: check = False With sh Do If .Range(col & row) = "" Then check = True Else row = row + 1 End If Loop Until check = True End With recodernum = row - recodernum End Function

TA的精华主题

TA的得分主题

发表于 2004-5-25 10:24 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2004-5-25 10:26 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2004-5-25 21:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

如何做成DLL,这也是我关注的,能细讲讲吗?

TA的精华主题

TA的得分主题

发表于 2004-5-25 22:21 | 显示全部楼层
楼主所言: 我知道可以将Function 过程另存为加载宏然后在里通过工具菜单里的加载宏来调用自定义的函数但经过这样处理的Function只能在工作表里的单元格里使用并不能在VBA宏代码里使用 这样处理的Function可以在VBA中调用,请参看: Run 方法 语法 1:执行一个宏或者调用一个函数。可用于执行用 Visual Basic 或 Microsoft Excel 4.0 宏语言编写的宏, 或者调用 DLL 或 XLL 中的函数 语法 1 expression.Run(Macro, Arg1, Arg2, ...)
[此贴子已经被作者于2004-5-25 22:32:10编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2004-5-27 21:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢yachtz大侠,经过试用expression.Run(Macro, Arg1, Arg2, ...),基本达到了我想要的结果,谢谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2004-5-31 09:48 | 显示全部楼层

为何无法正确传递参数计算的结果值?

我用下列代码实现从订单记录库中读取满足某一特定记录编号的所有记录:

sub readdetail()

dim sh:set sh=sheets("订单记录库")

co=1:jlhao=102

xx = Application.Run("myfunction.xla!orderdetail", jlhao, sh, co, ddanxinxi, k, y)

msgbox k,y

end sub

式中ddanxinxi为一个二维数组,k,y表示该二维数组的两个上限值,因为每个订单的条数都不一样。

为何k和y的值不能正确传递出来?msgbox 看到的结果是空值。

请各路高手帮我解决此问题。拜谢啦!!!!

加载宏myfunction.xla中相应的VBA代码如下:

Public Function orderdetail(searchvalue, sh, co, ordermesg, k, y) '该函数用于查询某一工作表中满足某一searchvalue的所有连续的记录的详细情况 x = sh.Cells(65525, co).End(xlUp).Row - 1 'Sheets("详情")中的记录条数 For i = 1 To x If searchvalue = sh.Cells(i + 1, co) Then k = 1: y = sh.[IV1].End(xlToLeft).Column Do ReDim Preserve ordermesg(y, k) For j = 2 To y ordermesg(j, k) = sh.Cells(i + k, j) Next j k = k + 1 Loop Until searchvalue <> sh.Cells(i + k, co) k = k - 1 '由于最后一条记录不满足查询要求所以必须去除掉 Exit For End If Next i End Function

TA的精华主题

TA的得分主题

发表于 2004-5-31 09:58 | 显示全部楼层
Public Function orderdetail(searchvalue, sh, co, ordermesg, k, y)中的k,y是你在调用函数时赋于函数的参数,而不是由函数返回的值.

TA的精华主题

TA的得分主题

 楼主| 发表于 2004-5-31 10:30 | 显示全部楼层

那么请问wenz大侠,怎样才能达到我想要的结果(即:准确的返回k,y的计算值)。其实如果不将该Function放在加载宏里而是直接放在sub所在的模块里调用能准确地返回k,y之值,因为我类似的Function很多,且在很多地方要用到,所以我就制成加载宏以便共享。

想必您一定有办法帮助我解决这个问题。请赐教!!!多谢多谢!!!

TA的精华主题

TA的得分主题

发表于 2004-5-31 10:52 | 显示全部楼层

sub readdetail() dim sh:set sh=sheets("订单记录库") co=1:jlhao=102 xx = Application.Run("myfunction.xla!orderdetail", jlhao, sh, co, ddanxinxi, k, y) 中ddanxinxi, k, y没有赋值,去掉试试.

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-20 19:38 , Processed in 0.068262 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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