Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Détection évènement insertion feuille

5 réponses
Avatar
ThierryP
Bonjour =E0 tou(te)s,

Dans un classeur, j'ajoute par VBA, =E0 la demande, une feuille copi=E9e
depuis un autre classeur par :
Sheets.Add.Name =3D "toto"

J'ai besoin d'ajouter du code dans l'=E9v=E8nement Worksheet_Change de
cette nouvelle feuille. Gr=E2ce =E0 un code trouv=E9 sur l'excellentissime
site de Fr=E9d=E9ric Sigonneau, j'ai r=E9ussi =E0 faire ce que je
voulais,....en simulation seulement ! En effet, j'ajoute le code
n=E9cessaire depuis l'=E9v=E8nement Workbook_NewSheet et tout fonctionne
bien tant que je fais une insertion manuelle d'une nouvelle feuille.
Si je passe par ma proc=E9dure ci-dessus, rien ne se passe !

O=F9 est l'astuce ??

Merci d'avance

ThierryP

5 réponses

Avatar
MichD
Bonjour,

Tu ajoutes une feuille dans le même classeur ou dans un autre classeur ?

Si tu utilises déjà du code (Frédéric), pourquoi ne pas le publier... si ce dernier a
besoin d'être adapté...

Qu'est-ce que tu ne réussis pas à faire présentement avec la macro ?


MichD
--------------------------------------------
"ThierryP" a écrit dans le message de groupe de discussion :


Bonjour à tou(te)s,

Dans un classeur, j'ajoute par VBA, à la demande, une feuille copiée
depuis un autre classeur par :
Sheets.Add.Name = "toto"

J'ai besoin d'ajouter du code dans l'évènement Worksheet_Change de
cette nouvelle feuille. Grâce à un code trouvé sur l'excellentissime
site de Frédéric Sigonneau, j'ai réussi à faire ce que je
voulais,....en simulation seulement ! En effet, j'ajoute le code
nécessaire depuis l'évènement Workbook_NewSheet et tout fonctionne
bien tant que je fais une insertion manuelle d'une nouvelle feuille.
Si je passe par ma procédure ci-dessus, rien ne se passe !

Où est l'astuce ??

Merci d'avance

ThierryP
Avatar
ThierryP
Bonjour (Bonsoir pour moi !!) Denis,

Toujours au rendez-vous !!!!

Dans un classeur, j'utilise ce code pour copier une feuille existante
dans un classeur auquel j'ajoute une page vierge :
Workbooks("Purchasing_Form.xls").Sheets("Achat").Activate
Columns("A:F").Select
Selection.Copy
Windows(ClassDest).Activate
Sheets.Add.Name = Onglet 'Onglet est une variable calculée
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:úlse, Transpose:úlse

Ci-dessous le code utilsé pour ajouter le code dans le module de
feuille :
Sub AddEventToModule()
'nécessite une référence à :
'Microsoft Visual Basic For Applications Extensibility 5.3 (je l'ai
ajoutée mais sans changement, la procédure fonctionne sans)
Dim DebutCode As Long
Dim S As String
S = "Controle_Saisie(Target)"
With ActiveWorkbook.VBProject.VBComponents(Nom_Feuille).CodeModule
DebutCode = .CreateEventProc("Change", "WorkSheet")
.InsertLines DebutCode + 1, S
End With
S = ""
End Sub

et enfin dans le module du Workbook, j'utilise :
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Nom_Feuille = Sh.CodeName
Call AddEventToModule
End Sub

Je viens de re-re-re-tester ! Si j'insère une feuille manuellement, le
code est bien ajouté dans l'évènement Worksheet_Change, mais pas par
la ligne
Sheets.Add.Name = Onglet 'Onglet est une variable calculée

J'en perds mon latin et le peu de VBA que je maîtrise !!

Merci d'avance

ThierryP



On 27 avr, 21:34, "MichD" wrote:
Bonjour,

Tu ajoutes une feuille dans le m me classeur ou dans un autre classeur ?

Si tu utilises d j du code (Fr d ric), pourquoi ne pas le publier... si c e dernier a
besoin d' tre adapt ...

Qu'est-ce que tu ne r ussis pas faire pr sentement avec la macro ?

MichD
--------------------------------------------
"ThierryP"  a crit dans le message de groupe de discussion :


Bonjour tou(te)s,

Dans un classeur, j'ajoute par VBA, la demande, une feuille copi e
depuis un autre classeur par :
    Sheets.Add.Name = "toto"

J'ai besoin d'ajouter du code dans l' v nement Worksheet_Change de
cette nouvelle feuille. Gr ce un code trouv sur l'excellentissime
site de Fr d ric Sigonneau, j'ai r ussi faire ce que je
voulais,....en simulation seulement ! En effet, j'ajoute le code
n cessaire depuis l' v nement Workbook_NewSheet et tout fonctionne
bien tant que je fais une insertion manuelle d'une nouvelle feuille.
Si je passe par ma proc dure ci-dessus, rien ne se passe !

