Развертывание шаблона Word с поддержкой макросов (.dotm) с помощью ленты пользовательского интерфейса

Я создал шаблон Word с поддержкой макросов (.dotm), который отлично работает на моем компьютере, когда я сохраняю его в папку Word Startup. Тем не менее, когда я отправляю .dotm файл моим коллегам (некоторые в той же среде, что и я, а некоторые нет), генерируется ошибка при нажатии кнопки пользовательского интерфейса ленты:

Макрос не найден или отключен из-за настроек безопасности

Настройки макроса настроены на запуск всех макросов, папка с шаблоном> является надежным местом

.... другие варианты помощи следуют

Мои коллеги также сохраняют файл в свою папку автозагрузки и загружают Word. Лента показывает отлично, но макрос не запускается. Мои коллеги и я провели множество поисков в Интернете и не можем выяснить проблему, поскольку все мои конфигурации верны, насколько я могу судить, что я перечислю ниже:

  • Настройки макроса: включить все макросы
  • Проверен доверительный доступ к объектной модели проекта VBA
  • Папка автозагрузки установлена ​​как надежное расположение

Пользовательский интерфейс 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>

UI Ribbon Connection в стандартном модуле

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

Код 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

Вот так выглядит мой VBE .dotm открыть.

1 ответ

Решение

Наиболее вероятной причиной сообщения об ошибке является то, что макрос недоступен в шаблоне, содержащем настройку ленты. Часто они остаются в Normal.dotm шаблон на разработку машины.

Фон:

При запуске проекта и тестировании в Word разработчик VBA всегда должен помнить о том, что Word работает с несколькими "контекстами". Во-первых, по умолчанию при записи макросов и создании функциональных возможностей в среде частного пользователя используется Normal.dotm шаблон. Это "универсальный": он вступает в игру независимо от того, с каким документом вы работаете, даже если этот документ прикреплен к другому шаблону.

В этом большая опасность, что вы можете забыть переместить код, предназначенный для определенного шаблона, из Normal.dotm к этому шаблону. Или, даже если вы скопируете код поверх, если код с одинаковыми именами процедур присутствует в обоих шаблонах, то в Normal.dotm может иметь приоритет.

Это особенно проблема при назначении макросов кнопкам ленты и QAT. Даже если Normal.dotm из машины разработчика больше нет, назначение ленты или QAT все еще ищет это и не проверяет альтернативный источник.

Так что, если вы решили, что хотите сохранить код в Normal.dotm а также в конкретном шаблоне, это хорошая идея переименовать процедуры в Normal.dotmчтобы избежать конфликтов.

Другие вопросы по тегам