Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: 爱疯

[已解决]Application.Run 方法和Call 语句的区别

  [复制链接]
 楼主| 发表于 2011-6-29 15:59 | 显示全部楼层
本帖最后由 爱疯 于 2011-6-29 17:47 编辑
leolee82 发表于 2011-6-29 13:10
RUN可以调用其他文件中的函数,也可以传参数进去
Application.Run "'F:\...\Xla Classic\file\print multi ...


谢谢82!
我在实验这么做,不知道怎么,老没成功 .... 我再44
ff345.gif

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

发表于 2011-6-29 16:21 | 显示全部楼层
本帖最后由 sanbe 于 2011-6-29 17:07 编辑

吕布说得是对的

Sub test()
Call test1("test")
Call test2("test")
For i = 1 To 2
    Application.Run "test" & i, "test"
Next
End Sub

Sub test1(ByVal strI As String)
Debug.Print strI
End Sub
Sub test2(ByVal strI As String)
Debug.Print strI
End Sub

在VB.net中用CTYPE将字符串转换成过程名
在EXCEL和VB中使用RUN进行字符串转换成过程名

刚才测试了一下,VB.net、VB、EXCEL中都支持Application.Run


回复

使用道具 举报

发表于 2011-6-29 17:09 | 显示全部楼层
调用文件只对宏文件有效,对EXCEL中的宏无效
回复

使用道具 举报

发表于 2011-6-29 17:19 | 显示全部楼层
本帖最后由 sanbe 于 2011-6-29 17:21 编辑

这样的话Application.Run 方法和Call 语句的区别就是:
Application.Run 可以将字符串转换成过程名,也可以将单元格内容转换成过程名
Call只能直接运行



这个很有用处,以前在EXCEL中没用过将字符串转换成过程名,后来在用vb.net时好多特定环境中需要这样做,只是net里有CTYPE,所以没机会用run,今天也算跟着爱疯学习了{:3512:}

PS:难怪喵师妹对爱疯推崇之极,今天领教了
回复

使用道具 举报

 楼主| 发表于 2011-6-29 18:11 | 显示全部楼层
谢谢sanbe版!
不知13楼是对9楼的赞同吗?由于我11楼没给出合示例证明9楼,所以仍得向大家求教。
14楼对8楼的阐述,比10楼更妥当,且给出不同环境的测试结果。学习了!

这么比较,也是想知道它们各自优势,即:
什么情况下,建议使用Application.Run 方法
什么情况下,建议使用Call 语句



PS:9楼的话,还是没明白,再等等吧
回复

使用道具 举报

发表于 2011-6-29 19:24 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sanbe 于 2011-6-29 19:25 编辑
爱疯 发表于 2011-6-29 18:11
谢谢sanbe版!
不知13楼是对9楼的赞同吗?由于我11楼没给出合示例证明9楼,所以仍得向大家求教。
14楼对8 ...


13楼是对9楼的认同,之所以你没有明白,你没仔细看帮助文件,9楼用法见附件
application.run方法适用范围:
1、在无法直接使用过程名时
2、获取的过程名是字符串时
3、需要调用未加载的加载宏文件时(这个功能很有用,这样可以减少启动工作簿时加载过多造成文件打开缓慢,需求时再加载)
4、跨工作表过程调用(跨工作簿没试过,理论上可以,有兴趣测试一下,PS:爱疯的引用宏的字符串肯定写错了)
5、还有其它范围没有测试过(比如调用自定义函数等等)

call就不用讲了吧?直接调用模块内过程

附件代码如下:

test.xls模块代码:

  1. Sub test()
  2. Application.Run "'" & Application.ActiveWorkbook.Path & "\test.xla'!test"
  3. Application.Run "'" & Application.ActiveWorkbook.Path & "\test.xla'!test1", "test"
  4. Application.Run "Sheet1.test1"
  5. End Sub
复制代码
test.xls sheet1代码:

  1. Sub test1()
  2. Range("A3") = "这样也可以调用"
  3. End Sub
复制代码
test.xla代码:

  1. Public Sub test()
  2.     Range("A1") = "不带参数"
  3. End Sub

  4. Public Sub test1(ByVal str As String)
  5.     Range("A2") = "参数为:" & str
  6. End Sub
