怎么用VBA代码批量提取word中的特定数据到EXCEL

怎么用VBA代码批量提取word中的特定数据到EXCEL,第1张

从你的,可以看出,数据是在WORD文件的表格中的,编个小程序可以解决,思路如下:

1、程序遍历指定文件下的所有DOC类文档,

2、打开找到的第一个文档,遍历文档中的每一个表格,

3、遍历表格中的每一个格子,与关键字进行比较,找出目标,其右侧的单元格中就是你要的字符串

4、程序新建EXCEL表格(这一步可以事先进行)

5、将找到的字符,输出到EXCEL表格中适当位置

6、循环直至文档未

7、循环直至文件夹中所有DOC文档全部处理完成

8----欢迎一起探讨(说明,我用的是C++,调用WORD,与EXCEL用的是ACTIVEX方法)

首先VBS不应该和VB、VBA放在一起比较,它是微软按照自己定义的ActiveX Scripting规范完全从头开始写成的脚本语言,虽然它的语法结构和VB非常相似,但VBS仅仅依靠自动化对象来扩充其功能(只有后期绑定),它不能用implements来实现接口,不可能在VBS里直接使用API,没有VarPtr这样能得到指针的函数,而VBS缺少的这些功能正是VB和VBA所特有的。当然,这不是说VBS不如VB或VBA,Windows已经为VBS提供了足够强大的功能,我们可以用VBS来做脚本COM组件,而且借自动化对象的能力VBS可以说能力无限,所以有病毒用VBS来写,对程序员来说VBS最重要的功能莫过于可以给自己的软件提供宏功能,就象VC中提供的VBS宏功能那样。注意,VBS是Free的,这和在Office中使用VBA来提供宏功能不同,要集成VBA需要价格不低的许可证费用,关于脚本语言可参见MSDN中Platform SDK\Tools and Languages\Scripting。

那么VB和VBA又有什么不同呢?好吧,眼见为实,开始我们的实验吧!

如果装了Office 2000以上版本,那么打开OLEVIEW,点击File下的View TypeLib查看位于E:\Program Files\Common Files\Microsoft Shared\VBA\VBA6下的VBE6dll的类型库,再用同样的方法看看MSVBVM60dll的类型库,你会发现它们的类型库基本上一模一样,除了VBE6多了一个VBEGlobal接口和实现这个接口的Global对象,这个Global对象我们也可以在VBA编程环境(比如用WORD的VB编辑器)中用对象浏览器看到。它有二个方法Load和UnLoad,还有一个UserForms属性,这是因为VBA6使用MS Form 20 Form设计器(FM20dll)来设计和使用UserForm窗体(而在VB6中,我们可以使用多个设计器。比如通过使用MS Form 20 Form设计器,我们就能在VB中使用VBA所使用的UserForm用户窗体)。和VBA的Global对象类似,在VB中也有GLobal对象,从VB的对象浏览器中可以知道它在vb6olb这个类型库中,这个类型库就是每个工程都必须引用的VB对象库,所有的VB内置对象都在这里。而VBA的UserForm中使用的对象都在FM20dll中。

除了上述不同外,VB和VBA还有一个最大的不同,就是VBA不能生成EXE可执行文件,但可以猜想在IDE环境中VBA和VB都要把代码编译成p-code来执行,后面我将用实验来证明的确是这样,虽然在具体的实现上VB和VBA有很大的不同。

从上面的分析上可以看到VB和VBA还是有很大不同的,这种不同主要体现在编程环境和对象结构上,但在本质上它们之间却有着不可割舍的血源关系。如果刚才你仔细地观察了MSVBVM60dll的类型库,你就会发现如下的片断:

// Generated IDL file (by the OLE/COM Object Viewer)

[

dllname("VBA6DLL"),

uuid(35BFBDA0-2BCC-1069-82D5-00DD010EDFAA),

helpcontext(0x000f6ec4)

]

module Strings {

[entry(0x60000000), helpcontext(0x000f665f)]

short _stdcall Asc([in] BSTR String);

[entry(0x60000001), helpcontext(0x000f6e9f)]

BSTR _stdcall _B_str_Chr([in] long CharCode);

……………

}

什么?在MSVBVM60dll中的对象其方法却定义在VBA6DLL中?!VB安装目录下不就有个VBA6DLL吗?再用OLEVIEW看看它,哇噻,真是想不到它居然和MSVBVM60DLL的一模一样。怎么回事?赶快再拿出DEPEND来看看VBA6dll、MSVBVM60dll和VBE6dll这三个DLL的输出函数。哈,又有新发现,我们可以发现在三个DLL的输出函数中从编号512到717绝大部分都是一模一样的一些以rtc开头的函数,比如595的rtcMsgBox(rtc是什么?应该是Run Time Component Control Code有谁知道吗?),这说明三个DLL都有着相同的运行时VBA函数。

