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

visite guidée

23 réponses
Avatar
sabatier
bonjour les damnés de la terre...
à la demande de denis du québec, je mets en place la visite de mes BO...afin
que mon offre attire toujours plus de monde (le forecast annonce pour 2005
un tout petit plus de visiteurs qu'à Eurodisney), j'ai pensé organisé aussi
un sightseeing de des procs au fil de mes divers modules en forme d'usine à
gaz...afin de laisser à mes visiteurs l'impression qu'ils ont été pris en
main par un vrai pro d'excel, j'ai donc besoin de remplacer tous les
Range("A12") par ce qui a rendu célèbre AV dans tout le Limousin, j'ai nommé
le fameux [A12]...au fait qu'elle était ma question? ah! oui j'y suis :
quelle proc pourrait procéder à ce remplacement sans tout casser le reste ;
si pour le [ ouvrant, cela ne doit pas être difficile à faire, je me pose
des questions pour le ] fermant car remplacer ") par ] va causer de gros
dégâts dans les textes des boxes quelquechose... sauf à détecter la présence
d'un chiffre juste avant le " et à condition qu'aucun des textes ne finisse
par un chiffre (on peut toujours l'espérer)...
évidemment, comme l'a fait pour moi FS avec son Pense-bête en espagnol,
j'offre des royalties sur chaque entrée de visiteur à celle ou celui qui
pourra m'aider dans ce Rechercher/Remplacer...
merci d'avance
jps

10 réponses

1 2 3
Avatar
sabatier
...et je la dirigerai spontanément vers toi, cette équipe, denis, toi qui
veux me faire faire des manips à n'en plus finir dans la boîte Remplacer
par....ah! on voit bien que ce n'est pas toi qui paie la main d'oeuvre, même
si elle ne touche que le SMIC du mpfien de base, c'est à dire moins d'un
euro de l'heure et encore moins d'un dollar canadien, fût-il québécois....
et il a raison, daniel, de dire que JPS il voit grand ; je n'en veux pour
preuve que le poids de mon perso.xls : 555 ko, un vrai petit sumo...et si je
pouvais le faire maigrir, je gagnerai en mémoire, je pense
jps
"michdenis" a écrit dans le message de
news:
Bonjour Daniel,

vu sous cet angle ... qu'on appelle d'urgence une équipe de réanimation !

;-))


Salutations!


"Daniel.M" a écrit dans le message de
news:

Bonjour Denis,

Est-ce possible que tu tentes de noyer le poisson ? Ça va être
difficile avec JPS, il ne supporte pas l'eau !
;-))



:-))
Il commence déjà à caler. :-)


Je pensais que la fonction Rechercher-Remplacer de la barre des
menus "Édition" de la fenêtre VBE aurait pu faire l'affaire
Rechercher : Range("A12")
Remplacer : [A12]
Avec l'option appropriée cochée :
procédure en cours ou module en cours ou le projet en cours


Ça fonctionne si tu cherches pour A12 mais si tu cherches pour 40 ou 50
adresses

de cellules différentes (dans quelques modules de code)?
Et 30 autres pour un autre fichier (parce que JPS, il voit grand!).

Donc, je pense que ça te prend un système qui identifie le texte à
l'intérieur

