3 votes

Déploiement d'un modèle Word activé par les macros (.dotm) avec un ruban d'interface utilisateur personnalisé

J'ai créé un modèle Word compatible avec les macros (.dotm) qui fonctionne parfaitement sur mon ordinateur lorsque je l'enregistre dans mon dossier de démarrage Word. Cependant, lorsque j'envoie le .dotm à mes collègues (certains dans le même environnement que moi, d'autres non), une erreur est générée lorsqu'on appuie sur le bouton du ruban de l'interface utilisateur personnalisée :

La macro est introuvable ou a été désactivée en raison de vos paramètres de sécurité.

Les paramètres des macros sont définis pour exécuter toutes les macros, le dossier contenant le modèle >est un emplacement de confiance.

.... d'autres options d'aide suivent

Mes collègues enregistrent également le fichier dans leur dossier de démarrage et chargent Word. Le ruban s'affiche parfaitement, mais la macro ne s'exécute pas. Mes collègues et moi-même avons effectué de nombreuses recherches en ligne et nous ne parvenons pas à trouver la cause du problème, car toutes mes configurations sont correctes, pour autant que je sache, et je les énumère ci-dessous :

  • Réglages Macro : Activer toutes les macros
  • L'accès de confiance au modèle d'objet du projet VBA est vérifié.
  • Le dossier de démarrage est établi comme un emplacement de confiance.

UI personnalisée XML

<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
  <ribbon>
    <tabs>
      <tab id="customTab" label="WebMerge">
        <group id="CustomHelp" label="Map Tags">
          <button id="mapper"
                  visible="true"
                  size="large"
                  label="Open Mapper"
                  screentip="Opens Mapping Engine"
                  onAction="LoadMappingGuide"
            imageMso="FindDialog"/>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

Connexion du ruban de l'interface utilisateur dans le module standard

Option Explicit

Sub LoadMappingGuide(ByVal Control As IRibbonControl) 'also tried without ByVal

    'select business unit or automatically detect based on username against our database ...
    Dim mappingForm As New mappingGuide
    mappingForm.Show vbModal

End Sub

Code mappingForm (UserForm)

Option Explicit

Private Sub cancelButton_Click()

    Unload Me

End Sub

Private Sub searchBox_Change()

    generateList

    Dim n As Long, index As Long

    index = 0

    For n = 0 To smartTagList.ListCount - 1
        If InStr(1, smartTagList.List(index, 0), searchBox.Value, vbTextCompare) > 0 Then
            index = index + 1
        ElseIf InStr(1, smartTagList.List(index, 1), searchBox.Value, vbTextCompare) > 0 Then
            index = index + 1
        ElseIf InStr(1, smartTagList.List(index, 2), searchBox.Value, vbTextCompare) > 0 Then
            index = index + 1
        Else
            smartTagList.RemoveItem (index)
        End If
    Next n

End Sub

Private Sub smartTagList_Click()

    If smartTagList.ListIndex > -1 And smartTagList.Selected(smartTagList.ListIndex) Then

        Dim smartyTag As String
        smartyTag = smartTagList.List(smartTagList.ListIndex, 2)

        Selection.Range.Text = smartyTag

    End If

    Unload Me

End Sub

Private Sub UserForm_Initialize()

    generateList

End Sub

Private Sub generateList()

    'replace with code to get values from database

    Dim fields() As String
    Dim descriptions() As String
    Dim smartyTags() As String

    fields = Split("Producer Name,Producer Address,Producer City,Producer State,Producer Zip,Insured Name,Insured Address,Insured City,Insured State,Insured ZIp,Risk Premium,TRIA Premium,Final Premium", ",")
    descriptions = Split("Name of Producer,Address Line of Producer,City of Producer,State of Producer,Zip Code of Producer,Name of Insured,Address of Insured,City of Insured,State of Insured,ZIp of Insured,Total Premium for all risks excluding terrorism taxes and surcharges.,Premium resulting from acceptance of terrorism protection,Total Premium of quote / policy", ",")
    smartyTags = Split("{$Producer Name},{$ProducerAddress},{$ProducerCity},{$ProducerState},{$ProducerZip},{$InsuredName},{$InsuredAddress},{$InsuredCity},{$InsuredState},{$InsuredZIp},{$RiskPremium},{$TRIAPremium},{$FinalPremium}", ",")

    Dim i As Long
    For i = LBound(fields) To UBound(fields)

        With smartTagList

            .AddItem
            .List(i, 0) = fields(i)
            .List(i, 1) = descriptions(i)
            .List(i, 2) = smartyTags(i)

        End With

    Next

End Sub

Voici à quoi ressemble mon VBE avec .dotm ouvert.

enter image description here

2voto

Cindy Meister Points 12465

La raison la plus probable de ce message d'erreur est que la macro n'est pas disponible dans le modèle contenant la personnalisation du ruban. Souvent, elles restent dans le Normal.dotm sur la machine de développement.

Le contexte :

Le développeur VBA doit toujours garder à l'esprit, lorsqu'il commence un projet et le teste dans Word, que Word fonctionne avec plusieurs "contextes". Tout d'abord, et par défaut, lors de l'enregistrement de macros et de la création de fonctionnalités dans l'environnement privé de l'utilisateur, c'est le contexte Normal.dotm modèle. Il est "universel" : il entre en jeu quel que soit le document dans lequel vous travaillez, même si ce document est attaché à un modèle différent.

Le grand danger est d'oublier de déplacer le code destiné à un modèle spécifique de la page d'accueil à la page d'accueil. Normal.dotm à ce modèle. Ou, même si vous copiez le code, si le code avec les mêmes noms de procédure est présent dans les deux modèles, ce code en Normal.dotm peuvent avoir la priorité.

C'est notamment un problème lors de l'affectation de macros aux boutons du ruban et du QAT. Même si Normal.dotm de la machine du développeur n'est plus présent, l'affectation du ruban ou de l'AQT le recherche toujours et ne vérifie pas la présence d'une autre source.

Donc, si vous décidez de garder le code en Normal.dotm ainsi que dans le modèle spécifique, c'est une bonne idée de renommer les procédures en Normal.dotm pour éviter les conflits.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X