Problème de n° d'index des feuilles Excel créées en VBA - VB/VBA/VBS - Programmation
Marsh Posté le 27-02-2006 à 21:57:06
ReplyMarsh Posté le 27-02-2006 à 22:06:35
Epena a écrit : Quel est le code qui créé les nouvelles feuilles Excel avec le numéro d'index ? |
Voici la totalité du code, il est très certainement loin d'être optimisé ou "propre", mais il avait le mérite de fonctionner. Merci d'avance pour tes remarques.
Sub Copie_et_préparation_inventaire()
'' Copie_et_traitement_avant_nouvel_inventaire Macro
' Macro enregistrée le 19/12/2002 par JYG
'
' Activation de la dernière feuille du classeur
Worksheets(Worksheets.Count).Activate
' Contrôle que la copie n'est pas déjà faite et le nom toujours "Nom de la feuille à modifier"
If ActiveSheet.Name = "Nom de la feuille à modifier" Then
MsgBox "ATTENTION, l'inventaire doit être renseigné dans la feuille copiée dont le nom sera à modifier", vbExclamation, " LA COPIE DE FEUILLE EST DEJA FAITE"
Range("K5" ).Select
Exit Sub
End If
' Contrôle que la copie n'est pas déjà faite avec le nom de la feuille modifié et l'inventaire pas encore saisi
Range("K5:L51" ).Select
If ActiveCell = Empty Then
MsgBox "ATTENTION, La dernière feuille est vide dans les colonnes où sont saisies les quantités d'inventaire, donc . . . INVENTAIRE A SAISIR ", vbExclamation, " LA COPIE DE FEUILLE EST DEJA FAITE, MAIS L'INVENTAIRE N'A PAS ENCORE ETE SAISI"
Range("K5" ).Select
Exit Sub
End If
' Affichage du choix de confirmation de la copie de feuille
Dim Msg, Style, Title, Help, Ctxt, Response, MyString
' Définit le message.
Msg = "Vous avez choisi de dupliquer une feuille pour un nouvel inventaire. Confirmer en cliquant sur OUI. ou abandonner en cliquant sur NON"
' Définit les boutons.
Style = vbYesNo + vbCritical + vbDefaultButton1
' Définit le titre.
Title = " Duplication de feuille pour nouvel inventaire"
' Définit le fichier d'aide.
Help = "DEMO.HLP"
' Définit le contexte de la rubrique.
Ctxt = 1000
' Affiche le message.
Response = MsgBox(Msg, Style, Title, Help, Ctxt)
If Response = vbYes Then ' L'utilisateur a choisi Oui.
MyString = "Oui" ' Le programme va copier la feuille.
Else ' L'utilisateur a choisi Non.
MyString = "Non"
Range("A1" ).Select
Exit Sub
End If
' Positionnement sur la première cellule de la feuille à copier
Range("A1" ).Select
' Copie_et_traitement_avant_nouvel_inventaire Macro
Worksheets(Worksheets.Count).Activate
' Déprotection de la feuille à copier
ActiveSheet.Unprotect
' Copie vers une nouvelle feuille que nous appellerons "Nom de la feuille à modifier"
Sheets(Worksheets.Count).Copy After:=Sheets(Worksheets.Count)
Worksheets(Worksheets.Count).Activate
ActiveSheet.Name = "Nom de la feuille à modifier" Range("AD5:AE51" ).Select
Selection.ClearContents
Range("I5:J51" ).Select
Selection.Copy
ActiveWindow.LargeScroll Down:=-1
ActiveWindow.LargeScroll ToRight:=1
Range("AD5" ).Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
ActiveWindow.LargeScroll ToRight:=0
Range("F5:G51" ).Select
Selection.ClearContents
Range("X5:X51" ).Select
Application.CutCopyMode = False
Selection.Copy
ActiveWindow.LargeScroll ToRight:=-1
ActiveWindow.LargeScroll Down:=-1
Range("E5" ).Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
ActiveWindow.LargeScroll Down:=1
ActiveWindow.SmallScroll Down:=3
Range("D56:G58" ).Select
Application.CutCopyMode = False
Selection.ClearContents
Range("K05:L51" ).Select
Application.CutCopyMode = False
Selection.ClearContents
Range("E59:F60" ).Select
Selection.ClearContents
Range("M56:M57" ).Select
Selection.Copy
Range("O56:O57" ).Select
ActiveSheet.Paste
Range("M56:M57" ).Select
Application.CutCopyMode = False
Selection.ClearContents
'Mise à jour de la date du jour et des anciennes dates d'inventaire
Range("C4" ).Select
ActiveCell.FormulaR1C1 = "=TODAY()"
Selection.Copy
Selection.NumberFormat = "dd.mm.yy"
Range("C4" ).Select
Selection.Copy
Range("C3" ).Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Range("F3" ).Select
Application.CutCopyMode = False
Selection.Copy
Range("E3" ).Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Range("F2" ).Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Range("C3" ).Select
Application.CutCopyMode = False
Selection.Copy
Range("F3" ).Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Range("C4" ).Select
Application.CutCopyMode = False
Selection.ClearContents
'Renommer la nouvelle feuille
Worksheets("Nom de la feuille à modifier" ).Activate
With ActiveWindow
.DisplayGridlines = False
.DisplayZeros = False
End With
' Déprotection des cellules à saisir
ActiveWindow.LargeScroll Down:=-2
Range("F5:G51" ).Select
Selection.Locked = False
Selection.FormulaHidden = False
Range("K5:L51" ).Select
Selection.Locked = False
Selection.FormulaHidden = False
ActiveWindow.SmallScroll Down:=32
Range("E56:G58" ).Select
Selection.Locked = False
Selection.FormulaHidden = False
Range("E59:F60" ).Select
Selection.Locked = False
Selection.FormulaHidden = False
Range("M56:M57" ).Select
Selection.Locked = False
Selection.FormulaHidden = False
ActiveWindow.SmallScroll Down:=4
ActiveWindow.LargeScroll Down:=-2
' Protection à nouveau de la nouvelle feuille
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
MsgBox "ATTENTION, modifier le nom de la nouvelle feuille pour y mettre la date de l'inventaire"
' Positionnement sur la cellule "C3" de la nouvelle feuille
Range("C3" ).Select
End Sub
Marsh Posté le 01-03-2006 à 07:28:06
Bonjour,
Je pense que le mieux est de changer provisoirement le nom de la feuille à copier (par exemple "Temp" ), copier la feuille et la renommer par son ancien nom après la copie. Reste à tester la procédure avec Win98SE. Celà donnerait :
' Copie vers une nouvelle feuille que nous appellerons "Nom de la feuille à modifier"
NomDeLaFeuille = Sheets(Worksheets.Count).Name 'Nom de la feuille à copier
ActiveSheet.Name = "Temp" 'Changer le nom de la feuille
Sheets(Worksheets.Count).Copy After:=Sheets(Worksheets.Count)
Sheets(Worksheets.Count - 1).Name = NomDeLaFeuille 'Remettre l'ancien nom de feuille aprés copie
Worksheets(Worksheets.Count).Activate
ActiveSheet.Name = "Nom de la feuille à modifier"
Bon courage
Epena
Marsh Posté le 02-03-2006 à 10:44:42
le problème vient du fait que tu copies la feuille puis encore la feuille copiée.
En fait quand tu copies une feuille, excel reprends le nom de la feuille et rajoute 1 (dans le codename de la feuille) et ainsi de suite, jusqu'à atteindre le nombre maximum de caractères et planter.
Ce problème est résolu avec les versions 2000 et 2002 d'office.
Pour éviter ça, insère une feuille à la fin, copie les cellules de la première feuille et colle le tout dans la nouvelle.
Sinon, il ne te reste plus qu'à installer une version plus récente d'office.
++++
Marsh Posté le 03-03-2006 à 21:31:22
ladislas2609 a écrit : le problème vient du fait que tu copies la feuille puis encore la feuille copiée. |
Bonsoir
Je viens, par hasard de tomber sur un article traitant du problème qui me préoccupe, cet article confirme ce que tu indiques, à savoir que le problème est résolu par la version Office 2000, mais il indique également que la seule façon de s'en tirer est de dupliquer SYSTEMATIQUEMENT à partir de la premiere feuille, ce qui lui fais appeler les modules VBA liés à chaque feuille : Feuil1, puis, Feuil12, puis Feuil13, etc... .
La petite application que j'ai développé utilisant obligatoirement le dernière feuille pour copier des infos qui serviront de base à la suivante, celà deviendrait un peu plus compliqué de dupliquer le première feuille et ensuite de copier les cellules intéressantes de l'avant dernière feuille sur la dernière feuille. Enfin, c'est évidemment faisable, mais il fallait savoir pourquoi Excel 97 procédait de cette manière.
J'ai trouvé l'info sur le site des astuces d'ExcelLabo.
Comme je l'indiquais précédemment, je vais plutot installer la version 2000 pour être tranquille, mais je vous remercie tous de votre aide précieuse.
Pour info, et uniquement pour ladislas2609, je me suis mélangé les pinceaux ce matin en t'envoyant un message privé, veux tu bien m'en excuser et ne pas en tenir compte.
Cordialement
Marsh Posté le 10-03-2006 à 21:52:44
RESOLU.
L'installation de la version 2000 d'Excel a bien supprimé l'incrémentation erronée existante dans la version Excel97.
Merci encore à tous pour vos précieux conseils.
Cordialement
JYG
Marsh Posté le 26-02-2006 à 18:29:23
Bonjour,
Je viens de découvrir un problème d'incrément de n° d'index des feuilles EXCEL dans un classeur. Les nouvelles feuilles sont créées et copiées partiellement par une petite application VBA. Celà se passe bien sur une machine avec XP Pro et Excel 2003, mais sur une machine avec W98SE et Excel 97, il arrive quelquefois, ce n'est pas systématique, que le n° ne n'incrémente pas bien, il n'ajoute pas 1 au n° de la dernière feuille, mais il incrémente celle-ci avec un 1 accolé au n° de la dernière feuille, exemple :
normalement, feuil1, feuil2, feuil3, etc...
dans mon cas, celà donne feuil1, feuil11, feuil111, feuil1111, feuil11111, etc....
ce ne serait pas gênant en soi, mais il se trouve que le nom ne doit pas dépasser un certain nombre de caractères, ce qui fait qu'arrivée à saturation, quand le nom devient trop long, la procédure plante et la récupération est diablement difficile.
Si vous avez déjà connu ce genre de problème et surtout si vous avez une solution, merci d'avance.
---------------
JYG