28

我想从同一个模块中的另一个子中调用一个子。第一个子程序是我的主要代码,我会在那里调用第二个子程序。第二个子程序接收多个输入,如整数、双精度、双精度数组和双精度矩阵。数组和矩阵的大小是已知的并存储在一个整数变量中。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

它如何知道哪个子是它开始运行的主子。我可以将辅助子程序放在顶部,并且代码以某种方式从底部子程序开始吗?

4

3 回答 3

46

要在另一个子中调用子,您只需要执行以下操作:

Call Subname()

所以你有CalculateA(Nc,kij, xi, a1, a)你需要有call CalculateA(Nc,kij, xi, a1, a)

至于哪个运行第一个问题由您决定,当您要运行子程序时,您可以转到宏列表中选择您要运行的程序并运行它,您也可以给它一个快捷键,因此您只会必须按这些键才能运行它。虽然,在二级潜艇上,我通常这样做是因为Private sub CalculateA(...)它不会出现在宏列表中并且更容易工作

希望它有帮助,布鲁诺

PS:如果您有任何其他问题只是问,但这不是您要求代码的社区,您会带着一个问题或未运行的代码来这里寻求帮助,而不是像您所做的那样“它会如果您能以 Excel VBA 格式编写它,那就太好了。”

于 2013-05-26T22:25:20.317 回答
4

这真的是两个问题。

第一个在这里回答:Calling a Sub in VBA

对于第二个,protip:VBA 中没有主子程序。忘记程序化的通用语言。VBA 子程序是“宏” - 您可以通过按 Alt+F8 或在工作表中添加一个按钮并从自动生成的“ButtonX_Click”子程序中调用您想要的子程序来运行它们。

于 2013-08-14T15:27:34.430 回答
3

VBA subs 不是宏。VBA sub 可以是宏,但不是必须的。

术语“宏”仅用于记录的用户操作。从这些动作中生成代码并将其存储在子程序中。这段代码很简单,不提供像循环这样的强大结构,例如 Do .. until、for .. next、while.. do 等。

更优雅的方式是,在不使用宏功能的情况下设计和编写自己的 VBA 代码!

VBA 是一种基于对象和面向事件的语言。子程序,或者最好称之为“子程序”,由专用事件启动。该事件可以是按下按钮或打开工作簿以及许多其他非常具体的事件。

如果您专注于 VB6 而不是 VBA,那么您可以声明,总有一个主窗口或主窗体。如果您启动已编译的可执行文件“xxxx.exe”,则会启动此表单。

在 VBA 中你没有这样的东西,但是你有一个由 Excel 启动的 XLSM 文件。您可以将一些代码附加到 Workbook_Open 事件。如果您打开称为工作簿的所需 excel 文件,则会生成此事件。在工作簿中,您有工作表。

熟悉所谓的 excel 对象模型很有用。工作簿有几个事件和方法。工作表也有几个事件和方法。

在基于对象的模型中,您拥有具有事件和方法的对象。方法是您可以对对象执行的操作。事件是可能发生在对象上的事情。一个对象可以包含另一个对象,依此类推。您可以创建新对象,例如工作表或图表。

于 2013-11-23T03:21:56.157 回答