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

Code qui plante avec 2003

9 réponses
Avatar
f4crw
Bonjour à tous,

Avant d'exporter un classeur sans ses modules j'utilise la macro suivante et
qui fonctionnait avec excel 2000, mais qui plante avec 2003 à
With ThisWorkbook.VBProject.VBComponents(MonModule).CodeModule
comment remplacer cette commande ou cette Macro pour 2003 et autre

Sub ToutDetruireSaufMoi()
Dim AGarder$, MonModule$, liDeb, LiFin, Tmp$
AGarder = "sauve" 'module à garder
MonModule = "MouvementsMenu" 'ou autre
'récupére le texte de cette macro
With ThisWorkbook.VBProject.VBComponents(MonModule).CodeModule
liDeb = .ProcStartLine(AGarder, 0)
LiFin = .ProcCountLines(AGarder, 0)
Tmp = .Lines(liDeb, LiFin)
End With
Dim VBComp, LesComps
Set LesComps = ThisWorkbook.VBProject.VBComponents
For Each VBComp In LesComps
Select Case VBComp.Type
Case 1, 2, 3
If VBComp.Name = MonModule Then
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
.AddFromString Tmp
End With
Else: LesComps.Remove VBComp
End If
Case 600
VBComp.CodeModule.DeleteLines 1, VBComp.CodeModule.CountOfLines
End Select
Next
End Sub

d'avance merci
F4CRW

9 réponses

Avatar
michdenis
Bonjour,

Est-ce que ton fichier contient la référence suivante :
"Microsoft Visual Basic for Applications Extensibilité 5.3"
dans la fenêtre de l'éditeur de code / barre des menus /
outils / références ?
Si non ? Coche-la.

Si elle est déjà cochée, décoche la, ferme la fenêtre et retourne
la cocher.





"f4crw" a écrit dans le message de groupe de discussion :

Bonjour à tous,

Avant d'exporter un classeur sans ses modules j'utilise la macro suivante et
qui fonctionnait avec excel 2000, mais qui plante avec 2003 à
With ThisWorkbook.VBProject.VBComponents(MonModule).CodeModule
comment remplacer cette commande ou cette Macro pour 2003 et autre

Sub ToutDetruireSaufMoi()
Dim AGarder$, MonModule$, liDeb, LiFin, Tmp$
AGarder = "sauve" 'module à garder
MonModule = "MouvementsMenu" 'ou autre
'récupére le texte de cette macro
With ThisWorkbook.VBProject.VBComponents(MonModule).CodeModule
liDeb = .ProcStartLine(AGarder, 0)
LiFin = .ProcCountLines(AGarder, 0)
Tmp = .Lines(liDeb, LiFin)
End With
Dim VBComp, LesComps
Set LesComps = ThisWorkbook.VBProject.VBComponents
For Each VBComp In LesComps
Select Case VBComp.Type
Case 1, 2, 3
If VBComp.Name = MonModule Then
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
.AddFromString Tmp
End With
Else: LesComps.Remove VBComp
End If
Case 600
VBComp.CodeModule.DeleteLines 1, VBComp.CodeModule.CountOfLines
End Select
Next
End Sub

d'avance merci
F4CRW
Avatar
f4crw
Bonsoir michdenis,
non elle n'était pas cochée, mais cela ne change pas après la manipe.
Le message est "erreur d'exécution 1004 la méthode VBProject'_Workbouk à
échoué"



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

Bonjour,

Est-ce que ton fichier contient la référence suivante :
"Microsoft Visual Basic for Applications Extensibilité 5.3"
dans la fenêtre de l'éditeur de code / barre des menus /
outils / références ?
Si non ? Coche-la.

Si elle est déjà cochée, décoche la, ferme la fenêtre et retourne
la cocher.





"f4crw" a écrit dans le message de groupe de discussion :

Bonjour à tous,

