Microsoft 365 VBA erreur d'exécution 1004 : méthode range de l'objet _global

FreshMan

XLDnaute Nouveau
Bonjour à tous,

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

Merci d'avance pour votre aide!

Freshman
 
Solution
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.

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour FreshMan, Jmfmarques
En passant par l'enregistreur de macro, on voit des différences par rapport à votre formule :
VB:
ActiveWorkbook.Worksheets(NomDeLaFeuille").Sort.SortFields.Add Key:=RANGE, _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
Code:
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 ! ;)
 

FreshMan

XLDnaute Nouveau
Bonjour FreshMan, Jmfmarques
En passant par l'enregistreur de macro, on voit des différences par rapport à votre formule :
VB:
ActiveWorkbook.Worksheets(NomDeLaFeuille").Sort.SortFields.Add Key:=RANGE, _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
Code:
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 ! ;)
Bonjour, merci pour ton aide mais même erreur..
 

jmfmarques

XLDnaute Accro
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 ? :rolleyes:
Alors ????
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
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
Toujours pas de petit fichier test ?
 

Dranreb

XLDnaute Barbatruc
Bonjour.
ActiveWorkbook.Worksheets("Affaires").ListObjects("AffairesTab").Sort. _
SortFields.Add2 Key:=Range("AffairesTab[[#All],[Délai fabrication]]"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
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.
 
Dernière édition:

FreshMan

XLDnaute Nouveau
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 ? :rolleyes:
Alors ????
Bonjour, excusez-moi d'avoir répondu un peu vite tout à l'heure, effectivement j'ai essayé et j'ai obtenu:
Sub Macro1()
'
' Macro1 Macro
'

'
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

Voici le fichier en question, il s'agit du bouton "Ajouter une affaire" / Userform "SaisiAffaire"

Merci encore
 

Pièces jointes

  • Suivi affaire Test.xlsm
    849.5 KB · Affichages: 3

FreshMan

XLDnaute Nouveau
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
Toujours pas de petit fichier test ?
Rebonjour Sylvanu, voici le fichier en question, il s'agit du bouton Ajouter une affaire (Userform "SaisiAffaire")
 

Pièces jointes

  • Suivi affaire Test.xlsm
    849.5 KB · Affichages: 0

sylvanu

XLDnaute Barbatruc
Supporter XLD
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.
 

Pièces jointes

  • Suivi affaire Test (1).xlsm
    859 KB · Affichages: 4

FreshMan

XLDnaute Nouveau
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.
Merci, c'est exactement ce qu'il me fallait!
 

Discussions similaires

Haut Bas