Je retrouve un classeur excel 95 contenant des macros en français que je voudrais récupérer. Peut-on les traduire automatiquement ?
Il y a une macro complémentaire de microsoft qui date de l'époque des dinosaures qui permet de traduire les modules vba français en anglais.
Il faut néanmoins mettre les mains dans le cambouis certains objets n'existent plus dans les versions ultérieures à 95 et les noms de variables en français peuvent être des mots réservés en anglais.
J'ignore si cette macro fonctionne sous 2007.
Cet outil est une macro-complémentaire Microsoft Excel. Pour l'utiliser :
1. Copier les 4 fichiers de l'archive zip dans un même dossier sur votre disque dur :
US_FR.XLA Macro-complémentaire
US_en_FR.XLT Modèle de module français
FR_en_US.XLT Modèle de module anglais
US_FR.HLP Fichier d'aide
2. Lancer Microsoft Excel
3. Ouvrer le fichier US_FR.XLA
Une barre d'outils se crée vous permettant ensuite de traduire vos modules affichés.
Pour toute information supplémentaire, veuillez consulter le fichier d'aide US_FR.HLP.
Cette astuce est illustrée dans ce classeur exemple :
traductionvba95 (téléchargé 179 fois)
Il faut néanmoins mettre les mains dans le cambouis certains objets n'existent plus dans les versions ultérieures à 95 et les noms de variables en français peuvent être des mots réservés en anglais.
J'ignore si cette macro fonctionne sous 2007.
Cet outil est une macro-complémentaire Microsoft Excel. Pour l'utiliser :
1. Copier les 4 fichiers de l'archive zip dans un même dossier sur votre disque dur :
US_FR.XLA Macro-complémentaire
US_en_FR.XLT Modèle de module français
FR_en_US.XLT Modèle de module anglais
US_FR.HLP Fichier d'aide
2. Lancer Microsoft Excel
3. Ouvrer le fichier US_FR.XLA
Une barre d'outils se crée vous permettant ensuite de traduire vos modules affichés.
Pour toute information supplémentaire, veuillez consulter le fichier d'aide US_FR.HLP.
traductionvba95 (téléchargé 179 fois)
jjh,
Ajouté ou modifié le 05/04/2008 (N°1993)
Ajouté ou modifié le 05/04/2008 (N°1993)
Quand on parcourt une plage de cellules avec For Each Next, la progression se fait ligne par ligne. Comment parcourir la plage colonne par colonne ?
Imbrication de 2 boucles...
d'abord une boucle sur les colonnes
suivie d'une boucle sur chacune des cellules de la colonne
Sub test()
Dim Col As Range, C As Range
For Each Col In Range("A1:Z2000").Columns
For Each C In Col.Cells
tot =tot+ C.Value
Next
Next
End Sub
Avec cette méthode, C reste un objet range que l'on peut manipuler (format...).
Si ceci n'est pas nécessaire et que la rapidité est un critère important, il y a une méthode plus rapide, qui fait appel à application.transpose.
Sub test1()
t = Timer
For Each C In Application.Transpose(Application.Transpose([A1:Z2000]))
tot = tot + C
Next
MsgBox Timer - t
End Sub
Application.Transpose transpose un champ en 'tableau mémoire' et ne permet que l'accès à la valeur en lecture.
Il faut 2 application.Transpose parce qu'une boucle For Each sur un 'tableau mémoire' parcours dans le sens colonne/Ligne.
cette méthode est 5 fois plus rapide que celle-ci qui n'utilise qu'un seul application.transpose
Sub test2()
t = Timer
For Each C In [A1:Z2000]
tot = tot + C
Next
MsgBox Timer - t
End Sub
d'abord une boucle sur les colonnes
suivie d'une boucle sur chacune des cellules de la colonne
Sub test()
Dim Col As Range, C As Range
For Each Col In Range("A1:Z2000").Columns
For Each C In Col.Cells
tot =tot+ C.Value
Next
Next
End Sub
Avec cette méthode, C reste un objet range que l'on peut manipuler (format...).
Si ceci n'est pas nécessaire et que la rapidité est un critère important, il y a une méthode plus rapide, qui fait appel à application.transpose.
Sub test1()
t = Timer
For Each C In Application.Transpose(Application.Transpose([A1:Z2000]))
tot = tot + C
Next
MsgBox Timer - t
End Sub
Application.Transpose transpose un champ en 'tableau mémoire' et ne permet que l'accès à la valeur en lecture.
Il faut 2 application.Transpose parce qu'une boucle For Each sur un 'tableau mémoire' parcours dans le sens colonne/Ligne.
cette méthode est 5 fois plus rapide que celle-ci qui n'utilise qu'un seul application.transpose
Sub test2()
t = Timer
For Each C In [A1:Z2000]
tot = tot + C
Next
MsgBox Timer - t
End Sub
Jacques Boisgontier, Denis Michon,
Ajouté ou modifié le 05/04/2008 (N°1989)
Ajouté ou modifié le 05/04/2008 (N°1989)
Je cherche à utiliser un fichier Excel via automation.
Je dois pour cela cocher la référence Microsoft Excel 9.0 Object Library et je voudrais obtenir le fichier .OCX auquel cette bibliothèque fait référence (par exemple, pour Excel 2003, c'est le fichier
COMDLG32.OCX).
Cette adresse te donne l'information nécessaire pour télécharger
le fichier. Lorsque cela est fait, tu le copies dans le répertoire
C:¾\Windows\System ou System32 selon le système d'exploitation
que tu possèdes.
Tu dois par la suite l'inscrire dans la base de registre. Pour ce faire,
tu utilises la commande : Bouton démarrer de la barre des tâches / Exécuter
et tu écris la commande suivante en prenant soin d'utiliser le chemin où
tu as copié le fichier : Exemple de la ligne de code à écrire :
regsvr32 C:WindowsSystem32COMDLG32.OCX
Voici l'adresse : Le site est écrit en anglais.
http://www.ascentive.com/support/new/support_dll.phtml?dllname=COMDLG32.OCX
Un exemple de code pour être sûr que la référence est chargé :
ça irait comme suit :
'-------------------------------------
Sub test()
Dim Xl As Object, Wk As Object
Dim Ref As String
'Tu dois adapter le chemin selon ton système
Ref = "C:WindowsSystem32COMDLG32.OCX"
Set Xl = CreateObject("Excel.Application")
Xl.Visible = True ' ou rien pour ne rien voir
Set Wk = Xl.Workbooks.Open("c:Classeur1.xls")
On Error Resume Next
With Wk
.VBProject.References.AddFromFile Ref
End With
' Le reste de ton code
'Fermeture du fichier avec enregistrement
Wk.Close True
'Fermeture de l'instance d'excel
Xl.Quit
'Libération de la mémoire des objets.
Set Wk = Nothing:Set Xl= Nothing
End Sub
'-------------------------------------
D'autres infos également ici :
http://www.ascentive.com/support/new/support_dll.phtml?dllname=COMDLG32.OCX
**********************************
Si tu as des problèmes il est conseillé de consulter cet article de la base de connaissances de microsoft :
http://support.microsoft.com/kb/281848
le fichier. Lorsque cela est fait, tu le copies dans le répertoire
C:¾\Windows\System ou System32 selon le système d'exploitation
que tu possèdes.
Tu dois par la suite l'inscrire dans la base de registre. Pour ce faire,
tu utilises la commande : Bouton démarrer de la barre des tâches / Exécuter
et tu écris la commande suivante en prenant soin d'utiliser le chemin où
tu as copié le fichier : Exemple de la ligne de code à écrire :
regsvr32 C:WindowsSystem32COMDLG32.OCX
Voici l'adresse : Le site est écrit en anglais.
http://www.ascentive.com/support/new/support_dll.phtml?dllname=COMDLG32.OCX
Un exemple de code pour être sûr que la référence est chargé :
ça irait comme suit :
'-------------------------------------
Sub test()
Dim Xl As Object, Wk As Object
Dim Ref As String
'Tu dois adapter le chemin selon ton système
Ref = "C:WindowsSystem32COMDLG32.OCX"
Set Xl = CreateObject("Excel.Application")
Xl.Visible = True ' ou rien pour ne rien voir
Set Wk = Xl.Workbooks.Open("c:Classeur1.xls")
On Error Resume Next
With Wk
.VBProject.References.AddFromFile Ref
End With
' Le reste de ton code
'Fermeture du fichier avec enregistrement
Wk.Close True
'Fermeture de l'instance d'excel
Xl.Quit
'Libération de la mémoire des objets.
Set Wk = Nothing:Set Xl= Nothing
End Sub
'-------------------------------------
D'autres infos également ici :
http://www.ascentive.com/support/new/support_dll.phtml?dllname=COMDLG32.OCX
**********************************
Si tu as des problèmes il est conseillé de consulter cet article de la base de connaissances de microsoft :
http://support.microsoft.com/kb/281848
Denis Michon,
Ajouté ou modifié le 01/12/2007 (N°1939)
Ajouté ou modifié le 01/12/2007 (N°1939)
Comment décocher une référence à une librairie par macro ?
Sub suppreF()
Dim oRef As Object
Set oRef = ThisWorkbook.VBProject.References("Word")
ThisWorkbook.VBProject.References.Remove oRef
End Sub
Dim oRef As Object
Set oRef = ThisWorkbook.VBProject.References("Word")
ThisWorkbook.VBProject.References.Remove oRef
End Sub
LSteph,
Ajouté ou modifié le 01/12/2007 (N°1937)
Ajouté ou modifié le 01/12/2007 (N°1937)
Comment vérifier au lancement d'une macro si la référence à une librairie est bien cochée et le faire si ce n'est pas le cas ?
Une méthode rapide :
Sub ajoutREf()
On Error Resume Next
With ThisWorkbook.VBProject.References
Application.DisplayAlerts = False
.AddFromFile "C:Program FilesMicrosoft OfficeOfficeMSWORD8.OLB"
End With
Application.DisplayAlerts = True
On Error GoTo 0
'..la suite
End Sub
***************************************
Explications détaillées :
Explication à partir d'une référence exemple : "MsForms" qui s'ajoute dans une application dès que tu ajoutes un formulaire...(userform)
A ) C'est toujours une bonne idée de s'assurer que l'application développée ne contient pas des références qui sont inutiles.
B ) La problématique qui se pose avec les références est qu'elles ne sont pas nécessairement situées au même endroit dans l'arborescence des fichiers de Windows. Selon le système d'exploitation utilisé, la référence dont il est question peut se retrouver à différent endroit :
Fm20.dll => fichier responsable de la référence
windows 98 et Millénium : C:WindowsSystemFm20.dll
Windows2000 C:WinntSystem32Fm20.dll
Windows Xp C:WindowsSystem32Frm20.dll
Conclusion évidente : Au chargement de l'application, Excel peut éprouver de la difficulté à localiser la référence ... et envoie un message d'erreur
C ) Solution 1
Dans le ThisWorkbook, tu utilises la procédure événementielle suivante afin de t'assurer que le chemin de la référence est bonne :
'---------------------------------
Private Sub Workbook_Open()
TesterBibliothequeFormulaire
End Sub
'---------------------------------
Dans un module Standard de ton application. copie ce qui suit :
'Haut de ton module, Déclaration de l'API
Private Declare Function GetSystemDirectory Lib "kernel32" _
Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, _
ByVal nSize As Long) As Long
'--------------------------------
Function CheminSystem()
Dim RetVal As Long
Dim SysDir As String
SysDir = Space$(256)
RetVal = GetSystemDirectory(SysDir, Len(SysDir))
If RetVal <> 0 Then
CheminSystem = Left$(SysDir, RetVal)
End If
End Function
'--------------------------------
Sub TesterBibliothequeFormulaire()
Dim File As String
File = CheminSystem & "FM20.DLL"
On Error Resume Next
ThisWorkbook.VBProject.References.AddFromFile File
End Sub
'--------------------------------
Solution II
Cette solution ne requiert pas d'API, mais tu dois connaître le GUID.
Guid : Global Unique Identifier => il est extrait directement à partir de la base de registre de Windows. Un numéro qui a cette forme :
{0D452EE1-E08F-101A-852E-02608C4D0BB4}
Lorsque tu utilises le GUID pour insérer des nouvelles références, comme dans l'exemple que j'ai donné, cette procédure se fout complètement des chemins où sont logés les fichiers, donc elle s'applique à tous les systèmes d'exploitations Windows.(Jamais testé ça sur des versions windows 3.1 et plus ancien !)
De plus, même si la "Description de la bibliothèque (l'appellation dans la fenêtre référence) a changé, si son nom de bibliothèque est demeuré le même (voir explorateur d'objet dans la fenêtre VBE) , même si cette bibliothèque a subi des mises à jour, la procédure s'applique très bien sans aucune difficulté.
IL y a seulement une petite exception, c'est lorsque Microsoft décide de modifier le nom de la bibliothèque... Et ça arrive à l'occasion ....En conséquence, peu importe la façon utilisée, il faut faire les recherches nécessaires et s'assurer que les références utilisées seront chargées adéquatement à l'ouverture de l'application.
Exemple : la bibliothèque "Visual Basic Extensibility 5.3"
qui a changé d'Excel 97 à Excel 2000
Sub TesterBibliothequeFormulaire2()
On Error Resume Next
ThisWorkbook.VBProject.References.AddFromGuid _
GUID:="{0D452EE1-E08F-101A-852E-02608C4D0BB4}", major:=2, minor:=0
End Sub
'--------------------------------
Comment trouver les paramètres : Guid, major et minor :
Attention : Le nom de la bibliothèque, tu peux le trouver à l'aide de l'explorateur d'objets de la fenêtre "Éditeur de code" de visual basic (raccourci clavier F2) . Son nom est celui que tu peux sélectionner dans la liste déroulante "Toutes les bibliothèques". Dès que tu sélectionnes une des bibliothèques, observe dans le bas de la fenêtre, la location et le nom du fichier qui en est responable. Ne pas mélanger "Nom de la biblothèque" avec l'appellation descriptive qui se trouve dans la fenêtre : outils / références /
'--------------------------
Sub IdentifierParametreDuneReference()
Cells(1, 1) = ActiveWorkbook.VBProject.References("MsForms").Name
Cells(1, 2) = ActiveWorkbook.VBProject.References("MsForms").Description
Cells(1, 3) = ActiveWorkbook.VBProject.References("MsForms").GUID
Cells(1, 4) = ActiveWorkbook.VBProject.References("MsForms").Major
Cells(1, 5) = ActiveWorkbook.VBProject.References("MsForms").Minor
Cells(1, 6) = ActiveWorkbook.VBProject.References.Item("MsForms").fullpath
End Sub
'--------------------------
Et si tu désires enlever cette référence au formulaire,
A ) Supprimer tous les formulaires
B ) utiliser cette petite procédure :
'--------------------------------
Sub SupprimerUneReference()
'MsForms est le nom de la référence chargé par
'Microsoft Forms 2.0 object librairy"
Dim Ref As Object
With ThisWorkbook.VBProject
Set Ref = .References("MsForms")
.References.Remove Ref
End With
End Sub
'--------------------------------
Sub ajoutREf()
On Error Resume Next
With ThisWorkbook.VBProject.References
Application.DisplayAlerts = False
.AddFromFile "C:Program FilesMicrosoft OfficeOfficeMSWORD8.OLB"
End With
Application.DisplayAlerts = True
On Error GoTo 0
'..la suite
End Sub
***************************************
Explications détaillées :
Explication à partir d'une référence exemple : "MsForms" qui s'ajoute dans une application dès que tu ajoutes un formulaire...(userform)
A ) C'est toujours une bonne idée de s'assurer que l'application développée ne contient pas des références qui sont inutiles.
B ) La problématique qui se pose avec les références est qu'elles ne sont pas nécessairement situées au même endroit dans l'arborescence des fichiers de Windows. Selon le système d'exploitation utilisé, la référence dont il est question peut se retrouver à différent endroit :
Fm20.dll => fichier responsable de la référence
windows 98 et Millénium : C:WindowsSystemFm20.dll
Windows2000 C:WinntSystem32Fm20.dll
Windows Xp C:WindowsSystem32Frm20.dll
Conclusion évidente : Au chargement de l'application, Excel peut éprouver de la difficulté à localiser la référence ... et envoie un message d'erreur
C ) Solution 1
Dans le ThisWorkbook, tu utilises la procédure événementielle suivante afin de t'assurer que le chemin de la référence est bonne :
'---------------------------------
Private Sub Workbook_Open()
TesterBibliothequeFormulaire
End Sub
'---------------------------------
Dans un module Standard de ton application. copie ce qui suit :
'Haut de ton module, Déclaration de l'API
Private Declare Function GetSystemDirectory Lib "kernel32" _
Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, _
ByVal nSize As Long) As Long
'--------------------------------
Function CheminSystem()
Dim RetVal As Long
Dim SysDir As String
SysDir = Space$(256)
RetVal = GetSystemDirectory(SysDir, Len(SysDir))
If RetVal <> 0 Then
CheminSystem = Left$(SysDir, RetVal)
End If
End Function
'--------------------------------
Sub TesterBibliothequeFormulaire()
Dim File As String
File = CheminSystem & "FM20.DLL"
On Error Resume Next
ThisWorkbook.VBProject.References.AddFromFile File
End Sub
'--------------------------------
Solution II
Cette solution ne requiert pas d'API, mais tu dois connaître le GUID.
Guid : Global Unique Identifier => il est extrait directement à partir de la base de registre de Windows. Un numéro qui a cette forme :
{0D452EE1-E08F-101A-852E-02608C4D0BB4}
Lorsque tu utilises le GUID pour insérer des nouvelles références, comme dans l'exemple que j'ai donné, cette procédure se fout complètement des chemins où sont logés les fichiers, donc elle s'applique à tous les systèmes d'exploitations Windows.(Jamais testé ça sur des versions windows 3.1 et plus ancien !)
De plus, même si la "Description de la bibliothèque (l'appellation dans la fenêtre référence) a changé, si son nom de bibliothèque est demeuré le même (voir explorateur d'objet dans la fenêtre VBE) , même si cette bibliothèque a subi des mises à jour, la procédure s'applique très bien sans aucune difficulté.
IL y a seulement une petite exception, c'est lorsque Microsoft décide de modifier le nom de la bibliothèque... Et ça arrive à l'occasion ....En conséquence, peu importe la façon utilisée, il faut faire les recherches nécessaires et s'assurer que les références utilisées seront chargées adéquatement à l'ouverture de l'application.
Exemple : la bibliothèque "Visual Basic Extensibility 5.3"
qui a changé d'Excel 97 à Excel 2000
Sub TesterBibliothequeFormulaire2()
On Error Resume Next
ThisWorkbook.VBProject.References.AddFromGuid _
GUID:="{0D452EE1-E08F-101A-852E-02608C4D0BB4}", major:=2, minor:=0
End Sub
'--------------------------------
Comment trouver les paramètres : Guid, major et minor :
Attention : Le nom de la bibliothèque, tu peux le trouver à l'aide de l'explorateur d'objets de la fenêtre "Éditeur de code" de visual basic (raccourci clavier F2) . Son nom est celui que tu peux sélectionner dans la liste déroulante "Toutes les bibliothèques". Dès que tu sélectionnes une des bibliothèques, observe dans le bas de la fenêtre, la location et le nom du fichier qui en est responable. Ne pas mélanger "Nom de la biblothèque" avec l'appellation descriptive qui se trouve dans la fenêtre : outils / références /
'--------------------------
Sub IdentifierParametreDuneReference()
Cells(1, 1) = ActiveWorkbook.VBProject.References("MsForms").Name
Cells(1, 2) = ActiveWorkbook.VBProject.References("MsForms").Description
Cells(1, 3) = ActiveWorkbook.VBProject.References("MsForms").GUID
Cells(1, 4) = ActiveWorkbook.VBProject.References("MsForms").Major
Cells(1, 5) = ActiveWorkbook.VBProject.References("MsForms").Minor
Cells(1, 6) = ActiveWorkbook.VBProject.References.Item("MsForms").fullpath
End Sub
'--------------------------
Et si tu désires enlever cette référence au formulaire,
A ) Supprimer tous les formulaires
B ) utiliser cette petite procédure :
'--------------------------------
Sub SupprimerUneReference()
'MsForms est le nom de la référence chargé par
'Microsoft Forms 2.0 object librairy"
Dim Ref As Object
With ThisWorkbook.VBProject
Set Ref = .References("MsForms")
.References.Remove Ref
End With
End Sub
'--------------------------------
LSteph, Denis Michon,
Ajouté ou modifié le 01/12/2007 (N°1936)
Ajouté ou modifié le 01/12/2007 (N°1936)
Depuis un classeur maitre, je crée par macro un nouveau classeur. Comment y insérer le contenu du module nommé "exporter" présent dans le classeur maitre ?
Pour transférer un module du classeur maitre vers le classeurnouvellement créé (donc actif) :
Nb - Il faut que le module contenant les macros à mettre dans le nouveau classeur soit nommé
"exporter" et que ce soit un module standard, pas un module de feuille.
Sub RecopieModule()
Dim NewM As Object, NewCode As String
' Stockage du code du module "exporter" du classeur maitre
With ThisWorkbook.VBProject.VBComponents("exporter").CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM = ActiveWorkbook.VBProject.VBComponents.Add(1)
With ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule
' Le DeleteLines sert à éviter éviter d'avoir 2 fois Option Explicit
' si la déclaration explicite est cochée dans les préférences
'sans effet si l'option n'est pas cochée
.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End Sub
Si l'on veut transférer les macros dans le ThisWorkbook du classeur créé,
la deuxième partie du code devient :
' Ajout d'un module au CLASSEUR ACTIF
With ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule
...
Il faut dans ce cas préciser le type d'événement déclenchant la macro dans le module" exporter" :
en écrivant par exemple
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)...
**************************************
Pour transférer tous les modules standards d'un classeur vers le classeur actif :
Sub TransfertModules()
Dim M As Object, NewM As Object, NewCode As String
For Each M In ThisWorkbook.VBProject.VBComponents
' Test type module (1 pour les modules standards, 100 pr les modules
' de feuille et le module ThisWorkbook, 3 pr les modules de UserForm)
If M.Type = 1 Then
' Stockage du code du module (lu dans CE CLASSEUR)
With M.CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM = ActiveWorkbook.VBProject.VBComponents.Add(1)
' MAJ du code du module créé
With ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule
' Le DeleteLines sert à éviter éviter d'avoir 2 fois Option Explicit
' si la déclaration explicite est cochée dans les préférences
.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End If
Next M
End Sub
Nb - Il faut que le module contenant les macros à mettre dans le nouveau classeur soit nommé
"exporter" et que ce soit un module standard, pas un module de feuille.
Sub RecopieModule()
Dim NewM As Object, NewCode As String
' Stockage du code du module "exporter" du classeur maitre
With ThisWorkbook.VBProject.VBComponents("exporter").CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM = ActiveWorkbook.VBProject.VBComponents.Add(1)
With ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule
' Le DeleteLines sert à éviter éviter d'avoir 2 fois Option Explicit
' si la déclaration explicite est cochée dans les préférences
'sans effet si l'option n'est pas cochée
.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End Sub
Si l'on veut transférer les macros dans le ThisWorkbook du classeur créé,
la deuxième partie du code devient :
' Ajout d'un module au CLASSEUR ACTIF
With ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule
...
Il faut dans ce cas préciser le type d'événement déclenchant la macro dans le module" exporter" :
en écrivant par exemple
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)...
**************************************
Pour transférer tous les modules standards d'un classeur vers le classeur actif :
Sub TransfertModules()
Dim M As Object, NewM As Object, NewCode As String
For Each M In ThisWorkbook.VBProject.VBComponents
' Test type module (1 pour les modules standards, 100 pr les modules
' de feuille et le module ThisWorkbook, 3 pr les modules de UserForm)
If M.Type = 1 Then
' Stockage du code du module (lu dans CE CLASSEUR)
With M.CodeModule
NewCode = .Lines(1, .CountOfLines)
End With
' Ajout d'un module au CLASSEUR ACTIF
Set NewM = ActiveWorkbook.VBProject.VBComponents.Add(1)
' MAJ du code du module créé
With ActiveWorkbook.VBProject.VBComponents(NewM.Name).CodeModule
' Le DeleteLines sert à éviter éviter d'avoir 2 fois Option Explicit
' si la déclaration explicite est cochée dans les préférences
.DeleteLines 1, .CountOfLines
.AddFromString NewCode
End With
End If
Next M
End Sub
Michel Gaboly, Flo cabon,
Ajouté ou modifié le 26/02/2005 (N°1579)
Ajouté ou modifié le 26/02/2005 (N°1579)
J'ai créé une macro. Comment l'appeler en cliquant sur un bouton dans une barre d'outils ?
Menu Affichage, Barre d'outils, Personnaliser.
Fenêtre Personnaliser, onglet Commandes, Catégories Macros.
Glisser "Bouton personnalisé" sur ta barre d'outils personnalisée.
Bouton droit sur "Bouton personnalisé" et choisir la commande "Affecter
une macro".
Fenêtre Affecter une macro, sélectionner la macro et OK.
À partir d'ici tu as le choix de texte seulement, image et texte ou
image seulement :
Texte seulement :
Bouton droit sur "Bouton personnalisé" et "Texte seul pour ce bouton".
Bouton droit sur "Bouton personnalisé" et taper le nom.
Image et texte :
Bouton droit sur "Bouton personnalisé" et "Image et texte".
Bouton droit sur "Bouton personnalisé" et taper le nom.
Image seulement :
Bouton droit sur "Bouton personnalisé" et "Par défaut".
Bouton droit sur "Bouton personnalisé" et "Modifier l'image du bouton"
pour choisir une image ou "Éditeur de bouton" pour créer une image.
Tu trouveras aussi sur la page barres d'autres astuces sur ce thème.
Fenêtre Personnaliser, onglet Commandes, Catégories Macros.
Glisser "Bouton personnalisé" sur ta barre d'outils personnalisée.
Bouton droit sur "Bouton personnalisé" et choisir la commande "Affecter
une macro".
Fenêtre Affecter une macro, sélectionner la macro et OK.
À partir d'ici tu as le choix de texte seulement, image et texte ou
image seulement :
Texte seulement :
Bouton droit sur "Bouton personnalisé" et "Texte seul pour ce bouton".
Bouton droit sur "Bouton personnalisé" et taper le nom.
Image et texte :
Bouton droit sur "Bouton personnalisé" et "Image et texte".
Bouton droit sur "Bouton personnalisé" et taper le nom.
Image seulement :
Bouton droit sur "Bouton personnalisé" et "Par défaut".
Bouton droit sur "Bouton personnalisé" et "Modifier l'image du bouton"
pour choisir une image ou "Éditeur de bouton" pour créer une image.
Tu trouveras aussi sur la page barres d'autres astuces sur ce thème.
Céline Brien,
Ajouté ou modifié le 16/02/2005 (N°1568)
Ajouté ou modifié le 16/02/2005 (N°1568)
Les macros excel4 fonctionnent-elles avec les versions plus récentes ?
Les macros excel4 fonctionnent encore très bien sur les versions plus récentes d'excel.
Pour certaines choses elles sont même plus rapides que VBA (impression personnalisée par exemple).
Cependant, elles sont écrites avec un langage différent de VBA. Le fichier d'aide de ce langage n'est plus
fourni par microsoft. Mais tu peux le télécharger sur excelabo. Ceci te permettra de modifier tes
macros si besoin, voire de comprendre ce qu'elles font pour les traduire en VBA.
Pour certaines choses elles sont même plus rapides que VBA (impression personnalisée par exemple).
Cependant, elles sont écrites avec un langage différent de VBA. Le fichier d'aide de ce langage n'est plus
fourni par microsoft. Mais tu peux le télécharger sur excelabo. Ceci te permettra de modifier tes
macros si besoin, voire de comprendre ce qu'elles font pour les traduire en VBA.
Pierre Roche et Flo Cabon,
Ajouté ou modifié le 05/02/2005 (N°1555)
Ajouté ou modifié le 05/02/2005 (N°1555)
Comment
- détecter quelles sont les librairies manquantes dans un projet VBA
- aller rechercher les bon fichiers manquants
- les charger dans le projet
La collection References permet de récupérer chacune des références
cochées. Avec ce programme microsoftien, on peut faire afficher, dans
la fenêtre Exécution, toutes les références cochées, pour un projet
VBA particulier:
Sub ReferenceProperties()
Dim ref As Reference
For Each ref In ThisWorkbook.VBProject.References
' Check IsBroken property.
'If ref.IsBroken = False Then
Debug.Print "Name: ", ref.Name
Debug.Print "FullPath: ", ref.FullPath
Debug.Print "Version: ", ref.Major & "." & ref.Minor
'Else
Debug.Print "GUIDs of broken references:"
Debug.Print ref.GUID
'End If
Next ref
End Sub
À l'origine c'était pour retrouver les références perdues ou
endommagées, mais je l'ai modifié pour tout récupérer.
J'ai donc pu par exemple récupérer les informations dont j'avais besoin pour la
bibliothèque "Extensibility", et ajouter la référence en question, en
la récupérant dans le registre, en utilisant la méthode AddFromGuid :
Sub nouvellereference()
Dim ref As Reference, GUID As String
Dim majeure As Integer, mineure As Integer
For Each ref In ThisWorkbook.VBProject.References
'VBIDE = Nom de la bibliothèque VisualBasic for Application Extensibility
If ref.Name = "VBIDE" Then
'retrouver le Global Unique IDentifier du fichier qui correspond à la
bibliothèque
GUID = ref.GUID
'Retrouver la partie principale du numéro de la version (5)
majeure = ref.Major
'Retrouver le numéro de la révision (3)
mineure = ref.Minor
Exit For
End If
Next
Workbooks.Add
ActiveWorkbook.VBProject.References.AddFromGuid GUID, majeure, mineure
End Sub
P.S. Dans l'aide d'Excel 2002, ils mettent les paramètres de la
méthode entre parenthèses. Faites comme si vous n'aviez pas vu les
parenthèses.
cochées. Avec ce programme microsoftien, on peut faire afficher, dans
la fenêtre Exécution, toutes les références cochées, pour un projet
VBA particulier:
Sub ReferenceProperties()
Dim ref As Reference
For Each ref In ThisWorkbook.VBProject.References
' Check IsBroken property.
'If ref.IsBroken = False Then
Debug.Print "Name: ", ref.Name
Debug.Print "FullPath: ", ref.FullPath
Debug.Print "Version: ", ref.Major & "." & ref.Minor
'Else
Debug.Print "GUIDs of broken references:"
Debug.Print ref.GUID
'End If
Next ref
End Sub
À l'origine c'était pour retrouver les références perdues ou
endommagées, mais je l'ai modifié pour tout récupérer.
J'ai donc pu par exemple récupérer les informations dont j'avais besoin pour la
bibliothèque "Extensibility", et ajouter la référence en question, en
la récupérant dans le registre, en utilisant la méthode AddFromGuid :
Sub nouvellereference()
Dim ref As Reference, GUID As String
Dim majeure As Integer, mineure As Integer
For Each ref In ThisWorkbook.VBProject.References
'VBIDE = Nom de la bibliothèque VisualBasic for Application Extensibility
If ref.Name = "VBIDE" Then
'retrouver le Global Unique IDentifier du fichier qui correspond à la
bibliothèque
GUID = ref.GUID
'Retrouver la partie principale du numéro de la version (5)
majeure = ref.Major
'Retrouver le numéro de la révision (3)
mineure = ref.Minor
Exit For
End If
Next
Workbooks.Add
ActiveWorkbook.VBProject.References.AddFromGuid GUID, majeure, mineure
End Sub
P.S. Dans l'aide d'Excel 2002, ils mettent les paramètres de la
méthode entre parenthèses. Faites comme si vous n'aviez pas vu les
parenthèses.
Frédéric Sigonneau, Clément Marcotte,
Ajouté ou modifié le 16/05/2004 (N°1403)
Ajouté ou modifié le 16/05/2004 (N°1403)
Existe-t-il un outil (ou une procédure) capable de convertir les macros Excel4 en VB?
Il y a bien ces textes chez Microsoft, mais pas de recette magique:
http://www.microsoft.com/France/officede
/infotech/info.asp?
mar=/France/officedev/infotech/MacroXLtoVBA.phpl
http://msdn.microsoft.com/library
default.asp?
url=/library/en-us/dnexcel9/html/xl4tovb.asp?frame=true
http://www.microsoft.com/France/officede
/infotech/info.asp?
mar=/France/officedev/infotech/MacroXLtoVBA.phpl
http://msdn.microsoft.com/library
default.asp?
url=/library/en-us/dnexcel9/html/xl4tovb.asp?frame=true
Clément Marcotte, (N°1096)
Comment faire une macro qui mettrait un X dans une cellule vide avec un double clic et qui enleverait ce X avec un nouveau double clic ?
A mettre dans le module de la feuille
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As
Boolean)
On Error Resume Next
If IsEmpty(ActiveCell.Value) Then
ActiveCell.Value = "X"
ElseIf ActiveCell.Value = "X" Then
ActiveCell.Value = ""
End If
Cancel = True
End Sub
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As
Boolean)
On Error Resume Next
If IsEmpty(ActiveCell.Value) Then
ActiveCell.Value = "X"
ElseIf ActiveCell.Value = "X" Then
ActiveCell.Value = ""
End If
Cancel = True
End Sub
Eric Jeanne, (N°1095)
Comment améliorer l'interface avec VBE ?
Cet utilitaire gratuit rajoute de nombreuses options dans l'éditeur VBE
http://www.mztools.com
http://www.mztools.com
Popi, (N°1094)
Quand dans VBA faut-il ou ne faut-il pas mettre des parenthèses ? Par exemple avec MsgBox parfois il faut en mettre parfois non.
L'affectation du résultat d'une fonction ou instruction dans VBA après le signe '='
nécessite l'emploi des parenthèses.
Ainsi, on écrira :
MsgBox "Coucou"
mais
e = MsgBox("Coucou")
nécessite l'emploi des parenthèses.
Ainsi, on écrira :
MsgBox "Coucou"
mais
e = MsgBox("Coucou")
Patrick Penet, (N°1090)
Où trouver une liste interrogeable des différents mots clefs de VBA ?
Dans ce classeur
sont listés les différents mots clefs qui sont présents dans l'aide de VBA.
Tu peux ainsi retrouver à partir de ces mots clefs la rubrique de l'aide associée.
Inscrire le mot à rechercher dans la zone de texte puis passser la souris sur le mot
lire à gauche pour avoir les instructions.
sont listés les différents mots clefs qui sont présents dans l'aide de VBA.
Tu peux ainsi retrouver à partir de ces mots clefs la rubrique de l'aide associée.
Inscrire le mot à rechercher dans la zone de texte puis passser la souris sur le mot
lire à gauche pour avoir les instructions.
Bruno-Dominique Robert, (N°1088)
Comment connaître les codes des touches du clavier ? Je voudrais pouvoir les utiliser dans mes macros pour en désactiver certaines.
Tu peux les trouver dans l'aide de visual basic :
Sommaire/Visual Basic/Manuel de référence du langage/Divers/jeux de caractères.
Tu peux aussi utiliser ce classeur à télécharger
pour les voir '"en direct" dans un userform
Sommaire/Visual Basic/Manuel de référence du langage/Divers/jeux de caractères.
Tu peux aussi utiliser ce classeur à télécharger
pour les voir '"en direct" dans un userform
Hervé, (N°1086)

