Excel 如何使用范围参数在另一个模块中调用VBA子程序?
我正在Excel VBA上创建一个函数,它在一个大的Excel工作表上执行许多清理任务。它应该包含多个子例程。单独的子程序可以工作,但我似乎无法使调用正常工作Excel 如何使用范围参数在另一个模块中调用VBA子程序?,excel,vba,range,Excel,Vba,Range,我正在Excel VBA上创建一个函数,它在一个大的Excel工作表上执行许多清理任务。它应该包含多个子例程。单独的子程序可以工作,但我似乎无法使调用正常工作 Public Function CleanTable(rangeA As Range) Module1.replaceCellWithZero (rangeA) Module2.removeAsterisk (rangeA) End Function 当我调用CleanTable函数时,它似乎什么都不做。即使进行调试
Public Function CleanTable(rangeA As Range)
Module1.replaceCellWithZero (rangeA)
Module2.removeAsterisk (rangeA)
End Function
当我调用CleanTable函数时,它似乎什么都不做。即使进行调试,我也找不到问题所在。好像它就停在零号的替换单元
主函数是一个函数而不是子函数,因为该函数需要在大量不同的Excel文档中使用。我相信SUB需要按钮或手动输入代码中的范围区域,这不适合这件事的需要。SUB位于不同的模块中,因为文件可能需要单独共享
任何帮助都将不胜感激 正如我在注释中所写,在调用函数的子函数时,如果没有关键字
Call
,参数周围的括号将对参数进行求值。在您的情况下,如果范围仅为一个单元格,则计算结果将是单元格的内容,或者是包含范围值的数组
也许下面的代码将有助于澄清这个问题
Option Explicit
Sub printV(v As Variant)
Dim i As Long, j As Long
For i = LBound(v) To UBound(v)
For j = LBound(v, 2) To UBound(v, 2)
Debug.Print v(i, j)
Next j
Next i
End Sub
Sub TestIt()
Dim rg As Range
Set rg = Range("A1:B2")
Debug.Print TypeName((rg)), TypeName(rg) ' Result is Variant and Range
' (rg) - the parewntheses will evaluate the range and the
' result is the same as v = rg
printV (rg)
' This call will cause an RTE in the sub
printV rg
End Sub
“我认为潜艇需要按钮或手动输入代码中的射程区域。”这是不正确的。
Sub
可以像函数一样具有参数。您如何调用第一个函数?我会亲自将它们更改为Sub
s,但删除rangeA
周围的括号。Re:我的第一个评论是,如何将它们用作函数
而不用“在代码中手动输入范围区域”? 您如何调用第一个函数?我想您应该在Module1.replaceCellWithZero(rangeA)
行中得到一个运行时错误424,因为括号将首先计算rangeA,然后将变量而不是范围传递给函数。因此,正如BigBen所写,去掉括号。谢谢。我对评估不太熟悉。这有助于我理解它。
Public Function removeAsterisk(rangeA As Range)
Dim thisCell As Variant
For Each thisCell In rangeA
thisCell.Value2 = replace(thisCell, "*", "")
Next thisCell
End Function
Option Explicit
Sub printV(v As Variant)
Dim i As Long, j As Long
For i = LBound(v) To UBound(v)
For j = LBound(v, 2) To UBound(v, 2)
Debug.Print v(i, j)
Next j
Next i
End Sub
Sub TestIt()
Dim rg As Range
Set rg = Range("A1:B2")
Debug.Print TypeName((rg)), TypeName(rg) ' Result is Variant and Range
' (rg) - the parewntheses will evaluate the range and the
' result is the same as v = rg
printV (rg)
' This call will cause an RTE in the sub
printV rg
End Sub