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

Excel se plante lors d'une copie de macro

10 réponses
Avatar
andre.l'hoir
Bonjour à tous,
Je doit recevoir d'un client, ±200 fichiers Excel. Dans chacun de ses fichiers,
je dois placer une macro sur une feuille dans l'évènement "SelectionChange".
Afin d'éviter de faire le travail à la main, j'aimerais créer une petite macro
qui permet d'ajouter automatiquement le module sur cette feuille de chaque
fichier.

Mais, le problème, est qu'Excel se plante royalement au moment d'ajouter le
module.

J'ai regardé sur différents sites, les exemples fourni, mais sans résultats. Je
fais certainement une bêtise quelque part mais je ne vois pas où???

Voici le code que j'ai recopié d'un site et que j'ai modifié en fonction de mes
besoins:

Je remercie d'avance pour votre aide.

Version d'Excel: 2002 SP3

André

Sub AddEventToModule()
'j'ai ajouté la référence à :
'Microsoft Visual Basic For Applications Extensibility 6.0

Dim livre As Workbook
Dim page As Worksheet

Set livre = Workbooks("9999009_acrinathrin (3).xls")
' Dans le futur, "livre" contiendra le nom des 200 fichiers à traiter.

' La macro doit se mettre toujours sur la même page
Set page = livre.Worksheets("Report")

Dim DebutCode As Long
Dim s As String

'le texte du code de l'événement

s = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbLf
s = s & " With Target" & vbLf
s = s & " If .Row > 54 And .Row < 86 And (.Column = 4 Or .Column = 7 Or
.Column = 10 Or .Column = 13) Then" & vbLf
s = s & " c = .Column" & vbLf
s = s & " r = .Row" & vbLf
s = s & " MsgBox c & "" "" & r" & vbLf
s = s & " End If" & vbLf
s = s & " End With" & vbLf
s = s & "End Sub"

With livre.VBProject.VBComponents.Item(page.CodeName).CodeModule

'C'est sur la ligne suivante qu'Excell se plante
DebutCode = .CreateEventProc("SelectionChange", "WorkSheet")

'insérère le texte du code
.InsertLines DebutCode + 1, s
'.AddFromString s
End With
s = ""
End Sub

10 réponses

Avatar
MichDenis
Tu pourrais utiliser ceci car tu n'aurais pas besoin d'insérer une nouvelle bibliothèque

Si tu tiens à utiliser ta macro, à cause de cette ligne de code
DebutCode = .CreateEventProc("SelectionChange", "WorkSheet")
Tu dois ajouter la bibliothèque suivante à ton classeur.

Dans la fenêtre de l'éditeur de code, barre des menus / outils / référence/
et tu coches dana la liste : "Microsoft Visual Basic For Application Extensibility 5.3"


'----------------------------------------
Sub AddEventToModule()
'j'ai ajouté la référence à :
'Microsoft Visual Basic For Applications Extensibility 6.0

Dim livre As Workbook
Dim page As Worksheet

Set livre = Workbooks("9999009_acrinathrin (3).xls")
' Dans le futur, "livre" contiendra le nom des 200 fichiers à traiter.

' La macro doit se mettre toujours sur la même page
Set page = livre.Worksheets("Report")

Dim DebutCode As Long
Dim s As String

'le texte du code de l'événement

s = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbLf
s = s & " With Target" & vbLf
s = s & " If .Row > 54 And .Row < 86 And (.Column = 4 Or .Column = 7 Or .Column = 10 Or
.Column = 13) Then" & vbLf
s = s & " c = .Column" & vbLf
s = s & " r = .Row" & vbLf
s = s & " MsgBox c & "" "" & r" & vbLf
s = s & " End If" & vbLf
s = s & " End With" & vbLf
s = s & "End Sub"

With ThisWorkbook.VBProject.VBComponents(page.CodeName).CodeModule
.AddFromString s
End With

s = ""
End Sub
'----------------------------------------



<andre.l' a écrit dans le message de news:
Bonjour à tous,
Je doit recevoir d'un client, ±200 fichiers Excel. Dans chacun de ses fichiers,
je dois placer une macro sur une feuille dans l'évènement "SelectionChange".
Afin d'éviter de faire le travail à la main, j'aimerais créer une petite macro
qui permet d'ajouter automatiquement le module sur cette feuille de chaque
fichier.

Mais, le problème, est qu'Excel se plante royalement au moment d'ajouter le
module.

J'ai regardé sur différents sites, les exemples fourni, mais sans résultats. Je
fais certainement une bêtise quelque part mais je ne vois pas où???

Voici le code que j'ai recopié d'un site et que j'ai modifié en fonction de mes
besoins:

Je remercie d'avance pour votre aide.

Version d'Excel: 2002 SP3

André

Sub AddEventToModule()
'j'ai ajouté la référence à :
'Microsoft Visual Basic For Applications Extensibility 6.0