O est l'astuce ??

Merci d'avance

ThierryP
Avatar
MichD
Voici un exemple de code,

Ta question représente des bouts de n'importe quoi.
Tu t'organise avec ceci.

'------------------------------------------
Sub Copier_Feuille_Autre_Classeur()
Dim Sh As Worksheet, Code As String

Application.ScreenUpdating = True
With Workbooks("ClassDest") 'Classeur de destination
Set Sh = .Worksheets.Add
End With
With Workbooks("Purchasing_Form.xls").Sheets("Achat") 'Classeur Source
.Range("A:F").Copy
End With
With Sh 'Ajoute la feuille + copie les données
.Name = "MaFeuil"
.Range("A1").PasteSpecial Paste:=xlPasteValues
.Range("A1").PasteSpecial Paste:=xlPasteFormats
End With

'le code à ajouter dans la nouvelle feuille
'tu ajoutes les lignes manquantes utilisant cette syntaxe
Code = "Private Sub WorkSheet_Change(ByVal Target As Range)" & vbCrLf
Code = "Le code à définir" & vbCrLf
Code = "End Sub"

'Ajout du code dans le code module de la nouvelle feuille
With Workbooks(Sh.Parent.Name).VBProject
With .VBcomponents(Sh.CodeName).CodeModule
.AddFromString Code
End With
'Le code à ajouter dans le ThisWorkbook du classeur de destination
Code = ""
Code = "Private Sub Workbook_NewSheet(ByVal Sh As Object)" & vbCrLf
Code = Code & "Dim Nom_Feuille As String" & vbCrLf
Code = Code & "Nom_Feuille = Sh.CodeName" & vbCrLf
Code = Code & "End Sub"

With .VBcomponents("ThisWorkbook").CodeModule
.AddFromString Code
End With
End With
Sh.Activate
Range("A1").Select

Application.CutCopyMode = False
Application.ScreenUpdating = False
End Sub
'------------------------------------------

MichD
--------------------------------------------
Avatar
ThierryP
Oui, je sais que ce n'est pas très propre....:-(((((
Mais j'ajoute des couches sur un truc que j'avais fait il y a
longtemps, et mes connaissances ne vont pas très loin !!

Mais c'est en forgeant que l'on devient forgeron, non ? Pour
l'instant, je me tape plus souvent sur les doigts qu'autre chose, mais
bon, il ne faut pas désespérer !!

Merci infiniment :-)))

ThierryP


On 27 avr, 22:53, "MichD" wrote:
Voici un exemple de code,

Ta question repr sente des bouts de n'importe quoi.
Tu t'organise avec ceci.

'------------------------------------------
Sub Copier_Feuille_Autre_Classeur()
Dim Sh As Worksheet, Code As String

Application.ScreenUpdating = True
With Workbooks("ClassDest") 'Classeur de destination
    Set Sh = .Worksheets.Add
End With
With Workbooks("Purchasing_Form.xls").Sheets("Achat") 'Classeur Source
    .Range("A:F").Copy
End With
With Sh 'Ajoute la feuille + copie les donn es
    .Name = "MaFeuil"
    .Range("A1").PasteSpecial Paste:=xlPasteValues
    .Range("A1").PasteSpecial Paste:=xlPasteFormats
End With

'le code ajouter dans la nouvelle feuille
'tu ajoutes les lignes manquantes utilisant cette syntaxe
Code = "Private Sub WorkSheet_Change(ByVal Target As Range)" & vbCrLf
Code = "Le code d finir" & vbCrLf
Code = "End Sub"

'Ajout du code dans le code module de la nouvelle feuille
With Workbooks(Sh.Parent.Name).VBProject
    With .VBcomponents(Sh.CodeName).CodeModule
       .AddFromString Code
    End With
    'Le code ajouter dans le ThisWorkbook du classeur de destination
    Code = ""
    Code = "Private Sub Workbook_NewSheet(ByVal Sh As Object)" & vb CrLf
    Code = Code & "Dim Nom_Feuille As String" & vbCrLf
    Code = Code & "Nom_Feuille = Sh.CodeName" & vbCrLf
    Code = Code & "End Sub"

    With .VBcomponents("ThisWorkbook").CodeModule
        .AddFromString Code
    End With
End With
Sh.Activate
Range("A1").Select

Application.CutCopyMode = False
Application.ScreenUpdating = False
End Sub
'------------------------------------------

MichD
--------------------------------------------
Avatar
MichD
Les 2 dernières lignes du code de la procédure :

True , not false

Application.CutCopyMode = true
Application.ScreenUpdating = true


MichD
--------------------------------------------