您的位置:首页 > 编程语言 > Delphi

delphi 调用 Excel 宏

2009-10-15 16:15 281 查看
作者 : handsome1234

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.



说得很多,但是最关键的几点是:
// V.CodeModule.AddFromString('Public Sub test() '+#13+'msgbox("test") '+#13+'end sub');
{动态加载宏除了的几种方法:V.CodeModule.AddFromString
V.CodeModule.AddFromFile
V.CodeModule.InsertLines
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: