`
congjl2002
  • 浏览: 215437 次
  • 性别: Icon_minigender_1
  • 来自: 辽宁
社区版块
存档分类
最新评论

Java程序员的第一个VBA程序

阅读更多

前言

受同事的委托,要我帮忙做一个将word批注提取出来导入到Excel中的工具

以前听说过office有VBA,宏之类的东西,而且和VB相似(本人以前做过简单的VB开发,但基本都忘没了),就答应了下来

经过一番苦战,终于完成了,回头看一下自己走过来的路,发现又学到很多东西,同时发现了一片新大陆,在Microsoft Office\OFFICE11\2052路径下,有VBA API的文档,而且是装了office以后自带的,这些宝贝在那待了那么长时间浪费啦。接下来我就说一下这次的开发过程吧,也算是一个小的总结。

需求开发

对于自己不了解的东西,到网上搜索就没有错了

在baidu里搜了一下“word 批注 excel”,还真有现成的代码,本着拿来主义,将代码拷贝到了excel的编辑器中,将文件路径这类的东西改了一下,运行!别说,还真好用。于是就拿去向同事交差。把网上的东西直接拿来就用当然不能满足同事的要求,于是同事又提了一大堆需求(同事也算是客户了,要求也算是需求),比如要可以在弹出的浏览窗口选择文件;不光要显示批注,还要显示批注的人和批注的章节位置;要可以导出到她(当然是她了)提供的统计模板里等等。

既然大框已经有了,接下来就是在基础上继续的完善了,我们接下来就一个一个来吧。

解题思路

弹出选择文件的提示框,又是网上一顿搜,结果搜来的都是打开文件夹的,郁闷,看来得自己动手了。

网上找的:Set fd = Application.FileDialog(msoFileDialogFolderPicker)
但只能打开文件夹,据我对VB的了解,两者应该是在方法中的参数上有所区别,经过再一的查找,终于找到了,将上述代码改为:Set fd = Application.FileDialog(msoFileDialogOpen)。嘿嘿,稍作修改以后,成功。

批注的内容和人很容易,直接在对象的后面点就能点出属性来,于是我迅速的添加上该功能并迫不及待的运行起来。结果出来后我发现问题了,批注的作何和批注人都可以得到,但是批注的位置却没有属性能能够得到。

其实,这部分也是这次开发最耗费时间的部分,我自己些的代码基本上都是在这部分了(不知道为什么网上竟然没有这部分的代码)。

这个时候的思维方向我认为是很重要的,要是走错了路,在往回走就更困难了,但没准也是个捷径,不知道了,反正我是按如下方式思考的:

要求搜索的是批注所在的章节号,章节是样式的一种,记得word中有可以搜索样式的功能,具体怎么操作就还的上网查了,这个通用的查找功能当然很容易找到,也有说用宏来录制一段看代码的,我就两种方式都试验了一下,最后得到了如下代码:

          With appword.Selection.Find
                  .Style = appword.ActiveDocument.Styles("标题 1")
                  .Forward = False
                  .Wrap = wdFindStop
                  .MatchByte = True
          End With

这里我采用的是从批注位置向上查找的方法,原因当然是批注所在段落的标题一定在批注的上面啦,“哎,这个你咋还给我们解释呢,上火”。别急,下面就是我解释的原因了,查找的时候大家可能都遇到过这种情况,比如字符串“aaabbb”,我想查找“ab”,但是关键是我现在鼠标的位置就是在“ab”这个字符串的中间,这样,查找的结果就是找不到字符串“ab”。我举这个例子就是说,当你在标题中打上批注的话,他找到的就是上一个章节的标题,这样错误就严重了,不是有那么一句名言吗“没有总比错误好”。对啊,告诉人家错了地方,还不如直接就说不知道。找到问题了,接下来就让我们来解决这个问题,还是按我们的方式,先想想和我们以前知识的积累有没有想关联的,必经我们已经搞了1年多的计算机了。

其实想想也很好解决,只要让光标焦点移到字符串的后面,就可以查到所要查找的位置了,接下来的关键就是在word里用vba怎么定制光标的位置。信息多了还真就是个麻烦事,在网上搜了很长时间,才找到一篇非常理想的文章,当然对于这么来之不易的文章我当然要搜藏了,在我前几篇文章里有全文的转帖。既然解决了,当然通过.selection就可以获得查到的标题了。这里还有一个问题,就是如何判断标题的级别,比如我要是批注了第二段,怎么能确定上一级标题就是“标题 1”呢,我想了一个很土的办法就是判断标题所在的行数,每次都查出来3级的标题,然后在比较他们行号的大小,将最大行号的标题作为最后显示的标题。恩,标题问题到这基本就完成了,再执行一下程序,完事?还是差了那么一点点,执行的结果中发现,标题只有标题的内容,没有标题的编号,这可不好办啊,接下来我们就来解决编号问题。见代码中文件。

问题都解决了,最后当然要用同事给的模板试一下了,结果发现,在插入行的时候并没有增加,而是将下面的行给覆盖了,这个也不难解决,录一小段宏看看,呵呵,代码都放在那了,就等你去取了。所有东西都结束了,最后是要在执行一下格式刷,将格式整理一下,大功告成。

 

  • 提取word批注_试用版.rar (29.3 KB)
  • 描述: VBA编写的读取word中批注小工具,很高兴很多朋友喜欢,公开代码了,密码:123
  • 下载次数: 162
分享到:
评论
12 楼 congjl2002 2012-11-19  
niuzk 写道
我在office 2003下运行楼主的Excel表,结果提示
编译错误:用户定义类型未定义。
我对VB一窍不通,不知道怎么解决。
另外,在网上找了很多的VB,却没有一个成功的。
请楼主指点。

你好,网上有很多方法解决,请参考以下链接:
http://wenku.baidu.com/view/2d237bec551810a6f5248636.html

删除以下目录中的内容,即可执行:
删除“C:\Users\shourou\AppData\Roaming\Microsoft\Forms”下的所有下的所有EXD文件; 删除“C:\Users\用户名\AppData\Local\Temp\VBE”下的所有EXD文件;
11 楼 niuzk 2011-12-09  
我在office 2003下运行楼主的Excel表,结果提示
编译错误:用户定义类型未定义。
我对VB一窍不通,不知道怎么解决。
另外,在网上找了很多的VB,却没有一个成功的。
请楼主指点。
10 楼 chogo 2010-10-21  
chogo 写道
非常感谢分享代码,最近我也在处理同样的问题~


呃,看代码的时候要求输入密码,请问能否把密码发给我,让我学习一下?
chogo@126.com
9 楼 chogo 2010-10-21  
非常感谢分享代码,最近我也在处理同样的问题~
8 楼 congjl2002 2010-05-29  
没有密码了,完全开源了
7 楼 xiang 2010-01-11  
忘记告诉楼主我的联系方式了:直接在JE网站里给我发消息!
6 楼 xiang 2010-01-11  
正在做把word的批注保存到数据库的程序,找到了楼主这篇文章,非常有借鉴意义!


请楼主给我发个邮件,告诉一下密码,谢谢了!!
5 楼 congjl2002 2009-02-28  
设置了密码,可以给我发信息索取,免费的
4 楼 congjl2002 2008-05-20  
由于是业余时间编写,而且对VBA的了解有限,因此有如下一些问题,希望大家可以和我一起完善
具有的功能:
1.从鼠标选择的excel格开始导入
2.可以列出批注的章节号,批注人,批注范围等信息
存在的问题:
1.如果打开word后点击取消,则再次打开该文档时,提示word已经被占用,可以在进程中关闭word的进程即可
2.最后没有做自动格式化处理,因此,导入时使用的格式其实是鼠标所在小格上面一行的格式,不过最后用格式刷刷一下就可以可

大家有什么更好的意见和建议,请给我留言,谢谢
3 楼 littmount 2008-04-16  
我也是在处理同样的问题,确实是其他的都比较好处理,但是这个批注所在的章节不好获取,能共享一下代码吗,谢谢!david.xuhg@gmail.com
2 楼 congjl2002 2008-03-12  
很抱歉,没有接触过这样的技术
1 楼 slivefox 2008-03-08  
你好。我想问一下,你有在jsp页面编辑word文档,并且将word的批注保存到数据库的代码吗。我看了一下,你的水品很高。希望和你交流交流。Email:jack60508065@sohu.com
QQ:34976064

相关推荐

    Java中使用JCOM操作Office对象

    `ExcelApplication` 类提供了对 Excel 工作簿和工作表的操作,如 `Visible(true)` 显示 Excel 窗口,`Add()` 方法创建新工作簿,`Item(1)` 获取第一个工作表,最后 `xlRange.Item(1, 1).Value("Hello, World!...

    (数据库系统基础、设计及应用)第6章数据库应用程序.ppt

    第 6 章主要探讨的是数据库应用程序的设计与应用,涵盖了多个关键概念和技术。首先,程序设计方法中提到了嵌入式SQL,这是一种将SQL语言(用于定义和操作数据库)与通用程序设计语言(如C++或Basic)相结合的技术。...

    Access_JDBC30

    JDBC是Sun Microsystems(现已被Oracle收购)开发的Java API,它为Java程序员提供了一种标准的方式来访问各种关系型数据库。JDBC包含一组接口和类,允许Java应用程序执行SQL语句,获取结果集,处理事务等。JDBC 3.0...

    取Excel表格有数据单元格的起讫行列.rar

    2. **遍历工作表**:对于每个工作表,找到第一个有数据的单元格(起始行和列)和最后一个有数据的单元格(结束行和列)。 3. **计算范围**:根据找到的起始和结束单元格,确定有数据的单元格区域。 4. **输出结果*...

    以ole方式读取excel文件

    Set worksheet = workbook.Worksheets(1) ' 访问第一个工作表 Dim cellValue cellValue = worksheet.Cells(1, 1).Value ' 获取A1单元格的值 MsgBox "Value in A1 is: " & cellValue workbook.Close SaveChanges:=...

    第一天资料.zip

    "第一天资料.zip"这个压缩包文件包含了学习或工作过程中可能会用到的一些常见资源,我们可以从中挖掘出多个IT相关的知识点。 首先,我们看到一个名为"PPT"的文件夹,这通常包含的是演示文稿,可能是一个讲座、培训...

    DigitalPersona U.are.U 4500 fingerprint SDK

    5. **开发实例**:Readme.txt文件通常会包含安装指南、快速启动示例和使用注意事项,是开发者开始项目的第一步。SDK中的源码实例则展示了如何使用SDK的各个功能,如指纹采集、模板生成、模板比较等,帮助开发者快速...

    2021-2022计算机二级等级考试试题及答案No.1316.docx

    22. **Java Application主类**:Java Application的源程序通常包含一个main方法,它是程序的入口点。 23. **数组初始化**:D选项是错误的,因为字符串数组需要指定长度,不能像这样直接初始化为"ABCDE",会自动添加...

    2021-2022计算机二级等级考试试题及答案No.17114.docx

    在 C 语言中,数组名可以被视为指向数组第一个元素的指针。因此,可以通过指针来访问数组中的元素。然而,尝试访问超出数组范围的元素(如 `x[5]` 对于一个只有五个元素的数组)会导致未定义的行为。 ### 10. ...

    2021-2022计算机二级等级考试试题及答案No.19067.docx

    13. Java源文件的第一条语句应是package声明,用于指定源代码所在的包。 14. 位左移操作符()将操作数的每一位向左移动指定位数,相当于乘以2的位移次数幂,所以左移两位相当于乘以4。 15. JSP中的隐式注释使用`...

    labview Excel读写

    1. **Excel API接口**:在不使用报表模块的情况下,LabVIEW程序员通常会借助第三方库或者API来与Excel通信。例如,可以使用Microsoft Office的自动化接口(Automation Interface),如VBA(Visual Basic for ...

    精彩编程与编程技巧-检测文件是否存在...

    `Dir$`函数默认返回与给定文件名匹配的第一个文件名。如果找不到匹配的文件,则返回空字符串。因此,通过比较`Dir$`返回的字符串是否为空,可以判断文件是否存在。 ##### 处理异常情况 ```vb If Err.Number <> 0 ...

    2021-2022计算机二级等级考试试题及答案No.13108.docx

    20. 第二代计算机元件:第二代电子计算机使用的是晶体管,取代了第一代的电子管。 21. 逻辑运算:在C++或类似的编程语言中,程序段执行后,x的值为1(true),因为(a&&b)&&(c>'A')是逻辑与运算,a和b均为真,且字符...

    2021-2022计算机二级等级考试试题及答案No.475.docx

    - 第一台现代电子计算机ENIAC并非冯·诺依曼发明,但他对计算机体系结构做出了重大贡献,选项错误。 18. 列表标记: - 有序列表(OL)用于创建带有数字列表符号的列表,选项C正确。 19. 程序控制: - LOOP语句...

    2021-2022计算机二级等级考试试题及答案No.17624.docx

    13. C语言指针和数组程序:给定程序的输出结果是2,4,因为指针p指向数组的第一个元素,然后通过q间接访问p,先输出2,然后p自增,q保持不变,所以第二次输出也是4。 14. 菜单项呈暗灰色:在Windows中,如果菜单项...

    Visual_assis_X_Setup1711

    【Visual Assis X Setup1711】是一个针对软件开发者和程序员的专业辅助工具,它旨在提升编程效率,优化代码质量,以及提供可视化的设计和调试功能。这个安装包名为"Visual_assis_X_Setup1711.exe",很可能是一个特定...

    2021-2022计算机二级等级考试试题及答案No.2164.docx

    1. Java内存管理:Java编程语言不同于C++,它不需要程序员手动管理内存。Java的垃圾回收机制会自动回收不再使用的对象,避免内存泄漏。因此,选项A描述错误。 2. Java流:Java中的`FileOutputStream`用于向文件写入...

Global site tag (gtag.js) - Google Analytics