/ / VBA Cellules de passage / plage de cellules vers plusieurs sous-marins - excel, vba, excel-vba

Cellules de passage VBA / plage de cellules à plusieurs sous-marins - excel, vba, excel-vba

Bonjour, j'ai un problème pour définir une plage de cellules commeune variable en fonction de quel groupe de cellules ont changé. Jusqu’à présent, j’ai ceci, mais cela envoie de nombreuses erreurs, j’ai essayé de les transmettre sous forme de chaîne et de créer des variables temporaires pour conserver les valeurs et les transmettre, mais quoi que cela ne semble pas fonctionner.

    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

Je l'avais déjà avant quand j'ai codé les cellules de la manière suivante:

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

Je n'ai jamais vraiment travaillé dans VBA avec des macros Excel, je suis donc très novice dans ce domaine. Toute aide serait la bienvenue!

Réponses:

3 pour la réponse № 1

Voir mon code refactored ci-dessous. Voir mes commentaires pour l'explication.

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

Vous pouvez également passer la gamme si vous le souhaitez. Cela ressemblerait à ceci:

   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 pour la réponse № 2

Vous pouvez transmettre les données sous forme de chaîne ou de plage:

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