【发布时间】:2015-11-24 14:39:36
【问题描述】:
在我的宏中,我有一个子例程(使用 for 循环)遍历表的行并根据 S 列中的内容在 V 列中写入注释。在此循环期间,它还计算它的次数在 S 列中显示“新建”。现在我想将此值向上传递到主宏并向下传递到另一个子例程。我该怎么做或者我的方法是错误的?
如果我理解正确,通常不可能从 excel VBA 中的 subs 中返回值,但您可以从函数中返回值。但是我认为函数在这里不合适(我可能误解了函数在 VBA 中的工作方式和/或没有充分发挥它们的潜力!)。
那么我如何将变量/值从 sub 中偷运到另一个中?是唯一的选项Global 还是Public 声明?
这是我的代码的一个非常粗略的示例:
Sub MainMacro ()
Call CommentSub
Call NumberOfRowsToCopy
End sub
Sub CommentSub
Dim Counter As Integer
For Counter = 1 to 500
If Cells(Counter, "S") = "New" Then
NewOrderLineCounter = NewOrderLineCounter + 1
Cells(Counter, "V").Select
ActiveCell.FormulaR1C1 = "New Line"
End If
Next Counter
End sub
Sub NumberOfRowsToCopy
ActiveSheet.Range("$A$12:$T$1001").AutoFilter Field:=16, Criteria1:= _
"New"
ActiveSheet.Range("B15:N" & NewOrderLineCounter).SpecialCells(xlCellTypeVisible).Select
End sub
(顺便说一句,我知道可能有“更好”的方法来获取需要在此处复制的行数(从而消除了在 subs 之间传递值的需要)但我想我已经尝试了所有这些并且没有工作。我认为它是 excel 表的格式,但这是另一个问题,你必须使用你得到的东西,对吧?)
【问题讨论】:
-
我不明白你为什么不能使用函数?您应该可以毫无问题地将它们中的第一个设为函数,并将计数器的结果作为 CommentSub 的输出作为 NumberOfRowsToCopy 的输入传递,并使 NumberOfRowsToCopy 具有 1 个计数器的输入值
-
我的印象是我误解了函数在 VBA 中的工作方式。从我读到的内容(在帮助文件等中),我了解到函数是用来进行计算的。该示例几乎总是给出函数 x 和 y,它会返回值 z,例如面积或体积之类的。我没有看到它说的任何地方:“在一个函数中,你可以完全按照你在 sub 中所做的,但也返回一个值”。
-
到底算什么?一系列运算得出某个答案,这是否意味着您仅限于数学运算符?不,不是的。在 Vba 中,function 和 sub 之间的主要区别在于,函数是子例程,它们向调用者返回一个值,而 subs 只是被调用并没有返回值而结束。与 C 相比,subs 是 void 函数。