Macro inachevée

Résolu/Fermé
tessel75 - 17 nov. 2013 à 14:27
 tessel75 - 21 nov. 2013 à 23:47
Bonjour,
Un (ou une) spécialiste des macros sur Excel peut-il me dire quelle commande est à placer dans le déroulement d'une macro pour être sûr qu'une commande itérative est terminée avant de passer à la suivante?
Pour être concret: j'ai une série de commandes dans une certaine macro dont la dernière est la suppression d'une feuille après sa recopie sur une autre, (il s'agit de recopier toutes les feuilles d'un cahier sur une seule feuille les unes à la suite des autres), mais je rends compte qu'à chaque fois, à la fin quand la macro principale est terminée, la dernière commande des 3 ou 4 dernières itérations n'est pas exécutée.
En espérant avoir été clair.
Je vous remercie pour vos réponse.
A voir également:

19 réponses

ReBonsoir, Personne n'aurait de réponse? Merci!
0
Mytå Messages postés 2973 Date d'inscription mardi 20 janvier 2009 Statut Contributeur Dernière intervention 20 décembre 2016 949
17 nov. 2013 à 19:35
Salut le Forum

Sans voir la macro... Non !

Myt?
0
Merci pour ton intérêt, Mytä.
Voila l'extrait de macro en cause :
"Df = ActiveWorkbook.Sheets.Count

f = Df
Do
If Not (Right(Sheets(f).Name, 4) Like An) Then
SendKeys ("{ENTER}")
Sheets(f).Delete
Else
df0 = Df - 1
End If
f = f - 1
Loop While (df0 > 0 Or IsNull(df0) Or IsEmpty(df0)) And f > 0 "
0
Le Pingou Messages postés 12186 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 13 novembre 2024 1 449
Modifié par Le Pingou le 17/11/2013 à 23:25
Bonjour,
La procédure complète serait préférable .....ce bout de code me semble boiteux ...!

Salutations.
Le Pingou
0
Ok!
0
Pour résumer: la procédure complète demande de sélectionner une certaine plage sur une feuille du cahier et de la copier sur la 1ère feuille; cela fait elle supprime la feuille d'origine et passe à la suivante. ne fois tout recopier, la macro enregistre le cahier (fichier) qui ne devrait n'avoir qu'une seule feuille, mais dans la pratique les 3 feuilles les plus à droite du cahier ne sont pas supprimées bien que la copie soit faite correctement.
Et encore merci.

"Sub StatAgendaRegrouptCahier()    

Df = ActiveWorkbook.Sheets.Count
DM = Worksheets(Df).Name
Mois = Right(DM, 2)
An = Left(Right(DM, 7), 4)
DM = Right(DM, 7)
SendKeys ("{LEFT}{ENTER}")
ActiveWorkbook.SaveAs Filename:= _
"D:\D-Mes documents\Cs4_GENERALES\Docts" & An & "\StatsCs\RecapStatCs" & An & "-" & Mois & ".xls" _
, FileFormat:=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False
f = 1 ' f = Index feuille courante
NoP1 = 0 ' NoP1 = Index feuille recapitulative
Do
Worksheets(f).Activate
NF = Worksheets(f).Name ' NF = Nom feuille courante, Index (f)
If Left(NF, 3) = Mid(Cells(2, 2), 8, 3) And Not (IsNull(NFN) Or IsEmpty(NFN)) Then
' si 3_1er caractères du nom de la feuille courante = n°UH de cellule UH
Cells(2, 1).Select
If IsEmpty(Cells(3, 1)) Then
Range(Cells(2, 1), Cells(2, 9)).Select 'Selectionne la ligne entière
Else
SelectPave 'Selectionne une plage entière
End If
Selection.Copy
Sheets(NFN).Select
Cells(l + 1, 1).Select
ActiveSheet.Paste
l = Cells(1, 1).End(xlDown).Row
Else
NFN = Left(Cells(2, 2), 4) & "#" & Mid(Cells(2, 2), 8, 3) & "#" & Mid(Cells(2, 2), 14, 25) & "#" & An
NFN = IIf(Len(NFN) < 32, NFN, Left(NFN, 26) & Right(NFN, 5))
Sheets(NoP1 + 1).Select
Sheets.Add
ActiveSheet.Name = NFN
f = f + 1
NoP1 = Worksheets(NFN).Index
Sheets(f).Select
Cells(1, 1).Select
SelectPave
Selection.Copy
Sheets(NoP1).Select
ActiveSheet.Paste
l = Cells(1, 1).End(xlDown).Row
Df = Df + 1
End If
f = f + 1
Loop While f < Df + 1