de l'instruction Range et qui reconnaît s'il s'agit d'une adresse simple
(ou

d'un mot qui réfère à un NOM défini dans Excel), auquel cas, il peut la
remplacer par [adresse].

S'il y a un tel système de détection (général, pas seulement pour A12) de
remplacement qui n'oblige pas à l'utilisation des expressions régulières
('regular expressions'), je suis preneur mais j'ai pas trouvé.

Salutations,

Daniel M.






Avatar
Daniel.M
Merci pour le feedback.


' **********************************

tu m'avais demandé de te tenir au courant et je viens donc au rapport :
une première chose qui n'a rien à voir avec ta fonction : si tu copies une
ligne du module commençant par des ", celui en tête de ligne ne se copie pas
dans la feuille du classeur, pas plus que celui qui "referme" la chaîne de
caractères ; je ne vois pas pourquoi mais toi, si, je pense...


Oui. Excel 'résoud' cette chaîne lors de l'opération de copie (comme le logiciel
résoud également les saisies qui ont l'air de dates).
Quelquefois, on apprécie beaucoup; d'autres fois, un peu moins.

Alternative 1:
============= Mettre tout ton code en commentaire.
Ça se fait en une manip:
Sélectionner le code
Dans VBE, Activer le Menu Edit par clique droit sur une barre de menu et cocher
le Menu Edition (pas celui des Menus traditionnels mais celui de la nouvelle
barre de menus)
Il y a un bouton "Commenter le bloc" (ou quelque chose du genre)

Juste à côté, il y a un autre bouton (enlever les commentaires, "UnComment
Block" en anglais) que tu invoqueras lorsque tu auras recopier le code
transformé dans le module.

En passant, il n'y a aucune commande associée à ces boutons: ils représentent
une fonctionnalité uniquement disponible à partir de l'interface (barre de menu
Edit) ce qui est plutôt rare dans Excel : habituellement, toutes les
manipulations qu'on fait peuvent se programmer et retrouvent leur équivalent
dans les Menus traditionnels Fichier/Édition/Vue/Format/etc.


Alternative 2:
=============
Se passer de la copie vers les cellules et récupérer directement le code (par
l'interface VBE Extensibility), le passer dans la fonction CodeObfuscator, puis
le retourner en remplacement dans le module. C'est nettement la solution à
privilégier. Si tu as besoin d'aide ici, avise.


' **********************************
une seconde chose qui elle, concerne la fonction : celle-ci convertit
Selection.Range("A1:F1").Select en

Selection.[A1:F1].Select et ça va faire boguer mais peut-être que la phrase
au départ n'est pas terrible...


C'est une limite des crochets. Utilisés seuls, ils sont l'équivalent de Range()
mais ils ne peuvent pas être des méthodes sur d'AUTRES objets Range (or
Selection est un tel objet Range).

AMA, il n'y a pas de parade qui vaudra en tout temps et je ne peux pas savoir
dans quels cas il faut transformer ou non.
Ainsi, ici on peut transformer :
With Sheets(1)
.Range("A10") = "x"
End With

Et ici, on ne peut pas:
With Sheets(1).Range("B1")
.Range("A10") = "x"
End With

Malgré le fait que l'analyseur lexicographique verra la même ligne.
C'est donc une bonne raison de privilégier la méthode universelle Range(). :-)


Dernière remarque: Si vraiment ton code est une usine à gaz (comme tu dis), tu
peux en publier des parties qui illustrent les carences en lisibilité. On
pourrait peut-être donner des conseils précis pour l'alléger (juste une offre,
tu en fais ce que tu veux).

Salutations,

Daniel M.

Avatar
sabatier
bonjour daniel
tout d'abord merci pour le feedback du fidebaque...
ensuite, je suis persuadé que je n'ai pas été le seul à être intéressé par
ta Function et, sans bien savoir sous quel soleil elle fait bronzer ses
petites plumes, j'ose espérer que misange inerceptera cet échange pour le
proposer sur excelabo...

"Daniel.M" a écrit dans le message de
news:
Merci pour le feedback.


' **********************************

tu m'avais demandé de te tenir au courant et je viens donc au rapport :
une première chose qui n'a rien à voir avec ta fonction : si tu copies
une


ligne du module commençant par des ", celui en tête de ligne ne se copie
pas


dans la feuille du classeur, pas plus que celui qui "referme" la chaîne
de


caractères ; je ne vois pas pourquoi mais toi, si, je pense...


Oui. Excel 'résoud' cette chaîne lors de l'opération de copie (comme le
logiciel

résoud également les saisies qui ont l'air de dates).
Quelquefois, on apprécie beaucoup; d'autres fois, un peu moins.


en effet, mais c'est assez vite cerné, Dieu garde comme disent les Corses

Alternative 1:
============= > Mettre tout ton code en commentaire.
Ça se fait en une manip:
Sélectionner le code
Dans VBE, Activer le Menu Edit par clique droit sur une barre de menu et
cocher

le Menu Edition (pas celui des Menus traditionnels mais celui de la
nouvelle

barre de menus)
Il y a un bouton "Commenter le bloc" (ou quelque chose du genre)

