Problème de n° d'index des feuilles Excel créées en VBA

Problème de n° d'index des feuilles Excel créées en VBA - VB/VBA/VBS - Programmation

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
Reply

Marsh Posté le 26-02-2006 à 18:29:23   

Reply

Marsh Posté le 27-02-2006 à 21:57:06    

Quel est le code qui créé les nouvelles feuilles Excel avec le numéro d'index ?

Reply

Marsh 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


---------------
JYG
Reply

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

Reply

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.
++++
 

Reply

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.
 
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.
++++


 
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


---------------
JYG
Reply

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


---------------
JYG
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed