在利用下面的方法打开Excel后,怎样在工作薄中加入宏或者过程。然后再执行,最后关闭。我想问如何执行和加入过程或宏?试过可以就给分
opendialog1.Execute;
Try
ExcelApplication1.Connect;//EXCEL应用程序
Except
MessageDlg('Excel may not be installed',mtError, [mbOk], 0);
Abort;
End;
ExcelApplication1.Visible[0]:=True;
ExcelApplication1.Caption:='Excel Application';
try
excelapplication1.Workbooks.Open(opendialog1.FileName,
null,null,null,null,null,null,null,null,null,null,null,null,0);//打开指定的EXCEL 文件
except
begin
ExcelApplication1.Disconnect;//出现异常情况时关闭
ExcelApplication1.Quit;
showmessage('请选择EXCEL电子表格!');
exit;
end;
end;
opendialog1.Execute;
Try
ExcelApplication1.Connect;//EXCEL应用程序
Except
MessageDlg('Excel may not be installed',mtError, [mbOk], 0);
Abort;
End;
ExcelApplication1.Visible[0]:=True;
ExcelApplication1.Caption:='Excel Application';
try
excelapplication1.Workbooks.Open(opendialog1.FileName,
null,null,null,null,null,null,null,null,null,null,null,null,0);//打开指定的EXCEL 文件
except
begin
ExcelApplication1.Disconnect;//出现异常情况时关闭
ExcelApplication1.Quit;
showmessage('请选择EXCEL电子表格!');
exit;
end;
end;
解决方案 »
- 调用数据放到哪个事件中好呢?
- 怎么用mmtool把wav转mp3啊??用里面的哪个控件啊??怎么用啊???
- Remote Desktop 管理不了我的远程服务器了!!急,急,急!
- 怎样在程序中得到TMemo组件中文本的行数和每一行的内容?
- 关于程序打包问题!!!100分求救!!!
- 动态创建的控件如何编写他的事件呢
- 高分征求Dream infogrid等的解压口令
- StringGrid字体颜色问题
- 怎么搞的??!!我搜索时怎么老是出错!!!!这网站也做得太差了吧。
- 用query组件,还是老问题,如何显示当前正在操作的记录号?(之前同类问题已给分,但又碰到新问题)
- delphi6 与C++Builder6 共存的问题
- 向那些因为我得帖子而被扣掉信誉分的xdjm道歉!
要把它加入到现有的Excel文件,不是新建的Excel
但是我们充分的利用VBA代码就可以弥补这个功能。
Word作为一个功能强大的Com,可以很容易被编程工具调用,成为办公自动化系统中处理文档
的强有力的嵌套工具,尤其是充分Word本身的录制宏的功能,更进一步减轻了编程的负担。
下面就如何在Delphi里面利用Word的VBA代码进行一些总结。
1、 生成VBA代码。Word本身具有很强的可扩展性,尤其是支持用户自定义功能,其实现
的主要方式就是通过VBA代码来实现的。在“工具->宏->Visual Basic编辑器”里面就可以看
到具体的宏代码,可以直接进行编辑。而且还可以使用录制宏的功能自动生成宏代码。方法是
选择“工具->宏->录制新宏”,然后执行自己想通过程序实现的功能,如存盘、打印等功能,
此时Word一边执行你要实现功能,一边将你的操作生成了一个宏,在实现功能后,可以选择
“工具->宏->VisualBasic编辑器”,查看生成的宏代码。例如:我们要将文档中的“讨论”全部替换成“研讨”。
a. 点击“工具->宏->录制新宏”,直接点击确定,默认的宏保存到了Normal.dot系统公
用模板里面。
b. 点击“编辑->查找”,出现弹出对话框,输入查找和替换的字,点确定。进行替换。
c. 结束宏的录制,点击结束按钮。
d. 按F11或者“工具->宏->Visual Basic 编辑器”,查看宏代码。缺省查看Normal里面
的模块里面的NewMacros模块。
以下是生成的宏代码:
Sub Macro1()
'
' Macro1 Macro
' 宏在 2002-2-1 由 yzhshi 录制
'
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "讨论"
.Replacement.Text = "研讨"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = True
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
2、 精简宏代码。通常,生成的宏代码有很多语句对你要实现的功能来说都是多余的。我们要
做的就是如何找到我们需要的代码。此时我们查看具体的代码,剔除明显没有用途的代码,然后光
标停留在宏上面,按F5执行,看是否实现功能,逐步精简,得到最小代码。此步骤可参考Word的
VBA帮助来判断代码是否有用。如上例,精简下来,剩下以下代码。
Sub Macro1()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "讨论"
.Replacement.Text = "研讨"
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub3、 转换成Delphi代码。这一步其实很简单,对于VBA代码,只需要在前面添加Word的句柄或者
文档的句柄或者文档的句柄.Application就可以直接操作了。
例:逐句翻译:(Word_Handle是Word的句柄)
(VB) Selection.Find.ClearFormatting
(Delphi) Word_Handle.Selection.Find.ClearFormatting;(VB) Selection.Find.Replacement.ClearFormatting
(Delphi) Word_Handle.Selection.Find.Replacement.ClearFormatting;
以上两句简单添加上Word的句柄就可以了。(VB) With Selection.Find
Text = "讨论"
Replacement.Text = "研讨"
End With
(Delphi) Word_Handle.Selection.Find.Text := '讨论';
Word_Handle.Selection.Find.Replacement.Text := '研讨';
以上几句因为Delphi不支持Variant的With结构,所以分开写。同时转换成Delphi语法。(VB) Selection.Find.Execute Replace:=wdReplaceAll
(Delphi) Word_Handle.Selection.Find.Execute(Replace:=2);
上面一句存在一个小技巧,如何找到常量wdReplaceAll的数值为2?
这里有几个办法,
一:直接use Word2000或者word97单元,那么直接使用常量wdReplaceAll就可以了;
二:到Word2000.pas或者Word97.pas里面查找wdReplaceAll的数值;
三:直接使用VBA代码见wdReplaceAll的数值显示出来。办法是写一个小过程,然后执行,如下:
Sub ShowValue()
MsgBox wdReplaceAll
End Sub最后补充一下,很多关于Word的东西可以从Word的VBA帮助里面获得。具体文件在
?:\Program files\Microsoft Office\Office10\2052(XP)下,VBAWD10.CHM,其他版本路径基本类似。
这句中的[0] 0 是lcid这个到底是什么意思,我试过了,用0不行的,那要用什么呢?
我把程序放在下面 供大家参考 Try
ExcelApplication1.Connect;//EXCEL应用程序
Except
MessageDlg('本机可能没有正确安装Excel,请检查!',mtError, [mbOk], 0);
Abort;
End;
try
ExcelApplication1.Visible[0]:= cbView.Checked ;
ExcelApplication1.Caption:='Excel Application';
excelapplication1.Workbooks.Open(edtSourceFile.text,null,null,null,null,null,null,null,null,null,null,null,null,0);//打开指定的EXCEL 文件
except
begin
ExcelApplication1.Disconnect;//出现异常情况时关闭
ExcelApplication1.Quit;
showmessage('请选择EXCEL电子表格!');
exit;
end;
end;
try
sCurPath := ExtractFilePath(Application.ExeName); //GetCurrentDir;
if sCurPath[length(sCurPath)]='\' then delete(sCurPath, length(sCurPath), 1);
//获得文件名
sFileBas := sCurPath+'\jsyd.bas' // 文件jsyd.bas为VBA脚本程序
intCount := excelapplication1.VBE.VBProjects.Count; excelapplication1.VBE.VBProjects.Item(intCount).VBComponents.Import(sFileBas);
excelapplication1.Run('CovertFile',intB,intRow,intBh+1,edtCovertPath.text) // CovertFile是过程名,后面是这个过程的参数
ExcelApplication1.Disconnect;//出现异常情况时关闭
ExcelApplication1.Quit;
showmessage('操作完成!');
chdir(ExtractFilePath(Application.ExeName));
except
on e:exception do
begin
ExcelApplication1.Disconnect;//出现异常情况时关闭
ExcelApplication1.Quit;
showmessage('请把EXCEL中的工具菜单->宏->安全性中可靠来源页的信任对于"Visual Basic 项目"的访问(V)'+e.Message);
chdir(ExtractFilePath(Application.ExeName));
exit;
end; end;
end
else begin
showmessage('请选择文件路径和输出路径!');
chdir(ExtractFilePath(Application.ExeName));
exit;
end;