Macro... rapidité à améliorer

Résolu
Anthonnyy -  
eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

j'ai réalisé cette macro qui doit pouvoir s'utiliser sur plusieurs feuilles (RPORDO 2009, RPORDO 2010, RPORDO 2011, .....)
elle permet de mettre en face de la ligne livraison (colonne C) le code de la colonne B pour que je puisse utiliser la fonction RECHERCHEV.

http://cjoint.com/?3BcsT7Djlpd

la macro fonctionne mais elle prend beaucoup de temps. j'ai fait pour le mieux mais je pense qu'elle fera rire les experts VBA :-)

quelqu'un aurait des idées pour qu'elle soit plus rapide ?

Merci de votre aide

6 réponses

  1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,

    Que faites vous des lignes cachees ????????
    0
    1. Anthonnyy
       
      effectivement les lignes cachées ont une incidence. c'est bon à savoir pour les prochaines macro
      Cells.Select
      Selection.EntireColumn.Hidden = False
      Selection.EntireRow.Hidden = False
      0
  2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    regarde si ça va :
    Sub mef_RPORDO()
        Dim c As Range, adr1 As String, lig As String, CalcStatus As Long
        lig = 5
        Application.ScreenUpdating = False
        CalcStatus = Application.Calculation
        Application.Calculation = xlCalculationManual
    
        With [C4].Resize(Cells(Rows.Count, "C").End(xlUp).Row - 3)
            Set c = .Find("Livraisons", LookIn:=xlValues, lookat:=xlWhole)
            If Not c Is Nothing Then
                Do
                    ' si trouvé
                    c.Offset(0, -1) = c.Offset(2, -1)
                    Range(lig & ":" & c.Row - 1).Delete
                    lig = c.Row + 1
                    Set c = .FindNext(c)
                Loop While Not c Is Nothing And c.Address <> "$C$5"
            End If
        End With
        Range(lig & ":" & lig + 20).Delete
        Application.ScreenUpdating = True
        Application.Calculation = CalcStatus
    End Sub

    eric

    0
    1. Anthonnyy
       
      après coup j'ai fait la comparaison du nbe de lignes obtenues avec ta macro (99) et en le faisant manuellement et j'obtiens 233 lignes "livraisons"
      les lignes vides doivent avoir une incidence (lignes 110 à 116 par exemple). Mon collègue a insérer des lignes vides pour séparer les familles
      0
    2. Anthonnyy
       
      j'ai rajouté ces lignes
      Cells.Select
      Selection.EntireColumn.Hidden = False
      Selection.EntireRow.Hidden = False
      et j'obtiens bien 233 cette fois donc j'ai ma réponse, les lignes cachées ont une incidence
      0
  3. Anthonnyy
     
    Bonjour,
    en fait cette feuille est mise à jour par un collègue et j'en fais une copie. Du coup je ne touche à rien sur la feuille mais la macro me permet de la mettre au format pour me permettre de l'exploiter. les lignes cachées ont une incidence ? je pensais qu'elles subissaient le même traitement que les autres lignes.
    0
  4. Anthonnyy
     
    Bonjour Eric,
    je viens de tester et c'est le jour et la nuit ^^
    1s top chrono
    je vais me plonger dans le pas à pas pour m'approprier le code afin de pouvoir l'adapter si jamais mon collègue faisait évoluer ses feuilles

    Merci encore, ça va me faire gagner du temps
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    Bonjour,

    En décortiquant ce que tu fais dans ta macro, je t'en ai écrit une plus compacte "selection_livraisons" qui fait la même chose :

    Public Sub selection_livraisons()
    Dim Lig As Long, mnt As Variant, vlB As Variant
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
        For Lig = Cells(Rows.Count, "C").End(xlUp).Row To 2 Step -1
            vlB = Cells(Lig, "B").Value
            If IsNumeric(vlB) And vlB > 0 Then mnt = vlB
            If Not (Cells(Lig, 3) Like ("Livraisons")) Then
                Rows(Lig).Delete
            Else
                Cells(Lig, "B").Value = mnt: mnt = ""
            End If
        Next Lig
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    End Sub
    

    Pas facile, lorsque l'on supprime des lignes de gagner du temps. La mienne va plus vite mais si tu rajoutes les 2 lignes en gras à la tienne , les temps sont identiques !

    à toi de voir... mais ces 2 lignes divisent le temps par 5 tout de même !
    0
    1. Anthonnyy
       
      j'ai testé, effectivement ça divise le temps, par contre je ne retrouve pas tous mes petits. comme 18316, 72450, 18333 sur les premières lignes
      0
  7. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Re,

    Je faisais mes tests sur un fichier sur lequel j'avais démasqué toutes les lignes.
    Je ne l'ai pas intégré à la macro, il faudrait l'ajouter.

    @gb, salut,
    tu as ajouté ça aussi :
    ... And vlB > 0 Then ...
    C'est aussi là que se situe la différence je pense, les cellules vides étaient traitées.

    eric

    Jamais tu ne répondras à un mp non sollicité...
    Bon, ça c'est fait.
    0