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

3 réponses

1 2 3
Avatar
sabatier
bonjour daniel
nouveau feedback, si tu veux bien qui peut peut-être intéresser aussi FS...
après m'en être un peu vu pour mettre les procs d'aplomb (ci-dessous une de
celles-ci rectifiée par mes soins et quelques remarques NDLR), je peux
simplement dire que c'est assez impressionnant ; comme dit en remarque dans
la proc ci-dessous, le module à transformer n'est pas détruit...et c'est
tant mieux....(peut-être parce que je n'ai fait mes essais que sur la proc
qui modifie UN module?)
j'ai noté deux anomalies toutefois pour lesquelles tu auras sûrement une
explication :

1) Range("65536") devient Range("65536]

2) Range(Range("H8") devient Range(Range([H8]

voili voilou

et maintenant la proc rectifiée qui fera de moi le prochain MVP....

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)
'NDLR : ceci devait être en prime que j'ai refusée!
.CountOfDeclarationLines)
End With
On Error Resume Next
'détruire le module à mettre à jour s'il existe
'NDLR : en fait, on constate avec plaisir que le module à mettre à jour
n'est pas détruit
'ce qui rend les quelques rectifications à faire plus faciles
'dans la ligne ci-dessous il fallait remplacer NomModuleDest par
'NomModuleSrc
rep = MsgBox("Nous allons détruire le module " & NomModuleSrc & _
" 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

et encore un grand merci, daniel, pour ton souci d'aller jusqu'au bout des
choses...
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
Bonsoir Jean-Paul,

j'ai noté deux anomalies toutefois pour lesquelles tu auras sûrement une
explication :
1) Range("65536") devient Range("65536]
2) Range(Range("H8") devient Range(Range([H8]


Je ne peux pas l'expliquer :-(
Peux-tu donner les lignes au complet?

Car, dans la fenêtre Debug (Ctrl-G dans VBE), si j'entre
?CodeObfuscator("Range(""65536"")")
j'obtiens
[65536]

?CodeObfuscator("Range(Range(""H8""))")
j'obtiens
Range([H8])

Ce qui est cohérent avec les résultats attendus.

et maintenant la proc rectifiée qui fera de moi le prochain MVP....

With ClasseurSrc.VBProject.VBComponents(NomModuleSrc).CodeModule
Debug.Print .CountOfDeclarationLines, .CountOfLines
sSrc = .Lines(1 + .CountOfDeclarationLines, .CountOfLines)
'NDLR : ceci devait être en prime que j'ai refusée!
.CountOfDeclarationLines)
End With


OK. Je pense que le résultat sera le même : i.e. tu récupères les lignes après
celles de déclarations (Option Explicit et autres).
Tu peux enlever ou mettre en commentaire la ligne débutant par Debug.Print


On Error Resume Next
'détruire le module à mettre à jour s'il existe
'NDLR : en fait, on constate avec plaisir que le module à mettre à jour
n'est pas détruit
'ce qui rend les quelques rectifications à faire plus faciles
'dans la ligne ci-dessous il fallait remplacer NomModuleDest par
'NomModuleSrc


Je crois qu'il était correct de parler de NomModuleDest.
L'avis concerne strictement la destruction du Module de Destination (pour le
remplacer ensuite par le nouveau code).
D'ailleurs, si tu réponds Non : on arrête tout.
Je ne suis pas sûr que cette précaution est vraiment utile.
Quand on y pense, les noms de modules débutant par JPS_, comme leur maître,
méritent probablement d'être MAJ régulièrement. ;-))
Mais au-delà de la petite blague, il demeure que je ne suis pas convaincu de
l'utilité de ce traitement.

Je ne touche pas (dans cette procédure) au Module Source. Il ne sera jamais
détruit ici.
Mais la bonne question est : peut-être voudrais-tu avoir la possibilité de le
détruire après coup (et c'est probablement ce à quoi tu pensais)? Cela
nécessiterait un petit ajout de code en FIN de traitement. Avise si tel est ton
intérêt.


rep = MsgBox("Nous allons détruire le module " & NomModuleSrc & _
" 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) <============== Voilà celui que j'enlève
End With


Salutations,

Daniel M.

Avatar
sabatier
bonjour daniel
tout va bien ainsi et je te remercie encore
à + pour de nouvelles aventures en terres inconnues (de moi, bien sûr)
jps

"Daniel.M" a écrit dans le message de
news:%
Bonsoir Jean-Paul,

j'ai noté deux anomalies toutefois pour lesquelles tu auras sûrement une
explication :
1) Range("65536") devient Range("65536]
2) Range(Range("H8") devient Range(Range([H8]


Je ne peux pas l'expliquer :-(
Peux-tu donner les lignes au complet?

Car, dans la fenêtre Debug (Ctrl-G dans VBE), si j'entre
?CodeObfuscator("Range(""65536"")")
j'obtiens
[65536]

?CodeObfuscator("Range(Range(""H8""))")
j'obtiens
Range([H8])

Ce qui est cohérent avec les résultats attendus.

et maintenant la proc rectifiée qui fera de moi le prochain MVP....

With ClasseurSrc.VBProject.VBComponents(NomModuleSrc).CodeModule
Debug.Print .CountOfDeclarationLines, .CountOfLines
sSrc = .Lines(1 + .CountOfDeclarationLines, .CountOfLines)
'NDLR : ceci devait être en prime que j'ai refusée!
.CountOfDeclarationLines)
End With


OK. Je pense que le résultat sera le même : i.e. tu récupères les lignes
après

celles de déclarations (Option Explicit et autres).
Tu peux enlever ou mettre en commentaire la ligne débutant par Debug.Print


On Error Resume Next
'détruire le module à mettre à jour s'il existe
'NDLR : en fait, on constate avec plaisir que le module à mettre à jour
n'est pas détruit
'ce qui rend les quelques rectifications à faire plus faciles
'dans la ligne ci-dessous il fallait remplacer NomModuleDest par
'NomModuleSrc


Je crois qu'il était correct de parler de NomModuleDest.
L'avis concerne strictement la destruction du Module de Destination (pour
le

remplacer ensuite par le nouveau code).
D'ailleurs, si tu réponds Non : on arrête tout.
Je ne suis pas sûr que cette précaution est vraiment utile.
Quand on y pense, les noms de modules débutant par JPS_, comme leur
maître,

méritent probablement d'être MAJ régulièrement. ;-))
Mais au-delà de la petite blague, il demeure que je ne suis pas convaincu
de

l'utilité de ce traitement.

Je ne touche pas (dans cette procédure) au Module Source. Il ne sera
jamais

détruit ici.
Mais la bonne question est : peut-être voudrais-tu avoir la possibilité de
le

détruire après coup (et c'est probablement ce à quoi tu pensais)? Cela
nécessiterait un petit ajout de code en FIN de traitement. Avise si tel
est ton

intérêt.


rep = MsgBox("Nous allons détruire le module " & NomModuleSrc & _
" 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) <============== Voilà celui que
j'enlève


End With


Salutations,

Daniel M.





1 2 3