Развертывание шаблона 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
чтобы избежать конфликтов.