Optimiser une macro
Résolu/Fermé
bayedav
-
25 juil. 2013 à 12:39
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 - 5 août 2013 à 15:55
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 - 5 août 2013 à 15:55
A voir également:
- Optimiser une macro
- Optimiser son pc - Accueil - Utilitaires
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Optimiser windows 10 - Guide
- Macro word - Guide
- Macro logiciel - Télécharger - Organisation
7 réponses
Bonjour,
Essayes cette Macros, elles transfère toutes les données de ton tableau dans une Table Virtuel et traite le tout virtuellement.
Une fois tout les résultat obtenu
elle vient agrémenterr ta colonne B sur la feuille
LgMax1 = Cells(Rows.Count, 1).End(xlUp).Row
CoMax1 = Cells(1, Columns.Count).End(xlToLeft).Column
ReDim TBL_Original(LgMax1, ColMax1)
For i = 2 To LgMax1
For u = 1 To CoMax1
TBL_Original(i, u) = wsFicAna.Cells(i, u).Value
Next u
Next i
For LgAna = 2 To LgMax1
For LgAnab = 2 To LgMax1
' Un doublon est trouvé dans une ligne
If TBL_Original(LgAna, 4) = TBL_Original(LgAnab, 4) _
And LgAnab <> LgAna _
And TBL_Original(LgAna, 4) <> "" Then
TBL_Original(LgAna, 2) = "UP"
Exit For
End If
Next
Next
For i = 2 To LgMax1
wsFicAna.Cells(i, 2).Value = TBL_Original(i, 2)
Next i
Essayes cette Macros, elles transfère toutes les données de ton tableau dans une Table Virtuel et traite le tout virtuellement.
Une fois tout les résultat obtenu
elle vient agrémenterr ta colonne B sur la feuille
LgMax1 = Cells(Rows.Count, 1).End(xlUp).Row
CoMax1 = Cells(1, Columns.Count).End(xlToLeft).Column
ReDim TBL_Original(LgMax1, ColMax1)
For i = 2 To LgMax1
For u = 1 To CoMax1
TBL_Original(i, u) = wsFicAna.Cells(i, u).Value
Next u
Next i
For LgAna = 2 To LgMax1
For LgAnab = 2 To LgMax1
' Un doublon est trouvé dans une ligne
If TBL_Original(LgAna, 4) = TBL_Original(LgAnab, 4) _
And LgAnab <> LgAna _
And TBL_Original(LgAna, 4) <> "" Then
TBL_Original(LgAna, 2) = "UP"
Exit For
End If
Next
Next
For i = 2 To LgMax1
wsFicAna.Cells(i, 2).Value = TBL_Original(i, 2)
Next i
eriiic
Messages postés
24600
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 octobre 2024
7 239
25 juil. 2013 à 12:49
25 juil. 2013 à 12:49
Bonjour,
tu devrais déposer un fichier représentatif avec qcq données.
Déposer le fichier xls (réduit au nécessaire et anonymisé, avec les explications et éventuellement le résultat attendu) sur cjoint.com et coller ici le lien fourni.
eric
tu devrais déposer un fichier représentatif avec qcq données.
Déposer le fichier xls (réduit au nécessaire et anonymisé, avec les explications et éventuellement le résultat attendu) sur cjoint.com et coller ici le lien fourni.
eric
En fait je suis en train de travailler sur un projet de mise à jour de données.
J'ai :
- un premier fichier Anlyse_données_V7 en xls avec trois onglets : Accueil, AnalyseData, UpdateData et InsertData.
- deux listes de données Export_SIG.csv (master : CSV1) et Export_CS.csv (slave : CSV2).
Le but est :
- d'ouvrir mon fichier analyse en premier où je vais lancer l'ouverture de mes deux fichiers csv.
- de faire un mapping des deux fichiers csv
- de copier toutes les lignes csv1 qui existent mais en doublons ou bien qui n'existent dans csv2 au niveau de l'onglet AnalyseData.
- de rechercher des doublons dans cet onglet AnalyseData et à chaque fois que je trouve un doublons il me met "UP" de update à la colonne B ou laisser vide si pas de doublon donc à insérer.
- de recopier les ligne avec "UP" dans l'onglet UpdateData, celles qui sont vides dans InsertData.
ça fonctionne comme je souhaite. Mais un peu long alors qu'il n'y a que 1100 lignes
Vous trouverai ci-dessous le lien des fichiers.
http://cjoint.com/?3Gzm6b9FGIU
Merci
J'ai :
- un premier fichier Anlyse_données_V7 en xls avec trois onglets : Accueil, AnalyseData, UpdateData et InsertData.
- deux listes de données Export_SIG.csv (master : CSV1) et Export_CS.csv (slave : CSV2).
Le but est :
- d'ouvrir mon fichier analyse en premier où je vais lancer l'ouverture de mes deux fichiers csv.
- de faire un mapping des deux fichiers csv
- de copier toutes les lignes csv1 qui existent mais en doublons ou bien qui n'existent dans csv2 au niveau de l'onglet AnalyseData.
- de rechercher des doublons dans cet onglet AnalyseData et à chaque fois que je trouve un doublons il me met "UP" de update à la colonne B ou laisser vide si pas de doublon donc à insérer.
- de recopier les ligne avec "UP" dans l'onglet UpdateData, celles qui sont vides dans InsertData.
ça fonctionne comme je souhaite. Mais un peu long alors qu'il n'y a que 1100 lignes
Vous trouverai ci-dessous le lien des fichiers.
http://cjoint.com/?3Gzm6b9FGIU
Merci
Gyrus
Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
523
25 juil. 2013 à 13:13
25 juil. 2013 à 13:13
Bonjour,
A+
Dim Plage As Range, Cel As Range Set Plage = wsFicAna.Range("D2:D" & wsFicAna.Range("A" & Rows.Count).End(xlUp).Row) Application.ScreenUpdating = False For Each Cel In Plage If Application.CountIf(Plage, Cel.Value) > 1 And Cel.Value <> "" Then Cel.Offset(0, -2).Value = "UP" Next Cel Set Plage = Nothing
A+
eriiic
Messages postés
24600
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 octobre 2024
7 239
25 juil. 2013 à 14:33
25 juil. 2013 à 14:33
Bonjour,
Lire et écrire des cellules est très lent, il faut que tu travailles en mémoire.
Je n'ai pas trop le temps de faire ton fichier mais je t'ai fait un exemple.
Si c'est toi qui a fait ton code je ne doute pas que tu comprendras très vite le principe :
charger dans des variables toutes les données en une lecture, et travailler avec les variables.
Pareil pour l'écriture : tout écrire en une fois.
100 fois plus rapide au minimum.
https://www.cjoint.com/c/CGzoFLCVLSZ
eric
Lire et écrire des cellules est très lent, il faut que tu travailles en mémoire.
Je n'ai pas trop le temps de faire ton fichier mais je t'ai fait un exemple.
Si c'est toi qui a fait ton code je ne doute pas que tu comprendras très vite le principe :
charger dans des variables toutes les données en une lecture, et travailler avec les variables.
Pareil pour l'écriture : tout écrire en une fois.
100 fois plus rapide au minimum.
https://www.cjoint.com/c/CGzoFLCVLSZ
eric
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
Je reviens vers vous pour un petit coup de main.
Car j'ai réussi à optimiser toutes les autres macro.
Mais il y'a une que je n'arrive pas à faire. Elle ralentit considérablement le traitement de mes données.
Merci d'avance
LgMax = Application.WorksheetFunction.Max(LgLigA, LgLigB)
CoMax = Cells(1, Columns.Count).End(xlToLeft).Column
For lgLig = 2 To LgMax
' Colonnes : D à AO
For lgCol = 2 To CoMax
' Une différence est trouvée dans une ligne
If wsFicA.Cells(lgLig, lgCol).Value <> wsFicB.Cells(lgLig, lgCol).Value Then
' Affichage du nom du fichier en colonne A
wsFicAna.Range("A" & lgLigDeb).Value = wbFicA.Name
' Copier la ligne du fichier A dans le fichier d'analyse
wsFicA.Range("A" & lgLig & ":" & "AX" & lgLig).Copy _
Destination:=wsFicAna.Range("C" & lgLigDeb)
' Affichage du nom du fichier en colonne A
wsFicAna.Range("A" & lgLigDeb + 1).Value = wbFicB.Name
' Copier la ligne du fichier B dans le fichier d'analyse
wsFicB.Range("A" & lgLig & ":" & "AX" & lgLig).Copy _
Destination:=wsFicAna.Range("C" & lgLigDeb + 1)
lgLigDeb = lgLigDeb + 2
Exit For
End If
Next lgCol
Next lgLig
Je reviens vers vous pour un petit coup de main.
Car j'ai réussi à optimiser toutes les autres macro.
Mais il y'a une que je n'arrive pas à faire. Elle ralentit considérablement le traitement de mes données.
Merci d'avance
LgMax = Application.WorksheetFunction.Max(LgLigA, LgLigB)
CoMax = Cells(1, Columns.Count).End(xlToLeft).Column
For lgLig = 2 To LgMax
' Colonnes : D à AO
For lgCol = 2 To CoMax
' Une différence est trouvée dans une ligne
If wsFicA.Cells(lgLig, lgCol).Value <> wsFicB.Cells(lgLig, lgCol).Value Then
' Affichage du nom du fichier en colonne A
wsFicAna.Range("A" & lgLigDeb).Value = wbFicA.Name
' Copier la ligne du fichier A dans le fichier d'analyse
wsFicA.Range("A" & lgLig & ":" & "AX" & lgLig).Copy _
Destination:=wsFicAna.Range("C" & lgLigDeb)
' Affichage du nom du fichier en colonne A
wsFicAna.Range("A" & lgLigDeb + 1).Value = wbFicB.Name
' Copier la ligne du fichier B dans le fichier d'analyse
wsFicB.Range("A" & lgLig & ":" & "AX" & lgLig).Copy _
Destination:=wsFicAna.Range("C" & lgLigDeb + 1)
lgLigDeb = lgLigDeb + 2
Exit For
End If
Next lgCol
Next lgLig
Bonjour,
Y'a-t-il quelqu'un qui pourra m'aider à optimiser cette macro?
Merci d'avance
Y'a-t-il quelqu'un qui pourra m'aider à optimiser cette macro?
Merci d'avance
eriiic
Messages postés
24600
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 octobre 2024
7 239
5 août 2013 à 14:59
5 août 2013 à 14:59
Bonjour,
le principe est toujours le même pour accélérer : mettre les données en mémoire.
eric
le principe est toujours le même pour accélérer : mettre les données en mémoire.
eric
eriiic
Messages postés
24600
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 octobre 2024
7 239
5 août 2013 à 15:55
5 août 2013 à 15:55
sans fichiers réduits à l'essentiel moi non plus.
eric
eric