Tri de variables en VBA
Bonjour à tous,
J'aurais une petite question qui pourrait sembler évidente mais que je n'arrive pas à résoudre.
J'ai construit tout un fichier formulaire, pour alimenter une base de données.
J'aimerais que cette base de données se trie automatiquement quand je clique sur le bouton "Enregistrer" du formulaire.
L'ordre des colonnes de cette base de données est amenée à être modifié, c''est pourquoi je veux que le tri se base sur des variables et non des références de colonne précise.
En utilisant l'enregistreur de macro, je parviens au résultat suivant :
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Range("A:A"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Range("C:C"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Range("E:E"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Range("H:H"), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
"janvier,fevrier,mars,avril,mai,juin,juillet,aout,septembre,octobre,novembre,decembre,Semestre 1,Semestre 2,Trimestre 1,Trimestre 2,Trimestre 3,Trimestre 4, Année n" _
, DataOption:=xlSortNormalJ'ai donc cherché à le modifier de la facon suivante, en intégrant mes variables :
Sub Tri()
'
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim l As Integer
Dim Column_periode As Range
Dim Column_annee As Range
Dim Column_services As Range
Dim nb_c As Integer
Dim Column_fournisseurs As Range
nb_c = ThisWorkbook.Sheets("Données").UsedRange.SpecialCells(xlCellTypeLastCell).Column 'Nombre de colonnes remplies
For i = 1 To nb_c
If Cells(1, i) Like "*Fournisseurs*" Then Set Column_fournisseurs = Range("i:i")
Next i
For j = 1 To nb_c
If Cells(1, j) Like "*Services*" Then Set Column_services = Range("j:j")
Next j
For k = 1 To nb_c
If Cells(1, k) Like "*Année*" Then Set Column_annee = Range("k:k")
Next k
For l = 1 To nb_c
If Cells(1, l) Like "*Période*" Then Set Column_periode = Range("l:l")
Next l
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Column_fournisseurs, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Column_services, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Column_annee, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Column_periode, SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
"janvier,fevrier,mars,avril,mai,juin,juillet,aout,septembre,octobre,novembre,decembre,Semestre 1,Semestre 2,Trimestre 1,Trimestre 2,Trimestre 3,Trimestre 4, Année n" _
, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Données").Sort
.SetRange Range("A:AX")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End SubEst ce que l'un d'entre vous voit quelque chose d'évident que j'aurais oublié dans la déclaration de mes variable ? j'ai du mal à utiliser l'objet Range avec mes variables...
Je ne peux malheureusement pas joindre de fichier car il s'agit d'un fichier d'entreeprise...
Un grand merci d'avance à vous !!
Bonne après midi,
Jeanne
Bonjour,
une proposition de correction pour la sélection des colonnes de tri
With Sheets("données")
For i = 1 To nb_c
If .Cells(1, i) Like "*Fournisseurs*" Then Set Column_fournisseurs = .Range(i & ":" & i)
If .Cells(1, i) Like "*Services*" Then Set Column_services = .Range(i & ":" & i)
If .Cells(1, i) Like "*Année*" Then Set Column_annee = .Range(i & ":" & i)
If .Cells(1, i) Like "*Période*" Then Set Column_periode = .Range(i & ":" & i)
Next i
End WithBonjour,
Merci pour ta réponse, mais il ne semble plus reconnaitre les colonnes...
Quand je clique sur Debogage, il me met en évidence le .Apply de la fin
Sub Tri()
'
Dim i As Integer
Dim Column_periode As Range
Dim Column_annee As Range
Dim Column_services As Range
Dim nb_c As Integer
Dim Column_fournisseurs As Range
nb_c = ThisWorkbook.Sheets("Données").UsedRange.SpecialCells(xlCellTypeLastCell).Column 'Nombre de colonnes remplies
With Sheets("données")
For i = 1 To nb_c
If .Cells(1, i) Like "*Fournisseurs*" Then Set Column_fournisseurs = .Range(i & ":" & i)
If .Cells(1, i) Like "*Services*" Then Set Column_services = .Range(i & ":" & i)
If .Cells(1, i) Like "*Année*" Then Set Column_annee = .Range(i & ":" & i)
If .Cells(1, i) Like "*Période*" Then Set Column_periode = .Range(i & ":" & i)
Next i
End With
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Column_fournisseurs, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Column_services, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Column_annee, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Column_periode, SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
"janvier,fevrier,mars,avril,mai,juin,juillet,aout,septembre,octobre,novembre,decembre,Semestre 1,Semestre 2,Trimestre 1,Trimestre 2,Trimestre 3,Trimestre 4, Année n" _
, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Données").Sort
.SetRange Range("A:AX")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Subre-bonjour,
voici une correction.
With Sheets("données")
For i = 1 To nb_c
If .Cells(1, i) Like "*Fournisseurs*" Then Set Column_fournisseurs = .Columns(i)
If .Cells(1, i) Like "*Services*" Then Set Column_services = .Columns(i)
If .Cells(1, i) Like "*Année*" Then Set Column_annee = .Columns(i)
If .Cells(1, i) Like "*Période*" Then Set Column_periode = .Columns(i)
Next i
End WithUn grand merci H2SO4
Bon j'ai l'impression que maintenant, la variable est bien définie, et le tri se fait, mais qu'uniquement si il n'y a aucun filtre déjà en place, or la formule initialement en place me supprimait tout les filtres puis me triait les données.
As tu une idée de la raison ?
Je pense que c'est quelque chose d'énorme car il y a un gros beug (excel ferme brusquement) quand j'actionne la formule alors qu'il y a des tris, mais je ne parviens pas à l'identifier...
Un grand grand merci d'avance à toi !!!
Sub Tri()
'
Dim i As Integer
Dim Column_periode As Range
Dim Column_annee As Range
Dim Column_services As Range
Dim nb_c As Integer
Dim Column_fournisseurs As Range
nb_c = ThisWorkbook.Sheets("Données").UsedRange.SpecialCells(xlCellTypeLastCell).Column 'Nombre de colonnes remplies
With Sheets("données")
For i = 1 To nb_c
If .Cells(1, i) Like "*Fournisseurs*" Then Set Column_fournisseurs = .Columns(i)
If .Cells(1, i) Like "*Services*" Then Set Column_services = .Columns(i)
If .Cells(1, i) Like "*Année*" Then Set Column_annee = .Columns(i)
If .Cells(1, i) Like "*Période*" Then Set Column_periode = .Columns(i)
Next i
End With
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Column_fournisseurs, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Column_services, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Column_annee, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Column_periode, SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
"janvier,fevrier,mars,avril,mai,juin,juillet,aout,septembre,octobre,novembre,decembre,Semestre 1,Semestre 2,Trimestre 1,Trimestre 2,Trimestre 3,Trimestre 4, Année n" _
, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Données").Sort
.SetRange Range("A:AX")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End SubJe pense que le problème vient de la dernière partie, la partie suivante :
With ActiveWorkbook.Worksheets("Données").Sort
.SetRange Range("A:BW")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End WithMais cette partie vient de l'enregistreur de Macro et je ne la comprend pas à 100%
Bon en fait j'ai trouvé, j'ai rajouté une petite partie à mon code pour effacer les filtres tout simplement.
Pour information :
Sub Tri()
'
Dim i As Integer
Dim Column_periode As Range
Dim Column_annee As Range
Dim Column_services As Range
Dim nb_c As Integer
Dim Column_fournisseurs As Range
nb_c = ThisWorkbook.Sheets("Données").UsedRange.SpecialCells(xlCellTypeLastCell).Column 'Nombre de colonnes remplies
With Sheets("données")
For i = 1 To nb_c
If .Cells(1, i) Like "*Fournisseurs*" Then Set Column_fournisseurs = .Columns(i)
If .Cells(1, i) Like "*Services*" Then Set Column_services = .Columns(i)
If .Cells(1, i) Like "*Année*" Then Set Column_annee = .Columns(i)
If .Cells(1, i) Like "*Période*" Then Set Column_periode = .Columns(i)
Next i
End With
On Error Resume Next
If ActiveWorkbook.Worksheets("Données").AutoFilterMode Then ActiveWorkbook.Worksheets("Données").ShowAllData
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Column_fournisseurs, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Column_services, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Column_annee, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Données").Sort.SortFields.Add Key:=Column_periode, SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
"janvier,fevrier,mars,avril,mai,juin,juillet,aout,septembre,octobre,novembre,decembre,Semestre 1,Semestre 2,Trimestre 1,Trimestre 2,Trimestre 3,Trimestre 4, Année n" _
, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Données").Sort
.SetRange Range("A:BW")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End SubUn grand merci pour ton aide
Bonne fin de journée