Avant d'exporter un classeur sans ses modules j'utilise la macro suivante
et
qui fonctionnait avec excel 2000, mais qui plante avec 2003 à
With ThisWorkbook.VBProject.VBComponents(MonModule).CodeModule
comment remplacer cette commande ou cette Macro pour 2003 et autre

Sub ToutDetruireSaufMoi()
Dim AGarder$, MonModule$, liDeb, LiFin, Tmp$
AGarder = "sauve" 'module à garder
MonModule = "MouvementsMenu" 'ou autre
'récupére le texte de cette macro
With ThisWorkbook.VBProject.VBComponents(MonModule).CodeModule
liDeb = .ProcStartLine(AGarder, 0)
LiFin = .ProcCountLines(AGarder, 0)
Tmp = .Lines(liDeb, LiFin)
End With
Dim VBComp, LesComps
Set LesComps = ThisWorkbook.VBProject.VBComponents
For Each VBComp In LesComps
Select Case VBComp.Type
Case 1, 2, 3
If VBComp.Name = MonModule Then
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
.AddFromString Tmp
End With
Else: LesComps.Remove VBComp
End If
Case 600
VBComp.CodeModule.DeleteLines 1, VBComp.CodeModule.CountOfLines
End Select
Next
End Sub

d'avance merci
F4CRW

Avatar
pirot
bonjour,
par rapport à la réponse de michdenis:
de plus, pour modifier ou supprimer du code, il faut que dans le
classeur excel:
outils/options/sécurité/sécutité des macros/editeur approuvé/fair e
confiance au projet visual basic
doit ête coché, sinon l'erreur 1004 apparait aussi

si c'est cela:
michdenis m'avait d'ailleurs fournit un scipt vbs qui coche cette
option fort bien !
(merci encore à lui !)
@+
pirot
Avatar
elect31
Salut pirot (ou michdenis)
Je serais intéressé par ce script VBs qui coche automatiquement "...
faire confiance..."
Pour l'instant, je me contente de vérifier si c'est coché (par VBA) et
je demande à l'utilisateur d'aller le faire lui même.
Je me dis que si on peut le cocher automatiquement à l'ouverture d'un
fichier précis, on peut peut être le décocher à sa fermeture?
Merci de votre collaboration
elect

pirot a écrit :
bonjour,
par rapport à la réponse de michdenis:
de plus, pour modifier ou supprimer du code, il faut que dans le
classeur excel:
outils/options/sécurité/sécutité des macros/editeur approuvé/faire
confiance au projet visual basic
doit ête coché, sinon l'erreur 1004 apparait aussi

si c'est cela:
michdenis m'avait d'ailleurs fournit un scipt vbs qui coche cette
option fort bien !
(merci encore à lui !)
@+
pirot
Avatar
pirot
bonjour,
c'est pirot, mais je me permets de remettre la réponse de michdenis:
donc, je cite michdenis :
--------------------------------------------------------------------------- -----------------------------------------------
Bonjour

Ce qui suit est un vbscript que tu peux copier dans
l'application NotePad et que tu sauvegardes en t'assurant
que l'extension du fichier est .VBS


Pour modifier le niveau de sécurité et cocher les 2 petites
cases dans la fenêtre de l'éditeur approuvé, il ne te reste
plus qu'à double-cliquer sur le fichier dans l'explorateur
Windows. Le niveau de sécurité est réglé sur le niveau 2.


'Excel Doit être fermé
'------------------------------------------
Dim wsh, objXl


'Pour s'assurer qu'excel n'est pas ouvert.


On Error Resume Next
Set objXl=GetObject(,"Excel.Application")
If Not IsEmpty(objXl) Then
Msgbox "Fermer excel pour exécuter ce scr1pt...",64,"La direction"
WScript.Quit
else
Set objxl=createobject("Excel.Application")
Ver = objxl.Version
set objxl = nothing
End If
Err.Clear


Set wsh = WScript.CreateObject("WScript.Shell")


