VBA : La méthode Sort de la classe Range a échoué : erreur d'exécution 1004

Bonjour,

Lorsque j'ai copié ma macro du classeur test dans le classeur de destination final, je me retrouve avec cette erreur, alors que j'ai copié cette même macro dans un autre classeur test (Onglet "résultat") où elle fonctionne sans problème, même quand je la recopie pour l'utiliser dans un autre onglet ("Dettes") !!??
Je ne comprend absolument pas d'où viens le problème.

C'est à devenir chèvre !

Dans le fichier de destination final, l'erreur se produit sur la ligne :

[BZ:BZ].Resize(UBound(T2)).Sort key1:=[BZ1], order1:=xlAscending, Header:=xlNo

Help,

Merci

Bonsoir JoBar

Commencez d'abord par coder correctement

1) Utilisez des noms de variables significatifs
2) Déclarez ces variables
3) Gérez les erreurs
4) Utilisez les objets de façon approprié
5) Utiliser des instructions complètes

Voici ce que ça donnerait pour la partie "Sort"

    With Sheets("dettes")
      .Activate
      .Range("BZ1").Resize(UBound(T2), 1).Value = Application.Transpose(T2)                           ' rangement résultat
      With .Range("BZ:BZ")
        .RemoveDuplicates Columns:=1, Header:=xlNo                                       ' suppression doublons
        .Resize(UBound(T2)).Sort key1:=.Range("BZ1"), order1:=xlAscending, Header:=xlNo          ' tri ascendant
      End With
      DL = .Range("BZ" & Rows.Count).End(xlUp).Row                                                            ' dernière ligne
      T = .Range("BZ1:BZ" & DL)                                                                ' recup données
      .Range("BZ:BZ").ClearContents                                                                   ' effacement colonne
      .Range("A1:M18").ClearContents                                                                  'Effacement formulaire
    ' Etc ...

A voir si cela arrange quelque chose

A+

Bonsoir,

@ Bruno, tu penses que c'est lui qui aurait pu le faire?

Hélas, un multi de plus...en plus impatient?

Salut cousinhub et merci

@JoBar

Je vous invite à lire la charte du forum [A LIRE AVANT DE POSTER]
qui vous aidera dans vos demandes et réponses sur ce forum et notamment :

  • Ne postez pas la même question sur un autre forum pour éviter de faire perdre bêtement du temps aux membres sur un problème qui peut être déjà résolu sur l'autre forum. L'inverse est également valable, si vous avez déjà posé votre question sur un autre forum, ne créez pas un doublon sur ce forum (à moins d'avoir clôturé le sujet sur l'autre forum).

Je vous laisse choisir votre "camp"

Merci de votre compréhension et de votre participation

Bonjour,

Désolé pour la réponse tardive, mais manque de temps suite changement de planning de travail.

Nécessaire fait pour le choix.

Concernant la macro, j'ai fait un premier test rapidement, mais il semblerait que ça ne fonctionne pas non plus.

Je vais regarder d'un peu plus près dès que possible avant de revenir vers vous.

Merci

Bonsoir,

Effectivement je retrouve la même erreur (1004) après la modification de la macro (onglet "Dettes") sur le modèle fourni ci-dessus, alors que ma macro d'origine (onglet "résultat") fonctionne correctement dans le fichier test, mais ne fonctionne pas non plus dans le classeur final !

Je ne vois pas le pourquoi et ne sais donc pas du tout où chercher l'erreur.

Si quelqu'un a une explication ..... ?

Merci

Bonjour JoBar,

C'est votre manipulation des objets qui pose problème

Soit vous supprimé le point devant Range("BZ1")

 With Sheets("Dettes")
        .Activate
        .Range("BZ1").Resize(UBound(T2), 1).Value = Application.Transpose(T2) ' rangement résultat
          With .Range("BZ:BZ")
              .RemoveDuplicates Columns:=1, Header:=xlNo      ' suppression doublons
              .Resize(UBound(T2), 1).Sort key1:=Range("BZ1"), order1:=xlAscending, Header:=xlNo ' tri ascendant
          End With

Soit vous utilisé l'objet WorkSheet

    Dim Sht As Worksheet
    Set Sht = Sheets("Dettes")
    With Sht
      .Activate
      .Range("BZ1").Resize(UBound(T2), 1).Value = Application.Transpose(T2) ' rangement résultat
      With .Range("BZ:BZ")
      .RemoveDuplicates Columns:=1, Header:=xlNo      ' suppression doublons
      .Resize(UBound(T2), 1).Sort key1:=Sht.Range("BZ1"), order1:=xlAscending, Header:=xlNo ' tri ascendant
      End With

Ceci dit, si vous ne tenez pas compte de ce que je vous ai indiqué au début de ce fil
https://forum.excel-pratique.com/s/goto/1151556

Vous allez au devant de gros ennuis

A+

Bonjour,

Il me semble pourtant avoir fait le nécessaire afin de ne conserver qu'un seul post, même si j’ai dû m’y reprendre à plusieurs fois car je n’ai pas trouvé de mode d’emploi suffisamment clair (… en tout cas pour moi). Je n'ai pu supprimer que mes posts et pas les vôtres, ni le titre.

Concernant la macro, elle fonctionne avec la 2e proposition, soit l’objet WorkSheet, mais uniquement aussi dans les classeurs test et pas dans celui de destination.

