Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3071|回复: 9

[已解决]【求教】替换宏语句执行n次的问题(高手请进)

[复制链接]
发表于 2010-3-31 15:03 | 显示全部楼层 |阅读模式

替换宏语句执行n次的问题

Sub call3次()
 ThisWorkbook.VBProject.VBComponents("模块1").CodeModule.ReplaceLine 6, " Range(""C2:C"" & R) = ""=A2*100"""
Call 试验
 ThisWorkbook.VBProject.VBComponents("模块1").CodeModule.ReplaceLine 6, " Range(""D2:D"" & R) = ""=A2*10000"""
Call 试验
End Sub

这里替换了宏语句2次,可第二次替换的该宏不能得到运行(实际运行的换是第一次替换宏语句的宏得到执行),

请求怎么做到替换宏语句可以执行当次替换后宏。

 

1Gusi7VB.rar (8.28 KB, 下载次数: 12)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2010-3-31 17:38 | 显示全部楼层
回复

使用道具 举报

发表于 2010-4-1 13:14 | 显示全部楼层

QUOTE:
以下是引用xdwy81129在2010-3-31 17:38:00的发言:
这个也请老师帮助下,顶下

我也期盼下答案
回复

使用道具 举报

 楼主| 发表于 2010-4-2 15:13 | 显示全部楼层

自己顶下

回复

使用道具 举报

发表于 2010-4-2 16:04 | 显示全部楼层    本楼为最佳答案   

MS不行了。

现在的高级语言都是通过编译(将高级语言转换为计算机语言)来生成目标程序,然后再执行。

在编译的时候,那个“试验”子过程是作为一个整体编程目标程序的。所以在编译的时候,“试验”子过程已经生成,你之后源码的改变并不能改变编译后的程序。换句话说,你仅仅改变了源代码,却没有改变真正执行的代码,因为真正执行的代码在你改变源代码之前已经生成。

这里有个很奇怪的现象,你可以试试看先进行编译,然后再运行。
先进行编译的话,子程序和主程序同时编译。这个时候你可以看到,始终执行的是Range("D2:D" & R) = "=A2*10000"

照理说直接运行的时候,也会先进行编译,然后再执行。按照这个逻辑,应该始终执行的是Range("D2:D" & R) = "=A2*10000"

但是实际情况,VBA在直接运行的时候,子程序是在第一次运行前编译成目标程序的。编译后的子程序在第二次运行的时候不会再次编译,所以出现了只执行第一次改变后始终执行第一次的语句。

回复

使用道具 举报

发表于 2010-4-2 20:06 | 显示全部楼层

我也想知道

回复

使用道具 举报

 楼主| 发表于 2010-4-4 15:36 | 显示全部楼层

QUOTE:
以下是引用amulee在2010-4-2 16:04:00的发言:

MS不行了。

现在的高级语言都是通过编译(将高级语言转换为计算机语言)来生成目标程序,然后再执行。

在编译的时候,那个“试验”子过程是作为一个整体编程目标程序的。所以在编译的时候,“试验”子过程已经生成,你之后源码的改变并不能改变编译后的程序。换句话说,你仅仅改变了源代码,却没有改变真正执行的代码,因为真正执行的代码在你改变源代码之前已经生成。

这里有个很奇怪的现象,你可以试试看先进行编译,然后再运行。
先进行编译的话,子程序和主程序同时编译。这个时候你可以看到,始终执行的是Range("D2:D" & R) = "=A2*10000"

照理说直接运行的时候,也会先进行编译,然后再执行。按照这个逻辑,应该始终执行的是Range("D2:D" & R) = "=A2*10000"

但是实际情况,VBA在直接运行的时候,子程序是在第一次运行前编译成目标程序的。编译后的子程序在第二次运行的时候不会再次编译,所以出现了只执行第一次改变后始终执行第一次的语句。

难道真的没有办法了?????

回复

使用道具 举报

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

QUOTE:
以下是引用xdwy81129在2010-4-4 15:36:00的发言:

难道真的没有办法了?????

希望能有其他的办法做到下。

等待下看看。

回复

使用道具 举报

发表于 2010-4-5 11:14 | 显示全部楼层

再制一个模块。好象只能这样子了。试验1,放在模块3中,和模块1原样一样。

Sub call3次()
 ThisWorkbook.VBProject.VBComponents("模块1").CodeModule.ReplaceLine 6, "range(""C2:C"" & R)=""=A2*10"""
 Call 试验
 ThisWorkbook.VBProject.VBComponents("模块3").CodeModule.ReplaceLine 6, "range(""D2:D"" & R)=""=A2*10000"""
 Call 试验1
End Sub

回复

使用道具 举报

 楼主| 发表于 2010-4-9 10:14 | 显示全部楼层

QUOTE:
以下是引用开辆小富康在2010-4-5 11:14:00的发言:

再制一个模块。好象只能这样子了。试验1,放在模块3中,和模块1原样一样。

Sub call3次()
 ThisWorkbook.VBProject.VBComponents("模块1").CodeModule.ReplaceLine 6, "range(""C2:C"" & R)=""=A2*10"""
 Call 试验
 ThisWorkbook.VBProject.VBComponents("模块3").CodeModule.ReplaceLine 6, "range(""D2:D"" & R)=""=A2*10000"""
 Call 试验1
End Sub

这样太麻烦了,就想一个实验替换了几次执行。

希望能有其他办法

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 22:41 , Processed in 0.324924 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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