Juste à côté, il y a un autre bouton (enlever les commentaires, "UnComment
Block" en anglais) que tu invoqueras lorsque tu auras recopier le code
transformé dans le module.


oui, oui, daniel, je connais bien ces deux fonctionnalités de VBE et soit
dit entre nous (mais tu me promets de ne le répéer à personne car, comme
disait aussi un président des USA, Jefferson, je crois : un secret entre
trois personnes est bien gardé dès l'instant où deux d'entre elles sont
mortes) et entre nous, disais-je, c'est ton humble serviteur qui a fait
découvrir à notre grand MVP FS que tu pouvais installer ces deux boutons
dans la BO de VBE ; et si je t'en parle, c'est parce que je viens juste de
lui facturer mes honoraires pour le temps que mon tuyau lui a permis, lui
permet et lui permettra d'économiser....

En passant, il n'y a aucune commande associée à ces boutons: ils
représentent

une fonctionnalité uniquement disponible à partir de l'interface (barre de
menu

Edit) ce qui est plutôt rare dans Excel : habituellement, toutes les
manipulations qu'on fait peuvent se programmer et retrouvent leur
équivalent

dans les Menus traditionnels Fichier/Édition/Vue/Format/etc.


puisse Bilou et ses sbires t'entendre et pallier cette lagune, comme déjà à
l'époque leur faisait remarquer Marco Polo

Alternative 2:
============= >
Se passer de la copie vers les cellules et récupérer directement le code
(par

l'interface VBE Extensibility), le passer dans la fonction CodeObfuscator,
puis

le retourner en remplacement dans le module. C'est nettement la solution à
privilégier. Si tu as besoin d'aide ici, avise.


ach! was ist das, daniel? si c'est à privilégier et si ça ne doit pas trop
te "prendre le chou", moi je veux bien bénéficier encore d'une petite leçon,
me sentant à ce niveau du cours un peu "taré de la courge" (ces formules, un
peu rugueuses, je te l'accorde, ne sont utilisées que parce que j'ai la
chance d'avoir un entretien particulier avec une grosse légume)
' **********************************
une seconde chose qui elle, concerne la fonction : celle-ci convertit
Selection.Range("A1:F1").Select en

Selection.[A1:F1].Select et ça va faire boguer mais peut-être que la
phrase


au départ n'est pas terrible...


C'est une limite des crochets. Utilisés seuls, ils sont l'équivalent de
Range()

mais ils ne peuvent pas être des méthodes sur d'AUTRES objets Range (or
Selection est un tel objet Range).

AMA, il n'y a pas de parade qui vaudra en tout temps et je ne peux pas
savoir

dans quels cas il faut transformer ou non.
Ainsi, ici on peut transformer :
With Sheets(1)
.Range("A10") = "x"
End With

Et ici, on ne peut pas:
With Sheets(1).Range("B1")
.Range("A10") = "x"
End With

Malgré le fait que l'analyseur lexicographique verra la même ligne.
C'est donc une bonne raison de privilégier la méthode universelle Range().
:-)


ach! (bis) ne me dis pas, daniel, que, finalement, nous avons écrit tout
cela pour rien et quand je dis "nous", je pense surtout "toi" puisque moi
je n'ai fait, pour rester dans le registre de la maraîchère, que mettre un
peu de piment dans l'échange

Dernière remarque: Si vraiment ton code est une usine à gaz (comme tu
dis), tu

peux en publier des parties qui illustrent les carences en lisibilité. On
pourrait peut-être donner des conseils précis pour l'alléger (juste une
offre,

tu en fais ce que tu veux).


