Difference between revisions of "VBA zh"

From Apache OpenOffice Wiki
Jump to: navigation, search
(其他语言访问VBA API)
(OO Basic)
Line 176: Line 176:
  
 
=== OO Basic ===
 
=== OO Basic ===
OO宏就像VBA一样,可以自动的访问这些全局变量和方法,所以不需要使用API创建或访问这些单态对象。
+
OO宏就像VBA一样,可以自动的访问这些全局变量和方法,所以不需要使用API创建或访问这些单例对象。
 
+
原文:Basic allows access to the global variables automatically just like VBA does, there is no need to create any services or access any singletons to use the API
+
  
 
  msgbox "Name of the current document is " & ActiveWorkbook.Path
 
  msgbox "Name of the current document is " & ActiveWorkbook.Path

Revision as of 09:32, 15 March 2007

en

简介

为了能够在OpenOffice.org办公套件中运行Excel和Word文档引入的VBA宏,Novell和Sun联合发起了 VBA VBA 解释器项目。

  • Noel Power ( co-lead )
  • Andreas Breagas ( co-lead )

Visual Basic for Applications (VBA) 是微软(Microsoft)内建在其办公套件中[wikipedia:Visual Basic|Visual Basic]]的实现。

原文:VBA interoperability project is a joint Novell & Sun incubator project whose aim is to deliver a way to run Excel and Word macros natively in imported documents.

  • Noel Power ( co-lead )
  • Andreas Breagas ( co-lead )

Visual Basic for Applications (VBA) is an implementation of Microsoft's Visual Basic which is built into all Microsoft Office applications.


新闻

  • 更新Wiki页面到最新状态。
  • VBA项目创建:Novell and Sun to work together
  • 很高兴Andreas Brega的加入,并协同领导VBA项目的孵化。
  • 将从cws npower6 初始化项目代码。

术语

  • helperapi - Sun公司慷慨捐赠。是其迁移工具的一部分,兼容微软VBA。
  • oovbaapi - Novell在ooo-build中首先实现VBA解释器解决方案,并引入了helperapi实现的对象。

Note: 运行微软办公文档的宏,可以在Ooo-build中找到最新的VBA模型和补丁。该模型主要由Novell公司开发,并且在提交到openoffice的过程中会不断变化。可以想象,现在仍有很多宏不能运行。

状态

  • cws npower6 进入测试(QA)阶段。
  • cws npower7 已经创建。

任务和状态 ( 按优先级排序 )

任务 描述 问题号 计划的CVS分支(cws) 启动 集成的版本
迁移 Ooo-build 代码 将大量的idl文件和实现代码由ooo-build提交 74096 npower6 yep n/a
引入VBA代码 设置模块参数,作为启动VBA代码的条件 64570 npower6 yep n/a
VBA常量 调整宏运行时环境,“有条件的”识别定义在oovbaapi中的VBA常量。 68897 npower7 yep n/a
支持Dim定义VBA对象 调整宏运行时环境,“有条件的”允许VBA兼容对象这样使用:Dim r1 as Range 68897 npower7 yep n/a
数组擦除 在VBA兼容模式下,队列擦除方式需要改变 70380 npower7 yep n/a
空变量 VBA兼容模式下,需要改变空对象变量的操作行为 71827 npower7 yep n/a
'Like'运算符 为OOo创建'Like'运算符 73830 npower7 yep n/a
模块变量 在VBA兼容模式下,模块范围内变量的生存期,依赖的是包含宏的文档 n/a npower7? n/a n/a
索引数组的数组 索引数组的数组在VBA中非常普遍,如:myArray(1)(2) n/a n/a n/a n/a
支持控件事件 使表单(form)的事件处理器以controlname_xxx 形式松散帮定(loose bingding)到控件。例如:controlname_click 将会处理与之关联的事件调用。 n/a n/a n/a n/a


还有非常多的任务需要投入更多的工作(并分拆为小的任务加入到列表)

对于提高 标准 ooo-baisc兼容性的条目,可以像[70380]这样创建问题名单。

如何启用VBA模型

当前的ooo-build默认启用VBA模型。在getbuildinstallbe able to run后,VBA就被启用了。

如果你想使用官方版OpenOffice.org,同时希望使用VBA功能。请提取出cws npower6,并编译创建。这样就包含了初始的oovbaapi功能。

如何关闭VBA模型

不同的提供VBA支持的OpenOffice.org版本,决定了其关闭的方法。 对于linux发行(或者Novell windows版)的OpenOffice.org套件,如果包含了VBA解释器,那么就可以导航到'工具.选项.装入/保存.VBA属性'页面反选'装入需要边界的Basic代码'即可。 如果使用的是你自己创建的包含cws-npower6的版本(混合的),那么VBA功能不能被直接关闭。但是,如果你创建的VBA解释器是作为OpenOffice.org扩展,那么可以通过扩展管理器(Extension Manager)关闭或者删除vbaapi.oxt来禁用VBA功能。

获取帮助

我们在众多的方面需要帮助。下面将会介绍如何迁移helperapi对象,如何理解VBA使用模式,如何实现并测试VBA。

