谁能帮我解决一下这个VBA宏的问题?

newline 2003-11-20 04:58:54
我在excel里录制了一个宏,可以从数据透视表取得数据,数据透视表是从宏里动态生成的。
当我新建一个excel文件,新建宏,然后把这个宏的代码考过去,执行后可以取得数据。但当再次运行这个宏,因为它已经生成了这个数据透视表,所以就会出错。

我想处了一个解决办法,在宏里首先删除当前workbook里的数据透视表,然后再生成,请问语句怎么写?我对VBA一窍不通,谢谢!

另外,我想在用delphi动态生成新的workbook,然后调用已经存在于一个excel文件的宏(当然如果有从delphi里就能加载的宏就更好了),将数据传到这个新的worksheet里,并保存成excel文件,能实现吗?
...全文
74 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolfilm 2003-11-21
  • 打赏
  • 举报
回复

看看下面的内容,对你也许有帮助。

Word宏和Delphi

前面我就Delphi中调用Word写了一些,比较注重于具体实现,对于研究的方法则说的比较片面。

今天晚上,我静下心来,总结了一下怎样在Delphi中生成操作Word的代码。如果说前面我写的

是金子,那么下面这篇文章就是点石成金的手指(太自夸了,呵呵)。毕竟已经有半年多没有研

究这些了,只能零碎的写一些心得了。

使用CreateOleObject方式调用Word相比Service控件的最大缺点就是不支持代码的自动生成,

但是我们充分的利用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 Sub

3、 转换成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帮助里面获得。具体文件在

-------------------------------------------------------

//可以替换所有的Range的内容
procedure ToReplaceTextEx1(vDocment :OleVariant;FindText ,ReplaceText :AnsiString);
var
iCount,i:Integer ;
Range:OleVariant ;
begin
try
iCount:=vDocment.Paragraphs.Count ;
for i:=1 to iCount do
begin
Range:=vDocment.Paragraphs.Item(i).Range ;
if Pos(FindText,Range.Text)>0 then //Range.Text='<@证据内容@>'
begin
Range.Text:=ReplaceText ;
end;
end
finally
end;
end;

5,939

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