【发布时间】:2019-06-19 08:01:39
【问题描述】:
我有两个 excel 文件,一个 patcher.xlsm 和一个 file.xlsm。 file.xlsm 上有一个按钮,当它单击时,它会在工作表 1 上执行一个带有消息框的过程:幻数是:5。
现在,我有一个 patcher.xlsm,它将重新导入已修补的 Sheet 1 和一个带有全局变量的标准模块,并在 file.xlsm 上运行一个宏> 将此数字设置为 7。预期结果是,用户点击 file.xlsm 现在会看到 神奇的数字是:7。
由于某种原因,每当我执行 patcher.xlsm 时,幻数总是重置为 0,就好像内存已被清除或项目重置一样。
有没有办法从另一个工作簿分配一个全局变量?
过去,我查看了几个stackoverflow线程,例如,更改变量的范围,私有,公共,全局等,激活工作簿,查看Excel隐藏的名称空间。
Sub Proc()
MsgBox "The magic number is: 5"
End Sub
file.xlsm 中的 Sheet1
Call CopyModule("patcher_b_progress_bar.xlsm", "file_b.xlsm", "Sheet1", True)
Call CopyModule("patcher_b_progress_bar.xlsm", "file_b.xlsm", "GlobalModule", True)
Application.Run ("'file_b.xlsm'!GlobalModule.setDefaultMagicNumber")
patcher.xlsm“修补”工作表 1 并通过模块设置幻数
CopyModule
' export "patched GlobalModule" from patcher.xlsm as temp.bas
' remove GlobalModule from file.xlsm
' re-import "patched GlobalModule" to file.xlsm
(too lengthy to post here, referenced from http://www.cpearson.com/excel/vbe.aspx)
patcher.xlsm的CopyModule
Option Explicit
Private MAGIC_NUMBER As Integer
Public Function getMagicNumber() As Integer
getMagicNumber = MAGIC_NUMBER
End Function
Public Function setDefaultMagicNumber() As Integer
MAGIC_NUMBER = 7
setDefaultMagicNumber= getMagicNumber()
End Function
patcher.xlsm 的全局模块
Sub Proc()
If GlobalModule.getMagicNumber= 7 Then
MsgBox "Magic number is correct: " & GlobalModule.getMagicNumber
Else
MsgBox "Magic number is wrong: " & GlobalModule.getMagicNumber
End If
End Sub
patcher.xlsm 的Sheet1(将被覆盖到file.xlsm)
编辑:我已经修改了问题。即使“GlobalModule.setDefaultMagicNumber”行成功执行,变量 MAGIC_NUMBER 似乎重新初始化为“0”。
【问题讨论】:
-
将幻数放在外部文件中,而不是尝试在运行中重写 VBA 模块不是更简单吗?
-
@Freeflow 代码的目的是用来修补过时的宏。碰巧某些版本的宏没有特定的模块。外部文件不是一个可行的选择。它肯定会更简单并且开箱即用,但我正在寻找更多的 vba 解决方案。
-
我的猜测是,如果您更改源代码,那么模块将被重新编译,因此原始代码中设置的任何值都将丢失。据我所见,您在修补代码后没有执行 setmagicnumber 过程,因此您的 getmagicnumber 过程将返回未初始化整数的默认值,即 0。
-
@Freeflow setMagicNumber 在修补模块后调用。我想你提到的内容是有道理的,因为清除内存空间是合乎逻辑的,但是我试图在补丁之后重新分配全局变量但它仍然没有注册,这让我很头疼。