Dim livre As Workbook
Dim page As Worksheet

Set livre = Workbooks("9999009_acrinathrin (3).xls")
' Dans le futur, "livre" contiendra le nom des 200 fichiers à traiter.

' La macro doit se mettre toujours sur la même page
Set page = livre.Worksheets("Report")

Dim DebutCode As Long
Dim s As String

'le texte du code de l'événement

s = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbLf
s = s & " With Target" & vbLf
s = s & " If .Row > 54 And .Row < 86 And (.Column = 4 Or .Column = 7 Or
.Column = 10 Or .Column = 13) Then" & vbLf
s = s & " c = .Column" & vbLf
s = s & " r = .Row" & vbLf
s = s & " MsgBox c & "" "" & r" & vbLf
s = s & " End If" & vbLf
s = s & " End With" & vbLf
s = s & "End Sub"

With livre.VBProject.VBComponents.Item(page.CodeName).CodeModule

'C'est sur la ligne suivante qu'Excell se plante
DebutCode = .CreateEventProc("SelectionChange", "WorkSheet")

'insérère le texte du code
.InsertLines DebutCode + 1, s
'.AddFromString s
End With
s = ""
End Sub
Avatar
andre.l'hoir
Bonjour,
Tout d'abord, j'aimerais vous remercier pour votre support.
Au départ, j'avais ajouter la référence 6.0 mais j'ai changé en 5.3

Je viens d'essayer votre conseil, mais hélas Excel se plante.

Quand je vois votre ligne :
Si tu tiens à utiliser ta macro, à cause de cette ligne de code
DebutCode = .CreateEventProc("SelectionChange", "WorkSheet")


Y aurait'il une autre manière de faire la même chose???

André

Tu pourrais utiliser ceci car tu n'aurais pas besoin d'insérer une nouvelle
bibliothèque

Si tu tiens à utiliser ta macro, à cause de cette ligne de code
DebutCode = .CreateEventProc("SelectionChange", "WorkSheet")
Tu dois ajouter la bibliothèque suivante à ton classeur.

Dans la fenêtre de l'éditeur de code, barre des menus / outils / référence/
et tu coches dana la liste : "Microsoft Visual Basic For Application
Extensibility 5.3"


'----------------------------------------
Sub AddEventToModule()
'j'ai ajouté la référence à :
'Microsoft Visual Basic For Applications Extensibility 6.0

Dim livre As Workbook
Dim page As Worksheet

Set livre = Workbooks("9999009_acrinathrin (3).xls")
' Dans le futur, "livre" contiendra le nom des 200 fichiers à traiter.

' La macro doit se mettre toujours sur la même page
Set page = livre.Worksheets("Report")

Dim DebutCode As Long
Dim s As String

'le texte du code de l'événement

s = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbLf
s = s & " With Target" & vbLf
s = s & " If .Row > 54 And .Row < 86 And (.Column = 4 Or .Column = 7 Or
.Column = 10 Or
.Column = 13) Then" & vbLf
s = s & " c = .Column" & vbLf
s = s & " r = .Row" & vbLf
s = s & " MsgBox c & "" "" & r" & vbLf
s = s & " End If" & vbLf
s = s & " End With" & vbLf
s = s & "End Sub"

With ThisWorkbook.VBProject.VBComponents(page.CodeName).CodeModule
.AddFromString s
End With

s = ""
End Sub
'----------------------------------------



<andre.l' a écrit dans le message de news:

Bonjour à tous,
Je doit recevoir d'un client, ±200 fichiers Excel. Dans chacun de ses fichiers,
je dois placer une macro sur une feuille dans l'évènement "SelectionChange".
Afin d'éviter de faire le travail à la main, j'aimerais créer une petite macro
qui permet d'ajouter automatiquement le module sur cette feuille de chaque
fichier.

Mais, le problème, est qu'Excel se plante royalement au moment d'ajouter le
module.

J'ai regardé sur différents sites, les exemples fourni, mais sans résultats. Je
fais certainement une bêtise quelque part mais je ne vois pas où???

Voici le code que j'ai recopié d'un site et que j'ai modifié en fonction de mes
besoins:

Je remercie d'avance pour votre aide.

Version d'Excel: 2002 SP3

André

Sub AddEventToModule()
'j'ai ajouté la référence à :
'Microsoft Visual Basic For Applications Extensibility 6.0

Dim livre As Workbook
Dim page As Worksheet

Set livre = Workbooks("9999009_acrinathrin (3).xls")
' Dans le futur, "livre" contiendra le nom des 200 fichiers à traiter.

' La macro doit se mettre toujours sur la même page
Set page = livre.Worksheets("Report")

Dim DebutCode As Long
Dim s As String

'le texte du code de l'événement

s = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbLf
s = s & " With Target" & vbLf
s = s & " If .Row > 54 And .Row < 86 And (.Column = 4 Or .Column = 7 Or
.Column = 10 Or .Column = 13) Then" & vbLf
s = s & " c = .Column" & vbLf
s = s & " r = .Row" & vbLf
s = s & " MsgBox c & "" "" & r" & vbLf
s = s & " End If" & vbLf
s = s & " End With" & vbLf
s = s & "End Sub"

With livre.VBProject.VBComponents.Item(page.CodeName).CodeModule

'C'est sur la ligne suivante qu'Excell se plante
DebutCode = .CreateEventProc("SelectionChange", "WorkSheet")

'insérère le texte du code
.InsertLines DebutCode + 1, s
'.AddFromString s
End With
s = ""
End Sub




Avatar
MichDenis
Un exemple d'application pour l'usage de " .CreateEventProc"

Si je veux ajouter une ligne de code à la procédure "Trouver" déjà existante
dans le module 2 à une ligne particulière du code :
P.S. La procédure "Trouver" doit déjà exister dans le module 2

Dans cette ligne de code, si tu utilises ceci :
Comp.ProcBodyLine("Trouver", vbext_pk_Proc)

Pour avoir accès à cette constante "vbext_pk_Proc" tu as besoin
de la bilbiothèque : "Microsoft Visual Basic For Application Extensibility 5.3"

Si tu remplaces "vbext_pk_Pr" par sa constante numérique, tu n'as pas
besoin de la bibliothèque et la ligne de code devient :

Comp.ProcBodyLine("Trouver", 0)

Plus bas tu trouveras une macro qui la correction de ta macro pour insérer
toute une procédure...


'-----------------------------------------------------
Sub AjouterUneLigneDeCode()

Dim Comp As CodeModule, NoLigne As Integer, Ajout As Variant
Ajout = "Msgbox ""ça marche!"""

'Attention : Remplace Module2 par le nom du module
'où se trouve ta procédure
Set Comp = ThisWorkbook.VBProject.VBComponents("module2").CodeModule
'indique à quelle ligne la procédure "Trouver" débute.

NoLigne = Comp.ProcBodyLine("Trouver", vbext_pk_Proc)
'Ajoute à la deuxième ligne de la procédure "Trouver
'le code désiré
Comp.InsertLines NoLigne + 3, S

End Sub
'-----------------------------------------------------


| Y aurait'il une autre manière de faire la même chose???
'----------------------------------------
Sub AddEventToModule()
'j'ai ajouté la référence à :
'Microsoft Visual Basic For Applications Extensibility 6.0

Dim livre As Workbook
Dim page As Worksheet

Set livre = Workbooks("9999009_acrinathrin (3).xls")
' Dans le futur, "livre" contiendra le nom des 200 fichiers à traiter.

' La macro doit se mettre toujours sur la même page
Set page = livre.Worksheets("Report")

Dim DebutCode As Long
Dim s As String

'le texte du code de l'événement

s = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbLf
s = s & " With Target" & vbLf
s = s & " If .Row > 54 And .Row < 86 And (.Column = 4 Or .Column = 7 Or .Column = 10 Or
.Column = 13) Then" & vbLf
s = s & " c = .Column" & vbLf
s = s & " r = .Row" & vbLf
s = s & " MsgBox c & "" "" & r" & vbLf
s = s & " End If" & vbLf
s = s & " End With" & vbLf
s = s & "End Sub"

With ThisWorkbook.VBProject.VBComponents(page.CodeName).CodeModule
.AddFromString s
End With

s = ""
End Sub
'----------------------------------------
Avatar
andre.l'hoir
Oui,
Je comprends ta macro. C'est dans le cas ou la macro existe déjà.

En réalité, je vais recevoir de mon client ±200 fichiers (1 fichier par
produit). Ces fichiers n'auront aucune macro au départ. Je vais devoir l'ajouter
sur chaque fichier. J'essaie simplement de trouver une solution pour me
simplifier ma vie. Je sais que la structure de chaque fichier sera identique.

Autrement, je vais devoir trouver une autre solution.

Du genre: est il possible de connaitre, depuis un autre fichier excel, quelle
est la cellule sélectionné au moment du clique???

André


In article , MichDenis says...


Un exemple d'application pour l'usage de " .CreateEventProc"

Si je veux ajouter une ligne de code à la procédure "Trouver" déjà existante
dans le module 2 à une ligne particulière du code :
P.S. La procédure "Trouver" doit déjà exister dans le module 2

Dans cette ligne de code, si tu utilises ceci :
Comp.ProcBodyLine("Trouver", vbext_pk_Proc)

Pour avoir accès à cette constante "vbext_pk_Proc" tu as besoin
de la bilbiothèque : "Microsoft Visual Basic For Application Extensibility 5.3"

Si tu remplaces "vbext_pk_Pr" par sa constante numérique, tu n'as pas
besoin de la bibliothèque et la ligne de code devient :

