Excel 如何使用范围参数在另一个模块中调用VBA子程序?

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函数时,它似乎什么都不做。即使进行调试

我正在Excel VBA上创建一个函数,它在一个大的Excel工作表上执行许多清理任务。它应该包含多个子例程。单独的子程序可以工作,但我似乎无法使调用正常工作

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