我正在处理一个电子表格应用程序,其中每个工作表对象具有相同的方法(getHeaderRow
和skipCol
),但每个工作表的定义略有不同。这两个方法均在DataComments模块的btnGenerate_DataComments_Click()
方法中调用。更具体地说,作为btnGenerate_DataComments_Click()
方法的一部分,我想调用定义为项目目录中ActiveSheet对象一部分的getHeaderRow
方法(例如,如果我单击分配了{{工作表5中的1}}宏,我想调用btnGenerate_DataComments_Click()
)。为此,我正在使用Sheet5.getHeaderRow
。下面是我的代码:
Application.Run
和getHeaderRow在所有工作表中定义为:
Dim str As String: str = "Sheet" & ActiveSheet.Index & ".getHeaderRow"
Dim intHeaderRow As Integer: intHeaderRow = Application.Run(str)
Dim testHeaderRow As Integer: testHeaderRow = Sheet5.getHeaderRow
MsgBox ("Macro: " & str & "; intHeaderRow: " & intHeaderRow & "; testHeaderRow: " & testHeaderRow)
尽管工作表之间的常量IntHeaderRow的值不同
但是,弹出的msgbox显示为“宏:Sheet5.getHeaderRow; intHeaderRow:0; testHeaderRow:3”。这告诉我Const intHeaderRow = 3
Const intEqpTypeCol = 3
Public Function getHeaderRow() As Integer
getHeaderRow = intHeaderRow
End Function
函数有效,但是getHeaderRow
不能返回正确的值(3)。另外,当我逐步调试时,我看到由Application.Run
调用时,代码确实转到Sheet5.getHeaderRow方法,并将正确的返回值存储在Application.Run
中,但是当调试器返回时到getHeaderRow
方法中,它不存储值。
如果您对此问题有任何见解,我将不胜感激;我的项目结构如下。最好的问候。
答案 0 :(得分:0)
仅供参考,这些年这个套路给我带来了很多悲伤!除非万不得已,我通常会避免使用它。好的,那么我是如何让它工作的。
(抱歉没有使用您的代码示例,因为我个人无法使用冒号,很难阅读)
'I have found you "must" use an Object variable as follows:
Dim oExcelApp as Object 'Don't specify Excel.Application
'Don't just use Application.Run as you have, I have found it just won't work as desired, it must be declared in an Object var.
... your other code here e.g.
sSub = "Module1.MyRoutine" 'I like to be explicit and include the module
vArgs() = Array("A","B","C")
set oExcelApp = Excel.Application 'Yes, you can now use Excel.Application, go figure!
Debug.print "Before: " & vArgs(2) "C"
call oExcelApp.run(sSub,vArgs)
Debug.print "After: " & vArgs(2) "Holy Cow"
Private sub MyRoutine(ByRef vArgs as Variant)
vArgs(2) "Holy Cow!"
end sub
正如我所说,它对我有用,但在使用 Application.Run 例程时,我没有信心,例如我注意到它有时似乎在 Application.Run 之后直接结束...,你可能比我更幸运。