Comp.ProcBodyLine("Trouver", 0)

Plus bas tu trouveras une macro qui la correction de ta macro pour insérer
toute une procédure...


'-----------------------------------------------------
Sub AjouterUneLigneDeCode()

Dim Comp As CodeModule, NoLigne As Integer, Ajout As Variant
Ajout = "Msgbox ""ça marche!"""

'Attention : Remplace Module2 par le nom du module
'où se trouve ta procédure
Set Comp = ThisWorkbook.VBProject.VBComponents("module2").CodeModule
'indique à quelle ligne la procédure "Trouver" débute.

NoLigne = Comp.ProcBodyLine("Trouver", vbext_pk_Proc)
'Ajoute à la deuxième ligne de la procédure "Trouver
'le code désiré
Comp.InsertLines NoLigne + 3, S

End Sub
'-----------------------------------------------------


| Y aurait'il une autre manière de faire la même chose???
'----------------------------------------
Sub AddEventToModule()
'j'ai ajouté la référence à :
'Microsoft Visual Basic For Applications Extensibility 6.0

Dim livre As Workbook
Dim page As Worksheet

Set livre = Workbooks("9999009_acrinathrin (3).xls")
' Dans le futur, "livre" contiendra le nom des 200 fichiers à traiter.

' La macro doit se mettre toujours sur la même page
Set page = livre.Worksheets("Report")

Dim DebutCode As Long
Dim s As String

'le texte du code de l'événement

s = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbLf
s = s & " With Target" & vbLf
s = s & " If .Row > 54 And .Row < 86 And (.Column = 4 Or .Column = 7 Or
.Column = 10 Or
.Column = 13) Then" & vbLf
s = s & " c = .Column" & vbLf
s = s & " r = .Row" & vbLf
s = s & " MsgBox c & "" "" & r" & vbLf
s = s & " End If" & vbLf
s = s & " End With" & vbLf
s = s & "End Sub"

With ThisWorkbook.VBProject.VBComponents(page.CodeName).CodeModule
.AddFromString s
End With

s = ""
End Sub
'----------------------------------------




Avatar
MichDenis
Est-ce que cela t'arrive de lire les messages que tu reçois jusqu'à la fin ?

Tu as une solution toute faite pour ajouter l'ensemble d'une macro à un module.

Que veux-tu de plus ?


<andre.l' a écrit dans le message de news:
Oui,
Je comprends ta macro. C'est dans le cas ou la macro existe déjà.

En réalité, je vais recevoir de mon client ±200 fichiers (1 fichier par
produit). Ces fichiers n'auront aucune macro au départ. Je vais devoir l'ajouter
sur chaque fichier. J'essaie simplement de trouver une solution pour me
simplifier ma vie. Je sais que la structure de chaque fichier sera identique.

Autrement, je vais devoir trouver une autre solution.

Du genre: est il possible de connaitre, depuis un autre fichier excel, quelle
est la cellule sélectionné au moment du clique???

André


In article , MichDenis says...


Un exemple d'application pour l'usage de " .CreateEventProc"

Si je veux ajouter une ligne de code à la procédure "Trouver" déjà existante
dans le module 2 à une ligne particulière du code :
P.S. La procédure "Trouver" doit déjà exister dans le module 2

Dans cette ligne de code, si tu utilises ceci :
Comp.ProcBodyLine("Trouver", vbext_pk_Proc)

Pour avoir accès à cette constante "vbext_pk_Proc" tu as besoin
de la bilbiothèque : "Microsoft Visual Basic For Application Extensibility 5.3"

Si tu remplaces "vbext_pk_Pr" par sa constante numérique, tu n'as pas
besoin de la bibliothèque et la ligne de code devient :

Comp.ProcBodyLine("Trouver", 0)

Plus bas tu trouveras une macro qui la correction de ta macro pour insérer
toute une procédure...


'-----------------------------------------------------
Sub AjouterUneLigneDeCode()

Dim Comp As CodeModule, NoLigne As Integer, Ajout As Variant
Ajout = "Msgbox ""ça marche!"""

'Attention : Remplace Module2 par le nom du module
'où se trouve ta procédure
Set Comp = ThisWorkbook.VBProject.VBComponents("module2").CodeModule
'indique à quelle ligne la procédure "Trouver" débute.

NoLigne = Comp.ProcBodyLine("Trouver", vbext_pk_Proc)
'Ajoute à la deuxième ligne de la procédure "Trouver
'le code désiré
Comp.InsertLines NoLigne + 3, S

End Sub
'-----------------------------------------------------


| Y aurait'il une autre manière de faire la même chose???
'----------------------------------------
Sub AddEventToModule()
'j'ai ajouté la référence à :
'Microsoft Visual Basic For Applications Extensibility 6.0

Dim livre As Workbook
Dim page As Worksheet

