[Résolu] VBA accélérer replace

adel53

XLDnaute Occasionnel
bonjour

J'ai besoin de votre aide pour accélerer ce bout de code.
En gros je reçois de différent labo des analyses d'huile que j'importe et je retraite pour homégéniser les résultats de différents labo.

Cette partie de ma macro est celle qui consomme le plus de temps pouvez vous svp m'aider à l'optimiser

Code:
Sub Symboles()
    Columns("F:AP").Select
    Selection.Replace What:="9999", Replacement:="1", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False

    Selection.Replace What:="~*", Replacement:="", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
    
    Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
    
    Selection.Replace What:="-", Replacement:="", LookAt:=xlWhole, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
    
    Selection.Replace What:="<1", Replacement:="0,9", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
    
    Selection.Replace What:="<0", Replacement:="0", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
    
    Selection.Replace What:="/", Replacement:=",", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
    
    Range("a1").Activate
    Application.Calculate
End Sub

Cette procédure aussi prends énormement de temps


Code:
Sub Formats()
    Dim derligne As Integer
    derligne = Range("B3000").End(xlUp).Row
    For Each c In Range("F2:AP" & derligne).Cells
        If c.Value <> "" Then
            c.Value = c.Value * 1
        End If
    Next
    Debug.Print "format " & ActiveSheet.Name
    Application.Calculate
End Sub
 
Dernière édition:

laetitia90

XLDnaute Barbatruc
Re : VBA accélérer replace

bonjour adel53
un exemple pour la 1 qst.. code assez brut a voir en attendant mieux

pour la plage je prends la colonne f donc 6 adapte

Code:
Sub es()
Dim x As Variant, r As Long, c As Long
  With Application
 .Calculation = xlCalculationManual: .ScreenUpdating = 0: .DisplayAlerts = 0
    x = Range("f1:ap" & Cells(Rows.Count, 6).End(3).Row).Value
     For r = 1 To UBound(x, 1)
     For c = 1 To UBound(x, 2)
           x(r, c) = Replace(x(r, c), "9999", "1")
           x(r, c) = Replace(x(r, c), "~*", "")
           x(r, c) = Replace(x(r, c), ".", ",")
     'ect
     Next c: Next r
   Range("f1:ap" & Cells(Rows.Count, 6).End(3).Row).Value = x
  .Calculation = xlCalculationAutomatic: .ScreenUpdating = 1: .DisplayAlerts = 1
 End With
End Sub
 

pierrejean

XLDnaute Barbatruc
Re : VBA accélérer replace

Bonjour adel53

Tu souhaites gagner du temps
Cela tombe bien : nous aussi
Dans cette optique , tu nous prépares un petit fichier exemple a partir de ton fichier (sans données confidentielles )
Quelques dizaines de lignes devraient suffire

Edit : Salut Laetitia (pas rafraîchi assez vite)
 

adel53

XLDnaute Occasionnel
Re : VBA accélérer replace

Voici un fichier exemple

Je dois gérer les analyses de 4 labos différents (CSV, Excel) une fois le fichier importé je procède à l'uniformisation des fichiers afin de faire du reporting derrière et décider si oui ou non une vidange doit être réalisé.

Laetitia J'ai erreur execution 13 avec votre macro

Merci pour votre aide
 

Pièces jointes

  • Exemple.xlsm
    53.1 KB · Affichages: 44
  • Exemple.xlsm
    53.1 KB · Affichages: 50
  • Exemple.xlsm
    53.1 KB · Affichages: 53

pierrejean

XLDnaute Barbatruc
Re : VBA accélérer replace

Re

Une petite accélération peut-être avec cette macro:

Code:
Sub test()
debut = Timer
Application.Calculation = xlCalculationManual
tablo = Range("F2:AP" & Range("F" & Rows.Count).End(xlUp).Row)
voir = Array("9999", "~*", ".", "-", "<1", "<0", "/")
mettre = Array("1", "", ",", "", "0,9", "0", ",")
ReDim tabres(UBound(tablo, 1), UBound(tablo, 2))
For n = LBound(tablo, 1) To UBound(tablo, 1)
 For m = LBound(tablo, 2) To UBound(tablo, 2)
 tabres(n, m) = tablo(n, m)
   For p = LBound(voir) To UBound(voir)
     If InStr(tabres(n, m), voir(p)) <> 0 Then
         tabres(n, m) = Replace(tabres(n, m), voir(p), mettre(p))
     End If
   Next
 Next
Next
Range("F2").Resize(UBound(tabres, 1), UBound(tabres, 2)) = tabres
Application.Calculation = xlCalculationAutomatic
MsgBox (Timer - debut)
End Sub

teste et dis- nous
 

Si...

XLDnaute Barbatruc
Re : [Résolu] VBA accélérer replace

salut

indépendamment de la durée (encore que ?) tu peux simplifier ton code

Code:
Sub Symboles()
  t = Timer
  Range("F1:AP" & [F60000].End(xlUp).Row)(3).SpecialCells(2).Select
  'pour accélérer surtout si tu as des fourmles
  With Application
    .Calculation = xlCalculationManual: .ScreenUpdating = 0: .DisplayAlerts = 0
  End With
  With Selection
    .Replace "9999", "1"
    .Replace "~*", ""
    .Replace ".", ","
    .Replace "-", ""
    .Replace "<1", "0,9"
    .Replace "<0", "0"
    .Replace "/", ","
   End With
   [A1].Activate
   Application.Calculation = xlCalculationAutomatic: Application.DisplayAlerts = 0
   MsgBox Timer - t
End Sub
 

Discussions similaires

Réponses
1
Affichages
127

Statistiques des forums

Discussions
312 239
Messages
2 086 508
Membres
103 237
dernier inscrit
smbt-excel