【问题标题】:Passing through variable to sub in VBA在VBA中通过变量传递给子
【发布时间】:2013-04-25 14:31:20
【问题描述】:

这可能是非常基本的,但是我尝试了很多东西并且总是报错。

基本上我想要做的是每次在 Excel 中更改单元格时运行一个过程。所以我使用 Sub Worksheet_Change(ByVal Target As Range)。 一切正常,但在这个过程中,我多次调用另一个子过程。

我想在此过程中重用“目标”值,但由于某种原因,我找不到如何操作。我尝试将“Public rTarget As Range”放置在程序开始时并执行“rTarget = Target”。但是当我调用子过程时,rTarget 保持为空。

我该如何进行这项工作? 我现在将 Target 作为变量之一添加到子例程中,但这看起来很愚蠢。

谢谢!

【问题讨论】:

    标签: excel vba variables parameter-passing


    【解决方案1】:
    Private Sub Worksheet_Change(ByVal Target As Range)
        MySub Target
    End Sub
    
    Sub MySub(ByVal Target As Range)
        ' Your sub code goes here and can work with the Target Range from the Worksheet_Change Event
    End Sub
    

    【讨论】:

    • 谢谢,这就是我现在正在做的事情。但是我每次调用“MySub”时都必须添加“Target”。有没有办法不必这样做?
    【解决方案2】:

    将 Target 作为变量传递是你应该做的。您希望将变量保持在最紧凑的范围内,并将它们作为参数传递是最严格的。

    如果您将变量传递给同一个模块中的一堆不同的过程,那么有一个模块级变量可能是有意义的。看起来像这样

    Private mrTarget As Range
    
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    
        Set mrTarget = Target
        MySub
    
    End Sub
    
    Private Sub MySub()
    
        Debug.Print mrTarget.Address
    
    End Sub
    

    根据您的问题,它只是一个被重复调用的 sub。在这种情况下,我会坚持将其作为参数传递。

    【讨论】:

    • 我知道我必须将变量尽可能保持在本地。但是我正在运行的代码非常小,它只是让它看起来更整洁,而无需添加 Target 作为参数。我使用与您相同的代码,但在将 Target 复制到 mrTarget 时忘记使用“Set”......现在就像一个魅力!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 2013-03-05
    • 2015-04-28
    相关资源
    最近更新 更多