我们再用DEPEND来观察一下VB6EXE, 我们可以发现VB6EXE引入了VBA6DLL中一些它特有的以Eb和Tip开头的函数,从这些函数的名称上可以发现它们的功能都是IDE相关的,比如79的EbShowCode和82的TipDeleteModule。VB6EXE恰恰没有引入任何rtc开头的函数(注意一)。我们再来看看MSVBVM60DLL,随便找一个用了MsgBox函数的编译后的文件,用DEPEND来观察它,就会发现它引入MSVBVM60DLL输出的595号rtcMsgBox函数(注意二)。并且引入MSVBVM60DLL中很多以下划线开头的函数,比如__vbaVarAbs(注意三)。其实从这个三个"注意"中我们已经可以进行一些猜想,无论对错,你可以先想想。

如果你没有跟着我做实验,而仅仅是看这篇文章的话,我猜想你应该有点昏了。如果你自己动手做了这些实验,现在你应该充满了疑问而急侍看到结论。所以请一定要亲手试一试,学习研究问题的方法比看结论更重要。

到这里至少我们可以得出结论:VB和VBA本就是同宗的姐妹,只不过姐姐VB的功夫要比妹妹VBA历害些。不过姐姐只会单打独斗是女强人;妹妹却只会傍大款。姐姐有生育能力,是真正的女人;妹妹却不会生崽,但深谱相夫之道,一番教导指挥之下可使她老公增色不少,而VBS呢,也是大户人家的女儿,不过没有VB和VBA姐妹优秀的血统,娇小玲珑干不得粗活只能指挥些自动听话的对象来干活,她乐于助人品德好不象VBA那样只认大款,VB、VBA、vbs三个女人我都喜欢。

docx 这个文档 是一个压缩文档,估计这样保存是有问题的,

需要将 文档的扩展名 改为 doc

你可以这样试一试,你用 RAR解压缩一下 word docx 的文档(你自己新建一个 word 文档) 你会发现 它是可以解压缩的

直到90年代早期,使应用程序自动化还是充满挑战性的领域对每个需要自动化的应用程序,人们不得不学习一种不同的自动化语言例如:可以用EXCEL的宏语言来使EXCEL自动化,使用WORD BASIC使WORD自动化,等等微软决定让它开发出来的应用程序共享一种通用的自动化语言--------Visual Basic For Application(VBA),可以认为VBA是非常流行的应用程序开发语言VISUAL BASIC 的子集实际上VBA是寄生于VB应用程序的版本VBA和VB的区别包括如下几个方面:

1 VB是设计用于创建标准的应用程序,而VBA是使已有的应用程序(EXCEL等)自动化

2 VB具有自己的开发环境,而VBA必须寄生于已有的应用程序

3 要运行VB开发的应用程序,用户不必安装VB,因为VB开发出的应用程序是可执行文件(EXE),而VBA开发的程序必须依赖于它的父应用程序,例如EXCEL

尽管存在这些不同,VBA和VB在结构上仍然十分相似事实上,如果你已经了解了VB,会发现学习VBA非常快相应的,学完VBA会给学习VB打下坚实的基础而且,当学会在EXCEL中用VBA创建解决方案后,即已具备在WORD ACCESS OUTLOOK FOXPRO PROWERPOINT 中用VBA创建解决方案的大部分知识

VBA一个关键特征是你所学的知识在微软的一些产品中可以相互转化

VBA可以称作EXCEL的“遥控器”

VBA究竟是什么更确切地讲,它是一种自动化语言,它可以使常用的程序自动化,可以创建自定义的解决方案

此外,如果你愿意,还可以将EXCEL用做开发平台实现应用程序

Office取得巨大成功的一个重要原因就是VBA,使用VBA可以完成很多事情,基于Excel、Word的VBA小程序不计其数。

VBA程序员很多是业余程序员,正因为业余,解决的却是工作中需要解决的问题;所以,VBA程序大多都是只是在部门内部或个人使用的小工具。

集成了VBA的其他应用程序也很多,但真正能为程序增色的不多。

大多数人看到了VBA可以自动化一个程序,可以扩展已有程序,但没有看到在Office中,VBA代码可以是录制的,而不是写出来的,带来的好处是,学习曲线变得非常缓。如果没有宏录制功能,要熟悉某个Office组件的对象模型,绝非一日之功。

