如何将示例Excel中剩余两段VBA代码迁移至大型现有工作簿?
问题背景
我已在Stack Overflow接受Oscar Sun的解决方案,获取了示例工作簿《Dynamic-Data-Validation (from SO 20230517).xlsb》。该工作簿中有四段VBA代码需迁移至已有大量VBA代码(10个模块及多个工作表代码)的大型Excel工作簿。目前我已迁移两段:将示例中的Module1重命名为Module6,将Sheet2(Sheet B)代码迁移至自定义命名的工作表,并修改了Module6的代码,但仍未显示下拉菜单。剩余需迁移的两段代码为Module SheetsOP和原ThisWorkbook(已更名为DropDownOP)。现有工作簿的ThisWorkbook中已有如下代码:
Sub copypasterange() Set Src = Application.InputBox("Select a source cell", "Obtain Range Object", Type:=8) Set Dst = Application.InputBox("Select a destination cell", "Obtain Range Object", Type:=8) Src.Copy Dst.PasteSpecial (xlPasteAllUsingSourceTheme) Dst.PasteSpecial (xlPasteColumnWidths) Dst.PasteSpecial (xlPasteAllUsingSourceTheme) Count = 0 For Each Row In Src.Rows Dst.Offset(rowoffset:=Count).RowHeight = Row.RowHeight Count = Count + 1 Next End Sub Private Sub Workbook_Open() End Sub
咨询问题
- 是否可将Module SheetsOP迁移至自定义命名的模块(如Module8)?
- 示例中DropDownOP的代码是否需添加至现有ThisWorkbook代码的End Sub之后?
- 是否可为剩余两段代码自定义模块名称(如Module7对应DropDownOP,Module8对应Module SheetsOP)?
问题解答
问题1:是否可将Module SheetsOP迁移至自定义命名的模块(如Module8)?
可以。只要原SheetsOP模块中的代码没有依赖模块名称的硬引用(比如其他代码通过SheetsOP.过程名的方式调用),完全可以迁移到自定义命名的标准模块中。迁移后检查所有跨模块调用的代码,确保引用路径正确即可。问题2:示例中DropDownOP的代码是否需添加至现有ThisWorkbook代码的End Sub之后?
需根据DropDownOP代码的类型判断:- 如果是工作簿级事件过程(比如
Workbook_SheetChange、Workbook_BeforeSave这类),必须添加到ThisWorkbook模块中,但要注意和现有过程同级,不能嵌套在已有的Sub或End Sub之间。比如现有空的Workbook_Open过程,可以把DropDownOP中对应的Workbook_Open代码合并进去,或者在ThisWorkbook模块中新增独立的事件过程。 - 如果是普通的公共/私有
Sub/Function,既可以放在ThisWorkbook模块,也可以迁移到自定义标准模块,只要调用逻辑正确即可。
- 如果是工作簿级事件过程(比如
问题3:是否可为剩余两段代码自定义模块名称(如Module7对应DropDownOP,Module8对应Module SheetsOP)?
完全可以。VBA标准模块的名称支持自定义,只要满足以下条件:- 模块名称符合VBA命名规则(无空格、特殊字符,不与关键字重名)
- 若其他代码存在引用原模块名称的情况,需同步修改为新模块名称
- 注意:如果DropDownOP包含工作簿级事件代码,这类代码必须留在ThisWorkbook模块,不能移到自定义模块;如果只是普通过程,则可以迁移到自定义命名的模块(比如Module7)中。
内容的提问来源于stack exchange,提问作者Unicorn
相关产品推荐
相关产品推荐