Set livre = Workbooks("9999009_acrinathrin (3).xls")
' Dans le futur, "livre" contiendra le nom des 200 fichiers à traiter.

' La macro doit se mettre toujours sur la même page
Set page = livre.Worksheets("Report")

Dim DebutCode As Long
Dim s As String

'le texte du code de l'événement

s = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbLf
s = s & " With Target" & vbLf
s = s & " If .Row > 54 And .Row < 86 And (.Column = 4 Or .Column = 7 Or
.Column = 10 Or
.Column = 13) Then" & vbLf
s = s & " c = .Column" & vbLf
s = s & " r = .Row" & vbLf
s = s & " MsgBox c & "" "" & r" & vbLf
s = s & " End If" & vbLf
s = s & " End With" & vbLf
s = s & "End Sub"

With ThisWorkbook.VBProject.VBComponents(page.CodeName).CodeModule
.AddFromString s
End With

s = ""
End Sub
'----------------------------------------




Avatar
MichDenis
Tu peux aussi utiliser ceci, tu n'as qu'à renseigner tes variables dans
la procédure Test :

'------------------------------------------
Sub Test()

Dim Wk As Workbook
Dim Module As String
Dim Code As String

Set Wk = ThisWorkbook ' OU Workbooks("NomDuClasseur.xls")
Module = "Feuil1" ' ou worksheets("NomFeuille").codename
Code = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbLf
Code = Code & " With Target" & vbLf
Code = Code & " If .Row > 54 And .Row < 86 And " & _
"(.Column = 4 Or .Column = 7 Or .Column = 10 Or .Column = 13) Then" & vbLf
Code = Code & " c = .Column" & vbLf
Code = Code & " r = .Row" & vbLf
Code = Code & " McodegBox c & "" "" & r" & vbLf
Code = Code & " End If" & vbLf
Code = Code & " End With" & vbLf
Code = Code & "End Sub"

AddEventToModule Wk, Module, Code

End Sub
'------------------------------------------
Sub AddEventToModule(Wk As Workbook, Module As String, Code As String)

With Wk.VBProject.VBComponents(Module).CodeModule
.AddFromString Code
End With

End Sub
'------------------------------------------




"MichDenis" a écrit dans le message de news:

Est-ce que cela t'arrive de lire les messages que tu reçois jusqu'à la fin ?

Tu as une solution toute faite pour ajouter l'ensemble d'une macro à un module.

Que veux-tu de plus ?


<andre.l' a écrit dans le message de news:
Oui,
Je comprends ta macro. C'est dans le cas ou la macro existe déjà.

En réalité, je vais recevoir de mon client ±200 fichiers (1 fichier par
produit). Ces fichiers n'auront aucune macro au départ. Je vais devoir l'ajouter
sur chaque fichier. J'essaie simplement de trouver une solution pour me
simplifier ma vie. Je sais que la structure de chaque fichier sera identique.

Autrement, je vais devoir trouver une autre solution.

Du genre: est il possible de connaitre, depuis un autre fichier excel, quelle
est la cellule sélectionné au moment du clique???

André


In article , MichDenis says...


Un exemple d'application pour l'usage de " .CreateEventProc"

Si je veux ajouter une ligne de code à la procédure "Trouver" déjà existante
dans le module 2 à une ligne particulière du code :
P.S. La procédure "Trouver" doit déjà exister dans le module 2

Dans cette ligne de code, si tu utilises ceci :
Comp.ProcBodyLine("Trouver", vbext_pk_Proc)

Pour avoir accès à cette constante "vbext_pk_Proc" tu as besoin
de la bilbiothèque : "Microsoft Visual Basic For Application Extensibility 5.3"

Si tu remplaces "vbext_pk_Pr" par sa constante numérique, tu n'as pas
besoin de la bibliothèque et la ligne de code devient :

Comp.ProcBodyLine("Trouver", 0)

Plus bas tu trouveras une macro qui la correction de ta macro pour insérer
toute une procédure...


'-----------------------------------------------------
Sub AjouterUneLigneDeCode()

Dim Comp As CodeModule, NoLigne As Integer, Ajout As Variant
Ajout = "Msgbox ""ça marche!"""

'Attention : Remplace Module2 par le nom du module
'où se trouve ta procédure
Set Comp = ThisWorkbook.VBProject.VBComponents("module2").CodeModule
'indique à quelle ligne la procédure "Trouver" débute.

NoLigne = Comp.ProcBodyLine("Trouver", vbext_pk_Proc)
'Ajoute à la deuxième ligne de la procédure "Trouver
'le code désiré
Comp.InsertLines NoLigne + 3, S

End Sub
'-----------------------------------------------------


| Y aurait'il une autre manière de faire la même chose???
'----------------------------------------
Sub AddEventToModule()
'j'ai ajouté la référence à :
'Microsoft Visual Basic For Applications Extensibility 6.0

