Excel VBA从另一个具有多个输入,不同大小的输出的子调用子

Posted

技术标签:

【中文标题】Excel VBA从另一个具有多个输入,不同大小的输出的子调用子【英文标题】:Excel VBA calling sub from another sub with multiple inputs, outputs of different sizes 【发布时间】:2013-05-26 19:49:16 【问题描述】:

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

它如何知道哪个子是它开始运行的主子。我可以把二级子放在上面,代码从底部子程序开始吗?

【问题讨论】:

Calling a Sub in VBA 的可能重复项 部分复制了Calling a Sub in VBA。 “仅”在 VBA 中调用 Sub 回答了有关如何调用另一个 sub 的问题,并为该问题提供了更好的解释。 【参考方案1】:

要在另一个 sub 中调用一个 sub,你只需要这样做:

Call Subname()

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

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

希望对你有帮助, 布鲁诺

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

【讨论】:

【参考方案2】:

这确实是两个问题。

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

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

【讨论】:

【参考方案3】:

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

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

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

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

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

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

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

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

【讨论】:

如何在 VBA 中创建子程序,然后从开发人员选项卡的宏功能中调用它?如果 Excel 不提供此功能,则存在严重缺陷。

以上是关于Excel VBA从另一个具有多个输入,不同大小的输出的子调用子的主要内容,如果未能解决你的问题,请参考以下文章

ms excel vba 填充具有不同列要求的列表框

使用 VBA 插入图片,Excel 2010 和 Excel 2016 之间的大小不同

如何在excel VBA中同时多选多个列表框

具有多个标准排名的 Excel VBA 动态数据验证下拉列表

MS Access VBA:创建具有多个工作表的 Excel 工作簿

如何使用 vba 从具有多个数据字段的 excel 数据透视表中删除小计