A partir d'un classeur, je dois récupérer par macro de nombreuses données contenues dans un autre classeur. Comment indiquer à cette macro d'attendre la fin du processus de récupération pour continuer le traitement ?
La macro AttendFinNotePad ci dessous va ouvrir note pad et attendre que
tu aies fermé notepad pour lancer la suite de la macro (affichage ici d'un message).
A Adapter bien sur en fonction du processus dont tu attends la fin pour terminer ta macro
Cette macro utilise des fonctions API.
Declare Function WaitForSingleObject Lib "Kernel32" _
(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Declare Function OpenProcess Lib "Kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Public Const INFINITE = &HFFFF
Function LanceEtAttendLaFin(ByVal CheminComplet As String) As Long
Dim ProcessHandle As Long
Dim ProcessId As Long, ret&
ProcessId = Shell(CheminComplet, vbNormalFocus)
ProcessHandle = OpenProcess(&H1F0000, 0, ProcessId)
LanceEtAttendLaFin = WaitForSingleObject(ProcessHandle, INFINITE)
End Function
Sub AttendFinNotepad()
chemin = "c:\Windows\NotePad.exe"
If LanceEtAttendLaFin(chemin) = 0 Then MsgBox "La macro peut reprendre"
End Sub
tu aies fermé notepad pour lancer la suite de la macro (affichage ici d'un message).
A Adapter bien sur en fonction du processus dont tu attends la fin pour terminer ta macro
Cette macro utilise des fonctions API.
Declare Function WaitForSingleObject Lib "Kernel32" _
(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Declare Function OpenProcess Lib "Kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Public Const INFINITE = &HFFFF
Function LanceEtAttendLaFin(ByVal CheminComplet As String) As Long
Dim ProcessHandle As Long
Dim ProcessId As Long, ret&
ProcessId = Shell(CheminComplet, vbNormalFocus)
ProcessHandle = OpenProcess(&H1F0000, 0, ProcessId)
LanceEtAttendLaFin = WaitForSingleObject(ProcessHandle, INFINITE)
End Function
Sub AttendFinNotepad()
chemin = "c:\Windows\NotePad.exe"
If LanceEtAttendLaFin(chemin) = 0 Then MsgBox "La macro peut reprendre"
End Sub
Laurent Longre, (N°1085)
Comment recopier mes macros sur un classeur situé sur un autre PC
Tu le copies simplement sur l'autre PC !
Mais il va écraser celui déjà présent sur l'autre poste... d'où
l'intérêt des macros complémentaires si tu veux éviter ça. Fais Fenêtre
-> Afficher, sélectionne Perso.xls, clique sur OK. Ensuite, Fichier ->
Enregistrer sous, donne un nom autre que Perso.xls (par exemple,
MesMacros.xls), sélectionne le type de fichier "Macro complémentaire
Microsoft Excel (*.xla)" et enregistre. Sur l'autre poste, copie le
fichier MesMacros.xla que tu viens de créer dans le répertoire Macrolib,
lance Excel, fais Outils -> Macros complémentaires, coche "MesMacros" et
valide.
Mais il va écraser celui déjà présent sur l'autre poste... d'où
l'intérêt des macros complémentaires si tu veux éviter ça. Fais Fenêtre
-> Afficher, sélectionne Perso.xls, clique sur OK. Ensuite, Fichier ->
Enregistrer sous, donne un nom autre que Perso.xls (par exemple,
MesMacros.xls), sélectionne le type de fichier "Macro complémentaire
Microsoft Excel (*.xla)" et enregistre. Sur l'autre poste, copie le
fichier MesMacros.xla que tu viens de créer dans le répertoire Macrolib,
lance Excel, fais Outils -> Macros complémentaires, coche "MesMacros" et
valide.
Laurent Longre, (N°1084)
Comment appliquer une macro à toutes les cellules sauf à celles d'une plage donnée ?
Si l'évènement ne concerne pas la plage B1:B10
Private Sub worksheet_selectionchange(ByVal target As Excel.Range)
If Intersect(Target, Range("B1:B10")) Is Nothing Then exit sub
...etc...
End Sub
Private Sub worksheet_selectionchange(ByVal target As Excel.Range)
If Intersect(Target, Range("B1:B10")) Is Nothing Then exit sub
...etc...
End Sub
Alain Vallon, (N°1083)