使用自定义 UI 功能区部署启用 Word 宏的模板 (.dotm)
Deploying Word Macro-Enabled Template (.dotm) with a Custom UI Ribbon
我有一个 Word 启用宏的模板 (.dotm),当我将它保存到我的 Word 启动文件夹时,它在我的机器上工作得很好。但是,当我将 .dotm
文件发送给我的同事(一些与我处于相同环境中,一些则不是)时,按下自定义 ui 功能区按钮时会生成错误:
The macro cannot be found or has been disabled because of your security settings
The macro settings are set to run all macros, the folder containing the template >is a trusted location
.... more help options follow
我的同事也将文件保存到他们的启动文件夹并加载 Word。功能区显示完美,但宏没有 运行。我和我的同事在网上进行了大量搜索,但无法找出问题所在,因为我的所有配置都是正确的,据我所知,我将在下面列出:
- 宏设置:启用所有宏
- 已检查对 VBA 项目对象模型的信任访问
- 启动文件夹被建立为受信任的位置
自定义UIXML
<?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 标准模块中的色带连接
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(用户窗体)代码
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
这是 .dotm
打开时我的 VBE 的样子。
错误消息的最可能原因是宏在包含功能区自定义的模板中不可用。通常,它们保留在开发机器上的 Normal.dotm
模板中。
背景:
VBA 开发人员在开始一个项目并在 Word 中进行测试时始终需要牢记的一点是 Word 可以处理多个 "contexts"。首先,在私有用户环境中记录宏和创建功能时最重要的默认设置是 Normal.dotm
模板。这是 "universal":无论您在哪个文档中工作,它都会发挥作用,即使该文档附加到不同的模板也是如此。
这样做的最大危险是您可能忘记将用于特定模板的代码从 Normal.dotm
移动到该模板。或者,即使您确实复制了代码,如果两个模板中都存在具有相同过程名称的代码,那么 Normal.dotm
中的代码可能会保持优先级。
在将宏分配给功能区和 QAT 按钮时,这尤其是一个问题。即使来自开发人员计算机的 Normal.dotm
不再存在,功能区或 QAT 分配仍会查找它并且不会检查备用源。
因此,如果您决定要将代码保留在 Normal.dotm
以及特定模板中,最好重命名 Normal.dotm
中的过程以避免冲突。
我有一个 Word 启用宏的模板 (.dotm),当我将它保存到我的 Word 启动文件夹时,它在我的机器上工作得很好。但是,当我将 .dotm
文件发送给我的同事(一些与我处于相同环境中,一些则不是)时,按下自定义 ui 功能区按钮时会生成错误:
The macro cannot be found or has been disabled because of your security settings
The macro settings are set to run all macros, the folder containing the template >is a trusted location
.... more help options follow
我的同事也将文件保存到他们的启动文件夹并加载 Word。功能区显示完美,但宏没有 运行。我和我的同事在网上进行了大量搜索,但无法找出问题所在,因为我的所有配置都是正确的,据我所知,我将在下面列出:
- 宏设置:启用所有宏
- 已检查对 VBA 项目对象模型的信任访问
- 启动文件夹被建立为受信任的位置
自定义UIXML
<?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 标准模块中的色带连接
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(用户窗体)代码
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
这是 .dotm
打开时我的 VBE 的样子。
错误消息的最可能原因是宏在包含功能区自定义的模板中不可用。通常,它们保留在开发机器上的 Normal.dotm
模板中。
背景:
VBA 开发人员在开始一个项目并在 Word 中进行测试时始终需要牢记的一点是 Word 可以处理多个 "contexts"。首先,在私有用户环境中记录宏和创建功能时最重要的默认设置是 Normal.dotm
模板。这是 "universal":无论您在哪个文档中工作,它都会发挥作用,即使该文档附加到不同的模板也是如此。
这样做的最大危险是您可能忘记将用于特定模板的代码从 Normal.dotm
移动到该模板。或者,即使您确实复制了代码,如果两个模板中都存在具有相同过程名称的代码,那么 Normal.dotm
中的代码可能会保持优先级。
在将宏分配给功能区和 QAT 按钮时,这尤其是一个问题。即使来自开发人员计算机的 Normal.dotm
不再存在,功能区或 QAT 分配仍会查找它并且不会检查备用源。
因此,如果您决定要将代码保留在 Normal.dotm
以及特定模板中,最好重命名 Normal.dotm
中的过程以避免冲突。