delphi 调用 Excel 宏

delphi 调用 Excel 宏

我的理解宏就是函数,只要我能调用VBA的函数就算是调用Excel宏.
最近很长时间研究如何用delphi调用Excel宏,找了很多资料,大多是讲如何调用Excel,有好几种方式,但真正讲宏的很少,我现在把我的资料共享一下,省得今后有想了解这方面内容的兄弟姐妹们少走弯路。:
1、加载activex和vbide97单元,其中vbide97具体路径在C:/Program Files/Borland/Delphi5/Ocx/Servers下
   
{动态加载宏除了的几种方法:V.CodeModule.AddFromString
                          V.CodeModule.AddFromFile
                          V.CodeModule.InsertLines
还有一些方法在vbide97.pas里面都可以找到
}
其中V:_VBComponent;类型

我在 UseExcel单元中加了AddExcelMaro这个函数,可以直接调用。

下面是UseExcel.pas 其中是msgboxVBA的一个函数。

unit UseExcel;   //将数据导入Excel的单元
{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}
Interface
Uses DBGrids,SysUtils,StdCtrls,ExtCtrls,Windows,Dialogs,Classes,Forms,Excel97,
Controls,DB,OleServer,activex,vbide97;
{------------------------------------------------------------------------------}
procedure PutOutData(DBN:TDataSet; PXM:TDBGrid);
//PXM=TDBGrid控件显示的内容, DBN=TDBGrid控件连接的TDataSet.
//将PXM显示的内容输出数据到Excel
procedure AddExcelMaro();
{------------------------------------------------------------------------------}
{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}
Implementation
Var ExApp:TExcelApplication; ExlWb:TExcelWorkbook; ExWS:TExcelWorksheet;
{******************************************************************************}
Function CreateExcel:Boolean;
Begin
  ExApp:=TExcelApplication.Create(Forms.Application);//这里也很关键,在vbide里Application也是一个类型,所以只能在他前面加上Forms.,否则编译报错。
  ExApp.ConnectKind:=ckNewInstance;
  ExlWb:=TExcelWorkbook.Create(Forms.Application);
  ExlWb.ConnectKind:=ckRunningOrNew;
  ExWS:=TExcelWorksheet.Create(Forms.Application);
  ExWS.ConnectKind:=ckRunningOrNew;
  CreateExcel:=True;
  Try
  ExApp.Connect;
  Except
  CreateExcel:=False;
  ExApp.Free;
  ExlWb.Free;
  ExWS.Free;
  End;
End;
{******************************************************************************}
Function CheckPrtXM(DBN:TDataSet; DBField:String):Boolean; Var X:Integer;
Begin
  CheckPrtXM:=False;
  For X:=0 To DBN.FieldDefs.Count-1 Do If DBField=DBN.FieldDefs[X].Name Then
  Begin
    CheckPrtXM:=True;
    Exit;
  End;
End;
{******************************************************************************}
Procedure WriteToExcel(DBN:TDataSet; PXM:TDBGrid); Var X,Y,Row,Column:Integer;

Begin
  ExApp.Visible[0]:=True;
  ExApp.Caption:='编辑打印数据';
  ExApp.Workbooks.Add(Null,0);
  ExlWb.ConnectTo(ExApp.Workbooks[1]);
  ExWS.ConnectTo(ExlWb.Worksheets[1] as _Worksheet);
  Y:=1;
  For X:=0 To PXM.Columns.Count-1 Do If (PXM.Columns[X].Visible=True)
  And (CheckPrtXM(DBN,PXM.Columns[X].FieldName)=True) Then
  Begin
    ExWS.Cells.Item[1,Y]:=PXM.Columns[X].Title.Caption;
    Y:=Y+1;
  End;
  DBN.Last;
  DBN.First;
  Row:=2;
  While Not DBN.Eof Do
  Begin
    Column:=1;
    For X:=0 To PXM.Columns.Count-1 Do If(PXM.Columns[X].Visible=True)
    And(CheckPrtXM(DBN,PXM.Columns[X].FieldName)=True) Then
    Begin
      ExWS.Cells.Item[Row,Column]:=
      DBN.FieldByName(PXM.Columns[X].FieldName).AsString;
      Column:=column+1;
    End;
    DBN.Next;
    Row:=Row+1;
  End;
End;

procedure AddExcelMaro();
var
V:_VBComponent;
  vArg1, vArg2, vArg3, vArg4, vArg5, vArg6, vArg7, vArg8, vArg9, vArg10,
  vArg11, vArg12, vArg13, vArg14, vArg15, vArg16, vArg17, vArg18, vArg19, vArg20,
  vArg21, vArg22, vArg23, vArg24, vArg25, vArg26, vArg27, vArg28, vArg29, vArg30: OLEVariant;
begin
vArg1:= EmptyParam; vArg2:= EmptyParam; vArg3:= EmptyParam; vArg4:= EmptyParam;
      vArg5:= EmptyParam; vArg6:= EmptyParam; vArg7:= EmptyParam; vArg8:= EmptyParam;
      vArg9:= EmptyParam; vArg10:= EmptyParam; vArg11:= EmptyParam; vArg12:= EmptyParam;
      vArg13:= EmptyParam; vArg14:= EmptyParam; vArg15:= EmptyParam; vArg16:= EmptyParam;
      vArg17:= EmptyParam; vArg18:= EmptyParam; vArg19:= EmptyParam; vArg20:= EmptyParam;
      vArg21:= EmptyParam; vArg22:= EmptyParam; vArg23:= EmptyParam; vArg24:= EmptyParam;
      vArg25:= EmptyParam; vArg26:= EmptyParam; vArg27:= EmptyParam; vArg28:= EmptyParam;
      vArg29:= EmptyParam; vArg30:= EmptyParam;
  V:=ExlWb.VBProject.VBComponents.Add(TOleEnum($00000001));
  V.name:='Module';
//  V.CodeModule.AddFromString('Public Sub test() '+#13+'msgbox("test") '+#13+'end sub');
{动态加载宏除了的几种方法:V.CodeModule.AddFromString
                          V.CodeModule.AddFromFile
                          V.CodeModule.InsertLines
}
  ExApp.Visible[0] := True;
  ExApp.Run('test',vArg1, vArg2, vArg3, vArg4, vArg5, vArg6, vArg7, vArg8, vArg9, vArg10,
  vArg11, vArg12, vArg13, vArg14, vArg15, vArg16, vArg17, vArg18, vArg19, vArg20,
  vArg21, vArg22, vArg23, vArg24, vArg25, vArg26, vArg27, vArg28, vArg29, vArg30);

    ExApp.Disconnect;
    ExApp.Quit;
    ExApp.Free;
    ExlWb.Free;
    ExWS.Free;


end;

 


{******************************************************************************}
procedure PutOutData(DBN:TDataSet; PXM:TDBGrid);
Begin
  If CreateExcel=False Then ShowMessage('系统中未安装Excel') Else
  Begin
    WriteToExcel(DBN,PXM);


  End;
End;
{******************************************************************************}
end. 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值