Dim livre As Workbook
Dim page As Worksheet

Set livre = Workbooks("9999009_acrinathrin (3).xls")
' Dans le futur, "livre" contiendra le nom des 200 fichiers à traiter.

' La macro doit se mettre toujours sur la même page
Set page = livre.Worksheets("Report")

Dim DebutCode As Long
Dim s As String

'le texte du code de l'événement

s = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbLf
s = s & " With Target" & vbLf
s = s & " If .Row > 54 And .Row < 86 And (.Column = 4 Or .Column = 7 Or
.Column = 10 Or
.Column = 13) Then" & vbLf
s = s & " c = .Column" & vbLf
s = s & " r = .Row" & vbLf
s = s & " MsgBox c & "" "" & r" & vbLf
s = s & " End If" & vbLf
s = s & " End With" & vbLf
s = s & "End Sub"

With ThisWorkbook.VBProject.VBComponents(page.CodeName).CodeModule
.AddFromString s
End With

s = ""
End Sub
'----------------------------------------




Avatar
andre.l'hoir
Bonjour,

Excusez-moi, je n'ai pas fait attention.
J'ai essayé ce que vous me dites mais sans succès.
J'ai également fait la même opération avec / sans la référence
Microsoft Visual Basic For Applications Extensibility 5.3 et 6.0
sans succès.

André

In article , MichDenis says...

Est-ce que cela t'arrive de lire les messages que tu reçois jusqu'à la fin ?

Tu as une solution toute faite pour ajouter l'ensemble d'une macro à un module.

Que veux-tu de plus ?


<andre.l' a écrit dans le message de news:

Oui,
Je comprends ta macro. C'est dans le cas ou la macro existe déjà.




'-----------------------------------------------------
Sub AjouterUneLigneDeCode()

Dim Comp As CodeModule, NoLigne As Integer, Ajout As Variant
Ajout = "Msgbox ""ça marche!"""

'Attention : Remplace Module2 par le nom du module
'où se trouve ta procédure
Set Comp = ThisWorkbook.VBProject.VBComponents("module2").CodeModule
'indique à quelle ligne la procédure "Trouver" débute.

NoLigne = Comp.ProcBodyLine("Trouver", vbext_pk_Proc)
'Ajoute à la deuxième ligne de la procédure "Trouver
'le code désiré
Comp.InsertLines NoLigne + 3, S

End Sub
'-----------------------------------------------------


| Y aurait'il une autre manière de faire la même chose???
'----------------------------------------
Sub AddEventToModule()
'j'ai ajouté la référence à :
'Microsoft Visual Basic For Applications Extensibility 6.0

Dim livre As Workbook
Dim page As Worksheet

Set livre = Workbooks("9999009_acrinathrin (3).xls")
' Dans le futur, "livre" contiendra le nom des 200 fichiers à traiter.

' La macro doit se mettre toujours sur la même page
Set page = livre.Worksheets("Report")

Dim DebutCode As Long
Dim s As String

'le texte du code de l'événement

s = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbLf
s = s & " With Target" & vbLf
s = s & " If .Row > 54 And .Row < 86 And (.Column = 4 Or .Column = 7 Or
.Column = 10 Or
.Column = 13) Then" & vbLf
s = s & " c = .Column" & vbLf
s = s & " r = .Row" & vbLf
s = s & " MsgBox c & "" "" & r" & vbLf
s = s & " End If" & vbLf
s = s & " End With" & vbLf
s = s & "End Sub"

With ThisWorkbook.VBProject.VBComponents(page.CodeName).CodeModule
.AddFromString s
End With

s = ""
End Sub
'----------------------------------------








Avatar
MichDenis
Dans le module1 du classeur exemple : http://cjoint.com/?bytSIo7a06

exéute la procédure "Test"... elle va copiée le code dans le module"feuil1"

Dans la procédure test, tu renseignes les variables
Set Wk = ThisWorkbook ' OU Workbooks("NomDuClasseur.xls")
Module = "Feuil1" ' ou worksheets("NomFeuille").codename
et le code à copier

Et tu peux copier le code que tu désires dans le classeur ouvert de ton choix
et dans le module que tu désires... le module doit exister !


<andre.l' a écrit dans le message de news:
Bonjour,

Excusez-moi, je n'ai pas fait attention.
J'ai essayé ce que vous me dites mais sans succès.
J'ai également fait la même opération avec / sans la référence
Microsoft Visual Basic For Applications Extensibility 5.3 et 6.0
sans succès.

André

In article , MichDenis says...

Est-ce que cela t'arrive de lire les messages que tu reçois jusqu'à la fin ?

Tu as une solution toute faite pour ajouter l'ensemble d'une macro à un module.

Que veux-tu de plus ?


<andre.l' a écrit dans le message de news:

Oui,
Je comprends ta macro. C'est dans le cas ou la macro existe déjà.




