ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2866|回复: 4

[求助] ★VBA如何控制word自动用学生姓名当文件名保存?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-1-19 20:16 | 显示全部楼层 |阅读模式
本帖最后由 it_hunter 于 2016-1-19 22:10 编辑

现在手头有一个word文档,是一个关于很多学生的成绩通知书,其中每一页对应一个学生,目前已用VBA代码将每一页提出来单独保存。但是文件名是“通知书-1.DOC"、”通知书-2.DOC“。。。。等等。
因为每一页中学生的姓名位置是固定的(如下图),所以希望通过vba编程将姓名(每个学生不同)字符提取出来,以便作为文件名自动保存。

(姓名字符在文档中的特点:前面有”学生“两个字,后面是”已“字,且姓名都是自动添加了下划线的。)。

不知道在vba中如何读取这个特定位置的文字出来。特求助解决,谢谢!

附:目前实现将该文件自动按每一页自动保存为”通知书-1.DOC“"通知书-2.doc“……的VBA代码(该代码在文档的thisdocument模块中,能够正确执行)如下:

--------------------------------------------
Sub SaveAsPage()

Dim PageCount As Integer, StartRange As Long, EndRange As Long, MyRange As Range, Fn As String, MyDoc As Document
On Error Resume Next
If Dir("D:\通知书", vbDirectory) <> "" Then                           '判断文件夹是否存在
        MsgBox "文件夹存在", , "提示"            '提示
Else
     MsgBox "文件夹不存在!在D盘创建一个名为“通知书”的文件夹", , "提示"         '文件夹不存在的提示
     MkDir "D:\通知书"                                            
End If
ChangeFileOpenDirectory "D:\通知书"
PageCount = Selection.Information(wdNumberOfPagesInDocument)
Range(0, 0).Select '将光标移至文档起点
For I = 1 To PageCount '设置循环次数
    StartRange = Selection.Start '取得该页的第一个字符位置
    Selection.EndKey Unit:=wdLine '将光标移动到该页首行的最后位置
     Fn = "FILE" & I&".DOC"
       If I = PageCount Then '如果循环到达最后一页
        EndRange = ActiveDocument.Content.End '将文档最后位置赋值于EndRange
      Else
        Selection.GoToNext (wdGoToPage) '否则,将下一页的起始位置赋值于EndRange(等同于本页的最后位置)
        EndRange = Selection.Start
     End If
    Set MyRange = Range(StartRange, EndRange) '将本页中的内容进行复制
    MyRange.Copy
    Set MyDoc = Documents.Add '新建一空白文档
    MyDoc.Range(0, 0).Paste '在文档开始处粘贴
    MyDoc.SaveAs FileName:=Fn '保存文档名
    MyDoc.Close '关闭文档
Next
End Sub


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

1.png

通知书样本.rar

158.09 KB, 下载次数: 76

TA的精华主题

TA的得分主题

发表于 2016-1-20 10:52 | 显示全部楼层
楼主,我是在2003中测试的,不敢保证在2007或以上正确。请先备份原文件后再测试,测试完毕与原文件对照一下以保正确。
  1. Sub SaveAsPage_New()
  2.     Dim PageCount As Integer, StartRange As Long, EndRange As Long, MyRange As Range, Fn As String, MyDoc As Document, i As Long
  3.     On Error Resume Next
  4.     If Dir("D:\通知书", vbDirectory) <> "" Then                           '判断文件夹是否存在
  5.             MsgBox "文件夹存在", , "提示"            '提示
  6.     Else
  7.          MsgBox "文件夹不存在!在D盘创建一个名为“通知书”的文件夹", , "提示"         '文件夹不存在的提示
  8.          MkDir "D:\通知书"
  9.     End If
  10.     ChangeFileOpenDirectory "D:\通知书"
  11.     PageCount = Selection.Information(wdNumberOfPagesInDocument)
  12. '    Range(0, 0).Select '将光标移至文档起点
  13.     Selection.HomeKey unit:=wdStory
  14.     For i = 1 To PageCount '设置循环次数
  15.         StartRange = Selection.Start '取得该页的第一个字符位置
  16.         Selection.EndKey unit:=wdLine '将光标移动到该页首行的最后位置
  17. '        Fn = "FILE" & i & ".DOC"
  18.         If i = PageCount Then '如果循环到达最后一页
  19.             EndRange = ActiveDocument.Content.End '将文档最后位置赋值于EndRange
  20.         Else
  21.             Selection.GoToNext (wdGoToPage) '否则,将下一页的起始位置赋值于EndRange(等同于本页的最后位置)
  22.             EndRange = Selection.Start
  23.         End If
  24.         Set MyRange = ActiveDocument.Range(StartRange, EndRange) '将本页中的内容进行复制
  25.         MyRange.Copy
  26.         Set MyDoc = Documents.Add '新建一空白文档
  27.         MyDoc.Range(0, 0).Paste '在文档开始处粘贴
  28.         
  29. '取得学生名字
  30.         Selection.HomeKey unit:=wdStory
  31.         Selection.ClearFormatting
  32.         Selection.Find.Execute findtext:="学生", Forward:=True, Wrap:=wdFindStop
  33.         If Selection.Find.Found = True Then
  34.             Do
  35.                 Selection.MoveEnd unit:=wdCharacter, Count:=1
  36.             Loop Until Selection Like "*已于"
  37.             Selection.MoveStart unit:=wdCharacter, Count:=2
  38.             Selection.MoveEnd unit:=wdCharacter, Count:=-2
  39.         End If
  40.         
  41.         Fn = Selection.Text
  42.         Fn = Fn & ".doc"
  43. '
  44.         ActiveDocument.Paragraphs.Last.Previous.Range.Delete
  45.         ActiveDocument.Paragraphs.Last.Range.Select
  46. '最后一段,设置为1磅
  47.         With Selection.Font
  48.             .Size = 1
  49.             .Kerning = 0
  50.             .DisableCharacterSpaceGrid = True
  51.         End With
  52.         With Selection.ParagraphFormat
  53.             .LineSpacing = LinesToPoints(0.25)
  54.             .AutoAdjustRightIndent = False
  55.             .DisableLineHeightGrid = True
  56.         End With
  57. '''
  58.         MyDoc.SaveAs FileName:=Fn '保存文档名
  59.         MyDoc.Close '关闭文档
  60.     Next
  61. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-20 16:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
很好,在word2013中测试通过了,非常感谢啊!

TA的精华主题

TA的得分主题

发表于 2019-3-13 15:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
太好了,如何改成第一行呢?

TA的精华主题

TA的得分主题

发表于 2019-3-13 20:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
提取姓名可以用正则表达式或两个split
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-25 01:49 , Processed in 0.042555 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表