起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1212|回复: 5

平台的VBA调用[分享]

[复制链接]
发表于 2008-12-24 11:35:50 | 显示全部楼层 |阅读模式
零零碎碎也写了一些DispatchHelper调用vba的例子。有一些心得拿出来共享一下。大部分alang都写过,但是包括我们都会犯一些很不经意的错误。
alang的分享帖:
   http://bbs.justep.com/forum.php?mod=viewthread&tid=25218
http://bbs.justep.com/forum.php?mod=viewthread&tid=13656
回复

使用道具 举报

 楼主| 发表于 2008-12-24 11:36:05 | 显示全部楼层
心得:   
1、大部分的office的vba,x3平台的DispatchHelper对象都是可以处理的。注意是大部分,并不是所有。因为DispatchHelper本身对象的一些缺陷,造成了某些方法或者属性调用不正常。
  调用不成功的例子:http://bbs.justep.com/forum.php?mod=viewthread&tid=24789
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-24 11:41:04 | 显示全部楼层
2、office的调用需要了解vba的语法。学会用office本身提供的工具和帮助去查询我们要的语句。

   比如这个帖子:http://bbs.justep.com/forum.php?mod=viewthread&tid=21679  
               (  请问怎样在word文档中查找正则表达式?   其实是word的通配符查找)
里面有一个很复杂的方法 Function Execute
     我是通过vba的对象查看器,查询里面的参数。

1.jpg

101.61 KB, 下载次数: 778

回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-24 11:45:00 | 显示全部楼层
接上:
   里面每一参数的类型是通过office的帮助查询的。
例如参数:MatchAllWordForms通过下面的工具我们能看出是boolean类型的。

1.jpg.jpg

101.81 KB, 下载次数: 766

回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-24 11:48:34 | 显示全部楼层
接上:
   我们可以模仿以前别人写的代码,去翻译vba就可以了。
   vba代码的来源一般有3个:
   1、通过office的宏录制功能获得。
   2、通过百度或者谷歌去查询。
   3、我们自己写的。
   比如
   Range("A3:F3").Select         
       ActiveWindow.FreezePanes = True
    这个是通过方法1获得的。
  我们要分析出里面的对象方法和属性。
  Range("A3:F3") ,ActiveWindow 是对象   用PropertyGet和DispatchHelper.Create()   
Select       是方法      用InvokeMethod
   FreezePanes  是属性   用  PropertyPut
  x3代码:
   
procedure TMainForm.Button1Click(Sender: TObject);
var
  lFileName: String;
begin
  if OpenDialog1.Execute then
  begin
    lFileName := OpenDialog1.FileName;
    fxls := ComObj.CreateOleObject('Excel.Application');
    FApp := DispatchHelper.Create(fxls);
    FApp.PropertyPut('Visible', [True]);

    docs := FApp.PropertyGet('Workbooks',  []);
    FDocs := DispatchHelper.Create(docs);

    FDocs.InvokeMethod('Open', [lFileName]);
    end;
end;

procedure TMainForm.Button2Click(Sender: TObject);
begin
//fapp.InvokeMethod('save', []);
  fapp.InvokeMethod('quit', []);
  (docs as System.IDisposable).Dispose;

  (fxls as System.IDisposable).Dispose;

end;

procedure TMainForm.Button3Click(Sender: TObject);
var
Range,aw: DispatchHelper;
o1,o2bject;
begin
//Range("A3:F3").Select
//ActiveWindow.FreezePanes = True
o1:= FApp.PropertyGet('Range', ['A3:F3']);
  Range := DispatchHelper.Create(o1);//属性和对象
  Range.InvokeMethod('Select',[]);   //事件
o2:= FApp.PropertyGet('ActiveWindow', []);
  aw:=DispatchHelper.Create(o2);//属性和对象
  aw.PropertyPut('FreezePanes',[true]);
  (o1 as System.IDisposable).Dispose;
  (o2 as System.IDisposable).Dispose;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-24 11:58:26 | 显示全部楼层
3、我们最头疼的是我们quit后,word或者excel等进程还在进程里面存在。
  有个好办法解决:
  只要是  DispatchHelper.Create  出来的object对象,都要  
  (o2 as System.IDisposable).Dispose;
  所有的都Dispose就不会遗留进程了。
需要注意的
  1、别忘记某个对象的释放。因为bbs上很多
lSelection := DispatchHelper.Create(FApp.PropertyGet('Selection', []));  类似这样的嵌套写法,所以造成了我们忘记释放对象。
   2、注意对象释放的顺序。
   3、PropertyGet出来的object不用释放。如果后面有DispatchHelper.Create语句,是必须释放的。
   例子:o1:= FApp.PropertyGet('Range', ['A3:F3']);
              Range := DispatchHelper.Create(o1);//属性和对象
        o1必须释放。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-28 15:01 , Processed in 0.040509 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表