c'est gentil à toi ; tu te doutes bien qu'après avoir beaucoup utilisé
l'enregistreur de macros, je n'ai pas mis, dans le perso.xls et autres VBA
projects de classeurs divers, des procs comme le beurre de ma femme
(comprends "allégées) ; les seuls passages concentrés sont ceux pour
lesquels j'ai honteusement profité de l'aide du sus-nommé MVP (qui ne
l'était d'ailleurs pas encore à l'époque et tu auras déjà compris que je
n'ai pas été étranger à sa nomination grâce à mes nombreuses relations du
côté de Redmond)...
petit extrait de ce qui, avec beaucoup de temps (trop, je crois) pourrait
subir un régime weightwatcher car je doute que pour cela tu puisses sortir
de ton chapeau une autre Function miracle...

Application.ScreenUpdating = False
Windows("FACTUREEUROS.XLS").Activate
Range("D6").Select
Selection.PasteSpecial Paste:=xlAll, Operation:=xlNone,
SkipBlanks:úlse _
, Transpose:=True
Range("F57").Select
Selection.Copy
Windows("FICHCLTS.XLS").Activate
ActiveCell.Offset(0, 7).Range("A1").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlAdd, SkipBlanks:= _
False, Transpose:úlse
ActiveCell.Offset(0, 2).Range("A1").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=INT(SUM(RC[-2]:RC[-1]))"
ActiveCell.Select
Selection.Copy

en tous cas, merci encore, daniel, pour toute la peine que tu t'es donnée...
sur ce, tel un petit nain (rôle où je me sens bien eu égard à mes
connaissances ès excel), hého hého, je repars au boulot
bonne journée
jps
PS perso à michel P : si j'apprends que tu as profité des bienfaits
prodigués ici par daniel M, je te facture la prestation (si tu es en
micro-entreprise, on peut s'arranger au niveau de la TVA)


Avatar
AV
Moi j'ai rien dit... mais je n'en pense pas moins !

[AV]
Avatar
Daniel.M
'*******************************
Alternative 2:
============= > >
Se passer de la copie vers les cellules et récupérer directement le code
(par l'interface VBE Extensibility), le passer dans la fonction

CodeObfuscator,

puis le retourner en remplacement dans le module. C'est nettement la solution
à

privilégier. Si tu as besoin d'aide ici, avise.


ach! was ist das, daniel? si c'est à privilégier et si ça ne doit pas trop
te "prendre le chou", moi je veux bien bénéficier encore d'une petite leçon,


Chez Frédéric, il y a quelques exemples où on récupère dans une string le code
d'un module.
L'adaptation devrait bien aller. Je suis pris pour le moment mais d'ici ce soir,
je te fournirais un exemple (à moins qu'un autre brave ait le temps d'ici là).


'*******************************
c'est gentil à toi ; tu te doutes bien qu'après avoir beaucoup utilisé
l'enregistreur de macros, je n'ai pas mis, dans le perso.xls et autres VBA
projects de classeurs divers, des procs comme le beurre de ma femme
(comprends "allégées) ; les seuls passages concentrés sont ceux pour
lesquels j'ai honteusement profité de l'aide du sus-nommé MVP (qui ne
l'était d'ailleurs pas encore à l'époque et tu auras déjà compris que je
n'ai pas été étranger à sa nomination grâce à mes nombreuses relations du
côté de Redmond)...
petit extrait de ce qui, avec beaucoup de temps (trop, je crois) pourrait
subir un régime weightwatcher car je doute que pour cela tu puisses sortir
de ton chapeau une autre Function miracle...

Application.ScreenUpdating = False
Windows("FACTUREEUROS.XLS").Activate
Range("D6").Select
Selection.PasteSpecial Paste:=xlAll, Operation:=xlNone,
SkipBlanks:úlse _
, Transpose:=True
Range("F57").Select
Selection.Copy
Windows("FICHCLTS.XLS").Activate
ActiveCell.Offset(0, 7).Range("A1").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlAdd, SkipBlanks:= _
False, Transpose:úlse
ActiveCell.Offset(0, 2).Range("A1").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=INT(SUM(RC[-2]:RC[-1]))"
ActiveCell.Select
Selection.Copy



À quoi servent les .Range("A1") ici?
ActiveCell étant toujours une et une seule cellule, ton Offset va la décaler et
je ne vois pas l'utilité d'utiliser .Range("A1") avant de SELECTionner. De même,
on pourrait utiliser l'abbréviation de .Cells (qui est les parenthèses
directement) pour être plus concis.
Donc:
au lieu de
ActiveCell.Offset(0, 7).Range("A1").Select
mettre
ActiveCell(1,8).Select

D'ailleurs je crois que tu pourrais éviter de Selectionner (sauf pour le dernier
Select si tu désires terminer sur une plage précise). Tu pourrais faire les
manipulations directement. Le code suivant n'est pas testé mais je crois qu'il
donne l'idée.

Sub Test2()
'Application.ScreenUpdating = False
With Workbooks("FACTUREEUROS.XLS")
.Range("D6").PasteSpecial Paste:=xlAll, Operation:=xlNone, _
SkipBlanks:úlse, Transpose:=True
.Range("F57").Copy
End With

With Workbooks("FICHCLTS.XLS")
.Activate
.ActiveCell(1, 8).PasteSpecial Paste:=xlValues, Operation:=xlAdd, _
SkipBlanks:úlse, Transpose:úlse
.ActiveCell(1, 10).Select
.ActiveCell.FormulaR1C1 = "=INT(SUM(RC[-2]:RC[-1]))"
.ActiveCell.Copy
End With
End Sub



'*******************************
en tous cas, merci encore, daniel, pour toute la peine que tu t'es donnée...


Il n'y a pas de quoi.

Salutations,

Daniel M.


Avatar
Daniel.M
Moi j'ai rien dit... mais je n'en pense pas moins !

[AV]



:-)))

