首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何通过激活另一个工作簿中的宏来更改工作簿的全局变量

如何通过激活另一个工作簿中的宏来更改工作簿的全局变量
EN

Stack Overflow用户
提问于 2019-06-19 16:01:39
回答 1查看 176关注 0票数 3

我有两个excel文件,一个是patcher.xlsm,一个是file.xlsm。在file.xlsm上有一个按钮,当它点击时,它会执行工作表1上的一个带有消息框的过程:神奇的数字是: 5。

现在,我有了一个patcher.xlsm,它将重新导入一个打了补丁的工作表1和一个带有全局变量的标准模块,并在file.xlsm上运行一个宏,将这个数字设置为7。预期的结果是,单击file.xlsm的用户现在会看到神奇的数字是: 7。

由于某些原因,每当我执行patcher.xlsm,时,幻数总是被重置为0,就好像内存已被清除或项目重置一样。

有没有办法从另一个工作簿中分配全局变量?

在过去,我看过几个stackoverflow线程,例如,更改变量的作用域、私有、公共、全局等,激活工作簿,查看Excel当前隐藏的名称空间。

代码语言:javascript
复制
Sub Proc()
  MsgBox "The magic number is: 5"
End Sub

file.xlsm中的Sheet1

代码语言:javascript
复制
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并设置一个幻数

代码语言:javascript
复制
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.xlsmCopyModule

代码语言:javascript
复制
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.xlsmGlobalModule

代码语言:javascript
复制
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

Sheet1 of patcher.xlsm (将覆盖到file.xlsm)

编辑:我已经修改了这个问题。即使行"GlobalModule.setDefaultMagicNumber“被成功执行,变量MAGIC_NUMBER似乎也被重新初始化为"0”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-20 03:08:14

欢迎来到SO,恭喜你问了一个非常好的问题。

这只是部分解决方案,根本不能令人满意。无论如何,我要发布它,因为它会以某种方式服务于您的代码的目的,将Magic_Number更改为某个所需的整数。

我尝试了一些不同的设置,目标略有不同(这是无法实现的)。

File.Xlsm工作簿打开事件中

代码语言:javascript
复制
Private Sub Workbook_Open()
SetMagic
End Sub

File.Xlsm的Module1中

代码语言:javascript
复制
Global Magic_Number As Integer
Sub Test_Magic()
MsgBox Magic_Number
End Sub

Sub SetMagic()
Magic_Number = 5
ThisWorkbook.Sheets(1).Range("F1").Value = Magic_Number
End Sub

File.Xlsm的Sheet1更改事件中

代码语言:javascript
复制
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Range("A1:E20"), Target) Is Nothing Then
    Magic_Number = Magic_Number + 1
    Range("F1").Value = Magic_Number
    End If
End Sub

最后在Patch.xlsm Module1中

代码语言:javascript
复制
Sub ChangeMagic()
Dim wb As Workbook, Opn As Boolean , Ln as Long
    Onp = False
    For Each wb In Application.Workbooks
    If wb.Name = "File.xlsm" Then
    Opn = True
    Exit For
    End If
    Next

    If Opn = False Then
    Set wb = Workbooks.Open(ThisWorkbook.Path & "\File.xlsm")
    End If


    With wb.VBProject.VBComponents("Module1").CodeModule
    Ln = .ProcBodyLine("SetMagic", vbext_pk_Proc)
    .ReplaceLine Ln + 1, "Magic_number =  100"
    End With

    Application.OnTime Now + TimeValue("00:00:03"), "'File.xlsm'!Module1.SetMagic"
    wb.Activate
End Sub

这条线

代码语言:javascript
复制
Application.OnTime Now + TimeValue("00:00:03"), "'File.xlsm'!Module1.SetMagic"

做这个把戏吧。在替换了VBE中所需的代码行之后,Patch.xlsm中的宏将结束,并且当File.xlsm激活时,SetMagic将在一段延迟后执行。Magic_Number将为100。

但它仍然没有达到我的预期目的,因为在试验期间,很明显,一旦VBE代码模块行被替换(即在执行Sub SetMagic之前),Magic_Number就会重置为0。但是您的目的将会得到解决,并且Magic_Number将从Patch.xlsm获得我们设置的任何值。

因为我动态设置Magic_Number = Magic_Number + 100的目标无法实现。为了实现这个目的,我必须解决这个问题,并将Magic_Number的最新值保存在一些单元格等中,然后从那里检索(这将失去代码的真正精神)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56662806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档