'-----------------------------------------------------
Sub AjouterUneLigneDeCode()

Dim Comp As CodeModule, NoLigne As Integer, Ajout As Variant
Ajout = "Msgbox ""ça marche!"""

'Attention : Remplace Module2 par le nom du module
'où se trouve ta procédure
Set Comp = ThisWorkbook.VBProject.VBComponents("module2").CodeModule
'indique à quelle ligne la procédure "Trouver" débute.

NoLigne = Comp.ProcBodyLine("Trouver", vbext_pk_Proc)
'Ajoute à la deuxième ligne de la procédure "Trouver
'le code désiré
Comp.InsertLines NoLigne + 3, S

End Sub
'-----------------------------------------------------


| Y aurait'il une autre manière de faire la même chose???
'----------------------------------------
Sub AddEventToModule()
'j'ai ajouté la référence à :
'Microsoft Visual Basic For Applications Extensibility 6.0

Dim livre As Workbook
Dim page As Worksheet

Set livre = Workbooks("9999009_acrinathrin (3).xls")
' Dans le futur, "livre" contiendra le nom des 200 fichiers à traiter.

' La macro doit se mettre toujours sur la même page
Set page = livre.Worksheets("Report")

Dim DebutCode As Long
Dim s As String

'le texte du code de l'événement

s = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbLf
s = s & " With Target" & vbLf
s = s & " If .Row > 54 And .Row < 86 And (.Column = 4 Or .Column = 7 Or
.Column = 10 Or
.Column = 13) Then" & vbLf
s = s & " c = .Column" & vbLf
s = s & " r = .Row" & vbLf
s = s & " MsgBox c & "" "" & r" & vbLf
s = s & " End If" & vbLf
s = s & " End With" & vbLf
s = s & "End Sub"

With ThisWorkbook.VBProject.VBComponents(page.CodeName).CodeModule
.AddFromString s
End With

s = ""
End Sub
'----------------------------------------








Avatar
andre.l'hoir
Bonjour,

GENIAL .... Cela fonctionne.
J'aimerais vous remercier pour avoir utilisé de votre temps pour m'aider.

Maintenant, concrètement lorsque je regarde le code, la seule différence, est
que l'instruction qui ajoute le code se trouve dans une procédure séparée avec
leurs paramètres... ce que je parviens pas à comprendre est pourquoi sa plante.

Si je peux vous aider à ma manière, je le ferais avec plaisir.
Encore merci
André


In article <#eKcIj#, MichDenis says...

Dans le module1 du classeur exemple : http://cjoint.com/?bytSIo7a06

exéute la procédure "Test"... elle va copiée le code dans le module"feuil1"

Dans la procédure test, tu renseignes les variables
Set Wk = ThisWorkbook ' OU Workbooks("NomDuClasseur.xls")
Module = "Feuil1" ' ou worksheets("NomFeuille").codename
et le code à copier

Et tu peux copier le code que tu désires dans le classeur ouvert de ton choix
et dans le module que tu désires... le module doit exister !


<andre.l' a écrit dans le message de news:

Bonjour,

Excusez-moi, je n'ai pas fait attention.
J'ai essayé ce que vous me dites mais sans succès.
J'ai également fait la même opération avec / sans la référence
Microsoft Visual Basic For Applications Extensibility 5.3 et 6.0
sans succès.

André

In article , MichDenis says...

Est-ce que cela t'arrive de lire les messages que tu reçois jusqu'à la fin ?

Tu as une solution toute faite pour ajouter l'ensemble d'une macro à un module.

Que veux-tu de plus ?


<andre.l' a écrit dans le message de news:

Oui,
Je comprends ta macro. C'est dans le cas ou la macro existe déjà.




'-----------------------------------------------------
Sub AjouterUneLigneDeCode()

Dim Comp As CodeModule, NoLigne As Integer, Ajout As Variant
Ajout = "Msgbox ""ça marche!"""

'Attention : Remplace Module2 par le nom du module
'où se trouve ta procédure
Set Comp = ThisWorkbook.VBProject.VBComponents("module2").CodeModule
'indique à quelle ligne la procédure "Trouver" débute.

NoLigne = Comp.ProcBodyLine("Trouver", vbext_pk_Proc)
'Ajoute à la deuxième ligne de la procédure "Trouver
'le code désiré
Comp.InsertLines NoLigne + 3, S

End Sub
'-----------------------------------------------------


| Y aurait'il une autre manière de faire la même chose???
'----------------------------------------
Sub AddEventToModule()
'j'ai ajouté la référence à :
'Microsoft Visual Basic For Applications Extensibility 6.0

Dim livre As Workbook
Dim page As Worksheet

Set livre = Workbooks("9999009_acrinathrin (3).xls")
' Dans le futur, "livre" contiendra le nom des 200 fichiers à traiter.