'Niveau de sécurité 2 pour 2ième niveau
wsh.RegWrite "HKCUSoftwareMicrosoftOffice" & _
Ver & "ExcelSecurityLevel",2,"REG_DWORD"


if ver >= 10 and ver <= 12 then 'Faire confiance au projet VBA -> 1
pour que la case soit cochée
' -> 0 pour que la case soit décochée
wsh.RegWrite "HKCUSoftwareMicrosoftOffice" & _
Ver & "ExcelSecurityaccessVBOM",1,"REG_DWORD"


'Faire confiance au modèle -> 0 pour que la case soit cochée
' -> 1 pour que la case soit décochée
wsh.RegWrite "HKCUSoftwareMicrosoftOffice" & _
Ver & "ExcelSecurityDontTrustInstalledFiles",0,"REG_DWORD"
end if

--------------------------------------------------------------------------- ---------------------
voilà.
@+
pirot
Avatar
pirot
bonjour,
c'est encore moi .... en complément.
pour cocher/décocher dans un module vba, j'avais l'idée d'utiliser un
controle des erreurs(je peux modifier du code ou non)
et les sendkeys suivants:
-------------------------------------------------------
SendKeys "%o"
SendKeys "o"
SendKeys "s"
SendKeys "%s"
SendKeys "d"
SendKeys "%r"
SendKeys "{ENTER}"
Range("C9").Select
SendKeys "{ENTER}"
-------------------------------------------------------
un fois cette séquence coche, la fois suivante elle décoche,
MAIS......
seul souci, la fenêtre "option", je n'arrive pas à la fermer car elle
n'a pas le focus et je ne sais pas lui redonner le focus.
(c'est à cette question que michdenis m'avait fourni le script vbs, à
lancer une fois (et une seule fois, à moins que l'utilsiateur ne
décoche à la main) hors excel sur la machine concernée)
------------------------------------------------------
donc, à titre de "curiosité intellectuelle", si tu vois comment fermer
le fenêtre option ... je suis aussi preneur
@+
pirot



...
le souci est que
Avatar
michdenis
Si tu as ajouté la référence, ta macro fonctionne bien sauf ces
2 lignes de code :
liDeb = .ProcStartLine(AGarder, 0)
LiFin = .ProcCountLines(AGarder, 0)

La variable "AGarder" doit contenir le nom d'une procédure et non le
nom d'un module. Comme tu n'as pas énoncé ce que tu recherches
à faire, je ne peux pas t'en dire plus.





Sub ToutDetruireSaufMoi()
Dim AGarder$, MonModule$, liDeb, LiFin, Tmp$
AGarder = "sauve" 'module à garder
MonModule = "MouvementsMenu" 'ou autre
'récupére le texte de cette macro
With ThisWorkbook.VBProject.VBComponents(MonModule).CodeModule
liDeb = .ProcStartLine(AGarder, 0)
LiFin = .ProcCountLines(AGarder, 0)
Tmp = .Lines(liDeb, LiFin)
End With
Dim VBComp, LesComps
Set LesComps = ThisWorkbook.VBProject.VBComponents
For Each VBComp In LesComps
Select Case VBComp.Type
Case 1, 2, 3
If VBComp.Name = MonModule Then
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
.AddFromString Tmp
End With
Else: LesComps.Remove VBComp
End If
Case 600
VBComp.CodeModule.DeleteLines 1, VBComp.CodeModule.CountOfLines
End Select
Next
End Sub

d'avance merci
F4CRW

Avatar
elect31
Merci pirot
Je comprends qu'il faut qu'Xl soit fermé pour exécuter le script. Donc
pas moyen de lancer ça par macro. Donc autant demander à l'utilisateur
de le faire lui même, en lui donnant les indications pour le faire.
Dommage.
Merci quand même à michdenis et à pirot
elect


pirot a écrit :
bonjour,
c'est pirot, mais je me permets de remettre la réponse de michdenis:
donc, je cite michdenis :
--------------------------------------------------------------------------------------------------------------------------
Bonjour