以ArcGIS为例,ArcGIS扩展必须使用ArcObject,不管是使用VBA也罢,VB也罢,还是C++也罢。但同时,ArcObject的学习不是一天两天可以搞定,对于业余程序员,要使用VBA来扩展ArcGIS,几乎没有可能;专业程序员又不屑使用VBA;而对于公司,如果要基于ArcObject来扩展ArcGIS,选择VBA意味着源码的保护很困难。所以,ArcGIS的VBA就如同鸡肋。不过,学习AO的时候,使用VBA比使用其他语言要容易一些,写几行代码,然后直接运行测试结果,这种交互式的学习应该是最好的学习方法。

ArcGIS以及AO与Office相比,还有一个很大的差别,就是ArcGIS缺乏中等粒度的对象,例如Word和Excel的Range对象。对于Office开发,可以在对底层小粒度对象一无所知的状况下做很多事情,这就是抽象的力量。常人可以处理的复杂度是有限的,面对数十个对象和几百个对象,后者需要付出的努力不是10倍,而是数十倍或更多,因为在学习过程中,必须可以把这些对象在大脑中很好的组织,以控制其复杂度。

Visual Basic for Applications(简称VBA)是新一代标准宏语言,是基于Visual Basic for Windows 发展而来的。它与传统的宏语言不同,传统的宏语言不具有高级语言的特征,没有面向对象的程序设计概念和方法。而VBA 提供了面向对象的程序设计方法,提供了相当完整的程序设计语言。VBA 易于学习掌握,可以使用宏记录器记录用户的各种 *** 作并将其转换为VBA 程序代码。这样用户可以容易地将日常工作转换为VBA 程序代码,使工作自动化。因此,对于在工作中需要经常使用Office 套装软件的用户,学用VBA 有助于使工作自动化,提高工作效率。另外,由于VBA 可以直接应用Office 套装软件的各项强大功能,所以对于程序设计人员的程序设计和开发更加方便快捷。

Sub 合并至总表()

 Dim Rng As Range, Rng1 As Range, Rng2 As Range, Sh As Worksheet

 Dim Dic As Object, i1&, j1&, i2&, j2&, K1$, K2$, K3$, i0&

 K1 = "水果": K2 = "其他1": K3 = "其他2"

 Set Dic = CreateObject("ScriptingDictionary")

 ApplicationScreenUpdating = False

 ApplicationDisplayAlerts = False

 ApplicationEnableEvents = False

 For Each Sh In Worksheets

  Dic(ShName) = ""

 Next Sh

 If Not Dicexists("总表") Then

  WorksheetsAdd before:=Worksheets(1)

  ActiveSheetName = "总表"

 Else

  Worksheets("总表")CellsClearContents

 End If

 i0 = 0

 With Worksheets("总表")

  For Each Sh In Worksheets

   If ShName <> Name Then

    Set Rng = ShCellsFind(what:=K1)

    '总表采用第一个分表的两行表头

    If (Not Rng Is Nothing) And i0 = 0 Then

     RngResize(2, 9)Copy Cells(1, 1)

     i0 = 2

     j1 = 3: j2 = 3

    End If

    Set Rng1 = ShCellsFind(what:=K2)

    Set Rng2 = ShCellsFind(what:=K3)

    If Rng Is Nothing Or Rng1 Is Nothing Or Rng2 Is Nothing Then

    Else

     Set Rng = RngOffset(i0, 0)

     Cells(j1, 1)Resize(Rng1Row - RngRow, 5) = RngResize(Rng1Row - RngRow, 5)Value

     Cells(j2, 6)Resize(Rng2Row - RngRow, 4) = RngOffset(0, 5)Resize(Rng2Row - RngRow, 4)Value

     j1 = j1 + Rng1Row - RngRow

     j2 = j2 + Rng2Row - RngRow

    End If

   End If

  Next Sh

  Cells(1, 1)Resize(ApplicationWorksheetFunctionMax(j1, j2) - 1, 9)BordersLineStyle = xlContinuous

 End With

 ApplicationEnableEvents = True

 ApplicationDisplayAlerts = True

 ApplicationScreenUpdating = True

 Set Dic = Nothing

End Sub

以上就是关于怎么用VBA代码批量提取word中的特定数据到EXCEL全部的内容,包括:怎么用VBA代码批量提取word中的特定数据到EXCEL、VB和VBA详细的区别都用在什么地方、用vba建立的word文档不能打开等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10092645.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存