Booster macro

  • Initiateur de la discussion jean
  • Date de début
J

jean

Guest
bonjour au FORUM

Je cherche a accelerer mes macros car je dois attendre 30min pour que le resultat s'affiche: c'est beaucoup trop long
il y a peut etre qqc a faire sur l'ordinateur?

merci
 
M

michel_m

Guest
Bonjour à tour

autre petit gain de temps:

on pourrait remplacer:
Sheets('ordre1').Select
Cells.Select
Selection.Copy
Sheets('1').Select
Cells(1, 1).Select
ActiveSheet.Paste


par
Sheets('ordre1').cells.copy Sheets('1').cells


Michel
 

PascalXLD

XLDnaute Barbatruc
Modérateur
Bon ça va José :whistle:


Oui il en manque un autre (j'avais bien dit que j'avais pas testé :) )

For x = 1 To UBound(MonTableauSource)
For y = 1 To UBound(MonTableauSource2)
If MonTableauSource(x, 1) = MonTableauSource2(y, 1) And MonTableauSource(x, 4) =
MonTableauSource2(y, 4) And MonTableauSource(x, 8) = MonTableauSource2(y, 8) And MonTableauSource(x,
10) = MonTableauSource2(y, 10) And MonTableauSource(x, 12) = MonTableauSource2(y, 12) Then
z = z + 1
ReDim Preserve MonTableauCible(z)
MonTableauCible(z) = y
end if 'ICI
Next y
Next x
 
M

michel

Guest
re

ne serait ce pas le end if de

If MonTableauSource(x, 1) = MonTableauSource2(y, 1) And MonTableauSource(x, 4) = MonTableauSource2(y, 4) And MonTableauSource(x, 8) = MonTableauSource2(y, 8) And MonTableauSource(x, 10) = MonTableauSource2(y, 10) And MonTableauSource(x, 12) = MonTableauSource2(y, 12) Then



michel
 

PascalXLD

XLDnaute Barbatruc
Modérateur
Bon là je vois pas comme cela

De plus j'ai un souci car je ne vais pas pouvoir ccontinuer de suite car gros problème de PC il faut que je reformate tout donc .....

Bon je pense que tu auras de la relève puisque José, Michel suivent
 

Hellboy

XLDnaute Accro
Bonjour a tous

Mon grain de sel

Code:
Sub ordre1()
Application.ScreenUpdating = False
Dim u As Byte
Dim i As Integer
Sheets('ordre1').Select
Cells.Select
Selection.Copy
Sheets('1').Select
Cells(1, 1).Select
ActiveSheet.Paste


With Sheets('1')
    For i = 1 To Sheets('ordre0').Range('A65000').End(xlUp).Row
    For u = 1 To .Range('A65000').End(xlUp).Row
       If Sheets('ordre0').Range('D' & i) = .Range('D' & u) And _
          Sheets('ordre0').Range('D' & i) = .Range('D' & u) And _
          Sheets('ordre0').Range('H' & i) = .Range('H' & u) And _
          Sheets('ordre0').Range('J' & i) = .Range('J' & u) And _
          Sheets('ordre0').Range('L' & i) = .Range('L' & u) And _
          Sheets('ordre0').Range('A' & i) = .Range('A' & u) Then
          .Range('D' & u).ActiveCell.EntireRow.Delete
       End If
Next u
Next i
supprimeMoins
SelectionCopier1bis
supp
Application.ScreenUpdating = True
End Sub


Sub supp()
Dim i As Integer, j As Byte

Range('B4').Select
For i = Range('A65536').End(xlUp).Row To 2 Step -1
    For j = 2 To (Range('IV2').End(xlToLeft).Column - 1) ' Le J ne devrait t_il pas commencer a deux ?
        If Cells(i, 2).Value = '***' Then  ' Est ce que le ça --> '***' peut se retrouver dans une autre colonnes ? de la même ligne que i ?
            Rows(i).Delete
            'Cells(i, 2).Select
            'j = 1  TU réinitialise le J a 1 pourquoi ?
            'k = k + 1    Tu ne fais rien avec ça ???
        'Else
        '    Cells(i, j + 1).Select  Tu ne fais rien avec ça ???
        End If
    Next j
    'Cells(i - 1, 2).Select
Next i
End Sub

Option Explicit
Sub supprimeMoins()
Dim derlgn As Integer
derlgn = Range('A65536').End(xlUp).Row
Range(Cells(1, 10), Cells(derlgn, 10)).Select
Selection.Replace What:='-', Replacement:='', LookAt:=xlPart, _
          SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
End Sub

