delphi 调用 Excel 宏

    技术2022-05-11  59

    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}InterfaceUses 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显示的内容输出数据到Excelprocedure AddExcelMaro();{------------------------------------------------------------------------------}{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}ImplementationVar 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();varV:_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;beginvArg1:= 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)