字宏:"Sub or function not defined" 在第二台电脑上
Word Macro: "Sub or function not defined" on 2nd PC
我创建了一个包含 2 个宏的 .docm 文件,在我的电脑上一切正常,但如果我将 .docm 文件复制到另一台电脑,它会显示 "sub or function not defined" 错误。
宏1:
附有宏的 activeX 按钮 (Developer - Legacy tools
):
Private Sub buttonStart_Click()
Main
End Sub
宏 2:"Main"(通过 View - Macros - Show Macros
创建)
Sub Main()
'Calls other subs and functions in the right order
End Sub
在另一台 PC 上,我授予 Word 使用 activeX 的权限,但 "Main" 宏在 View - View Macros
列表中丢失,并且每次我尝试启动宏时它都显示错误消息) 通过单击按钮。
抱歉,我是 VBA 和宏的新手。我是否必须 link 第二个宏或以不同的方式添加它才能在其他 PC 上访问?
编辑:VBA 编辑器的左侧(两个宏看起来相同):
根据我对情况的了解:
- 当双击 ActiveX 控件时,将为控件的默认操作创建(或选择,如果它已经存在)一个过程。这将始终位于嵌入 ActiveX 控件的文档的
ThisDocument
class 模块中。
- 当使用 Word 用户界面中的控件创建宏时,将在名为
NewMacros
.[=50 的模块中的 Normal.dotm
(默认)模板中自动创建该宏=]
- 只有普通模块中定义为 "public"
Sub
不带参数的过程的宏才会出现在可用的宏列表中。 ActiveX 控件的事件没有出现在列表中的原因是 a) 它是 Private
而不是 public 并且 b) 它不在普通模块中 - 它在 ThisDocument
中,这是一个class模块(代表代码级别的文档)。
因此,buttonStart_Click
在已分发到另一台 PC 的文档中,在 ThisDocument
模块中。另一方面,Sub Main
是在 Normal.dotm 模板中的 NewMacros
中创建的,它保留在原始机器上。
因此,您需要
- 单击项目
BilderEinlesen
,转到 Insert
菜单并向项目插入一个 模块 。默认情况下,它将被命名为 Module1
.
- 在 Normal 项目中双击
NewMacros
打开代码页。 Select Sub Main
全部复制过来
- 双击
Module1
打开代码页。如果 Option Explicit
不在顶部,请输入。粘贴复制的 Sub Main
.
现在这两个程序应该在将要分发的文档中。
注意:就个人而言,我会将 Sub Main
重命名为其他名称。 Sub Main
由 VBA 在某些自动情况下生成(例如用于创建此环境的情况),如果 VBA 可能 导致冲突再次想要创建这样一个宏...或者如果同时打开的项目中存在另一个具有该名称的宏。如果您确实重命名,请记住还要更改按钮单击事件中的过程调用。
我创建了一个包含 2 个宏的 .docm 文件,在我的电脑上一切正常,但如果我将 .docm 文件复制到另一台电脑,它会显示 "sub or function not defined" 错误。
宏1:
附有宏的 activeX 按钮 (Developer - Legacy tools
):
Private Sub buttonStart_Click()
Main
End Sub
宏 2:"Main"(通过 View - Macros - Show Macros
创建)
Sub Main()
'Calls other subs and functions in the right order
End Sub
在另一台 PC 上,我授予 Word 使用 activeX 的权限,但 "Main" 宏在 View - View Macros
列表中丢失,并且每次我尝试启动宏时它都显示错误消息) 通过单击按钮。
抱歉,我是 VBA 和宏的新手。我是否必须 link 第二个宏或以不同的方式添加它才能在其他 PC 上访问?
编辑:VBA 编辑器的左侧(两个宏看起来相同):
根据我对情况的了解:
- 当双击 ActiveX 控件时,将为控件的默认操作创建(或选择,如果它已经存在)一个过程。这将始终位于嵌入 ActiveX 控件的文档的
ThisDocument
class 模块中。 - 当使用 Word 用户界面中的控件创建宏时,将在名为
NewMacros
.[=50 的模块中的Normal.dotm
(默认)模板中自动创建该宏=] - 只有普通模块中定义为 "public"
Sub
不带参数的过程的宏才会出现在可用的宏列表中。 ActiveX 控件的事件没有出现在列表中的原因是 a) 它是Private
而不是 public 并且 b) 它不在普通模块中 - 它在ThisDocument
中,这是一个class模块(代表代码级别的文档)。
因此,buttonStart_Click
在已分发到另一台 PC 的文档中,在 ThisDocument
模块中。另一方面,Sub Main
是在 Normal.dotm 模板中的 NewMacros
中创建的,它保留在原始机器上。
因此,您需要
- 单击项目
BilderEinlesen
,转到Insert
菜单并向项目插入一个 模块 。默认情况下,它将被命名为Module1
. - 在 Normal 项目中双击
NewMacros
打开代码页。 SelectSub Main
全部复制过来 - 双击
Module1
打开代码页。如果Option Explicit
不在顶部,请输入。粘贴复制的Sub Main
.
现在这两个程序应该在将要分发的文档中。
注意:就个人而言,我会将 Sub Main
重命名为其他名称。 Sub Main
由 VBA 在某些自动情况下生成(例如用于创建此环境的情况),如果 VBA 可能 导致冲突再次想要创建这样一个宏...或者如果同时打开的项目中存在另一个具有该名称的宏。如果您确实重命名,请记住还要更改按钮单击事件中的过程调用。