Sub SelectionCopier1bis()
Dim X As Integer, Z As Integer
Dim Y As Byte
Application.ScreenUpdating = False
With Worksheets('1')
    For X = 1 To Range('A65536').End(xlUp).Row
        If .Cells(X, 6) = 'PM7' Then
           Z = Worksheets('1bis').Range('A65536').End(xlUp).Row + 1
            For Y = 1 To 14
            Worksheets('1bis').Cells(Z, Y) = .Cells(X, Y)
            Next
        End If
    Next X
End With
Application.ScreenUpdating = True
End Sub

Il me reste le module supp acomprendre pour optimisation

Une chose que j'ai change de plus par rapport au autre c'est enlever une boucle ds la procédure supprime moins.

Mais je crois que le goulot d'étranglement se situe ds la procédure supp


Regarde la procédure supp et si tu peux répondre a mes question qui sont en commentaire merci !

a+

Message édité par: Hellboy, à: 29/06/2005 16:49
Changer des variables Integer qui servent pour les colonnes en Byte
Message édité par: Hellboy, à: 29/06/2005 18:24

Message édité par: Hellboy, à: 29/06/2005 18:46
 

DSA

XLDnaute Junior
Bonjour à tous,

j'arrive un peu après la bataille, mais je vous propose la sub suivante (concerne uniquement la partie ordre1 sans les autres macro, pas encore eut le temps):

Code:
Sub ordre1()
Dim u, i, j, Col1, Col2 As Integer
Dim ASup As Boolean
Dim derLigneTemp, derLigneCompa As Integer
Dim FeuilTemp As Worksheet
Dim FeuilCompa As Worksheet
    
ThisWorkbook.Sheets('ordre1').Copy before:=Sheets(1)
ThisWorkbook.Sheets('ordre1 (2)').Name = '1'
Set FeuilTemp = ThisWorkbook.Sheets('1')
Set FeuilCompa = ThisWorkbook.Sheets('ordre0')

'Ici tu fixe les colonnes à tester, la Col1 doit tjs avoir des valeurs et ne pas être vide
Col1 = 1
Col2 = 7

'On recherche la dernière ligne de chaque feuille
i = 1
While FeuilTemp.Cells(i, Col1) <> ''
    i = i + 1
Wend
derLigneTemp = i - 1
i = 1
While FeuilCompa.Cells(i, Col1) <> ''
    i = i + 1
Wend
derLigneCompa = i - 1

'On trie les données sur la base de la première colonne
FeuilCompa.Range(FeuilCompa.Cells(1, Col1), FeuilCompa.Cells(derLigneCompa, Col2)).Sort Key1:=FeuilCompa.Cells(1, Col1), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
FeuilTemp.Range(FeuilTemp.Cells(1, Col1), FeuilTemp.Cells(derLigneTemp, Col2)).Sort Key1:=FeuilTemp.Cells(1, Col1), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
        
        
i = 1
j = 1
While FeuilTemp.Cells(i, Col1) <> ''
    'On revient trois lignes en arrière au cas où. A voir si cela est nécessaire en fonction de tes propres données
    If j > 3 Then
        j = j - 2
    End If
    While FeuilCompa.Cells(j, Col1) <> ''
        'Hypothèse toutes les données identiques
        ASup = True
        For u = Col1 To Col2
            If FeuilCompa.Cells(j, u) <> FeuilTemp.Cells(i, u) Then
                'Données différentes, donc on garde
                ASup = False
            End If
        Next
        'Comme toutes les données sont identiques, on zap la boucle
        If ASup Then
            GoTo suite
        End If
        j = j + 1
    Wend
suite:
        If ASup Then
            FeuilTemp.Rows(i).Delete
        Else
            i = i + 1
        End If
Wend

Set FeuilCompa = Nothing
Set FeuilTemp = Nothing
End Sub

Normallement, tu dois gagner pas mal de temps sur les comparaison ligne à ligne. Fais quand même attention au commentaire car il y a plusieurs qui suivant tes données risquent d'être bloquant.

Si j'ai le temps, je vous propose demain ma version des autres macro (sauf naturelement j'ai un message me disant que ce n'est pas nécessaire)...

A+

DSA
 
J

jean

Guest
Bonjour dsa


je viens d'essayer ta macro mais il y a un probleme en ce qui concerne:

FeuilCompa.Range(FeuilCompa.Cells(1, Col1), FeuilCompa.Cells(derLigneCompa, Col2)).SortKey1:=FeuilCompa.Cells(1, Col1), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False,Orientation:=xlTopToBottom
FeuilTemp.Range(FeuilTemp.Cells(1, Col1), FeuilTemp.Cells(derLigneTemp, Col2)).SortKey1:=FeuilTemp.Cells(1, Col1), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False,Orientation:=xlTopToBottom


2erreur de sintaxe
 

Statistiques des forums

Discussions
312 286
Messages
2 086 809
Membres
103 392
dernier inscrit
doc_banane