迁移HelperApi对象

什么是 helperapi?

请查看 porting notes

请查看 porting example

To Do 添加需要迁移的对象列表

To Do 对已存在的对象增加方法(从helperapi迁移)

理解VBA使用模式

VBA模型十分庞大。我们将理解VBA使用模式作为这个过程中的重点。大量含有VBA宏的微软办公套件的文档,对于研究开发很重要。我们乐于接受任何开发人员或者普通使用者所提供的文档。

原文:VBA model is huge and we need help in understanding the VBA usage patterns for prioritizing as we progress. It's important to receive as many Microsoft Office documents with macros as possible for analysis. We are interested in documents from developers and regular people too.


从微软办公套件文档中提取出VBA宏

libgsf

如果你不喜欢包含数据页表的文档,可以使用test-msvba提取出VBA部分。下载libgsf和最新的test-msvba.c,使用如下命令进行编译:

gcc `pkg-config --libs --cflags libgsf-1` -o test-msvba test-msvba.c

Note: 必须安装libgsf-devel开发包.

现在,你可以使用下面的命令从文档中提取VBA宏:

find -name '*.xls' -exec sh -c 'test-msvba {} >> ~/excel-vba-stream-for-noel.bas' \;

pole

或者你可以使用带有图像界面的POLE。POLE是可以访问结构存储,是一个可迁移的C++库。其兼容微软存储结构,并识别一些OLE文档(OLE Compound Document)

从微软电子表格输出宏

打开文档并编辑相关宏。在屏幕的左边有模块的列表。用鼠标右键打开上下文菜单,点击“输出”。这个模块就被存储为一个大的*.bas文件。

提交给

如果你准备提交纯VBA文件,请直接发送到[Noel.Power@novell.com]

实现

需要的顺序

添加IDL

IDL文件在oovbaapi/org/openoffice/*。通过其他的IDL文件,你可以很快的明白IDL语法。 一下两件事情比较重要:

  • 确认参数名称正确。这样,类似 MsgBox title:="hello" 的语法就可以正确解析。
  • 对于可选参数,你需要使用 any 类型。

编辑完IDL文件后,需要下面的动作:

  • 在oovbaapi中运行: build && deliver (可能需要删除types.db文件)。

添加实现

实现的代码在sc/source/ui/vba/ - 创建头文件和cxx源文件。添加方法(使用正确的原型)到头文件 - 可以方便的从在sc/unxlngixxx/inc/org/openoffice/vba/ 中的C++头文件中复制过来。

接着在.cxx文件中实现这些方法。然后运行 build debug=true

运行

你的[linkoo]正确配置了吗?-如果是,直接的运行 soffice.bin (首先运行 killall -9 soffice.bin 确认没有隐藏的进程(lurked factory process))。

当然,你需要增加一个测试用例到 ooo-build/test/macro/* 检测实现. 同样,回到前面所作的,如果你希望分享的进展,在ooo-build/scratch目录使用 cvs diff -u | tee /tmp/foo.diff 就可以产生对应的补丁文件。你可以发邮件给 Noel 或者到 ooo-build 邮件列表提交你的补丁。 特别:首先需要签署一份JCA.

Testing

测试对我们所作的工作非常重要。你可以使用ooo-build/test/macro目录下的测试案例,也可以亲自创建测试案例。

创建测试案例,最好直接使用微软的电子表格?

其他语言访问VBA API

VBA API的实现是一个UNO服务,并且是单例模式(singleton)。 任何拥有UNO绑定的编程语言都可以使用其API。这些API的入口,是一些特定的由该UNO导出的全局变量{ Application, ActiveWorkbook and ActiveSheet }或者方法{ WorkSheets, WorkBooks }。 通过这些全局的变量或方法,就可以访问其他的API。

注意: 因为idl是不稳定,(或者说,在可预见的未来不会被”发布“ )会改变,所以,如果你使用的语言对接口是二进制依赖(像c++和java ),就请注意。


Python

vba = uno.getComponentContext().getByName("/singletons/org.openoffice.vba.theGlobals")
sheet = vba.ActiveSheet
book = vba.ActiveWorkbook

Java

import org.openoffice.vba.*;
"
// getComponentCtxFromSomewhere is a fictional
// routine representing acquisition of the component context
// from e.g. remote ServiceManage if the code is a remote client
// or from the XScriptContext if this were a java ScriptingFramework script 

XComponentContext ctx = getComponentCtxFromSomewhere(); 
Object oGlobs = ctx.getValueByName(
                "/singletons/org.openoffice.vba.theGlobals");
XGlobals xGlobs = AnyConverter.toObject(
                new Type(XGlobals.class), oGlobs);
XWorkBook xWBook =  xGlobs.getActiveWorkbook();
XWorkSheet xSheet = xGlobs.getActiveWorkSheet();

OO Basic

OO宏就像VBA一样,可以自动的访问这些全局变量和方法,所以不需要使用API创建或访问这些单例对象。

msgbox "Name of the current document is " & ActiveWorkbook.Path
Personal tools