复制代码

test.rar

15.38 KB, 下载次数: 25

回复

使用道具 举报

 楼主| 发表于 2011-6-29 21:22 | 显示全部楼层
sanbe 发表于 2011-6-29 19:24
13楼是对9楼的认同,之所以你没有明白,你没仔细看帮助文件,9楼用法见附件
application.run方法适用范 ...

看了16楼,这才发现9楼开头是:双引号+单引号+..... ,明白9楼意思了


试了下:
3、调用未加载的工作簿(.xls)时,也可 1.rar (20.82 KB, 下载次数: 15)
回复

使用道具 举报

 楼主| 发表于 2011-6-29 21:24 | 显示全部楼层
谢谢无聊的疯子,吕布,82!
又把我给为难了
回复

使用道具 举报

发表于 2011-6-30 09:15 | 显示全部楼层
参数的传递方法也可以与OnTime方法或菜单的OnAction的一致:
传递参数到OnTime方法和OnAction属性所调用的宏程序中
因为运用Application.OnTime或Object.OnAction调用宏程序的语法基本相似,因此,下面介绍的OnTime方法所使用的语法同样适用于OnAction属性。
为了便于理解,以下介绍均使用一段相似的代码,只不过传递给所调用宏程序MyProcedure的参数不同而已,以此来讲解传递给宏程序不同参数的方法。例如,下面的代码将使MyProcedure宏程序在从现在起的2秒后运行:
Application.OnTime Now + TimeValue("00:00:02"), "MyProcedure"
问题1:假设MyProcedure宏程序接受参数,如何传递参数到该宏程序中?有下面几种情形:
(1)所调用的宏程序接受一个参数
如果是在正常代码过程中传递参数给宏程序,可以使用" MyProcedure (42)",其中“42”为传递给MyProcedure程序的参数。但如果这样的传递参数方法用在OnTime方法中,该程序将不会运行。
正确的语法是外层为双引号,内层再加上一组单引号,里面是程序名和程序所接受的参数。如下所示:
’MyProcedure宏程序接受一个数值参数
Application.OnTime Now + TimeValue("00:00:02"), "’ MyProcedure 42’"
(2)所调用的宏程序接受多个参数
如果所调用的宏程序接受几个参数,那么在这些参数之间应该用逗号分隔。如下所示:
’MyProcedure宏程序接受两个数值参数
Application.OnTime Now + TimeValue("00:00:02"), "’MyProcedure 42, 13’"
(3)所调用的宏程序接受字符串参数
如果所调用的宏程序所接受的参数是字符串,因为字符串已经带有一对双引号,因此应该将字符串包含在双层双引号中,即字符串参数周围有两对双引号。如下所示:
’MyProcedure宏程序接受一个字符串Hello!作为其参数
Application.OnTime Now + TimeValue("00:00:02"), "’MyProcedure ""Hello!""’"
问题2:当MyProcedure宏程序所接受的参数是变量,如何传递参数到该宏程序中?  
(1)该变量为局部变量,用如下所示的方式。
’MyProcedure宏程序接受一个字符串变量strText参数,该变量为局部变量
strText = "Hello!"
Application.OnTime Now + TimeValue("00:00:02"), "’MyProcedure """ & strText & """’"
(2)该变量为全局变量,用如下所示的方式,即不必加双层双引号。
’MyProcedure宏程序接受一个字符串变量g_strText参数,该变量必须声明为公有的
g_strText = "Hello!"
Application.OnTime Now + TimeValue("00:00:02"), "’MyProcedure g_strText’"
注意,在这种情况下变量必须声明为公共变量,否则MyProcedure宏程序将不能找到该变量参数。

点评

谢谢了  发表于 2011-6-30 10:28
回复

使用道具 举报

发表于 2015-8-15 17:01 | 显示全部楼层
爱疯 发表于 2011-6-29 11:03
你的意思是,两者作用一样,只是语句的表达不同?
。。。。。。怎么还是感觉很忐忑啊

这个帖子真不错,我正好有个关于他们两个的问题,爱疯你帮我看看:

用 run 是不是不能像 call 那样 把参数返回?
http://www.excelpx.com/thread-368957-1-1.html
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-17 07:07 , Processed in 0.233760 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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