J'en reviens donc à la question initiale qui était : pourquoi une macro fonctionne-t-elle dans tous les nouveaux classeurs test que je crée et pas dans le classeur de destination prévu, est-ce parce que le classeur de destination a été créé avec une version antérieure d’Excel ou bien … ?

Même si ma macro de départ est mal codée (vu mon niveau en VBA) et j’en tiendrai compte par la suite, elle fonctionne tout de même dans chaque nouveau classeur test que j’ai créé (exemple : Collecter données et restituer sous forme de fiche rédigée 5). Alors pourquoi pas dans l’ancien classeur (aaa-modele-test) que j'ai joint après suppression de onglets et données personnelles ?

Merci d’avoir lu ce post jusque-là et encore merci à celui qui aurait une réponse.

bonjour,

J'en reviens donc à la question initiale qui était : pourquoi une macro fonctionne-t-elle dans tous les nouveaux classeurs test que je crée et pas dans le classeur de destination prévu, (...)

vérifie si ta feuille n'est pas protégée.

Bonjour à tous,

Il me semble qu'il y a un certain nombre de choses qui ne vont pas à la fois dans votre classeur (aaa-modele-test.xlsm) et dans votre code, entre autres :

N n'est pas le compteur de cellules qui répondent à la condition (une fois qu'on y a mis le premier élément N vaut 2 -> alors qu'il devrait valoir 1)

Ubound(T2) n'est pas le nombre d'éléments de T2 car l'indice de T2 commence à 0 (et pas à un). Le nombre d'élément de T2 est Ubound(T2) + 1. Si on n'est pas certain du début et de la fin des indices, on peut utiliser :

NbrElem = Ubound(T2) - Lbound(T2) + 1

La couleur soit-disant "orange" des cellules n'est pas la couleur véritable de la cellule. Cette couleur provient d'une MFC. La cellule orangé n'a pas de couleur de fond. C'est la MFC qui en affiche une autre. Donc aucune cellule ne répondra à la condition If .Cells(i, j).Color = RGB(255, 192, 0) Then

Pour connaitre la couleur affichée par la MFC, on peut utiliser DisplayFormat.Color ce qui donne If .Cells(i, j).DisplayFormat.Color = RGB(255, 192, 0) Then

Quand bien même en utilisant cette syntaxe, cela n'aboutirait à aucune cellule car la MFC n'affiche pas la couleur orange recherchée [ RGB(255, 192, 0) ] mais la couleur [ RGB( 250, 191, 143) ].

Pour l'autre classeur, les cellules colorées en orange ont bien un fond de cette couleur qui ne provient pas d'une MFC.

Quand on fait un tri, le mieux est de s'assurer que la zone à trier comporte au moins deux éléments.

Donc il y a un certain nombre de problèmes à éradiquer. Je ne me suis pas penché sur leur éradication.

Mes codes ne sont généralement pas commentés sauf si on me le demande gentiment...

Re,

Errata : il fallait lire DisplayFormat.Interior.Color à la place de DisplayFormat.Color dans mon précédent message. Honte à moi

Bonsoir, ou bonjour,

Merci d'avoir pris le temps de regarder

Concernant la protection, non la feuille n'est pas protégée.

Concernant la couleur, en effet je n'avais pas fait de distinction entre couleur de fond et mfc (signe de mon inculture dans Excel )

Il faudra donc insérer un bout de code en début de macro afin de colorer les cellules en fonction de leur valeur, ce qui résoudra le problème en principe (ElseIf, CaseElse, ?)

=> Comment puis-je récupérer les codes RGB de la couleur d'une cellule afin d'éviter d'avoir des oranges différents à chaque fois ?

Concernant

N n'est pas le compteur de cellules qui répondent à la condition (une fois qu'on y a mis le premier élément N vaut 2 -> alors qu'il devrait valoir 1)

Ubound(T2) n'est pas le nombre d'éléments de T2 car l'indice de T2 commence à 0 (et pas à un). Le nombre d'élément de T2 est Ubound(T2) + 1. Si on n'est pas certain du début et de la fin des indices, on peut utiliser :

Je ne comprend toujours pas comment le fait de recopier une macro, qui fonctionne, dans un autre classeur dans un nouvel onglet (qui ne contient donc rien) puisse ne pas fonctionner alors qu'elle fonctionne très bien au départ (peut-être aussi en lien avec mon manque de connaissance ) !?

Bonjour à tous,

J'ai fini par recréer un classeur test depuis le début et finalement, le seul truc qui coince c'est la couleur !

Quand le fond est bien orange ma macro fonctionne sans problème, mais dès que la couleur vient de la mfc, alors je me retrouve avec mon erreur "La méthode Sort de la classe Range a échoué : erreur d'exécution 1004".

=> merci à "mafraise" de me l'avoir fait remarquer, car je n'avais pas fait le lien.

Pour colorer en orange les cellules qui comportent les nombres 13-14-15-16-18-19-26-33 je n'arrive pas à faire correctement une boucle avec un code "élégant" et donc plus court que ce que je sait faire.

Est-ce que quelqu'un pourrait me montrer comment faire ça proprement ?

Merci

Bonjour,

En fin de compte, j'ai fini par trouver la solution pour colorer les cellules

Merci de votre aide qui m'a permis d'apprendre quelque chose de plus (différence entre colorer avec une mfc et colorer directement l'arrière plan d'une cellule) et d'avancer dans mon projet.

Mais je n'arrive pas à trouver où cliquer pour marquer le sujet comme étant résolu

Rechercher des sujets similaires à "vba methode sort classe range echoue erreur execution 1004"