Df = ActiveWorkbook.Sheets.Count
f = Df
Do
If Not (Right(Sheets(f).Name, 4) Like An) Then
SendKeys ("{ENTER}")
Sheets(f).Delete
Else
df0 = Df - 1
End If
f = f - 1
Loop While (df0 > 0 Or IsNull(df0) Or IsEmpty(df0)) And f > 0
Columns("E:H").HorizontalAlignment = xlCenter
Worksheets(1).Name = "ImportActiviteMedecins"
Cells(1, 1).Activate
ActiveWorkbook.Save
' Enregistrement après regroupement des pages sur une seule sous le nom "ImportActiviteMedecins"
End Sub"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Le Pingou Messages postés 12186 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 13 novembre 2024 1 449
18 nov. 2013 à 00:00
Bonjour,
Merci, il se fait tard, réponse demain dans la journée.
0
Merci à tous!
Pour compléter ma question, je me souviens avoir lu qq part une instruction qui permettait d'attendre que la boucle soit complètement exécutée avant de passer à l'instruction suivante. Mais je ne sais plus si c'était dans VBA Access, et alors je suppose qu'il existe la même avec Excel, et de toutes façons je ne l'avais pas comprise.
0
Le Pingou Messages postés 12186 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 13 novembre 2024 1 449
18 nov. 2013 à 15:12
Bonjour,
J'ai créé un fichier selon les informations que j'ai trouvé et votre procédure ne fait pas ce que vous avez décrit (la procédure complète demande de sélectionner une certaine plage sur une feuille du cahier et de la copier sur la 1ère feuille; cela fait elle supprime la feuille d'origine et passe à la suivante. ne fois tout recopier, la macro enregistre le cahier (fichier) qui ne devrait n'avoir qu'une seule feuille, mais dans la pratique les 3 feuilles les plus à droite du cahier ne sont pas supprimées bien que la copie soit faite correctement).
Résultat : le nouveau classeur avec une seule feuille [ImportActiviteMedecins] c'est en ordre mais la valeur qui avait été compilées sont supprimées.... !
Dans votre procédure pourquoi la ligne de code :
SendKeys ("{LEFT}{ENTER}")   
?
Et celle-ci :
SelectPave
est-ce l'appel d'une autre procédure .... ?

0
Le Pingou Messages postés 12186 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 13 novembre 2024 1 449
Modifié par Le Pingou le 18/11/2013 à 23:12
Bonjour,
Sans réponse de votre part il est impossible d'en faire plus....!

Salutations.
Le Pingou
0
Bonjour, Le Pingou,
Je n'avais pas du tout oublié ma question ni bien sûr ta proposition de réponse; seulement je ne suis pas encore en retraite (qq mois !!!) et je suis rentré assez tard, juste un peu plus d'une heure. Et je viens juste d'ouvrir ma machine.

Cela dit, effectivement "SelectPave" est une autre macro qui sélectionne une plage "compacte" càd sans ligne ni colonne vides, elle définit elle-même ses dimensions selon la colonne la plus à gauche et la ligne supérieure.
Son expression est très simple:
Sub SelectPave()
    l1 = ActiveCell.Row
    C1 = ActiveCell.Column  
    Cells(l1, C1).End(xlToRight).Select
    c2 = ActiveCell.Column
    Cells(l1, C1).End(xlDown).Select
    l2 = ActiveCell.Row    
    Range(Cells(l1, C1), Cells(l2, c2)).Select
End Sub


Quant à l'expression : "SendKeys()" , elle est là pour passer outre à la boite de dialogue avertissant que la page supprimée contient des données qui vont être perdues.
Pour répondre à vos questions!
..... Je regarde plus attentivement le reste de vos remarques.
Bien à vous
0
Que voulez-vous dire par : "mais la valeur qui avait été compilées sont supprimées.... ! "

Comme vous avez pu comprendre, il s'agit de compiler l'activité de consultation de médecins. Après certaines transformations, on part d'une série de 23 tableaux reprenant l'activité de ces médecins à raison de un tableau par service qu'il faut compacter en en un seul; sachant que tous les tableaux ont la même structure on peut les réécrire en un seul comportant autant de lignes qu'il y a de médecins, et les colonnes étant inchangées. Aussi
1ère étape : Renommer le fichier et sauvegarder (le fichier d'origine avant transformation pourra être repris en cas de buggage)
2ème étape : Définir la 1ère feuille (Index=0) comme feuille de réception, et la 2ème (Index=1) comme feuille active.
3ème étape : lancer la 1ère boucle : Compile les données et les colle sur la 1ère feuille
4ème étape : Supprimer les feuilles qui ont servi de base au Copier/Coller

Avec tous mes mes remerciements, et mes excuses pour l'heure tardive (mais travail oblige, je suis d'après-midi, sans heure fixe de fin)
0
Le Pingou Messages postés 12186 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 13 novembre 2024 1 449
Modifié par Le Pingou le 19/11/2013 à 16:38
Bonjour,
Merci pour l'information.
C'est en ordre pour la procédure [SelectPave]. Par contre le code [SendKeys ("{LEFT}{ENTER}")] et [SendKeys ("{ENTER}")] ne fait qu'insérer des lignes vides dans la procédure et n'a aucun effet sur le message d'avertissement... !
J'ai découvert un autre problème car dans la première boucle vous ajouter la copie d'une feuille existante (qui peut se répéter plusieurs fois selon votre code...).
Le gros problème est que je ne peux pas (sur la base du fichier que j'ai tenté de créer)déterminer ou intervenir car votre code ne fait pas ce que vous avez décrit.


Est-il possible d'avoir une copie du fichier.... ?

Question, vous réalisez cette compilation chaque jour, semaine, mois .... ?


Salutations.
Le Pingou
0
Bonjour, et merci pour la réponse;
Je vous envoie tout ça demain soir, car j'ai cela au travail mais pas à domicile.
En fait, ça marche bien, mais j'ai pu trouver le temps en fin d'AM pour faire un pas à pas. En réalité, ce n'est pas la fin de boucle qui foire mais le début, les 3*1ères qui ne suppriment pas la feuille voulue, ce qui fait qu'au lieu d'avoir un fichier (cahier) avec une seule feuille comme souhaité, j'en ai 4 dont les 3 dont je parle. D'autre part, et j'avais oublié, la macro est "régressive", j'entends qu'elle ne commence pas par la 1ère mais par la dernière et remonte vers la 1ère (c'est comme celui qui supprimerait le dernier wagon d'un train, il supprimerait toujours le dernier wagon, jusqu'à ce qu'il n'en reste qu'un seul); mais je pense que surtout cette macro vient en fin d'une série de macros imbriquées les unes dans les autres où celle-là est la dernière. Pour finir mon explication je dirai que je pars de plusieurs feuilles PDF recopiées dans Excel et que je suis obligé de "casser" pour les transférer dans une Table Access.
Pour ce qui est de la périodicité de l'exercice, il est mensuel.
Bien à vous.
0
Le Pingou Messages postés 12186 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 13 novembre 2024 1 449
20 nov. 2013 à 09:45
Bonjour,
Merci, alors j'attends la suite.
Pour votre information j'ai préparé une procédure en gardant les parties utiles (à mes yeux) :
Sub StatAgendaRegrouptCahier_vjpp()
Df = ActiveWorkbook.Sheets.Count
DM = Worksheets(Df).Name ' Nom de la dernière feuille ..!!!!! mafeuilee201311
Mois = Right(DM, 2)
An = Left(Right(DM, 7), 4)
DM = Right(DM, 7)
delireca = 2
' *** sur mon poste
' *** ActiveWorkbook.SaveAs Filename:="C:\Users\PJP\Desktop\RecapStatCs" & An & "-" & Mois & ".xls", FileFormat:=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False
ActiveWorkbook.SaveAs Filename:= _
"D:\D-Mes documents\Cs4_GENERALES\Docts" & An & "\StatsCs\RecapStatCs" & An & "-" & Mois & ".xls" _
, FileFormat:=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False
' Insérer feuille récapitulative
Sheets.Add before:=Sheets(1)
ActiveSheet.Name = "ImportActiviteMedecins"
Set shrecap = ActiveSheet
shrecap.Range("A1:I1") = Array("titre 1", "titre 2", "titre 3", "titre 4", "titre 5", "titre 6", "titre 7", "titre 8", "titre 9")
' boucle réspérer données des feuilles
For Each sh In Worksheets
If sh.Name <> "ImportActiviteMedecins" Then
sh.Activate
'Do
'Worksheets(f).Activate
' NF = Worksheets(f).Name ' NF = Nom feuille courante, Index (f)
NF = sh.Name
If Left(NF, 3) = Mid(Cells(2, 2), 8, 3) And Not (IsNull(NFN) Or IsEmpty(NFN)) Then
' si 3_1er caractères du nom de la feuille courante = n°UH de cellule UH
'sh.Cells(2, 1).Select
If IsEmpty(Cells(3, 1)) Then
Range(Cells(2, 1), Cells(2, 9)).Copy Destination:=shrecap.Cells(delireca, 1)
Else
l2 = Cells(Rows.Count, 1).End(xlUp).Row
c2 = Cells(2, Columns.Count).End(xlToLeft).Column
Range(Cells(2, 1), Cells(l2, c2)).Copy Destination:=shrecap.Cells(delireca, 1)
End If
Else
NFN = Left(Cells(2, 2), 4) & "#" & Mid(Cells(2, 2), 8, 3) & "#" & Mid(Cells(2, 2), 14, 25) & "#" & An
NFN = IIf(Len(NFN) < 32, NFN, Left(NFN, 26) & Right(NFN, 5))
l2 = sh.Cells(Rows.Count, 1).End(xlUp).Row
c2 = sh.Cells(2, Columns.Count).End(xlToLeft).Column
Range(Cells(2, 1), Cells(l2, c2)).Copy Destination:=shrecap.Cells(delireca, 1)
End If
delireca = shrecap.Cells(Rows.Count, 1).End(xlUp).Row + 1
End If
Next sh

For Each sh In Worksheets
Application.DisplayAlerts = False
If sh.Name <> "ImportActiviteMedecins" Then
sh.Delete
End If
Next sh
Application.DisplayAlerts = True
Columns("E:H").HorizontalAlignment = xlCenter
ActiveWorkbook.Save
' Enregistrement après regroupement des pages sur une seule sous le nom "ImportActiviteMedecins"
End Sub
Vue que vous faite l'opération tous les mois, ne serait-il pas mieux de créer un classeur de récapitulation avec une feuille par mois et on copie directement les données des classeurs de détail.... ? En plus la procédure reste dans ce classeur.

0
Bonsoir,
Passé plus de 3 heures à préparer une version propre à vous être envoyée (élagage des approximations + anonymation du fichier) , enfin qqch de présentable.

http://cjoint.com/?3KvcMke3RX0

Pour faire tourner la bête, vous devez sélectionner la macro "StatAgendaRegrouptCahier"

Vous constaterez que la dernière feuille n'est pas supprimée comme cela devrait, et plus gênant encore, au travail ce sont les 4 dernières qui ne sont pas supprimées. Je me demande donc si le problème ne vient pas de la rapidité de la machine ????

Avec tous ces soucis de mise au point, je n'ai malheureusement pas eu le temps de regarder votre envoi, et il est très tard!!!

Avec tous mes remerciements!
0
Le Pingou Messages postés 12186 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 13 novembre 2024 1 449
21 nov. 2013 à 10:39
Bonjour,
Merci pour le fichier, je constate que c'est une version 97-2003 (xls), qu'elle est la version exacte de votre MS Office... ? .
Que pensez-vous de ma proposition en fin du message précédent.... ?

0
Bonjour,
Je complète rapidement ma réponse de cette nuit,(avant de partir).
Je suis sur Excel2003 simplement parce que c'est l'outil qu'on veut bien me donner (au travail), à domicile j'ai E2010. Il est question qu' "on" me donne une nouvelle machine mais j'attends.
La réalité est que toutes mes procédures sont sur un fichier particulier, vide de toutes données, et j'y ai accès par des barres d'outils et une série de boutons personnalisés. Bien évidemment, tout ça de ma propre fabrication.
J'ai 36 noms (peut être trop) de fichiers intermédiaires selon l'avancée de la procédure, ne serait ce que pour sauvegarder les différentes étapes. A l'arrivée, j'ai une table annuelle qui est complétée chaque mois par cette même procédure, et en plus, comme je vous disait, tout est importer dans une table Access, avec laquelle je suis bien plus à l'aise et que je trouve beaucoup plus souple quant aux sélections. Ainsi, j'ai les données pour les 4 dernières années, date à la quelle je suis arrivé. Cela étant dit, il faut se rendre à l'évidence que certaines tâches sont plus aisées avec Excel, mais les capacités de la suite Office permettent le passage de l'un à l'autre passablement confortable.

j'ai transféré votre proposition sur un module idoine, je l'emporte pour la regarder à fond.
Je vous souhaite une bonne journée.
A ce soir. Et encore merci.
0
Bonsoir LePingou!
J'ai pu tester votre macro sur la même maquette anonymisée que celle que j'ai postée. Le résultat est des plus probants. J'ai fait un pas à pas, ainsi qu'un passage sans arrêt. Tout passe parfaitement. Aussi je vous adresse un grand merci!
Maintenant, il me reste à comprendre les outils utilisés; ça risque d'être plus corsé, d'autant que je ne suis vraiment pas un spécialiste. Aussi j'aurai sans aucun doute pas mal de questions supplémentaires à ce sujet. C'est pourquoi je ne mets pas la question comme étant résolue.
A bientôt!
0
Le Pingou Messages postés 12186 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 13 novembre 2024 1 449
21 nov. 2013 à 22:52
Bonjour,
Merci, pour ma procédure c'est un coup de chance car j'ai reconstruit un fichier selon votre procédure ce qui n'était pas évident... !
Superbe découverte pour moi, j'ai fait un pas à pas sur l'ensemble, c'est parfait. Le résultat final est conforme sans avoirs le problème de feuille en plus comme cela se produit chez vous.
Je vous suggère toutefois de supprimer l'instruction [SendKeys ("{LEFT}{ENTER}") ] et [SendKeys ("{ENTER}")] dans la procédure [StatAgendaRegrouptCahier3()] et de mettre à la place [Application.DisplayAlerts = False] juste après l'instruction [Do] (boucle...Sheets(f).Delete) et [Application.DisplayAlerts = True] après l'instruction [Loop While (df0.....].
C'est possible d'améliorer les procédures mais cela impose de tout reprendre, je pense que ce n'est pas peine de changer pour changer.... !

0
Bonsoir,
Je suis en train de lire attentivement le détail de votre procédure. Effectivement je découvre également pas mal de choses et en particulier des outils beaucoup plus légers que ceux que j'avais mis, que ce soit range().copy destination:= NomFeuille() ou bien le ARRAY() que je n'ai jamais pu appréhender, ou encore la possibilité d'indiquer les bornes droite et basse d'une plage (pavé) sans passer par le décompte. Autant de choses dont je vous remercie.
Cela dit, vous aurez pu constater (si tant est que vous ne le sachiez déjà) que les pauvres autodidactes que nous sommes, à défaut de maitrise et de connaissance techniques approfondies il faut procéder avec astuces pour contourner les obstacles.
Bien à vous.
0
Le Pingou Messages postés 12186 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 13 novembre 2024 1 449
21 nov. 2013 à 23:31
Bonjour,
Merci, je suis content pour vous. J'en suis un aussi.......pauvre non .... mais....!
Au plaisir de vous retrouver sur le forum.
0
Au plaisir tout également.
0