XL 2010 Optimiser code VB

Toufi

XLDnaute Nouveau
Salut la team,

Noob en VBA, je souhaite utiliser les bonnes pratiques, m'améliorer et apprendre d'avantage
C'est pourquoi, je vous demande si vous pouvez m'aider à optimiser mon code, car je pense que l'on peut faire quelque chose.
Actuellement le résultat est conforme à mes attentes, mais si le fichier comporte un certain nombre de ligne ça lague...

Je vais essayer d'être le plus clair possible sur l'exécution de la macro.
En colonne A, j'aurai toujours des références qui commencent par 3,6 ou 8
le 3 correspond au début
le 6 correspond au contenu
le 8 correspond à la fin
et ainsi de suite
En colonne B, j'ai le détail de la référence de la colonne A.

Le résultat attendu est de:
Mettre sur la même ligne chaque référence qui commence par 3/6/8
Je vous ai joint en lien mon code ainsi que le avant/après exécution de la macro

Merci d'avance ;)

NB: Pour des raisons de confidentialité, j'ai évidemment modifié le contenu de certaines cellules.
 

Pièces jointes

  • Test_Macro.xlsm
    19.3 KB · Affichages: 9
  • Avant.jpg
    Avant.jpg
    204.4 KB · Affichages: 16
  • Après.jpg
    Après.jpg
    166.1 KB · Affichages: 13

pierrejean

XLDnaute Barbatruc
Bonjour Toufi

Je te propose:
VB:
Sub Macro1()
    Columns("A:B").Select
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("A1:A21") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Feuil1").Sort
        .SetRange Range("A1:B21")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
For n = 1 To Range("A" & Rows.Count).End(xlUp).Row
   If Left(Range("A" & n), 1) = "3" And Left(Range("A" & n + 1), 1) <> "3" Then
   debut = n + 1
   aeffacer = n + 1
   End If
   If Left(Range("A" & n), 1) = "6" And Left(Range("A" & n + 1), 1) <> "6" Then
     fin = n
     Range(Cells(debut, 1), Cells(fin, 2)).Copy Destination:=Range("C1")
     debut = n + 1
     Exit For
   End If
Next
For n = 1 To Range("A" & Rows.Count).End(xlUp).Row
   If Left(Range("A" & n), 1) = "8" And Left(Range("A" & n + 1), 1) <> "8" Then
     fin = n
     Range(Cells(debut, 1), Cells(fin, 2)).Copy Destination:=Range("E1")
     debut = n + 1
     Exit For
   End If
Next
Range("A" & aeffacer & ":B" & Rows.Count).ClearContents
End Sub
 

Toufi

XLDnaute Nouveau
Bonjour Pierre Jean
merci pour ta réponse.
J'ai repris ton code et initialisé les variables:
Dim n As Integer
Dim debut As Range
Dim aeffacer As Range
Dim fin As Range

Cependant, j'ai une erreur d'exécution '91' dans le For:

For n = 1 To Range("A" & Rows.Count).End(xlUp).Row
If Left(Range("A" & n), 1) = "3" And Left(Range("A" & n + 1), 1) <> "3" Then
debut = n + 1
aeffacer = n + 1
End If
If Left(Range("A" & n), 1) = "6" And Left(Range("A" & n + 1), 1) <> "6" Then
fin = n
Range(Cells(debut, 1), Cells(fin, 2)).Copy Destination:=Range("C1")
debut = n + 1
Exit For
End If
Next

J'ai regardé à quoi correspond cette erreur d'exécution:
Erreur d'exécution '91': Variable objet ou variable de bloc With non définie
Il se peut qu'une fonction soit appliquée à une variable vide. Ex :

Mais comme je suis un noob, je pédale dans la choucroute...
Merci d'avance pour ton aide
 

pierrejean

XLDnaute Barbatruc
Re
Tu es un nob et la 1ere chose que tu fais c'est modifier le code !!!!!
tu as du écouter un ayatollah de l'option explicit qui a oublié de te dire que les variables non déclarées l’étaient implicitement en Variant
Pour info debut n'est pas un Range mais un integer
 

Toufi

XLDnaute Nouveau
Merci pour ton retour, je me suis auto flagellé :p
Et en effet, en déclarant les variables en "Integer" ça marche beaucoup mieux ;)
Par contre ce n'est pas exactement le résultat attendu.
Voici le résultat attendu, qui fonctionne avec mon code:
Mon code.jpg


Ce que j'obtiens avec ton code:
Ton code.jpg


Encore merci à toi ;)
 

Toufi

XLDnaute Nouveau
Encore merci, mais malheureusement ce n'est pas encore ça.
Par contre, ce qui est bien, c'est que s'exécute beaucoup plus vite :)

J'ai coloré les blocs avant/après pour rendre plus clair le résultat souhaité avec ta sortie et ma sortie de code.
Document avant exécution du code:
Avant.jpg


Document après exécution de mon code:
Après_Mon code.jpg


Document après exécution de ton code:
Après_Ton code.jpg


J'espère que c'est un peu plus clair... et encore merci pour tout.
 

Discussions similaires

Réponses
22
Affichages
787

Statistiques des forums

Discussions
312 273
Messages
2 086 694
Membres
103 372
dernier inscrit
BibiCh