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 :

Macro stoppe à la 65536e ligne ! [XL-2010]


Sujet :

Macros et VBA Excel

  1. #21
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Je ne comprends pas l'utilité de tes tests dans la boucle, ni de l'addition à l'intérieur des IF, puisque tu additionnes une cellule non vide avec une cellule vide. Ca vient à passer la valeur de la non-vide dans la vide, non?

    Dans le code suivant, si la condition est rencontrée, Cells(i-1,j) n'a pas été modifiée à la fin du IF...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                If Cells(i - 1, j) <> "" And Cells(i, j) = "" Then
                    Cells(i - 1, j) = Cells(i - 1, j) + Cells(i, j)
    D'où ma demande: Explique stp en français ce que tu as et ce que tu souhaites obtenir.

    j'avoue : un peu à l'arrache mon code ( t'as vu l'heure ??? ) depuis ce matin 7h je teste ma macro et comme elle "tourne" 40 min à chaque fois...
    promis, j'affinerai mon code

    post message :

    voili :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                If Cells(i - 1, j) = "" And Cells(i, j) <> "" Then
                    Cells(i - 1, j) = Cells(i, j)
                End If

  2. #22
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 926
    Points
    55 926
    Billets dans le blog
    131
    Par défaut
    Si j'ai bien compris, voici quelque chose qui pourrait convenir (à adapter à tes colonnes)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Test1()
      Dim i As Long
      Dim j As Long
     
      For i = Range("a1048576").End(xlUp).Row To 2 Step -1
        If Cells(i, 1) = Cells(i - 1, 1) And Cells(i, 3) = Cells(i - 1, 3) Then
          For j = 5 To 9
            If Cells(i, j) = "" Or Cells(i - 1, j) = "" Then Cells(i - 1, j) = Cells(i, j) & Cells(i - 1, j)
          Next j
          Cells(i, 1).EntireRow.Delete
        End If
      Next i
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #23
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 926
    Points
    55 926
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Stardust31 Voir le message
    [...]elle "tourne" 40 min à chaque fois...[...]
    1. Désactiver le rafraîchissement d'écran en début de macro Application.Screenupdating = false
    2. Passer le calcul en manuel en début de macro si tu as des formules qui utilisent la plage que tu manipules application.Calculation = xlCalculationManual
    Faudrait voir à y aller par formule dans des colonnes de droite pour compléter la première ligne du doublon éventuel puis supprimer les lignes en doublons sur les colonnes 1 et 3. Ca pourrait être nettement plus rapide. Le tout pourrait se faire par macro, mais parfois, ça va plus vite ainsi.

    Autre solution: charger la plage dans un tableau VBA et faire tourner le code sur le tableau plutôt que sur la plage (en remplissant les deux lignes), puis supprimer la plage et y coller le tableau puis supprimer les doublons.

    En passant par des formules dans des colonnes à droite, on pourrait avoir un code du genre, à adapter sur une feuille qui ressemblerait à ceci (25 secondes sur 1 million de lignes testées):

    Nom : 2018-02-23_215652.png
Affichages : 87
Taille : 28,9 Ko



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub TEst2()
      Dim Formula As String
      Dim myRange As Range
     
    Application.ScreenUpdating = False
      Set myRange = Range("j1:n" & Range("a1048576").End(xlUp).Row)
      Formula = "=IF(AND($A2=$A1,$C1=$C2),IF(OR(E1="""",E2=""""),E1&E2,E1),E1&"""")"
      myRange.Formula = Formula
      myRange.Copy
      myRange.PasteSpecial xlPasteValues
      Columns("e:i").Delete xlToLeft
      Range("a1:i" & Range("a1048576").End(xlUp).Row).RemoveDuplicates Columns:=Array(1, 3), Header:=xlNo
      Application.ScreenUpdating = True
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #24
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    bonjour Pierre
    j'ai testé ta dernière proposition : c'est NICKEL !!

    si tu avais 3 secondes de plus à m'accorder pour la question suivante...
    je ne comprends pas la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Formula = "=IF(AND($A2=$A1,$C1=$C2),IF(OR(E1="""",E2=""""),E1&E2,E1),E1&"""")"
    comment elle prend en compte les cellules E à I ?
    je comprends le critère AND($A2=$A1,$C1=$C2)... c'est après que je bugge

    merci à toi pour le support

    merci à tous des propositions

  5. #25
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Points : 1 441
    Points
    1 441
    Par défaut
    bonjour,
    E1="""" --> E1="" mais entre " et " --> "E1="""" ..."

    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  6. #26
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 926
    Points
    55 926
    Billets dans le blog
    131
    Par défaut
    C'est une formule Excel avec des références absolues et relatives. Comme cette formule est placée en J1:Nx, les $A restent des $A, mais E1 en J1 devient F9 en K9 etc. C'est là que les $ ont toute leur importance pour l'utilisation des références absolues et relatives dans la rédaction d'UNE formule que l'on valide sans boucle en VBA sur une grande plage.

    Placer la formule comme je le fais sur toute la plage J1:Nx revient à sélectionner cette plage en Excel puis à saisir la formule en E1 et à valider avec CTRL+ENTER pour la placer dans chaque cellule de la plage sélectionnée en une seule passe.

    Cest une méthode très rapide en Excel que l'on peut singer en vba et sui évite les boucles sur 200000 lignes. Pas de boucle est synonyme de gain de performance...

    A nouveau, on fait d'abord de l'Excel puis du VBA (voir ma signature...) 😉
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. macro recherche et insertion ligne
    Par jul85 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/02/2008, 19h45
  2. Une macro à faire sur une ligne précise
    Par JPDU92 dans le forum VBA Word
    Réponses: 5
    Dernier message: 31/01/2008, 12h13
  3. macro pour impression dernière ligne excel
    Par schwoby dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/08/2007, 14h33
  4. [Macro excel]selectionner une ligne à partir d'une recherche
    Par heavenly dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/04/2007, 16h26
  5. Excel : Macro pour positionnement sur ligne
    Par danielh dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/10/2006, 08h45

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