首页 > 解决方案 > 通过调用/运行其他工作簿/文件将变量从嵌套宏获取到“外部”宏

问题描述

我有一个主宏 (macro1) 在其他 * .xlam或 * .xslm文件中运行较小的宏 (macroA 和 macroB)。

除了小宏 (A+B) 执行其工作外,我还需要“外部”宏 (macro1) 中的特定变量及其值,以便在其代码中进一步使用。

有没有办法将宏 A+B 中的变量值传递给宏 1?

背景: 我知道声明 aPublic Variable可以在不同的宏中使用。我也知道如何将变量或它们的值从一个宏传递给下一个宏。但是(在下面给出我的示例)我怎样才能将变量“返回”给宏 1?

Subs不调用其他工作簿/文件(工作)的情况下传递变量的示例(1 ):

Public wbA as Workbook
Public wbB as Workbook
Sub MySubRoutine()
    Set wbA = Workbooks.Open("C:\file.xlsx")
    Set wbB = Workbooks.Open("C:\file2.xlsx")
    OtherSubRoutine
End Sub
Sub OtherSubRoutine()
    Debug.Print wbA.Name
End Sub

输出:文件.xlsx

将变量从被调用传递Sub到另一个工作簿/文件(非工作)的示例(2 ):

Public count As Integer
Sub macro1()
    Run file.xlam! & macroB, argument1, argument2
    Debug.Print count  'second print
End Sub
Sub macroB(argument1, argument2)
    'code that does something
    count = 5
    Debug.Print count  'first print
End Sub

输出第一次打印:5
输出第二次打印:0

代码在没有错误或调试消息的情况下完成。我的错误在哪里?

标签: excelvba

解决方案


您应该将Subin 转换为函数(能够返回某些内容)并以稍微不同的方式调用它:

  1. 将下一个函数放在工作簿 1 中(例如,我使用了 'PERSONAL.XLSB'):
Function GiveMeFive(x As Long, y As Long) As Long
    Debug.Print x + y 'not important, ONLY TO SEE IT WORKING IN immediate Window
    GiveMeFive = 5
End Function
  1. 以这种方式从另一个工作簿中调用它:
Sub testFunctionWithArgsOtherWb()
   Dim x As Long
   x = Run("PERSONAL.XLSB!" & "GiveMeFive", 4, 3)
   Debug.Print x
End Sub

它将在即时窗口中返回:7(来自函数本身)和 5,函数在被调用时返回的内容......

第二版

如果你不喜欢函数,你可以Public使用 a 返回一个变量值Sub,这样:

  1. 在另一个工作簿(也使用 Personal.xlsb)中创建一个Public变量,但在 ThisWorkbook 代码模块中
Public MyVar As Long
  1. Sub在标准模块中创建这样的:
Sub MyMacro(x As Long, y As Long)
   ThisWorkbook.MyVar = x * y
End Sub
  1. 从不同的工作簿调用Sub并读取由被调用者修改的全局变量Sub
Sub testValFromOtherWB()
   Dim x As Long
    Run "PERSONAL.XLSB!" & "MyMacro", 4, 3
    x = Workbooks("PERSONAL.XLSB").MyVar
    Debug.Print x
End Sub

请测试它们并发送一些反馈。


推荐阅读