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.
