Bonjour à tous,
Je me tourne vers vous pour un problème assez spécial que je n'arrive pas à résoudre bien qu'ayant fait moult recherches sur les forums...Je suis tombé sur un problème tout fait similaire à celui guilty_AL (http://www.developpez.net/forums/d13...oles-active-x/).
Je ne suis pas pro dans le codage VBA Excel. Mais le code que j’ai utilisé pour dupliquer une feuille modèle EXCEL contenant environ 50 contrôles activeX et qui initialise les contrôles. La nouvelle feuille prend alors le nom "FS_Lot_N°" & I ; I étant chiffre qui change en fonction du nombre de feuille (première feuille créée = FS_Lot_N°1, 2e feuille crée = FS_Lot_N°2,...).
Ce code fonctionne très bien pour les premières feuilles créées. Pour ce qui est de la 3e, le début du script fonctionne bien mais bug avec comme message d'erreur :
Erreur d'exécution '438' :
Propriété ou méthode d'exécution non gérée par cet objet
En visualisant la 3ème feuille, tous les contrôles y sont. Par contre, je constate qu’un bon nombre de contrôles ActiveX ont été changé en contrôle de formulaire (celui où il faut affecter une macro). On peut le voir en cliquant sur propriétés de ce boutons ou plus simplement via le projet VB où la plupart des boutons de commande ne se trouve plus sur la liste des objets, mais plutôt dans la liste des évènements.
Et plus j’augmente le nombre de feuilles à dupliquer, moins j’ai de contrôles ActiveX voir aucun car tous ont été transformés en contrôles de formulaires et pourtant les 2 premières feuilles dupliquées fonctionnent à merveille.
Voici mon code
Sub DuplicateSheetFicheSuiveuseGood()
Dim i As Integer
Dim numSheetFicheSuiveuse As Integer
Dim nbSheetFicheSuiveuse As Integer
Dim nbEndos As Integer
Dim nbEndosDansLot As Integer
Dim wb As Workbook
Dim ws As Worksheet
Dim NewSheet As Worksheet
Dim startNumFS As Integer
Dim aBaseColorIndex() As Variant
Dim oOle As OLEObject
Dim iMethode as integer
On Error Resume Next
bCreationFicheSuiveuseEnCours = True
‘Coloris disponible pour l’onglet et une partie de la feuille à appliquer
aBaseColorIndex = Array(5, 6, 38, 44, 32, 17, 10, 46)
'Récupère le nombre d'endoscopes générés
nbEndos = Worksheets("1-Saisie").Cells(5, 12).Value
‘Calcule le nombre de fiche suiveuse à créer
nbEndosDansLot = 10
nbSheetFicheSuiveuse = nbEndos \ nbEndosDansLot
‘Rend visible la fiche suiveuse modèle
Worksheets("3-FicheSuiveuse").Visible = True
‘Index de la feuille de fiche suiveuse modèle
numSheetFicheSuiveuse = Worksheets("3-FicheSuiveuse").Index
‘Vide le presse-papier
Application.CutCopyMode = False
‘Autres moyens pour vider le presse-papier
‘VidePressePapier
'Application.CommandBars("Clipboard").Controls("&Vider le Presse-Papiers").Execute
‘Application.CommandBars("clipboard").Controls(4).Execute
‘Copie les objets avec les cellules
Application.CopyObjectsWithCells = True
‘Désactive tous les élements
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
‘Deux methodes pour la duplication de la feuille
iMethode = 1
For p = 1 To nbSheetFicheSuiveuse
If iMethode = 0 Then
Set ws = ThisWorkbook.Worksheets.Add
With ws
.Move After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
.Name = "3-FS_Lot_N" & p
ThisWorkbook.Worksheets("3-FicheSuiveuse").Cells.Copy Destination:=ThisWorkbook.Worksheets("3-FS_Lot_N" & p).Range("A1")
End With
Set ws = Nothing
With ThisWorkbook.Worksheets("3-FS_Lot_N" & p) 'IN=nitialisation
.Unprotect Password:="xxx" ‘Dévérouille les cellules
.DTPicker1.Value = Date
.Range("J1").Value = Format(Now, "YY") & Format(Format(Now, "ww", vbMonday, vbFirstFourDays), "00") & Format(Weekday(Now, vbMonday), "00")
.ComboBox_NumeroLot.Value = Format(i + 1, "000")
.ComboBox_QuantiteDansLot.Value = 10
.Range("A14").Interior.ColorIndex = aBaseColorIndex(i)
.Tab.color = ThisWorkbook.Colors(aBaseColorIndex(i))
End With
Else
ThisWorkbook.Worksheets("3-FicheSuiveuse").Copy Before:=ThisWorkbook.Worksheets("4-FC_ENVOI")
Application.CutCopyMode = False ' VidePressePapier
Set NewSheet = ThisWorkbook.Worksheets(Worksheets("4-FC_ENVOI").Index - 1)
NewSheet.Name = "3-FS_Lot_N" & p
With ThisWorkbook.Worksheets("3-FS_Lot_N" & p) 'Initialisation
.Unprotect Password:="xxx"
.DTPicker1.Value = Date
.Range("J1").Value = Format(Now, "YY") & Format(Format(Now, "ww", vbMonday, vbFirstFourDays), "00") & Format(Weekday(Now, vbMonday), "00")
.ComboBox_NumeroLot.Value = Format(p + 1, "000")
.ComboBox_QuantiteDansLot.Value = 10
.Range("A14").Interior.ColorIndex = aBaseColorIndex(p) 'colorLot(i)
.Tab.color = ThisWorkbook.Colors(aBaseColorIndex(p))
End With
End If
Set NewSheet = Nothing
Next
‘Masque la fiche suiveuse- modèle
Worksheets("3-FicheSuiveuse").Visible = False
‘Réactive tous les évènements
bCreationFicheSuiveuseEnCours = False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.EnableEvents = True
MsgBox nbSheetFicheSuiveuse & " fiches suiveuses ont été créees !"
End Sub
Au début, j’ai pensé à un problème de mémoire, mais rien n’y fait.
J'ai utilisé plusieurs moyens pour vider le presse-papier
Pour vider le presse-papier :
Application.CutCopyMode = False
Ou encore
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Sub VidePressePapier()
OpenClipboard 0
EmptyClipboard
CloseClipboard
End Sub
J’ai fait attention à nommer les feuilles et d’éviter tant que possible « les ActiveSheet ».
J’ai même essayé de créer un modèle xltm pour cette fiche, de manière à l’insèrer dans mon classeur autant de fois que je voudrais, mais le même problème.
Et pour couronner le tout, cela bug sans passer par les macros càd que je copie manuellement la feuille en cliquant sur l’onglet, puis « Déplacer ou Copier », Cocher la case « Créer une copie ». J’ai exactement le même problème que celui que j’ai en exécutant la macro à partir de la 3 voire même 4 feuille.
Je m'arrache les cheveux. S'agit-il d'un bug Excel ?
Pourquoi les controles ActiveX ont été changés en contrôles de formulaires
Ce problème me perturbe fortement car il est à la base du formulaire que je veux créer...
Cela me parait incroyable de ne pas pouvoir le faire !
Je vous remercie d'avance pour votre aide, quelle qu’elle soit!
Partager