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

[VBA] Formules de macros complémentaires dans un classeur et ouverture sur différents postes

10 réponses
Avatar
HD
Bonjour,

Je me suis crée un fichier de macros complémentaires "Formules.xlam".
Ces macros comportent nos nouvelles fonctions Excel.

Tout fonctionne bien sur mon poste, pas de souci. J'ai crée un classeur
qui sera utilisé par plusieurs collègues. Mais le problème est que
malgrè le fait que le fichier de macros complémentaires "Formules.xlam"
ai été installé sur les autres postes, lorsque l'on ouvre un classeur
crée sur mon poste les fonctions veulent pointer vers l'emplacement sur
mon poste du fichier "Formules.xlam".

Exemple, sur mon poste lorsque j'ouvre le classeur, j'ai dans un cellule
la formule :
=Crédit(761)
Si j'ouvre ce même classeur sur un autre poste j'ai alors la formule
suivante dans la même cellule:
='E:\Documents and Settings\HD\Application
Data\Microsoft\AddIns\Formules.xlam'!Crédit(761)
Bref, la formule cherche le xlam sur l'emplacement des xlam de MON
poste.

Avez vous des astuces pour remédier à cela ?

Merci d'avance pour votre aide,

Cordialement,

HD

10 réponses

Avatar
HD
Personne n'aurait la solution ?

J'ai pensé bien sûr à faire remplacer dans les formules des cellules la
chaîne:
'E:Documents and SettingsHDApplication
DataMicrosoftAddInsFormules.xlam'
par "" (rien)
ce qui donnerait pour
='E:Documents and SettingsHDApplication
DataMicrosoftAddInsFormules.xlam'!Crédit(761)
le résultat:
=Crédit(761)
mais cela implique de déprotéger toutes les feuilles (donc soit donner
le mot de passe à l'utilisateur, soit préparer une macro avec l'ensemble
des mots de passe s'appliquant sur les classeurs que l'on utilise)
et d'autre part, si il y'a un grand nombre de formules cela pourrait
être assez long.

@+
HD
Avatar
MichD
Bonjour,

Le plus simple, c'est de copier le fichier de la macro complémentaire dans un répertoire
accessible par tous les usagers.

Chacun des usagers charge la macro complémentaire à partir de la fenêtre des Options d'Excel /
Compléments / Compléments Excel / En cliquant sur le bouton "parcourir" jusqu'au fichier de la macro
complémentaire. / En double-cliquant sur le fichier, un item va s'ajouter à la liste des macros
complémentaires déjà présente et en cochant cet item, toutes les fonctions de la macro
complémentaire deviendront disponibles directement dans toutes les feuilles de tous les classeurs en
inscrivant dans la cellule seulement le nom de la fonction sans faire référence à l'emplacement du
fichier.

Exemple : Si une fonction du fichier de macro complémentaire s'appelle "toto", dans la cellule, tu
écris =toto()
Avatar
MichD
En supposant que le chemin sur le Réseau où tu as copié le fichier de macros complémentaires soit le
même pour tous les usagers, tu pourrais automatiser cela de la manière suivante :

Si tu mets cela dans le ThisWorkbook d'un classeur, en ouvrant le classeur, l'usager charge la macro
complémentaire (la rend disponible) sur son ordinateur pour ses fichiers Excel.
'-------------------------------------------------
Private Sub Workbook_Open()
On Error Resume Next

'Cette ligne de code ajoute l'item de la macro complémentaire à la liste déjà présente
'dans les Options Excel / compléments
Application.AddIns.Add "Le chemin du réseauRépertoire où est le fichierTest.xlam"

'Cette ligne coche la macro complémentaire. ("Test") est le nom qui apparaît dans la fenêtre
'complément des options Excel.
AddIns("test").Installed = True
End Sub
'-------------------------------------------------
Avatar
HD
Bonjour MichD,

Mon souci n'est pas que la macro complémentaire ne s'installe pas. Tous
les postes clients l'ont et peuvent se l'installer via la macro d'un
classeur que je leur ai donné :

Sub InstallXLAM()
Dim ret As Long
Dim myAddIn As AddIn

