VBA将细胞/细胞的范围传递给多个潜艇

问题描述:

嗨,我有一个问题,定义一个单元格的范围作为一个变量,取决于什么样的细胞组发生了变化。到目前为止,我有这个,但它发送了多个错误,我试着将它们作为字符串传递并创建临时变量来保存值并传递它,但不管它看起来没有工作。VBA将细胞/细胞的范围传递给多个潜艇

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宏所以很新的这一点,所以任何帮助,将不胜感激!

请参阅下面的重构代码。请参阅我的评论以获取解释

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 
+0

聪明的我指针(则要remeber说),我也得到某种方式得到来自代码的语法错误。有什么我失踪?我还必须在sub中定义x和y,因为它们在传递引用时已经声明了吗? – Phoenix1237

+1

@ Phoenix1237 - 语法错误发生在哪一行?并且不需要在“DoSort”子文件中定义'x'或'y'。参数引用已经做到了。 –

+0

Sub Worksheet_Change(ByVal Target As Range)发生错误,但该宏存储在Sheet1中。 – Phoenix1237

你可以作为一个字符串传递数据对比为一个范围:使用

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 
+0

是的,我试过这个,但当我尝试测试时,我以某种方式得到语法错误。 – Phoenix1237

+0

@ Phoenix1237哪一行是错误? – Chrismas007

+0

它指向Private Sub Worksheet_Change(作为范围的ByVal目标) – Phoenix1237