Résolu 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
 
Ce fil a été résolu! Aller à la solution…

jmfmarques

XLDnaute Accro
Bonjour
Je suppose que tu as eu au moins le réflexe de voir le code obtenu à l'aide de l'enregistreur de macro.
Quel code t'a ainsi été proposé ?
 

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
Je suppose que tu as eu au moins le réflexe de voir le code obtenu à l'aide de l'enregistreur de macro.
Quel code t'a ainsi été proposé ?
Bonjour, oui effectivement la formule vient d'un enregistrement macro de base, toutefois j'ai toujours la même erreur.
 

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
 

Fichiers joints

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")
 

Fichiers joints

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.
 
Ce message a été identifié comme étant une solution!

Fichiers joints

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!
 

sylvanu

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

FreshMan

XLDnaute Nouveau
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. :(
Peut être qu'il n'arrive pas à trier tant que toutes les données ne sont pas incrémentées et calculées dans le tableau... :rolleyes:
 

Dranreb

XLDnaute Barbatruc
Moi je pense toujours que c'est parce qu'il n'assume pas dans les deux cas pour l'argument Key la méthode Range du même objet Worksheet non précisé, et que ça ne marche pas s'il en assume un qui représente une autre feuille que celle qui contient le tableau.
Le Show du UserForm est-il il commandé de puis un module d'objet Worksheet différent par exemple ?
Moi je n'utilise jamais Range ni Cells sans préciser devant de quel objet Worksheet il s'agit.
 
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
C'est là que j'ai un souci.
L'Userform est bien appelé de cette page. J'ai bien pris soin en début de macro de re préciser la feuille. et tous les objets sont bien spécifiés sur cette page.
Si je met in extenso cette macro dans UserForm_QueryClose il y a un bug. Si je met dans cette macro uniquement un call Tri, et Tri dans un module ça marche, d’où mon questionnement.
 

Dranreb

XLDnaute Barbatruc
Mets une MsgBox Range("A1").Worksheet.Name devant les tris, peut être que ça éclaircira les choses. Dans un module standard il prend la métode Range de l'objet Application qui elle même invoque celle de ActiveSheet. Dans un module d'objet Worksheet il prend celle de cet objet. Dans un UserForm affiché depuis un module d'objet Worksheet, je ne sais pas en fait. Et je m'en fiche, parce que moi je précise toujours l'objet Worksheet devant. Le plus souvent c'est son nom dans la rubrique Microsoft Excel Objets, sinon c'est une variable commençant par Wsh préalablement initialisée.
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas