IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Range.sort ne fonctionne par sur un fichier [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué

    Inscrit en
    Octobre 2003
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 183
    Points : 136
    Points
    136
    Par défaut Range.sort ne fonctionne par sur un fichier
    Bonjour.

    voici mon code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
      Dim Lig1 As Integer
      Dim Lig2 As Integer
      Dim NbLig1 As Integer
      Dim NbLig2 As Integer
      Dim NbRef2 As Integer
      Dim Trouve As Boolean
      Dim Ref1 As String
      Dim Ref2 As String
      Dim WkBk As Workbook
      Dim WkSh1 As Worksheet
      Dim WkSh2 As Worksheet
     
      Set WkBk = Workbooks(NomFic)
      Set WkSh1 = WkBk.Sheets(1)
      Set WkSh2 = WkBk.Sheets(2)
     
      Lig1 = 2
      Lig2 = 2
     
      NbLig1 = WkSh1.Cells(Rows.Count, 1).End(xlUp).Row
      WkSh2.Sort.SortFields.Clear
      If WkSh2.FilterMode Then WkSh2.ShowAllData
      NbLig2 = WkSh2.Cells(Rows.Count, 1).End(xlUp).Row
     
     
     
      WkSh2.Sort.SortFields.Clear
      WkSh2.Range("A1:F" & NbLig2).Sort WkSh2.Range("D1"), xlAscending, , , , , , xlYes
      WkSh2.Activate
     
     
      While Lig2 <= NbLig2
        Lig1 = 2
        Trouve = False
        Ref2 = WkSh2.Range("d" & Lig2)
     
        While Lig1 <= NbLig1 And Not Trouve
          Application.StatusBar = Ref2 & " (" & Lig2 & ")"
          Trouve = WkSh1.Range("a" & Lig1).Value = Ref2
          Lig1 = Lig1 + 1
        Wend
     
        If not Trouve Then
          MainWkSh.Range("b" & MainNbLig) = """" & Ref2 & """ n'est pas dans la feuille 1"
          MainNbLig = MainNbLig + 1
        End If
     
        Lig2 = Lig2 + 1
        While WkSh2.Range("d" & Lig2) = Ref2 And WkSh2.Range("d" & Lig2) <> ""
          Lig2 = Lig2 + 1
        Wend
      Wend
     
      Application.StatusBar = Null
      Set WkSh1 = Nothing
      Set WkSh2 = Nothing
      Set WkBk = Nothing
    l'objectif est de parcourir la colonne D de la feuille 2 et de vérifier si je retrouve la valeur dans la colonne a de la feuille1
    Comme j'ai beaucoup de doublons dans la feuille 2, j'ai mis une petite "optimisation" qui ne fonctionne que pour autant que j'ai appliqué mon tri.

    Certaines variables sont globales, ce qui explique qu'on ne trouve pas leur déclaration dans le code.
    Il fonctionne correctement sur tous mes fichiers sauf un sur lequel il n'enlève pas les filtres et n'effectue pas le tri.
    Les fichiers sont tous de la même la même forme et un autre fichier du même auteur que celui qui me pose problème fonctionne très bien.
    J'ai cherché partout et testé différentes choses, en vain.
    Le seul moment où je parviens à faire fonctionner le code avec ce fichier, c'est lorsque j'introduis une pause et que je clique sur la feuille du fichier incriminé avant de relancer le traitement.

    Quelqu'un aurait-il une idée du pourquoi du comment de la chose ?

    Merci de votre aide

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 380
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 380
    Points : 2 007
    Points
    2 007
    Par défaut
    Salut,

    Quelques questions:

    Avant de plonger sur du VBA,
    As-tu envisager une solution par formules ?
    As-tu envisagé une solution via Power Query ?

    Quand et comment est exécuté ce code ?
    Citation Envoyé par olivier] Voir le message
    Certaines variables sont globales, ce qui explique qu'on ne trouve pas leur déclaration dans le code.
    Ces choix sont-ils Indispensable ? Justifiés ? Pourquoi ?

    Citation Envoyé par olivier] Voir le message
    ll fonctionne correctement sur tous mes fichiers sauf un sur lequel il n'enlève pas les filtres et n'effectue pas le tri.
    Travailles-tu avec des tableaux structurés ?
    Ces derniers étant particulièrement versatiles, je t'invite a te renseigner pour en tirer tous les avantages.
    Ségrégue ta fonction en plusieurs sous-fonctions, traitements d'un côté et filtres de l'autre.

    La Collection ou le Dictionnaire ont des clefs qui doivent être unique, tu peux t'appuyer dessus pour faire ta recherche de doublons, ca t'éviteras de toucher aux tris et filtres.
    Le choix du conteneur dépend de la sensibilité à la casse voulue, les clefs d'une collection ne sont pas sensible à la casse, celles du dictionnaire le sont.

  3. #3
    Membre habitué

    Inscrit en
    Octobre 2003
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 183
    Points : 136
    Points
    136
    Par défaut
    Salut deedolith.
    Merci de te pencher sur mon problème.

    L'objectif de ce traitement est un contrôle de fichier avant traitement ultérieur.
    De nombreux fichiers sont échangés et la mise en place de formule sur chacun serait fastidieuse.

    La procédure utilisée seule ne fonctionne pas, bien sûr, mais le traitement est exécuté globalement et dans ce cadre, elle fonctionne.
    L'usage de variables globales tient à ce que je ne voulais pas particulièrement recourir à des paramètres pour les appels de fonctions.

    Je ne sais pas ce que tu entends par tableaux structurés. Si tu veux dire par là qu'ils sont tous au même format, c'est le cas.
    S'il s'agit d'une fonctionnalité d'Excell je ne la connais pas.

    Je vais regarder ce que sont les collections et dictionnaires car je ne connais pas.

  4. #4
    Membre habitué

    Inscrit en
    Octobre 2003
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 183
    Points : 136
    Points
    136
    Par défaut
    Alors...

    j'ai trouvé ce lien sur stackoverflow hier.
    Je l'ai mis en application en remplaçant dans mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      ...
      NbLig1 = WkSh1.Cells(Rows.Count, 1).End(xlUp).Row
      WkSh2.Sort.SortFields.Clear
      if WkSh2.FilterMode Then WkSh2.ShowAllData
      NbLig2 = WkSh2.Cells(Rows.Count, 1).End(xlUp).Row
      ...
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      ...
      NbLig1 = WkSh1.Cells(Rows.Count, 1).End(xlUp).Row
      WkSh2.Sort.SortFields.Clear
      If (WkSh2.AutoFilterMode and WkSh2.FilterMode) Or WkSh2.FilterMode Then WkSh2.ShowAllData
      NbLig2 = WkSh2.Cells(Rows.Count, 1).End(xlUp).Row
      ...
    on pourrait penser que (WkSh2.AutoFilterMode and WkSh2.FilterMode) Or WkSh2.FilterMode equivaut à WkSh2.AutoFilterMode Or WkSh2.FilterMode mais ce n'est pas le cas.
    la deuxième solution lève un erreur si le fichier est en filtre auto mais qu'aucun filtre n'est actif.

    Hier soir, cette modif na pas fonctionné.
    Ce matin, mon pc ayant fait son petit dodo, traite correctement la chose.

    Facéties de l'informatique!

    Problème résolu, donc.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 380
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 380
    Points : 2 007
    Points
    2 007
    Par défaut
    Citation Envoyé par olivier] Voir le message
    L'usage de variables globales tient à ce que je ne voulais pas particulièrement recourir à des paramètres pour les appels de fonctions.
    Vade Retro Satanas !!!

    Plutôt que te faire un long discours, je t'invite à lire ces article:
    https://www.baeldung.com/cs/global-variables
    https://fr.wikipedia.org/wiki/Loi_de_D%C3%A9m%C3%A9ter

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Server datasnap REST ne fonctionne par sur linux
    Par udinacer dans le forum Delphi
    Réponses: 2
    Dernier message: 27/12/2023, 20h57
  2. [XL-2016] Fonctionnement Macro sur autre fichier Excel en tache de fond
    Par gdeaquino dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/12/2020, 12h28
  3. Réponses: 0
    Dernier message: 02/07/2014, 11h58
  4. La boucle ne fonctionne pas sur un fichier flash
    Par Invité dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 06/07/2008, 19h01
  5. Réponses: 4
    Dernier message: 03/04/2006, 08h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo