【发布时间】:2021-11-16 04:35:29
【问题描述】:
我正在为 VBA 中的 Excel(2016 - 但我可以争取较新的版本)项目。
我在这里找到了这个相关主题:excel vba: Special Types - Functions as Arguments of Functions,但我对它的理解还不够好,无法实现它。还有这个:https://codereview.stackexchange.com/questions/138557/functional-framework,目前在我的脑海中。如果需要的话,我可以努力学习这些主题,但我可能需要有人帮助解释它们如何更好地工作。
我发现自己经常一遍又一遍地编写同一组代码:
Sub SpecificProcess()
Dim c as Range
Dim selectedRange as Range
Set selectedRange = Application.Selection
For Each c in selectedRange.Cells
'Do some stuff to the cell
Next c
End Sub
问题是我需要一直重复:
Sub Add1toValue()
End Sub
Sub ChangeColorToX()
End Sub
Sub CountFingersAndToes()
End Sub
Sub Foo()
End Sub
等等。每一个都有一个共同的因素:“对选择中的每个单元格做一些事情。代码闻起来很糟糕。尤其是如果我不小心把循环搞砸了。
如果是 python,我会做如下的事情:
注意:有一段时间我真的很喜欢学习 python,所以我对中级编码实践有一些了解——但我已经有 15 年左右没有使用它了(3.1 更新?),所有这些记忆都是锁起来,VBA 是一个非常不同的野兽。但是如果有人可以开始解释某些东西如何在 VBA 中工作,我可能会理解它。
'PseudoPython Code
Function Looper( f as function, *args, **kwargs )
selectedRange = Selection.range()
for c in selectedRange
f(c, *args, **kwargs)
next c
Function f_Sample(c as cell, arg1, arg2, ... kwarg1, kwarg2)
c.SpecificProcesses(arg_n, kwarg_n)
if __init__=="__main__"
`select cells
`add one to each cell, change the color, and foobar, in order
makeSelection()
Looper(f_addone, n_times)
Looper(f_changeColor, "RoyGBiv")
Looper(f_foobar, "spamspamspam")
'Note: maybe Looper would be a decorator in python?
结果是它会迭代地对选择中的每个单元格执行这些功能,而我不必一遍又一遍地编写循环结构。
我什至可以扩展它来制作 LoopOverCells、LoopOverWorkSheets、LoopOverSpams 等等。
以正确编码的方式处理此问题的最佳方法是什么 - 但仅限于 VBA / EXCEL 领域。
【问题讨论】:
-
在 VBA 中没有开箱即用的方法来传递函数:如果不实现链接帖子中涵盖的那种东西,您将依赖于将函数的字符串名称与 (例如)
Evaluate或CallByName -
那么我该怎么做呢,我必须让 Looper 成为一个类来调用其他东西?
标签: excel vba function loops iterator