Ce qui suit est un vbscript que tu peux copier dans
l'application NotePad et que tu sauvegardes en t'assurant
que l'extension du fichier est .VBS


Pour modifier le niveau de sécurité et cocher les 2 petites
cases dans la fenêtre de l'éditeur approuvé, il ne te reste
plus qu'à double-cliquer sur le fichier dans l'explorateur
Windows. Le niveau de sécurité est réglé sur le niveau 2.


'Excel Doit être fermé
'------------------------------------------
Dim wsh, objXl


'Pour s'assurer qu'excel n'est pas ouvert.


On Error Resume Next
Set objXl=GetObject(,"Excel.Application")
If Not IsEmpty(objXl) Then
Msgbox "Fermer excel pour exécuter ce scr1pt...",64,"La direction"
WScript.Quit
else
Set objxl=createobject("Excel.Application")
Ver = objxl.Version
set objxl = nothing
End If
Err.Clear


Set wsh = WScript.CreateObject("WScript.Shell")


'Niveau de sécurité 2 pour 2ième niveau
wsh.RegWrite "HKCUSoftwareMicrosoftOffice" & _
Ver & "ExcelSecurityLevel",2,"REG_DWORD"


if ver >= 10 and ver <= 12 then 'Faire confiance au projet VBA -> 1
pour que la case soit cochée
' -> 0 pour que la case soit décochée
wsh.RegWrite "HKCUSoftwareMicrosoftOffice" & _
Ver & "ExcelSecurityaccessVBOM",1,"REG_DWORD"


'Faire confiance au modèle -> 0 pour que la case soit cochée
' -> 1 pour que la case soit décochée
wsh.RegWrite "HKCUSoftwareMicrosoftOffice" & _
Ver & "ExcelSecurityDontTrustInstalledFiles",0,"REG_DWORD"
end if

------------------------------------------------------------------------------------------------
voilà.
@+
pirot
Avatar
f4crw
Bonsoir
Merci à vous tous ça marche

le fait de cocher "faire confiance au projet visual basic" n'est il pas un
risque à l'ouverture d'un fichier télécharger, ne risque t'il pas de de
lancer une macro sans l'avertissement ?

Effectivement la variable "AGarder" contiens le nom d'une procédure (sauve)
je veux exporter un classeur sans ses modules donc je supprimais les modules
avant de le sauvegarder en vue de l'envoyer pour des mises à jour.



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

Si tu as ajouté la référence, ta macro fonctionne bien sauf ces
2 lignes de code :
liDeb = .ProcStartLine(AGarder, 0)
LiFin = .ProcCountLines(AGarder, 0)

La variable "AGarder" doit contenir le nom d'une procédure et non le
nom d'un module. Comme tu n'as pas énoncé ce que tu recherches
à faire, je ne peux pas t'en dire plus.





Sub ToutDetruireSaufMoi()
Dim AGarder$, MonModule$, liDeb, LiFin, Tmp$
AGarder = "sauve" 'module à garder
MonModule = "MouvementsMenu" 'ou autre
'récupére le texte de cette macro
With ThisWorkbook.VBProject.VBComponents(MonModule).CodeModule
liDeb = .ProcStartLine(AGarder, 0)
LiFin = .ProcCountLines(AGarder, 0)
Tmp = .Lines(liDeb, LiFin)
End With
Dim VBComp, LesComps
Set LesComps = ThisWorkbook.VBProject.VBComponents
For Each VBComp In LesComps
Select Case VBComp.Type
Case 1, 2, 3
If VBComp.Name = MonModule Then
With VBComp.CodeModule
.DeleteLines 1, .CountOfLines
.AddFromString Tmp
End With
Else: LesComps.Remove VBComp
End If
Case 600
VBComp.CodeModule.DeleteLines 1, VBComp.CodeModule.CountOfLines
End Select
Next
End Sub

d'avance merci
F4CRW