我想从同一模块中的另一个子内部调用一个sub。第一个子将是我的主要代码,在那里我将调用第二个子例程。第二个子程序接收多个输入,如整数,双,双数组和双矩阵。数组和矩阵的大小是已知的并存储在整数变量中。该子也返回几个输出。所以,我想做这样的事情。
sub Main()
Nc As integer
Dim kij(1 To Nc, 1 To Nc), xi(1 to Nc), a1 As Double
'I assign values to my variables from the excelsheet e.g. Nc=Cells(1,1) etc.
CalculateA(Nc,kij, xi, a1, a)
Cells(5,5)=a
end sub
sub CalculateA(Nc as integer,kij as matrix double, xi as array double, a as Double)
a=0
For i=1 To Nc
For j=1 To Nc
a = a + kij(i,j)*x(i)*x(j)
Next j
Next i
a = a*a1
end sub
它如何知道哪个sub是它开始运行的主要sub。我可以将辅助子设置在顶部,代码以某种方式从底部子例程开始吗?
答案 0 :(得分:37)
要在另一个子区域内调用子区域,您只需执行以下操作:
Call Subname()
所以,CalculateA(Nc,kij, xi, a1, a)
你需要拥有call CalculateA(Nc,kij, xi, a1, a)
由于运行第一个问题,你需要决定,当你想运行一个子时,你可以进入宏列表选择你要运行的那个并运行它,你也可以给它一个jey快捷方式而且只有它必须按下这些键,在次要子上我通常像Private sub CalculateA(...)
那样做,因为这样它不会出现在宏列表中并且更容易工作
希望它有所帮助, 布鲁诺
PS:如果您有任何其他问题,请问,但这不是您要求代码的社区,您来到这里的问题或代码没有运行并寻求帮助,而不是像你做的那样“如果你能用Excel VBA格式编写它会很棒。”答案 1 :(得分:4)
这些真的有两个问题。
第一个答案在这里:Calling a Sub in VBA
对于第二个,protip:VBA中没有主子程序。忘记程序性的通用语言。 VBA subs是“宏” - 您可以通过按Alt + F8或在工作表中添加一个按钮并从自动生成的“ButtonX_Click”子调用所需的子项来运行它们。
答案 2 :(得分:2)
VBA sub不是宏。 VBA sub可以是一个宏,但它不是必须的。
术语“宏”仅用于记录的用户操作。从这些动作中生成代码并将其存储在子代码中。这段代码很简单,不提供像循环这样强大的结构,例如Do ..直到,for .. next,while .. do,和其他。
更优雅的方法是设计和编写自己的VBA代码而不使用宏功能!
VBA是一种基于对象和面向事件的语言。 Subs或者称之为“子例程”,由专门的事件启动。该事件可以是按下按钮或打开工作簿以及许多其他非常具体的事件。
如果你专注于VB6而不是VBA,那么你可以说,总有一个主窗口或主窗体。如果您启动已编译的可执行文件“xxxx.exe”,则会启动此表单。
在VBA中你没有这样的东西,但你有一个由Excel启动的XLSM文件。您可以将一些代码附加到Workbook_Open事件。如果您打开所需的excel文件(称为工作簿),则会生成此事件。在工作簿中,您有工作表。
更熟悉所谓的excel对象模型很有用。该工作簿有几个事件和方法。此外,工作表还有几个事件和方法。
在基于对象的模型中,您拥有具有事件和方法的对象。方法是您可以对对象执行的操作。事件是可能发生在对象上的事情。对象可以包含其他对象,依此类推。您可以创建新对象,例如工作表或图表。