' La macro doit se mettre toujours sur la même page
Set page = livre.Worksheets("Report")

Dim DebutCode As Long
Dim s As String

'le texte du code de l'événement

s = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbLf
s = s & " With Target" & vbLf
s = s & " If .Row > 54 And .Row < 86 And (.Column = 4 Or .Column = 7 Or
.Column = 10 Or
.Column = 13) Then" & vbLf
s = s & " c = .Column" & vbLf
s = s & " r = .Row" & vbLf
s = s & " MsgBox c & "" "" & r" & vbLf
s = s & " End If" & vbLf
s = s & " End With" & vbLf
s = s & "End Sub"

With ThisWorkbook.VBProject.VBComponents(page.CodeName).CodeModule
.AddFromString s
End With

s = ""
End Sub
'----------------------------------------












Avatar
MichDenis
| ce que je parviens pas à comprendre est pourquoi sa plante

fait une copie de ton fichier, tu peux enlever toutes les feuilles sauf une et encore sans les
données et
publie le sur cjoint.com et tu nous retournes le lien ici...

Impossible de dire où se situe la problématique dans ton fichier à partir de ce commentaire!






<andre.l' a écrit dans le message de news:
Bonjour,

GENIAL .... Cela fonctionne.
J'aimerais vous remercier pour avoir utilisé de votre temps pour m'aider.

Maintenant, concrètement lorsque je regarde le code, la seule différence, est
que l'instruction qui ajoute le code se trouve dans une procédure séparée avec
leurs paramètres... ce que je parviens pas à comprendre est pourquoi sa plante.

Si je peux vous aider à ma manière, je le ferais avec plaisir.
Encore merci
André


In article <#eKcIj#, MichDenis says...

Dans le module1 du classeur exemple : http://cjoint.com/?bytSIo7a06

exéute la procédure "Test"... elle va copiée le code dans le module"feuil1"

Dans la procédure test, tu renseignes les variables
Set Wk = ThisWorkbook ' OU Workbooks("NomDuClasseur.xls")
Module = "Feuil1" ' ou worksheets("NomFeuille").codename
et le code à copier

Et tu peux copier le code que tu désires dans le classeur ouvert de ton choix
et dans le module que tu désires... le module doit exister !


<andre.l' a écrit dans le message de news:

Bonjour,

Excusez-moi, je n'ai pas fait attention.
J'ai essayé ce que vous me dites mais sans succès.
J'ai également fait la même opération avec / sans la référence
Microsoft Visual Basic For Applications Extensibility 5.3 et 6.0
sans succès.

André

In article , MichDenis says...

Est-ce que cela t'arrive de lire les messages que tu reçois jusqu'à la fin ?

Tu as une solution toute faite pour ajouter l'ensemble d'une macro à un module.

Que veux-tu de plus ?


<andre.l' a écrit dans le message de news:

Oui,
Je comprends ta macro. C'est dans le cas ou la macro existe déjà.




'-----------------------------------------------------
Sub AjouterUneLigneDeCode()

Dim Comp As CodeModule, NoLigne As Integer, Ajout As Variant
Ajout = "Msgbox ""ça marche!"""

'Attention : Remplace Module2 par le nom du module
'où se trouve ta procédure
Set Comp = ThisWorkbook.VBProject.VBComponents("module2").CodeModule
'indique à quelle ligne la procédure "Trouver" débute.

NoLigne = Comp.ProcBodyLine("Trouver", vbext_pk_Proc)
'Ajoute à la deuxième ligne de la procédure "Trouver
'le code désiré
Comp.InsertLines NoLigne + 3, S

End Sub
'-----------------------------------------------------


| Y aurait'il une autre manière de faire la même chose???
'----------------------------------------
Sub AddEventToModule()
'j'ai ajouté la référence à :
'Microsoft Visual Basic For Applications Extensibility 6.0

Dim livre As Workbook
Dim page As Worksheet

Set livre = Workbooks("9999009_acrinathrin (3).xls")
' Dans le futur, "livre" contiendra le nom des 200 fichiers à traiter.

' La macro doit se mettre toujours sur la même page
Set page = livre.Worksheets("Report")

Dim DebutCode As Long
Dim s As String

'le texte du code de l'événement

s = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbLf
s = s & " With Target" & vbLf
s = s & " If .Row > 54 And .Row < 86 And (.Column = 4 Or .Column = 7 Or
.Column = 10 Or
.Column = 13) Then" & vbLf
s = s & " c = .Column" & vbLf
s = s & " r = .Row" & vbLf
s = s & " MsgBox c & "" "" & r" & vbLf
s = s & " End If" & vbLf
s = s & " End With" & vbLf
s = s & "End Sub"

With ThisWorkbook.VBProject.VBComponents(page.CodeName).CodeModule
.AddFromString s
End With

s = ""
End Sub
'----------------------------------------