Voir la mise à jour d'1 cellule avec screenupdating = False
Bonjour à vous, chers forumeurs,
Malgré toutes mes recherches dans nombreux forums (plusieurs jours !!
- J'ai une macro longue de 7mn et des brouettes ..
- Je souhaite donc, "tout simplement".. , mettre en évidence le temps qu'il reste.
Deux options se sont offertes à moi tels des cadeaux empoisonnés.. :
Option 1 : la progress bar
Option 2 : la mise à jour d'une cellule (qui mettra à jour mon objet dans la feuille...)
Option 1 : la progress bar
Malgré toutes mes recherches, soit on passe par une boucle, ce qui est loin d'être le cas de ma macro.. / soit je ne me souviens plus du topic mais il ne correspondait pas à ma requête..
Option 2 : la mise à jour d'une cellule.
Cela me semblait plus accessible et pourtant.. :'(
J'aimerais qu'une fois ma macro lancée (celle qui dure donc 7mn), un compteur se mette en place dans la fenêtre active.
Pour cela, j'ai une cellule "cachée" (où la font.color est identique à l'interior.color) où est noté le temps de ma macro.
Et j'ai aussi un objet où est directement liée cette cellule, avec toute la mise en forme qui va bien..
Je sais afficher l'objet sur la feuille mais je ne sais pas du tout comment mettre à jour la cellule où se trouve le temps.. => sachant, encore une fois, que j'ai une macro qui dure 7mn avec un screenupdating sur false..
Une âme charitable pourrait elle m'aider ???
Ps : je ne suis que novice dans VBA .. merci pour votre aide.
---------> voici mon code
Sub Continuer_Click()
If MsgBox("ATTENTION, CETTE ACTION SERA IRREVERSIBLE !" & Chr(10) & Chr(10) & "Souhaitez-vous vraiment continuer ?", _
vbExclamation + vbOKCancel, "Infosys PROCEDURE") <> vbOK Then
Exit Sub
End If
'+++++++++++++++++++++++++
'LANCEMENT DE LA PROCEDURE
'+++++++++++++++++++++++++
'Temporisation de la macro
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dim StartTime As Double
Dim MinutesElapsed As String
'Remember time when macro starts
StartTime = Timer
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'valorisation des variables "feuilles"
j = UserForm1.TextBox1.Value
j2 = UserForm1.TextBox2.Value
UserForm1.Hide
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
.DisplayAlerts = False
End With
'++++++++++++
'Feuille 01
'++++++++++++
With Worksheets(j).Select
dl = Range("B1048576").End(xlUp).Row + 3
'extraction des bonnes lignes
For i = 1 To dl 'Intègre l'ID manquant à l'entête
If Left(Cells(i, 2).Value, 3) = "IND" Then
If ActiveCell.Offset(-1, 0).Value = "" Then
ActiveCell.Offset(-1, 0).Value = ActiveCell.Offset(-13, 0).Value
End If
End If
Next i
'Prépare les lignes à la suppression
For i = 1 To dl
If Left(Cells(i, 2).Value, 3) = "IND" Then
Cells(i, 9).Value = "ok" 'Nomme les bonnes cellules à garder en colonne J
Cells(i, 2).Value = Cells(i - 1, 2).Value 'Remplace "Indus" par "ID "
End If
Next i
'Suppression de la colonne "A"
Range("A:A").Delete
'Suppression des lignes vides
For i = dl To 1 Step -1
If Cells(i, 8).Value = "" Then
Cells(i, 8).EntireRow.Delete
Else
Cells(i, 8).Value = ""
End If
Next
dl = Range("B1048576").End(xlUp).Row
'Réorganise les colonnes : déplace la colonne D en colonne E
Columns("E:E").Select
Selection.Cut
Columns("D:D").Select
Selection.Insert Shift:=xlToRight
Application.CutCopyMode = False
'Dissocie l 'ID du Nom
'Ajoute une Colonne pour Extraire l'ID
Columns("A:B").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
For i = 1 To dl
'Extrait l'ID en 1ère Colonne
Cells(i, 2).Value = Left(Cells(i, 3).Value, 10)
'Extrait le Nom Alloc en 2e Colonne
Cells(i, 3).Value = Mid(Cells(i, 3).Value, 11)
'Crée la cellule référente
Cells(i, 1).Value = Cells(i, 2).Value & Cells(i, 4).Value
Next i
End With
'++++++++++++
'Feuille 02
'++++++++++++
With Worksheets(j2).Select
dl2 = Range("B1048576").End(xlUp).Row + 3
'extraction des bonnes lignes
For i = 1 To dl2 'Intègre l'ID manquant à l'entête
If Left(Cells(i, 2).Value, 3) = "IND" Then
If ActiveCell.Offset(-1, 0).Value = "" Then
ActiveCell.Offset(-1, 0).Value = ActiveCell.Offset(-13, 0).Value
End If
End If
Next i
'Prépare les lignes à la suppression
For i = 1 To dl2
If Left(Cells(i, 2).Value, 3) = "IND" Then
Cells(i, 9).Value = "ok" 'Nomme les bonnes cellules à garder en colonne J
Cells(i, 2).Value = Cells(i - 1, 2).Value 'Remplace "Indus" par "ID "
End If
Next i
'Suppression de la colonne "A"
Range("A:A").Delete
'Suppression des lignes vides
For i = dl2 To 1 Step -1
If Cells(i, 8).Value = "" Then
Cells(i, 8).EntireRow.Delete
Else
Cells(i, 8).Value = ""
End If
Next
dl2 = Range("B1048576").End(xlUp).Row
'Réorganise les colonnes : déplace la colonne D en colonne E
Columns("E:E").Select
Selection.Cut
Columns("D:D").Select
Selection.Insert Shift:=xlToRight
Application.CutCopyMode = False
'Dissocie l 'ID du Nom
'Ajoute une Colonne pour Extraire l'ID
Columns("A:B").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
For i = 1 To dl2
'Extrait l'ID en 1ère Colonne
Cells(i, 2).Value = Left(Cells(i, 3).Value, 10)
'Extrait le Nom Alloc en 2e Colonne
Cells(i, 3).Value = Mid(Cells(i, 3).Value, 11)
'Crée la cellule référente
Cells(i, 1).Value = Cells(i, 2).Value & Cells(i, 4).Value
Next i
End With
'++++++++++++++++++++++++++++++++++++++++++++++
'fin des mises en forme des feuilles 1&2
+++++++++++++++++++++++++++++++++++++++++++++++
'Copie-Colle la feuille 02 dans la feuille 01
'Copie la 02
With Worksheets(j2).Select
Range("A1").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Copy
End With
'Colle la 02 après la 01
With Worksheets(j).Select
Range("A1").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Select
ActiveSheet.Paste
End With
Application.CutCopyMode = False
'supprime la feuille 02
Worksheets(j2).Delete
'++++++++++++++++++++++++++++++++++
'NE RESTE PLUS QUE LA FEUILLE 01 !
'++++++++++++++++++++++++++++++++++
'Copie les EnTêtes du Tableau d'Origine
k = Worksheets.Count
'Selectionne les données sources à copier
Worksheets(k).Rows("1:7").Copy
'Copie les lignes sources dans la feuille 01
Worksheets(j).Rows("1:1").Insert Shift:=xlDown
Application.CutCopyMode = False
Worksheets(j).Select
dl = Range("A1048576").End(xlUp).Row
'-------------------------
'Encadre tout ça
Range("B8").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, "N" & dl).Select
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
End With
'-------------------------
'Ajoute les Recherches V des colonnes I,J,K,L,M
For i = 8 To dl
Range("J" & i).FormulaR1C1 = "=IFERROR(VLOOKUP(RC1,'Ind au 01.05.2016'!R8C1:R1048576C14,10,FALSE),"""")"
Range("K" & i).FormulaR1C1 = "=IFERROR(VLOOKUP(RC1,'Ind au 01.05.2016'!R8C1:R1048576C14,11,FALSE),"""")"
Range("L" & i).FormulaR1C1 = "=IFERROR(VLOOKUP(RC1,'Ind au 01.05.2016'!R8C1:R1048576C14,12,FALSE),"""")"
Range("M" & i).FormulaR1C1 = "=IFERROR(VLOOKUP(RC1,'Ind au 01.05.2016'!R8C1:R1048576C14,13,FALSE),"""")"
Range("N" & i).FormulaR1C1 = "=IFERROR(VLOOKUP(RC1,'Ind au 01.05.2016'!R8C1:R1048576C14,14,FALSE),"""")"
Next i
'Copie-Colle le document
Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
ActiveSheet.Paste
Selection.VerticalAlignment = xlCenter
Application.CutCopyMode = False
'Supprime les "0"
For l = 8 To dl
For c = 10 To dl
If Cells(l, c).Value = "0" Then
Cells(l, c).Value = ""
End If
Next c
Next l
Columns("A:N").EntireColumn.AutoFit 'Ajuste la largeur des colonnes
'Met en forme les colonnes de la RechercheV
Range("J8:J" & dl).Select 'texte en bleu
With Selection
.Font.ColorIndex = 5
End With
Range("L8:N" & dl).Select 'texte en bleu, centré, et en gras
With Selection
.Font.ColorIndex = 5
.Font.Bold = True
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'Colorie les lignes de la nouvelle feuille par rapport à l'ancienne feuille (k)
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'INFO i : boucle de j
'INFO l : boucle de k
'INFO c : colonne pour la mise en couleur venant de k
'Début de procédure de recherche couleur
dl = Worksheets(j).Range("A1048576").End(xlUp).Row
dl2 = Worksheets(k).Range("A1048576").End(xlUp).Row
For i = 8 To dl Step 1
For l = 8 To dl2 Step 1
If Worksheets(j).Cells(i, 1).Value = Worksheets(k).Cells(l, 1).Value And Worksheets(k).Cells(l, 1).Interior.ColorIndex <> 0 Then
For c = 1 To 14 Step 1
Worksheets(j).Cells(i, c).Interior.ColorIndex = Worksheets(k).Cells(l, 1).Interior.ColorIndex
Next
End If
Next
Next
'Cache la 1ère colonne
Columns(1).EntireColumn.Hidden = True
'Renomme la feuille finale
ActiveWorkbook.Worksheets(j).Name = _
"Ind au " & Left(Date, 2) & "." & Mid(Date, 4, 2) & "." & Right(Date, 4)
'Remonte tout en haut de la page
Application.Goto Worksheets(j).Range("B1"), True
'++++++++++++++++++++++++++++++++++++
'FIN DE LA PROCEDURE DE MISE A JOUR !
'++++++++++++++++++++++++++++++++++++
Unload UserForm1
Worksheets(1).Select
MsgBox "PROCEDURE DE CONSOLIDATION TERMINEE !", vbOKOnly + vbInformation, "CONSOLIDATION"
'Temporisation de la macro
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'Determine how many seconds code took to run
MinutesElapsed = Format((Timer - StartTime) / 86400, "hh:mm:ss")
'Notify user in seconds
MsgBox "This code ran successfully in " & MinutesElapsed & " minutes", vbInformation
Worksheets(1).Shapes("Tps_Restant").Visible = False
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Call suppression_espace_et_point
With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
.DisplayAlerts = True
End With
End SubBonjour Gregcompta
Merci de mettre ton code entre balises [code] et [ /code] :evil: sans espace entre [ et /
Merci BrunoM45, tiptop !!
Ça sera nettement plus lisible..
bonjour,
Tu pourrais peut-être déjà te demander comment éviter de passer 7 minutes à pas faire grand chose... Mébon !
Je dis ça, j'ai rien dit...
On a l'impression que ta macro elle passe son temps à faire de la mise en forme, du quadrillage, et pour finir elle sous-traite le vrai boulot à quelques formules...
Excel est un calculateur, pas un sapin de Noel... et VBA n'a besoin d'aucune mise en forme pour faire des calculs très rapide !
Ceci dit sans le classeur KIVABIEN avec, on va pas avancer beaucoup.
A+
Galopin01, merci pour ta réponse. J'ai pas trouvé le classeur dixit "KIVABIEN" il se trouve où ?? !! mouahhhh
Alors le voici. Attention, il a été corrigé pour le web (donc peut etre que le résultat ne donnera rien dans les RechercheV)
Pour les 7mn, t'inquiètes pas, je me suis déjà posé la question, mais n'y ai trouvé aucune réponse pour le moment...
C'est, j'espère, grâce à vous que je vais trouver ces réponses..
D'ailleurs :
- dois-je créer plutôt des sous-procédures, appelées dans la macro principale (celle-ci), ou tout inscrire dans cette même macro est une meilleure solution ?
- la Sub suppression_espace_et_point() marche nickel ainsi. Si je l'intègre à l'intérieure de la macro, elle ne fait plus tout correctement..
- je n'arrive pas à réutiliser dans la Sub suppression_espace_et_point() les variables déclarées en Option Explicit, pourquoi ?..
- je ne comprends pas non plus l'utillisation du copy destination := ..
et.. - est ce que si je définis des variables ainsi : "dim i, dl, c as integer" (ou long), toutes seront définies en integer (ou long) ou ça change quelque chose ?? (si ça change un truc, pouquoi ??...)
Mais mon principale problème reste quand même le décompte de cette macro pour l'utilisateur qui la lancera..
MERCIIIII 1000 X en tout cas ^^
Bonsoir,
Ce serait trop demander qu'avoir un petit mode d'emploi avec la chose ? Que faut -il répondre pour pouvoir entrer dans ton USF sans se faire jeter comme un malpropre ?
[Edit] Pour les autres questions, je réserve en attendant de voir et comprendre le fonctionnement.
Pour les généralités : Dans le temps on disait qu'une bonne macro doit tenir dans un écran...
Diviser pour mieux régner est un vieux principe qui s'applique aussi avec VBA... Mais pour bien régner l'art est difficile !
Si en plus ta démo permettait le fonctionnement du recherchev ça serait le pied : Au moins j'aurai pas l'impression de travailler que pour faire clignoter le sapin...
A+
Je ne comprends pas pourquoi tu te fais "jeter comme un malpropre".. Qu'est ce que t'affiche ??
Je vais te refaire le truc dans ce cas, version ultra soft car c'est un document ultra confidentiel à la base. Je ne peux donc y mettre aucune réelle donnée.. Mais le principe est le suivant :
- 2 feuilles à l'ouverture du classeur : la procédure (où sont les boutons pour le lancement des macros) & la feuille source
- On y insère 2 feuilles d'extractions (dans ce fichier test, il y a la base que l'on copiera deux fois pour la conserver..)
- Et on lance la procédure de consolidation, qui a terme viendra remplacer la feuille source.
Je ne sais vraiment pas pourquoi tu te fais éjecter comme ça.. je vais te mets le fichier dans mon prochain post..
Moi quand je rentre j'ai le UserForm direct procédure de consolidation... Comme je ne sais pas quoi rentrer : je peux pas deviner !
Re,
Voilà, chai moi le fichier remarche comme l'ancien. Essaie et dis moi
Ah oui, c'est sûr, cliques sur "QUITTER" (tu en sortiras sans aucun problème.. ), pour le rappeler, va dans la feuille "PROCEDURE CONSOLIDATION"
Dans le fichier que je viens de joindre, tu as des feuilles pré copier pour lancer une première fois le test..
Que faut-il rentrer dans les Textbox pour espérer rentrer dans la procédure ?
Désolé,
Alors pour cliquer sur "Continuer?", tu dois renseigner la position des feuilles à modifier dans le classeur + cliquer sur oui pour valider le faire que la dernière feuille soit la feuille source.
Pour le dernier fichier que j'ai joints, ex : 1 - 2 + "oui"
galopin01 a écrit :bonjour,
On a l'impression que ta macro elle passe son temps à faire de la mise en forme, du quadrillage, et pour finir elle sous-traite le vrai boulot à quelques formules...
Excel est un calculateur, pas un sapin de Noel... et VBA n'a besoin d'aucune mise en forme pour faire des calculs très rapide !
A+
* Effectivement galopin01, ma macro sert pas mal à faire de la mise en forme.. si tu as une idée pour faire autrement que la macro, je suis preneur
* dois je passer par un "for imbriqué" pour faire mes RecherchesV ??
=> car en testant un semblant de for imbriqué, elle a mis nettement plus longtemps à se réaliser, saurais tu pourquoi ??
ALLEEEEE LES BLEUSSSSS !!!!!!
Bonjour,
Déjà dès la première boucle il y a du ActiveCell à gogo qui a de forte chance de ne pas servir à grand chose vu qu'aucune sélection n'a été effectué avant...
Sauf si tu as une explication valable je supprime...
'extraction des bonnes lignes
15 For i = 1 To dl 'Intègre l'ID manquant à l'entête d'Indus
16 If Left(Cells(i, 2).Value, 5) = "INDUS" Then
17 If ActiveCell.Offset(-1, 0).Value = "" Then
18 ActiveCell.Offset(-1, 0).Value = ActiveCell.Offset(-13, 0).Value
19 End If
20 End If
21 Next iIl y a la même quelques lignes plus loin avec la feuille suivante...
Je m'interroge aussi sur les RechercheV et Copier / Coller aussitôt après... Comme on est en CalculationManual ça doit lui faire l'effet de se balader en tenue de ski sur la plage non ? Mébon vu que le calcul se fait quand même, on va mettre ça sur le compte des quelques bizarreries d'Excel.
Bon il va falloir que je creuse vraiment TOUSSA : Malheureusement je serai éloigné de chez moi pour la semaine (et sans connection internet) mais j'aurai quand même un peu de temps pour me pencher dessus. Je te tiens au jus dès que possible.
A+
galopin01 a écrit :Déjà dès la première boucle il y a du ActiveCell à gogo qui a de forte chance de ne pas servir à grand chose vu qu'aucune sélection n'a été effectué avant...
Sauf si tu as une explication valable je supprime...
'extraction des bonnes lignes 15 For i = 1 To dl 'Intègre l'ID manquant à l'entête d'Indus 16 If Left(Cells(i, 2).Value, 5) = "INDUS" Then 17 If ActiveCell.Offset(-1, 0).Value = "" Then 18 ActiveCell.Offset(-1, 0).Value = ActiveCell.Offset(-13, 0).Value 19 End If 20 End If 21 Next iIl y a la même quelques lignes plus loin avec la feuille suivante...
Oui, dans ce cas supprime
Pour la deuxième feuille, effectivement, j'ai un peu bossé dessus entre temps, et je te renvoie le nouveau fichier, où j'ai fait des petites macro que j'appelle dans le USF à la place d'une seule et longue macro. Du coup, j'ai pu supprimer la partie "feuille 2"..
galopin01 a écrit :Je m'interroge aussi sur les RechercheV et Copier / Coller aussitôt après... Comme on est en CalculationManual ça doit lui faire l'effet de se balader en tenue de ski sur la plage non ? Mébon vu que le calcul se fait quand même, on va mettre ça sur le compte des quelques bizarreries d'Excel.
Concernant la rechercheV, j'ai trouvé !!
ps: ma macro, pas le fichier exemple..
galopin01 a écrit :Bon il va falloir que je creuse vraiment TOUSSA : Malheureusement je serai éloigné de chez moi pour la semaine (et sans connection internet) mais j'aurai quand même un peu de temps pour me pencher dessus. Je te tiens au jus dès que possible.
A+
Ok. Je vais continuer de creuser de mon côté aussi !!
A+ et bonnes vacances !
Bonjour,
pour l'instant j'ai juste déblayé le terrain... Je t'envoie le fruit de ma réflexion.
ça ne concerne que la préparation... Mais j'ai déjà je sentiment que ça doit gagner quelque chose. Je sais pas : pas testé parce que mettre le timer sur 14" ça me gonfle plus qu'autre chose...
J'ai juste perdu le formatage de la colonne J au passage (le diable sait pourquoi : je n'y ai pourtant pas touché...) mais ce n'est pas le plus important on verra ça plus tard...
Maintenant que j'y vois un peu plus clair, il faut que je m'attaque au RechercheV :
L'idée c'est que dans cette boucle :
For i = 8 To iLR Step 1
For l = 8 To iLR2 Step 1
If Worksheets(iWs).Cells(i, 1).Value = Worksheets(k).Cells(l, 1).Value And Worksheets(k).Cells(l, 1).Interior.ColorIndex <> 0 Then
For c = 1 To 14 Step 1
Worksheets(iWs).Cells(i, c).Interior.ColorIndex = Worksheets(k).Cells(l, 1).Interior.ColorIndex
Next
End If
Next
NextDans cette boucle tu fais déjà tous les rechercheV (sans les nommer), donc c'est que tu as pas besoin d'installer les rechercheV
YAKA tout supprimer et ne garder que cette boucle et en même temps que le formatage tu mets les valeurs qui t'intéressent...
(Le beurre, l'argent du beurre... et la crémière !)
Bon je ferais ça entre 2 zapéro cette semaine. Et je regarderai ta production...
[Edit] En fait j'étais en train de me dire que tu essaies de faire un mauvais bricolage sur1 ou 2 feuilles pour cloner la dernière, puis la supprimer afin que le clone prenne la place de cette dernière et qu'il puisse être supprimé lui aussi par la suite... C'est ça ?
Et si tu prenais le problème à l'envers : si tu faisais une comparaison à partir de ta dernière feuille pour la mettre à jour, supprimer ce qui ne sert plus et rajouter ce qui est nouveau. A mon avis ce serait tout benef.
Diviser en de nombreux sous programme n'est pas suffisant on fini par se perdre dans le labyrinthe.
Ce qu'il faut d'abord c'est réduire à minima... et ensuite diviser si possible.
Pour gagner du temps il faut arrêter de faire des boucles sur le tableur : Il faut charger tes données dans des tableaux virtuels (Array) travailler sur tes arrays pour les comparaisons, les évaluations et les calculs et seulement si la comparaison est positive alors tu appliques la modif dans ton tableau Excel.
Le parcours d'un Array est 20 fois plus rapide que celui du même tableau sur Excel. Sauf que là il ne faut pas s'y tromper, tes Arrays ils doivent être des clones de tes feuilles Excel. Il faut d'abord faire tes comparaisons / mise à jour et les ajouts et les suppressions en derniers (sinon tu perds la correspondance des lignes entre Array / Feuille.
10 minutes divisées par 20, ça excite l'imagination... hein !
A+
C'est cool !! je te remercie !! je vais voir ça surement ce soir !!
La recherche V (for i= .. to ..) a bien été incorporé à mon précédent fichier. j'ai giclé la formule..
le ps concernait le délai d'exécution..
Je vais voir ce qui a de différent du coup avec ton avancé..
J'ai aussi compris dorénavant comment utiliser le : ws.range... .copy destination := ...
Je vais essayer de l'incorporer maintenant ^^
Concernant les Array, je ne sais absolument pas l'utiliser.. Je vais un peu trifouiller sur la toile pour un peu mieux comprendre, mais c'est pas la première fois que je tombe dessus dans mes recherches annexes.. et j'ai toujours pas compris ! lol mais effectivement le temps sera clairement diminué d'après tout ce que je lis..
Concernant la possibilité de prendre le pb à l'envers................................... loool ! Je ne vois vraiment pas comment. mais suis totalement ouvert à tes propositions (concernant le classeur bien entendu !
La demande que l'on m'a faite est : avec une feuille source et deux extractions, on ne veut plus que les nouvelles données (et supprimer les anciennes non répertoriées dans les extractions) tout en gardant les annotations, la mise en forme... de la feuille source.
Encore meerciii
Y a un truc que je ne comprends pas !!..
Pourquoi une macro fonctionne très bien lorsqu'elle se trouve dans un module et lorsqu'on veut k'intégrer a la macro-mère, elle ne fonctionne plus ??
De plus, et je pense que ça a un lien, comment peux t-on faire pour que la variable Ws correspondant à une feuille, prenne le numéro de la feuille voulu !? Par un ex ca donne ceci :
textbox = "2"
je veux donc que ma variable "ws" représente : worksheets(2)
J'ai fait :
-dim ws as worksheet
set ws = ...pleins d'essais différents...
Mais rien ne fonctionne.
Si vous, lecteur, connaissez la solution .. ? Mille mercis
MILLE MERCIS POUR CE TRAVAIL GALOPIN01 qui donne de très beaux résultats
worksheets(iWs).Select
Columns(1).Delete 'Suppression de la colonne "A"
iLR = Range("A1048576").End(xlUp).Row
For i = iLR To 1 Step -1 'Suppression des lignes vides ou inutiles
If Not Left(Cells(i, 1).Value, 5) = "INDUS" Then
Rows(i).Delete
Else
ii = 1
Do While Left(Cells(i - ii, 1).Value, 5) = "INDUS"
ii = ii + 1
Loop
Cells(i, 1).Value = Cells(i - ii, 1)
End If
NextAlors .. j'ai :
- avancé de mon côté et me suis rendu compte que mon code ressemblait beaucoup au tien au final. Mais je te rassure, le tien est nettement meilleure par semble til le code ci-dessus.
- intégré la rechercheV à traveers une boucle for, qui fonctionne très bien,
- amélioré la mise en forme par des with ... sans select
Et résultat .. la macro ne dure plus que 5mn et des brouettes !! MIEUX !
Je ne sais pas si c'est du à ce code ou au fait que dès le départ, je réunis les deux feuilles pour ne travailler plus que sur une seule.. donc une seule boucle..
Seuil petit soucis à présent .. :
- 1èrement, puis-je te demander ce que signifie le code ci-dessus, je n'arrive pas à piger le raisonnement..
d'ailleurs je dois intégré une ligne supplémentaire par là, car à un moment un AI******** se trouve 13 lignes plus haut que la cellule "INDUS"
dans mon code initial, voici ce que j'ai mis :
For i = 1 to dl
If Left(Cells(i, 2).Value, 5) = "INDUS" Then
If ActiveCell.Offset(-1, 0).Value = "" Then
ActiveCell.Offset(-1, 0).Value = ActiveCell.Offset(-13, 0).Value
End If
Cells(i, 9).Value = "ok" 'Nomme les bonnes cellules à garder en colonne worksheets(ws1)
Cells(i, 2).Value = Cells(i - 1, 2).Value 'Remplace "Indus" par "ID de l'allocataire"
End If
Next i- 2emement, je ne sais toujours pas comment faire la barre de progression, l'écoulement du temps, ou le décompte de ce même temps, pour que l'utilisateur sache où en est la macro...
Une idée ???
Muchas Gracias !!
bonjour,
Je suis tout juste de retour, mais je repart pour la journée, anniversaire oblige...
Je suis très mal à l'aise pour répondre à tes questions. Pour moi j'appelle ça "des bouts de saucisson" extrait du contexte ça ne signifie rien du tout. C'est souvent déjà pénible quand tu as toute la proc et que tu peux déboguer au pas à pas.. Alors juste quelques lignes sorties du contexte comme ça...
En plus les offset, moi j'appelle ça du code flou... Tu grimpes un étage , encore un, encore un, comme tu ne sais pas trop d'où tu es parti, tu ne sais pas ou tu arrives... Bon je le renie pas hein : j'ai fait ça un peu à la sauvette !
Bon je me penche sur le machin sérieux ce soir. mais je repartirai de mon travail ton tout en un me laisses sceptique même si tu arrives à des résultats. Après tu choisiras mébon je n'ai pas l'intention de me pencher sur ton "tout en un." Pour tout te dire c'est déjà suffisamment imbuvable ! Je vais me pencher sur ce que j'ai avec ce que j'ai compris... Par contre ce qui m'arrangerai bien c'est d'avoir des feuilles de données un peu plus consistantes si tu pouvais me mettre un fichier un peu plus proche du réel... (Tu peux me le mettre en e-mail je t'en aie envoyé un afin que tu aies mon adresse et que tu puisses me mettre quelque chose de plus réaliste. (au besoin tu compresses ou/et tu enregistres en xlsb...) Essaie de me donner ton code actuel avec.
La difficulté des réunion tiens au fait que quand tu testes tes macros en général tu travailles sur la feuille active sans même t'en rendre compte puisqu'elle est affiché sur l'écran donc tu n'instancies rien du tout... Et quand tu veux réunir toussa tu perds de vue que les feuilles actives sont plus les mêmes donc le code ne réagit pas pareil, il ne compte pas les lignes de la bonne feuille... C'est un tout autre contexte !
Pour une barre de progression c'est pareil : difficile d'installer ça sur une peau de sauc... C'est pas comme un timer : Un timer c'est facile : une variable au début, un petit calcul à la fin et le tour est joué. Une barre de progression nécessite un mise au point parfois difficile et parfois pas mal d'essais. ça casse le ScreenUpdating... donc ça peut faire perdre un peu de temps supplémentaire...
Ecoute on verra ça quand j'aurai synthétisé un peu toussa. Si j'y arrive ! Il faut que je me remette dans le bain.
[EDIT] Pour revenir quand même sur la signification du code cité plus haut, (parce que je suis un peu au courant quand même vu que c'est moi qui l'ai pondu...) c'est ni plus ni moins la contraction du code d'origine ! Au lieu de faire 2 ou 3 boucles j'ai contracté tout ça, tout en un. C'est clair que à chaque fois que tu rajoutes une boucle qui scanne toute une colonne, tu perd du temps donc si dans la même boucle tu arrives à faire les mêmes opérations, tu gagnes tout le temps que tu aurais perdu...
Après, pourquoi y-a-t-il " à un moment un AI******** se trouve 13 lignes plus haut " je ne peux pas te dire.
Normalement c'est le rôle de la boucle Do While... Loop de s'occuper de ces choses là : Alors te dire pourquoi elle n'a pas fait son boulot sur cette ligne là ???
J'ai tendance à penser que c'est ton fichier d'origine qui déconne un peu ! J'ai cru comprendre que les données provenaient d'une extraction SAP. Donc ça m'étonnerait pas qu'à cette ligne VBA ait trouvé un caractère de contrôle (SAP) qu'il ne comprenait pas et qu'il ait zappé la question...
Sinon je ne sais pas, à priori il n'y a aucune autre raison pour que la boucle Do While n'aie pas fait son boulot. A condition que tu travailles bien sur mon code "in extenso" ! Si tu es sur un bricolage à toi ou tu as bricolé avec des bribes de mon code ça je ne peux pas te dire sans voir la totalité du code et du fichier source...
[EDIT (2)] Pour la question relative à :
textbox = "2"
je veux donc que ma variable "ws" représente : worksheets(2)Comme tu le dis très bien ton textbox renvoie un string : "2"
Donc si tu écris maVariable = textbox.Value
alors maVariable contient aussi un string
et Worksheets(maVariable) cherche en réalité une feuille nommée "2"
Après... Je ne sais plus trop comment expliquer parce que tout dépend ce que tu veux faire rechercher à VBA :
Si tu veux pointer sur une feuille qui s'appelle "FEUILLE 2" il faut écrire
Worksheets("FEUILLE " & maVariable).Activate 'par exemple... ou :
Set ws = Worksheets("FEUILLE " & maVariable)Si au contraire tu veux lui faire rechercher une feuille qui a l'index 2, il faudrait changer le string en integer :
Dim maVariable as Integer
maVariable = CInt(textbox.Value) 'puis...
Worksheets(maVariable).Activate 'par exemple... ou :
Set ws = Worksheets(maVariable)Dans ce dernier cas VBA pointera alors sur une feuille nommée "n'importe comment" mais possédant l'index 2.
Ok ?
Cordialement
A+