【问题标题】:VBA Passing cells/range of cells to multiple subsVBA将单元格/单元格范围传递给多个子
【发布时间】:2016-01-22 03:04:23
【问题描述】:

您好,我在将单元格范围定义为变量时遇到问题,具体取决于哪组单元格发生了变化。到目前为止,我有这个但它发送了多个错误,我尝试将它们作为字符串传递并创建临时变量来保存值并传递它,但无论如何它似乎都不起作用。

    Private Sub Worksheet_Change(ByVal Target As Range)
If Not (Application.Intersect(Worksheets("Sheet1").Range("A:E"), Target) Is Nothing) Then
    DoSort("A3:F100", "A4")
End If
If Not (Application.Intersect(Worksheets("Sheet1").Range("H:L"), Target) Is Nothing) Then
    DoSort("H3:M100", "H4)
End If
End Sub

Sub DoSort(x As Range, y As Range)
With ThisWorkbook.Sheets("Sheet1")
.Range(x).Sort Key1:=.Range(y), Order1:=xlAscending, Header:=xlYes
End With
End Sub

当我像这样对单元格进行硬编码时,我已经让它工作了:

Private Sub DoSort2()
With ThisWorkbook.Sheets("Sheet1")
.Range("H3:M100").Sort Key1:=.Range("H4"), Order1:=xlAscending, Header:=xlYes
End With
End Sub

从来没有真正在 VBA 中使用 excel 宏工作过,所以我对此很陌生,所以任何帮助都将不胜感激!

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    请参阅下面的重构代码。请参阅我的 cmets 以获得解释。

    Private Sub Worksheet_Change(ByVal Target As Range)
    
        'I used "Me." in place of "Worksheets("Sheet1")." assuming that the Worksheet_Change event is already on Sheet1    
        If Not Intersect(Me.Range("A:E"), Target) Is Nothing Then
             DoSort "A3:F100", "A4"
        End If
    
        If Not Intersect(Me.Range("H:L"), Target) Is Nothing Then
            DoSort "H3:M100", "H4"  'you were missing a close " here
        End If
    
    End Sub
    
    'define x and y as String to pass the string address of the range reference
    Sub DoSort(x As String, y As String)
        With ThisWorkbook.Sheets("Sheet1")
            .Range(x).Sort Key1:=.Range(y), Order1:=xlAscending, Header:=xlYes
        End With
    End Sub
    

    如果你愿意,你也可以通过范围。看起来像这样:

       DoSort Me.Range("A3:F100"), Me.Range("A4")
    
       Sub DoSort(x as Range, y as Range)
          x.Sort Key1:=y, Order1:=xlAscending, Header:=xlYes
       End Sub
    

    【讨论】:

    • Smart 使用 Me 指针(必须记住这一点),我现在不知何故从代码中得到语法错误。有什么我想念的吗?我还必须在 sub 中定义 x 和 y,因为它们在传递引用时已经声明了吗?
    • @Phoenix1237 - 语法错误发生在哪一行?并且无需在 DoSort 子中定义 xy。参数引用已经这样做了。
    • Sub Worksheet_Change(ByVal Target As Range)出现错误,但宏存储在Sheet1中。
    • @Phoenix1237 - 我认为这是DoSort 调用中不必要的括号。现在试试。只需编译代码即可检查。
    • 是的,就是这样!我想我的 Java 习惯泄露了,非常感谢您的帮助。
    【解决方案2】:

    您可以将数据作为字符串而不是作为范围传递:

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not (Application.Intersect(Worksheets("Sheet1").Range("A:E"), Target) Is Nothing) Then
            DoSort("A3:F100", "A4")
        End If
        If Not (Application.Intersect(Worksheets("Sheet1").Range("H:L"), Target) Is Nothing) Then
            DoSort("H3:M100", "H4")
        End If
    End Sub
    
    Sub DoSort(x As String, y As String)
        With ThisWorkbook.Sheets("Sheet1")
            .Range(x).Sort Key1:=.Range(y), Order1:=xlAscending, Header:=xlYes
        End With
    End Sub
    

    【讨论】:

    • 是的,我试过了,但是当我尝试测试时,不知何故出现了语法错误。
    • 它指向 Private Sub Worksheet_Change(ByVal Target As Range)
    • @Phoenix1237 那个宏存储在哪里?
    • 它存储在 Sheet1 中,这就是为什么我很困惑为什么它会是一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2018-12-20
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多