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 :

optimisation d'une macro


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 9
    Par défaut optimisation d'une macro
    Bonjour,


    J'aimerais si possible que l'on m'aide à optimiser mon code. Il marche mais j'aimerais augmenter sa vitesse d'éxécution et je ne vois pas comment faire. (Cela m'intéresserais beaucoup de connaître la meilleure méthode pour effectuer une recherche dans une feuille excel)

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    Sub TransformationDuCSV()
     
    	ActiveSheet.Name = "PSPI"
     
    	'[NE PAS MODIFIER]Suppression des 24 premières lignes du CSV
    	Rows("1:24").Delete Shift:=xlUp
     
    	'[NE PAS MODIFIER]Conversion du format CSV en EXCEL avec les cellules en textes
    	Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
            TextQualifier:=xlNone, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
            :="=", FieldInfo:=Array(Array(1, 2), Array(2, 2)), TrailingMinusNumbers:=True
     
    	'[NE PAS MODIFIER]Suppression de tous les espaces dans les cellules.
    	Dim L, C
            For L = 1 To ActiveCell.SpecialCells(xlCellTypeLastCell).Row
            	For C = 1 To ActiveCell.SpecialCells(xlCellTypeLastCell).Column
    			Cells(L, C).Value = Trim(Cells(L, C).Value)
            	Next
            Next
     
    	Dim j As Long
    	For j = 65536 To 1 Step -1
    		If Cells(j, 1) = "Operator ID" Then Rows(j + 1).Delete Shift:=xlUp
                    If Cells(j, 1) = "Enable status" Or Cells(j, 1) = "Re-enable date" Or Cells(j, 1) = "Approval status" Or Cells(j, 1) = "Last changed" Or Cells(j, 1) = "Last sign-on" Or Cells(j, 1) = "Calculated pwd" Or Cells(j, 1) = "One-time password" Or Cells(j, 1) = "Active devices" Then Rows(j).Delete Shift:=xlUp
    	Next j
     
    	'On commence du bas
    	Dim i As Long
    	For i = Selection.Rows.Count To 1 Step -1
    		If WorksheetFunction.CountA(Selection.Rows(i)) = 0 Then	Selection.Rows(i).EntireRow.Delete
    	Next i
     
    	With Application
    		.Calculation = xlCalculationAutomatic
    		.ScreenUpdating = False
    	End With
     
    	'[NE PAS MODIFIER]Ligner les colonnes
    	Application.ScreenUpdating = False
    	Rows("1:1").Insert Shift:=xlDown
     
    	With Sheets("PSPI").Range("A1:A" & [A65000].End(xlUp).Row)
    		Set C = .Find("Operator ID", LookIn:=xlValues, LookAt:=xlWhole)
     
    		If Not C Is Nothing Then
            		Firstaddress = C.Address
    			Do
    				derlig = Cells(C.Row, 1).Offset(0, 1).End(xlDown).Row
    	                	derlig2 = [D65000].End(xlUp).Row + 2
    		                Range(Cells(C.Row, 1), Cells(derlig, 2)).Copy
            		        Cells(derlig2, 4).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
    		                    True, Transpose:=True
            		        Set C = .FindNext(C)
    			Loop While Not C Is Nothing And C.Address <> Firstaddress
    	        End If
    	End With
     
    	Columns("A:C").Delete Shift:=xlToLeft
    	Rows("1:1").Delete Shift:=xlUp
    	[A1].Select
     
            For j = 1 To 65536
                    If Cells(j, 1) = "Operator ID" Then Rows(j - 1).Delete Shift:=xlUp
            Next j
     
            For j = 1 To 65536
            	If Cells(j, 1) = "Operator ID" Then Rows(j).Delete Shift:=xlUp
            Next j
     
    End Sub
    Merci pour votre aide future : o)
    Je reste à votre disposition pour toute précision


    Alphons

  2. #2
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Bonjour,
    Quelque remarque rapide j'ai juste survolé le code

    Tu parcours les lignes de la 65536 à la 1ère ca serait plus simple de comencer a la dernièreligne utilisé
    Un petit lien pour toi
    Tu l'utilise mais pas a chaque fois

    Sinon la meilleur méthode pour effectuer une recherche dans une feuille est d'utiliser la fonction find. Mais tu le fais déjà

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 9
    Par défaut
    Re,


    Effectivement, oui il serait mieux d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i = 65536 To 1 Step -1
    que
    Je suis d'accord seulement je ne sais pas pourquoi mais j'ai un bug qui apparaît lorsque j'utilise cette boucle en partant de la fin. L'erreur qu'il me propose est "erreur définie par l'application ou par l'objet". Et le debogage me surligne "Rows(j - 1).Delete Shift:=xlUp" dans l'avant dernière boucle de la macro. Que faire ? ^^

    En tout cas merci pour ta réponse qui est effectivement exacte mais que je n'arrive pas à appliquer pour l'instant. Ah et merci aussi pour le lien il est vraiment très bien je trouve.

    Si quelqu'un pouvait prendre un peu de temps pour se pencher sur mon code je lui en serais très reconnaissant^^

    Merci : o)


    Alphons

  4. #4
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Non ce n'est pas du tout ce que j'ai voulu dire surtout si tu supprimer des ligne est faut le faire de bas en haut.
    Je dit que s'il n'y a que 100 ligne inutile de commencer ton teste a la 65536ème tu vas faire 65436 test pour rien.
    Fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i = derniereligne To 1 Step -1
    Regarde le lien pour définir derniereligne
    Au moment du bug j vaux quoi?
    Ca ne serais pas 1 par hasard? Regarde si tu trouve la ligne 0(=1-1)

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 9
    Par défaut
    Re,

    Au risque de passer pour un débutant (que je suis^^) comment puis-je savoir la valeur de mon j au moment du bug ?
    Et ou suis-je sensé regarder pour trouver "la ligne 0(=1-1) " ?

    Sinon par rapport à la boucle qui part de 65536 jusqu'à 1 c'est en fait parce que toutes mes feuilles .CSV sont remplies jusqu'à 65536. Cependant merci pour la remarque car elle aurait pu beaucoup m'aider : o)

    Merci


    Alphons

  6. #6
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Je connais deux solutions enfin il y en a une troisième mais on va l'éviter si tu veux finir avant noel

    Au moment ou cela plante tu met le curseur de ta sourie sur le j et dans la bulle jaune tu as la valeur. Tu selectionne le j clique droit et tu met ajouter espion.


    Désolé d'avoir insité mais il est bien rare de voir des fichier plein par contre des boucles inutiles on en voi a la pelle

    pour la ligne 0 justement elle n'existe pas donc si j=1 la ligne j-1 donc la ligne 0 n'existe pas

Discussions similaires

  1. [XL-2007] Optimisation d'une macro + Application à tous les onglets
    Par Identifiant75 dans le forum Excel
    Réponses: 53
    Dernier message: 05/05/2015, 19h23
  2. Optimisation d'une macro lente
    Par Zebulon777 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/12/2012, 22h35
  3. [XL-2003] Optimiser une macro de mise en forme d'un Tableau
    Par mouncefdi dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/04/2009, 12h19
  4. Optimiser une macro
    Par PiliSql dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 20/05/2008, 20h18
  5. probleme d'optimisation d'une macro
    Par ylabarre dans le forum VBA Outlook
    Réponses: 5
    Dernier message: 28/09/2007, 16h40

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