office VBA的ide实在是太烂了,代码提示和语法高亮功能都不行,但是由于MS没有开放这个接口,不能用如sublime或Atom这样优秀的第三方编辑器?
经过一番研究,利用vba的导入导出模块的功能 ,部分实现了这个功能:
- 新建一个xlsm文件
-
alt
+F11
打开vbe环境,选中左边的ThisWorkbook,在代码面板输入下面的代码
Public Sub exportAndImport()
Dim wkBook As Excel.Workbook
Dim wkComp As VBIDE.VBComponent
Dim macroPath As String
Set wkBook = ThisWorkbook
On Error Resume Next
macroPath = ThisWorkbook.Path & "\" & "export\"
For Each wkComp In wkBook.VBProject.VBComponents 'export
If wkComp.Type = vbext_ct_StdModule Then '如果是模块就导出并删除
wkComp.Export macroPath & wkComp.Name & ".bas"
wkBook.VBProject.VBComponents.Remove wkComp
End If
Next
macroPath = ThisWorkbook.Path & "\" & "import\"
tempfile = Dir(macroPath & "*.bas")
While tempfile <> ""
Set wkComp = wkBook.VBProject.VBComponents.import(macroPath & tempfile) '导入代码
wkComp.Name = Left(tempfile, Len(tempfile) - 4)
tempfile = Dir
Wend
Debug.Print "in export and import"
End Sub
- 解释下,这就是把当前工作薄里的所有模块导出到当前子目录
export
,并从当前子目录import
里,导入各个bas
文件为对应文件名的模块。比如我的一个main.bas
文件里的代码会导入成main
模块。这样,就可以用 sublime或者 atom等ide来编辑。
- 两个问题
- 问题1:众所周之,在VBA中,模块是导出成
.bas
文件,类模块是导出成.cls
文件,但是我发现.VBProject.VBComponents.import
不能指定导入类型,只要是允许导入的文件,都导入成VBA的模块
。更不用提窗体的frm
文件。 - 问题2:为了方便,我在工作表里扔了两个Button,一个Button宏是上述的函数,一个Button宏是运行
main
里的一个main()
函数
但是我发现,只要把这两个宏的功能集中的一个宏里,就会出问题,类似下面这样
call exportAndImport()
call main.main()
感觉是exportAndImport,会多导入一个bas文件,结果会导致函数定义重复,有谁帮我解释一下吗?