Macro... rapidité à améliorer

Résolu/Fermé
Anthonnyy - 2 févr. 2013 à 18:51
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 - 3 févr. 2013 à 13:11
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


A voir également:

6 réponses

f894009 Messages postés 17229 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 21 janvier 2025 1 712
Modifié par f894009 le 3/02/2013 à 09:38
Bonjour,

Que faites vous des lignes cachees ????????
0
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
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 250
3 févr. 2013 à 11:34
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
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
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
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 714
3 févr. 2013 à 11:57
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
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
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 250
Modifié par eriiic le 3/02/2013 à 13:12
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