如何移植 OneNote 2010 vba 脚本(托管在 XLSM 文件中)以在 Onenote 2016 中工作

How to port OneNote 2010 vba scripts (hosted in a XLSM file) to work in Onenote 2016

我需要帮助才能从 Onenote 2010 移植到 OneNote 2016,我制作了 Excel VBA 主机工具包

TLDR:

a) 如果我想使用 Excel 2016 VBA 主机来自动化 OneNote 2016(桌面应用程序),我实际上应该 see/reference 什么对象库?我似乎只能 link 到 Onenote 12 对象库,有一个 V15 库但是当我尝试引用时会产生 "name conflict" 错误,即使我取消单击其余部分。我的安装错误吗? (Win10+Excel/ON 2016 32位)

b) OneNote 2016 中对 getpagecontent() 的 vba 调用应该如何,特别是模式参数是什么,一个字符串常量?我应该关心吗?

更长的版本

https://github.com/jceresearch/onenote_vba_host (public) 中,我维护了一个 Excel 电子表格,其中包含一些脚本来执行诸如作为个人 doc/pdf 批量导出页面之类的操作,包括它的嵌入式文件。还可以自动为页面编号,并自动在页面中添加内容。它在功能区中添加了一个菜单,您可以在那里看到选项。

代码比较乱,但在 Onenote 2010 下可以正常使用。 2016年我需要尽快上班

2016代码的关键部分在class代码中,调用OneNote:

Set app = New OneNote12.Application

我的2010code/installation已经是OneNote14.Application,但是我的office 365版本只能引用Onenote12对象库。

还有一个 "Microsoft OneNote 15.0 types" 库,但是当我点击它时它会产生名称冲突错误,即使我删除了旧库。还有一个扩展类型库,再次 Excel 不让我参考。

因此当前引用的库是:

有了这些,我可以 运行 宏并调用 OneNote 应用程序,甚至可以获得笔记本和分区的列表。

但是,当主机尝试 运行:

时,OneNote 崩溃得很惨
app.getPageContent sNodeID, sXML, piAll

我尝试了一些方法,比如只带基本数据但结果相同,还尝试了各种其他笔记本、页面、部分。

我认为问题可能与旧版本的对象库有关 and/or 在 getpagecontent 的文档中提到了使用 xsSchema 参数(xs2013 等)。参见 https://docs.microsoft.com/en-us/office/client-developer/onenote/application-interface-onenote

欢迎任何想法,顺便说一句,如果有人想帮助改进工具包,非常欢迎,请与我们联系。

谢谢!

这是我通过反复试验找到的解决方案:

一个。我犯了一个愚蠢的错误,直到我单独测试时才意识到。我认为我的 class 名称与其中一个较新的库(可能是 clsOneNoteHandler)发生冲突。更改为唯一名称似乎可以解决大部分问题,特别是防止加载最新的对象库并最终导致 OneNote 崩溃。

b。我设法 link 到 Onenote 15.0 对象库(不是扩展对象库),这似乎与我的 2010 代码兼容。我注意到它运行速度明显变慢(同一台机器在使用 office 2016 32 位重新成像到 windows 10 后)。

c。我仍然保留了 Microsoft XML、V3.0 库引用和解析 onenote XML 内容的语法,据我所知工作正常。

我需要继续对其进行回归测试,但对我来说最重要的功能是将页面导出为文档及其嵌入文件,这在 Onenote 2016 中仍然有效。

希望这对那里的某个人有所帮助。

欢迎并感谢您的评论!