If Dir("H:InfoFormules.xlam", vbNormal) = "" Then
ret = MsgBox("Le fichier de macros complémentaires
'Formules.xlam' n'est pas sur le réseau !!!" & vbCrLf & _
"Veuillez appeler David", vbExclamation, "")
Exit Sub
End If

For Each myAddIn In AddIns
If myAddIn.Name = "Formules.xlam" Then
ret = MsgBox("'Formules.xlam' était déjà installé. Un
nouveau fichier 'Formules.xlam' va être installer.", vbInformation, "")
myAddIn.Installed = False
End If
Next

' Load and install new XLAM
Application.DisplayAlerts = False
Set myAddIn = Application.AddIns.Add("H:InfoFormules.xlam")
myAddIn.Installed = True
Application.DisplayAlerts = True

' Load known XLAM
For Each myAddIn In AddIns
If myAddIn.Name = "Formules.xlam" Then
myAddIn.Installed = False
myAddIn.Installed = True
End If
Next
ret = MsgBox("Les macros complémentaires 'Formules.xlam' viennent
d'être installées.", vbInformation, "")
End Sub


Mon souci est que malgrè le fait que les utilisateurs ont cette macro,
j'aurai << =Crédit(761) >> qui va s'afficher sur mon classeur alors que
sur le même classeur ouvert sur un poste où l'utilisateur a bien <<
Formules.xlam >> installé et activé j'aurai sur cette même cellule <<
='E:Documents and SettingsHDApplication
DataMicrosoftAddInsFormules.xlam'!Crédit(761) >>. Bref, Excel veut
absolument récupérer la fonction "Crédit" sur le chemin qu'il y'avait
sur mon poste au lieu de récupérer la fonction "Crédit" qui se trouve
sur le poste de l'utilisateur parmi les macros complémentaires de <<
Formules.xlam >>.

@+
HD
Avatar
MichD
Et dis-moi, pourquoi as-tu installé la macro complémentaire en n’utilisant pas la version
du fichier complémentaire que tu as mis sur le réseau disponible pour tout le monde?

Ceci étant dit, je ne travaille pas en réseau, les tests que je peux faire sont limités!
Avatar
HD
Et dis-moi, pourquoi as-tu installé la macro complémentaire en n’utilisant
pas la version
du fichier complémentaire que tu as mis sur le réseau disponible pour
tout le monde?



C'est ce que j'ai fait. Pour faciliter l'installation pour tout le
monde, j'ai placer la macro complémentaire Formules.xlam dans un
répertoire caché du serveur "H:Info". Lorsque les utilisateurs lancent
ma macro d'installation de la macro complémentaire ça l'installe sur
leur poste automatiquement. La macro complémentaire et ses fonctions
fonctionnent alors bien. Mais mon souci provient du fait qu'un classeur
généré sur un poste avec des formules de ce classeur (comme par exemple
la formule "Crédit") ne fonctionnent pas sur les autres postes.

@+
HD
Avatar
MichD
Désolé, mais je n'ai pas un environnement qui me permet de faire des tests sur un réseau.

Si au départ, tu n'as qu'un seul fichier et que tu as utilisé le chemin sur le réseau pour installer
la macro complémentaire et que ce chemin est le même pour chacun des usagers, je ne vois pas
pourquoi tu devrais observer le comportement que tu décris.

À tout égard, lorsque tu charges la macro complémentaire avec cette ligne de code :
elle a 2 paramètres : addins.Add Filename,copyFile
CopyFile peut prendre la valeur True or False. As-tu regardé dans l'aide la signification
de ce paramètre?

Je dois quitter, de retour plus tard!
Avatar
MichD
Si tu veux que le fichier de macros complémentaires s'installe localement sur chaque ordinateur,
ajoute cette procédure dans le Thisworkbook du fichier de macros complémentaires. Tu le places
en réseau accessible à chacun. Chaque usager n'a qu'à faire un double-clic pour que ce fichier
s'installe automatiquement lors de son ouverture. Encore faut-il que les macros soient activées!

Si la chose peut t'aider...

'--------------------------------------------------------------------------
Private Sub Workbook_Open()
Dim Xl As Object, MyAddin As Object
Dim Chemin_Inst As String, Nom_Xlam As String
Dim ActuelPath As String

ActuelPath = Me.Path & ""

'Une des 2 lignes de code...à vérifier si tu as plusieurs
'systèmes d'exploitation différents et plusieurs version d'Office

Chemin_Inst = Application.UserLibraryPath
'OU
'Chemin_Inst = Environ("AppData") & "MicrosoftAddIns" & ""

'Extraire le nom du fichier de la macro complémentaire (.xlam = 5)
'Me.Name = "Nom du classeur" lorsque ce code est dans le ThisWorkbook.
Nom_Xlam = Mid(Me.Name, 1, Len(Me.Name) - 5)

If ActuelPath <> Chemin_Inst Then
If MsgBox("Désirez-vous installé ce fichier de macros complémentaires?", _
vbYesNo) = vbYes Then
'Créer une instance de l'application Excel
Set Xl = Application
'Ajout d'un classeur
Xl.Workbooks.Add
'Copie de ce fichier vers le répertoire des macros complémentaires
Me.SaveCopyAs Chemin_Inst & Me.Name
'Ajout de cette macro compl. à la liste de la fenêtre des
'macros complémentaires dans la fenêtre Compléments des options d'Excel
Set MyAddin = Xl.AddIns.Add(Chemin_Inst & Me.Name, True)
'Coche cette macro complémentaire dans la même fenètre
MyAddin.Installed = True
'Ferme Excel
Xl.Quit
'Libère la mémoire de l'objet Xl
Set Xl = Nothing
End If
End If
End Sub
'--------------------------------------------------------------------------
Avatar
HD
Bonjour MichD,

Je me suis résolu à solutionner mon problème via une macro qui changera
le lien vers le XLAM. Voici mon script :

Sub Modif_liens()
Dim myAddIn As AddIn
Dim NomXLAM As String
Dim RepXLAM As String

RepXLAM = Application.UserLibraryPath
NomXLAM = "Formules.xlam"

AllDeProt
aLinks = ActiveWorkbook.LinkSources(xlExcelLinks)
If Not IsEmpty(aLinks) Then
For i = 1 To UBound(aLinks)
If InStr(1, aLinks(i), NomXLAM) Then
monclasseur2 = RepXLAM & NomXLAM
Application.StatusBar = aLinks(i) & " / " & monclasseur2
DeProt
ActiveWorkbook.ChangeLink Name:=aLinks(i),
NewName:=monclasseur2, Type:=xlExcelLinks
Prot
End If
Next i
Else
MsgBox "Pas de liens"
End If
AllProt
Application.StatusBar = ""
End Sub

Les fonctions AllProt et AllDeprot protégent ou déprotégent les feuilles
et contrôle que la protection/déprotection se soit bien passée (via une
fonction IsProtect).

Function IsProtect(f As Worksheet) As Boolean
'* Test la protection de la feuille *
IsProtect = f.ProtectContents = True
End Function

@+
HD
Avatar
MichD
Bravo! L'important c'est que tu as trouvé un moyen efficace d'appliquer ton fichier de macros
complémentaires!

N.B. Lorsque l'on a ajouté une macro complémentaire localement et que l'on décide de modifier
l'emplacement
du fichier source de la macro complémentaire, il faut faire attention à la manière de procéder.

A ) Ferme toutes les instances d'Excel

B ) Déplace le fichier de la macro complémentaire ailleurs que dans le répertoire :
C:UsersLe profilAppDataRoamingMicrosoftAddIns

C ) Ouvrir Excel, dans les options d'Excel / Compléments / lorsque l'on essaie de décocher l'item de
la macro complémentaire que l'on veut supprimer, Excel affiche un message à cet effet et nous
demande si l'on veut supprimer cet item de la liste. En répondant "OUI", l'item est supprimé.

D ) Maintenant, on peut ajouter la même macro complémentaire, mais avec un nouveau chemin.

Si l'on tente à partir de la fenêtre "Complément" de modifier le chemin sans l'avoir supprimé, la
manoeuvre ne réussit pas et le nouveau chemin n'est pas pris en compte! Il ne faut pas oublier que
cette information est inscrite dans la base de registre de Windows et si on ne prend pas le temps
d'enlever la macro complémentaire, on ne peut pas modifier le chemin inscrit dans la base de
registre.