Daniel M.

Avatar
jps
bonjour, daniel
et merci encore une fois
je regarde cela tranquilos
cordialement
jps (dont tu noteras qu'il n'a pas quoté sa dilution de proc)

"Daniel.M" a écrit dans le message de
news:
'*******************************
Alternative 2:
============= > > >
Se passer de la copie vers les cellules et récupérer directement le
code



(par l'interface VBE Extensibility), le passer dans la fonction
CodeObfuscator,

puis le retourner en remplacement dans le module. C'est nettement la
solution


à
privilégier. Si tu as besoin d'aide ici, avise.


ach! was ist das, daniel? si c'est à privilégier et si ça ne doit pas
trop


te "prendre le chou", moi je veux bien bénéficier encore d'une petite
leçon,



Chez Frédéric, il y a quelques exemples où on récupère dans une string le
code

d'un module.
L'adaptation devrait bien aller. Je suis pris pour le moment mais d'ici ce
soir,

je te fournirais un exemple (à moins qu'un autre brave ait le temps d'ici
là).






Avatar
Daniel.M
G'Day JPS,

Chez Frédéric, il y a quelques exemples où on récupère dans une string le code
d'un module.
L'adaptation devrait bien aller. Je suis pris pour le moment mais d'ici ce
soir,

je te fournirais un exemple (à moins qu'un autre brave ait le temps d'ici là).


Voici 2 petits exemples de ce que je te racontais.
Le premier (EssaiTransformeMultiClasseurs) effectue le changement en prenant
tous les modules standard des classeurs ouverts (pas ceux des feuilles ou du
workbook) et en créant de nouveaux modules JPS+ancienNom.
Le deuxième (EssaiTransformeUNModule) effectue le changement en changeant pour
un module précis dans un classeur précis (assure-toi qu'ils existent).

Dans TransformeCode (c'est le coeur du traitement), on pourrait effectuer le
changement de code 'in situ' sans créer de nouveaux modules, mais avec tous les
dangers que cela suppose si la procédure va mal ==> risque de perte de code.
Avise si ça t'intéresse.

Je ne t'ai pas recopié les fonctions CodeObfuscator et Subst : elle n'ont pas
changé.

Salutations,

Daniel M.

P.S.: Tu sais pas le plaisir que j'ai pris à détruire autant de modules JPS_
;-))


' ****************** LE CODE *****************
Sub EssaiTransformeMultiClasseurs()

Dim Wk As Workbook
Dim i As Integer

For Each Wk In Workbooks
If Wk.Name <> ThisWorkbook.Name Then
For i = 1 To Wk.VBProject.VBComponents.Count
With Wk.VBProject.VBComponents(i)
'Debug.Print .Name, .Type
If .Type = vbext_ct_StdModule Then ' module standard
TransformeCode Wk, .Name, Wk, "JPS_" & .Name
End If
End With
Next i '(NomModuleSrc).CodeModule
End If
Next Wk
End Sub

Sub EssaiTransformeUNModule()

TransformeCode Workbooks("FACTUREEUROS.XLS"), "Daniel", _
Workbooks("FACTUREEUROS.XLS"), "JPS"
End Sub

' Moteur de remplacement qui emprunte au module
' "AjouterDuCodeDansUnModule" disponible sur le site
' de Frédéric Sigonneau --
'
http://perso.wanadoo.fr/frederic.sigonneau/code/VBE/AjouterDuCodeDansUnModule.txt
' et de quelques autres routines du site (section VBE)
' Daniel M. Août 2004
Sub TransformeCode(ClasseurSrc As Workbook, NomModuleSrc As String, _
ClasseurDest As Workbook, NomModuleDest As String)

Dim sSrc As String, sDest As String, rep As Variant

If ClasseurDest.Name = ThisWorkbook.Name Or _
ClasseurSrc.Name = ThisWorkbook.Name Then
' On ne touche pas à ce classeur-ci. Point final!
MsgBox "On n'entre pas le nom de ce classeur (" & _
ThisWorkbook.Name & ") comme source ou destination.", _
vbCritical + vbOKOnly, "Erreur"
Exit Sub
End If

With ClasseurSrc.VBProject.VBComponents(NomModuleSrc).CodeModule
Debug.Print .CountOfDeclarationLines, .CountOfLines
sSrc = .Lines(1 + .CountOfDeclarationLines, .CountOfLines -
.CountOfDeclarationLines)
End With

On Error Resume Next
'détruire le module à mettre à jour s'il existe
rep = MsgBox("Nous allons détruire le module " & NomModuleDest & _
" s'il est présent dans " & ClasseurDest.Name & "." & _
vbNewLine & _
"Voulez-vous détruire ce module pour le remplacer par le nouveau code
transformé?", _
vbYesNo + vbInformation, "Attention!!!")
If rep = vbNo Then
Exit Sub
End If
With ClasseurDest.VBProject.VBComponents
.Remove .Item(NomModuleDest)
End With
Err.Clear
sDest = CodeObfuscator(sSrc) ' LA TRANSFORMATION

ClasseurDest.VBProject.VBComponents.Add(1).Name = NomModuleDest ' ajout du
module standard
If Err.Number <> 0 Then ' si problème ==> avise et sort
MsgBox "Incapable d'ajouter un module au classeur " & _
ClasseurDest.Name & ".", vbExclamation + vbOKOnly, "Arrêt de la
procédure"
Exit Sub
End If
On Error GoTo 0
ClasseurDest.VBProject.VBComponents(NomModuleDest).CodeModule.AddFromString
sDest

End Sub

Avatar
sabatier
bonsoir, daniel
alors là, tu m'as fait la totale mais je sens que je vais faire des
c.....ies si je ne prends pas la peine de fabriquer quelques cobayes et
peut-être qu'alors, moi aussi, je prendrai du plaisir à scuder des modules
DM...
de toutes façons, si grâce à (ou plutôt à cause de) tout cela, je kill mon
usine à gaz, je viens de te mettre sous pli mon code bancaire, mes papiers
d'identité, la clé de mon bureau...ah! j'oubliais : tu veilleras aussi sur
ma femme...
jps

"Daniel.M" a écrit dans le message de
news:%23$
G'Day JPS,

Chez Frédéric, il y a quelques exemples où on récupère dans une string
le code


d'un module.
L'adaptation devrait bien aller. Je suis pris pour le moment mais d'ici
ce


soir,
je te fournirais un exemple (à moins qu'un autre brave ait le temps
d'ici là).



Voici 2 petits exemples de ce que je te racontais.
Le premier (EssaiTransformeMultiClasseurs) effectue le changement en
prenant

tous les modules standard des classeurs ouverts (pas ceux des feuilles ou
du

workbook) et en créant de nouveaux modules JPS+ancienNom.
Le deuxième (EssaiTransformeUNModule) effectue le changement en changeant
pour

un module précis dans un classeur précis (assure-toi qu'ils existent).

Dans TransformeCode (c'est le coeur du traitement), on pourrait effectuer
le

changement de code 'in situ' sans créer de nouveaux modules, mais avec
tous les

dangers que cela suppose si la procédure va mal ==> risque de perte de
code.

Avise si ça t'intéresse.

Je ne t'ai pas recopié les fonctions CodeObfuscator et Subst : elle n'ont
pas

changé.

Salutations,

Daniel M.

P.S.: Tu sais pas le plaisir que j'ai pris à détruire autant de modules
JPS_

;-))


' ****************** LE CODE *****************
Sub EssaiTransformeMultiClasseurs()

Dim Wk As Workbook
Dim i As Integer

For Each Wk In Workbooks
If Wk.Name <> ThisWorkbook.Name Then
For i = 1 To Wk.VBProject.VBComponents.Count
With Wk.VBProject.VBComponents(i)
'Debug.Print .Name, .Type
If .Type = vbext_ct_StdModule Then ' module standard
TransformeCode Wk, .Name, Wk, "JPS_" & .Name
End If
End With
Next i '(NomModuleSrc).CodeModule
End If
Next Wk
End Sub

Sub EssaiTransformeUNModule()

TransformeCode Workbooks("FACTUREEUROS.XLS"), "Daniel", _
Workbooks("FACTUREEUROS.XLS"), "JPS"
End Sub

' Moteur de remplacement qui emprunte au module
' "AjouterDuCodeDansUnModule" disponible sur le site
' de Frédéric Sigonneau --
'

http://perso.wanadoo.fr/frederic.sigonneau/code/VBE/AjouterDuCodeDansUnModule.txt

' et de quelques autres routines du site (section VBE)
' Daniel M. Août 2004
Sub TransformeCode(ClasseurSrc As Workbook, NomModuleSrc As String, _
ClasseurDest As Workbook, NomModuleDest As String)

Dim sSrc As String, sDest As String, rep As Variant

If ClasseurDest.Name = ThisWorkbook.Name Or _
ClasseurSrc.Name = ThisWorkbook.Name Then
' On ne touche pas à ce classeur-ci. Point final!
MsgBox "On n'entre pas le nom de ce classeur (" & _
ThisWorkbook.Name & ") comme source ou destination.", _
vbCritical + vbOKOnly, "Erreur"
Exit Sub
End If

With ClasseurSrc.VBProject.VBComponents(NomModuleSrc).CodeModule
Debug.Print .CountOfDeclarationLines, .CountOfLines
sSrc = .Lines(1 + .CountOfDeclarationLines, .CountOfLines -
.CountOfDeclarationLines)
End With

On Error Resume Next
'détruire le module à mettre à jour s'il existe
rep = MsgBox("Nous allons détruire le module " & NomModuleDest & _
" s'il est présent dans " & ClasseurDest.Name & "." & _
vbNewLine & _
"Voulez-vous détruire ce module pour le remplacer par le nouveau
code

transformé?", _
vbYesNo + vbInformation, "Attention!!!")
If rep = vbNo Then
Exit Sub
End If
With ClasseurDest.VBProject.VBComponents
.Remove .Item(NomModuleDest)
End With
Err.Clear
sDest = CodeObfuscator(sSrc) ' LA TRANSFORMATION

ClasseurDest.VBProject.VBComponents.Add(1).Name = NomModuleDest ' ajout du
module standard
If Err.Number <> 0 Then ' si problème ==> avise et sort
MsgBox "Incapable d'ajouter un module au classeur " & _
ClasseurDest.Name & ".", vbExclamation + vbOKOnly, "Arrêt de
la

procédure"
Exit Sub
End If
On Error GoTo 0

ClasseurDest.VBProject.VBComponents(NomModuleDest).CodeModule.AddFromString

sDest

End Sub





Avatar
Daniel.M
de toutes façons, si grâce à (ou plutôt à cause de) tout cela, je kill mon
usine à gaz, je viens de te mettre sous pli mon code bancaire, mes papiers
d'identité, la clé de mon bureau...ah! j'oubliais : tu veilleras aussi sur
ma femme...


:-))))))))

Daniel M.

1 2 3