excel - 通过调用/运行其他工作簿/文件将变量从嵌套宏获取到“外部”宏
问题描述
我有一个主宏 (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
代码在没有错误或调试消息的情况下完成。我的错误在哪里?
解决方案
您应该将Sub
in 转换为函数(能够返回某些内容)并以稍微不同的方式调用它:
- 将下一个函数放在工作簿 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
- 以这种方式从另一个工作簿中调用它:
Sub testFunctionWithArgsOtherWb()
Dim x As Long
x = Run("PERSONAL.XLSB!" & "GiveMeFive", 4, 3)
Debug.Print x
End Sub
它将在即时窗口中返回:7(来自函数本身)和 5,函数在被调用时返回的内容......
第二版:
如果你不喜欢函数,你可以Public
使用 a 返回一个变量值Sub
,这样:
- 在另一个工作簿(也使用 Personal.xlsb)中创建一个
Public
变量,但在 ThisWorkbook 代码模块中:
Public MyVar As Long
Sub
在标准模块中创建这样的:
Sub MyMacro(x As Long, y As Long)
ThisWorkbook.MyVar = x * y
End Sub
- 从不同的工作簿调用
Sub
并读取由被调用者修改的全局变量Sub
:
Sub testValFromOtherWB()
Dim x As Long
Run "PERSONAL.XLSB!" & "MyMacro", 4, 3
x = Workbooks("PERSONAL.XLSB").MyVar
Debug.Print x
End Sub
请测试它们并发送一些反馈。
推荐阅读
- google-cloud-platform - 使用 XCom 通过 GoogleCloudStorageToBigQueryOperator 在 Airflow 中加载 Schema
- android - Android:如何制作特殊的recyclerview布局
- observable - 当我尝试编译时,我不断收到这个错误类不是抽象的,并且没有覆盖 MyObserver 中的抽象方法 update(Object)
- strftime - 如何编写符合 Flake8 的 strftime 表达式?
- javascript - 如何将 Google Analytics api 响应放入工作表中?
- aws-amplify - 放大 @model 语法以仅生成创建和更新突变(而不是删除)
- vuejs2 - 使用 Nuxt.js 将事件传递给父组件
- java - 在添加之前检查 ArrayList 中元素的 ID 是否已经存在
- javascript - 使用javascript在表格中移动图像
- c# - 如何显示带有图片和一些文本区域的 ListView?