Novice en VBA, j'ai créé un formulaire pour remplir une base de données (tableau) qui fonctionnait bien jusqu'à maintenant..
Cependant au moment de la fermeture, j'aimerais que le tableau se trie automatiquement, j'avais donc écrit le code suivant :
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
ActiveWorkbook.Worksheets("Affaires").ListObjects("AffairesTab").Sort. _
SortFields.Clear ActiveWorkbook.Worksheets("Affaires").ListObjects("AffairesTab").Sort. _
SortFields.Add2 Key:=Range("AffairesTab[[#All],[Délai fabrication]]"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Affaires").ListObjects("AffairesTab").Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Je reçois alors une erreur d'exécution "1004 : méthode range de l'objet _global"
J'ai mis en jaune où le débogage situe l'erreur.
La colonne à trier est calculé à partir des données rentraient dans le tableau. Elle est composé de nombre (délai en jour) ou si rien n'est rentré, des mots comme "pas de date prévu" ou "livré"
Je me demande si cela vient du faite que j'ai à la fois des nombres et des mots dans la colonne à trier, toutefois cela fonctionne bien lorsqu'on trie "manuellement" le tableau avec la fonction tri
Re,
J'ai repris le code de l'enregistreur.
J'ai supprimé cette macro de l'événement UserForm_QueryClose, j'y ai mis un call TRI.
Et la macro de tri je l'ai mise dans un module. Il n'y a pas d'erreur de compil.
Par contre la pertinence des résultats ... ainsi que quoi trié ! J'ai mis par défaut sur délai de fabrication.
Mais au moins cela fait une base de travail saine sans erreur.
With ActiveWorkbook.Worksheets(NomDeLaFeuille).Sort
Appliqué à votre code cela pourrait donner :
Code:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
ActiveWorkbook.Worksheets("Affaires").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Affaires").Sort.SortFields.Add2 Key:=Range("AffairesTab[[#All],[Délai fabrication]]"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Affaires").Sort
.SetRange Range("AffairesTab[[#All],[Délai fabrication]]")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Mais en aveugle, difficile de vérifier et de tester. Tentez !
With ActiveWorkbook.Worksheets(NomDeLaFeuille).Sort
Appliqué à votre code cela pourrait donner :
Code:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
ActiveWorkbook.Worksheets("Affaires").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Affaires").Sort.SortFields.Add2 Key:=Range("AffairesTab[[#All],[Délai fabrication]]"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Affaires").Sort
.SetRange Range("AffairesTab[[#All],[Délai fabrication]]")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Mais en aveugle, difficile de vérifier et de tester. Tentez !
As-tu (oui ou non ?) fait cette opération de tri sur ta machine en utilisant l'enregistreur de macro?
et :
- si non : qu'attends-tu pour le faire ?
et
- si oui : montre le code proposé par l'enregistreur !
c'est quand même facile, de faire cela et d'en rapporter le résultat, non ?
Alors ????
Re Bonjour,
Avec un tri sur une tableau structuré, cela donnerait ça :
VB:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
ActiveWorkbook.Worksheets("Affaires").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Affaires").ListObjects("Tableau1").Sort.SortFields. _
Add Key:=Range("AffairesTab[Délai fabrication]"), SortOn:=xlSortOnValues, Order:= _
xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Affaires").ListObjects("AffairesTab").Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Pourrait peut être marcher avec Application.Range("AffairesTab[[#All],[Délai fabrication]]"), mais pas sûr du tout.
En tout cas l'assumé ActiveSheet.Range("AffairesTab[[#All],[Délai fabrication]]") ne marchera jamais.
Moi je préfère toujours
Dim LOt As ListObject
Set LOt = ActiveWorkbook.Worksheets("Affaires").ListObjects("Tableau1")
Comme ça je peux faire
LOt.Sort.SortField.Add Key:=LOt.ListColumns("Délai fabrication").Range, etc.
Comme ça on est sûr qu'il prend la bonne colonne.
As-tu (oui ou non ?) fait cette opération de tri sur ta machine en utilisant l'enregistreur de macro?
et :
- si non : qu'attends-tu pour le faire ?
et
- si oui : montre le code proposé par l'enregistreur !
c'est quand même facile, de faire cela et d'en rapporter le résultat, non ?
Alors ????
Re Bonjour,
Avec un tri sur une tableau structuré, cela donnerait ça :
VB:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
ActiveWorkbook.Worksheets("Affaires").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Affaires").ListObjects("Tableau1").Sort.SortFields. _
Add Key:=Range("AffairesTab[Délai fabrication]"), SortOn:=xlSortOnValues, Order:= _
xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Affaires").ListObjects("AffairesTab").Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Re,
J'ai repris le code de l'enregistreur.
J'ai supprimé cette macro de l'événement UserForm_QueryClose, j'y ai mis un call TRI.
Et la macro de tri je l'ai mise dans un module. Il n'y a pas d'erreur de compil.
Par contre la pertinence des résultats ... ainsi que quoi trié ! J'ai mis par défaut sur délai de fabrication.
Mais au moins cela fait une base de travail saine sans erreur.
Re,
J'ai repris le code de l'enregistreur.
J'ai supprimé cette macro de l'événement UserForm_QueryClose, j'y ai mis un call TRI.
Et la macro de tri je l'ai mise dans un module. Il n'y a pas d'erreur de compil.
Par contre la pertinence des résultats ... ainsi que quoi trié ! J'ai mis par défaut sur délai de fabrication.
Mais au moins cela fait une base de travail saine sans erreur.
Par contre je n'ai pas compris le pourquoi.
La même macro de tri mise dans UserForm_QueryClose ne fonctionne pas.
Par contre un call dans cette macro qui appelle le tri fonctionne.
Par contre je n'ai pas compris le pourquoi.
La même macro de tri mise dans UserForm_QueryClose ne fonctionne pas.
Par contre un call dans cette macro qui appelle le tri fonctionne.