ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 请教:用vba怎么将一个大型文档按照指定页数进行分割?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-3-6 09:15 | 显示全部楼层 |阅读模式
本帖最后由 怀英慕者 于 2012-3-6 18:10 编辑

我有一份大型的文档,每两页内容一样,由于页数太多,领导又要求按照每两页一份文档进行分割,任务量太大,那么用VBA怎么实现呢?
问题已解决,代码请见6楼。

TA的精华主题

TA的得分主题

发表于 2012-3-6 10:49 | 显示全部楼层
本版上有相关代码,请认真查找。

TA的精华主题

TA的得分主题

发表于 2012-3-6 11:16 | 显示全部楼层
Sub 每两页一文档()
Dim s%, mydoc
For s = 1 To ActiveDocument.Range.Information(wdNumberOfPagesInDocument) Step 2
With ActiveDocument
.Range(.GoTo(wdGoToPage, wdGoToNext, , s).Start, VBA.IIf(s >= .GoTo(wdGoToPage, wdGoToNext, , s).Information(wdNumberOfPagesInDocument), .Content.End, .GoTo(wdGoToPage, wdGoToNext, , s + 2).Start)).Copy
End With
Set mydoc = Documents.Add(Visible:=False)
With mydoc
.Content.Paste
.SaveAs s & ".doc" '此处偷工减料没有采用word默认文件名,直接数字了
.Close
End With
Set mydoc = Nothing
Next
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-3-6 12:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
sqhsqhli 发表于 2012-3-6 11:16
Sub 每两页一文档()
Dim s%, mydoc
For s = 1 To ActiveDocument.Range.Information(wdNumberOfPagesInDo ...

你好!非常感谢帮助!!!
我测试了一下,提示“数值超出范围”,有没有看到输出到什么地方,请赐教!

TA的精华主题

TA的得分主题

发表于 2012-3-6 13:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
果然有错误,改成以下可以了。保存位置是word默认的位置,如果你安装office后没有设置过,它在“我的文档”。
运行宏以后,文件逐一命名为1.doc,3.doc,5.doc。。。。。,如果已经存在此文件,她将不会提示覆盖掉,所以请注意保存。

Sub 每两页一文档()
Dim s%, mydoc
For s = 1 To ActiveDocument.Range.Information(wdNumberOfPagesInDocument) Step 2
With ActiveDocument
.Range(.GoTo(wdGoToPage, wdGoToNext, , s).Start, VBA.IIf(s + 2 < ActiveDocument.Range.Information(wdNumberOfPagesInDocument), .GoTo(wdGoToPage, wdGoToNext, , s + 2).Start, .Content.End)).Copy
End With
Set mydoc = Documents.Add(Visible:=False)
With mydoc
.Content.Paste
.SaveAs s & ".doc" '此处偷工减料没有采用word默认文件名,直接数字了
.Close
End With
Set mydoc = Nothing
Next
End Sub

点评

代码简短,强。若不偷工减料的话,怎样采用Word默认的文件名????  发表于 2012-3-7 23:46

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-3-6 18:06 | 显示全部楼层
sqhsqhli 发表于 2012-3-6 13:50
果然有错误,改成以下可以了。保存位置是word默认的位置,如果你安装office后没有设置过,它在“我的文档” ...

再次感谢你的热心帮助!!!!!
不过,我测试了一下还是有问题,后来实在是着急,又搜索了一下找到了另一个办法,我又根据我的实际情况添加了三行代码,已经解决了!
哈哈,还是很感谢你的!我把代码贴出来,请你也研究研究,也供其他朋友学习!
  1. Sub 每两页分割为一个新文档__保存到同目录下()
  2. '2010.01.30 雨雪霏霏改编自守柔版主代码。
  3. '守柔版主代码见:《请教:如何将一个word文档按页保存为多个word文档???》5楼
  4. '链接为:http://club.excelhome.net/viewthread.php?tid=52690


  5.     Dim MyPath As String, PageCount As Integer
  6.     Dim StartRange As Long, EndRange As Long, MyRange As Range
  7.     Dim Fn As String, MyDoc As Document, i As Integer


  8.     On Error Resume Next
  9.     Application.ScreenUpdating = False

  10.     MyPath = ActiveDocument.Path    '取得文档路径
  11.     PageCount = Selection.Information(wdNumberOfPagesInDocument)    '取得文档总页数


  12.     Selection.HomeKey Unit:=wdStory    '将光标移至文档起点
  13.     For i = 1 To PageCount / 2 + (PageCount Mod 2)    '设置循环次数
  14.         StartRange = Selection.Start    '取得该页的第一个字符位置
  15.         Selection.EndKey Unit:=wdLine    '将光标移动到该页首行的最后位置
  16.         Fn = i & ActiveDocument.Name    '-1的目的是防止该页首行含有段落标记,导致出错.
  17.         If i * 2 >= PageCount Then    '如果循环到达最后一页
  18.             EndRange = ActiveDocument.Content.End    '将文档最后位置赋值于EndRange
  19.         Else
  20.        '否则,将下两页的起始位置赋值于EndRange(等同于下一页的最后位置)
  21.             Selection.GoToNext (wdGoToPage)
  22.             Selection.GoToNext (wdGoToPage)
  23.             EndRange = Selection.Start
  24.         End If
  25.         Set MyRange = ActiveDocument.Range(StartRange, EndRange)  '将两页中的内容进行复制
  26.         MyRange.Copy


  27.         Set MyDoc = Documents.Add    '新建一空白文档
  28.         With MyDoc
  29.              .Content.Paste    '在新文档中粘贴
  30.              .Content.Paragraphs.Last.Range.Delete '删除新文档末尾多出来的一个段落标记
  31.             
  32.              Selection.EndKey Unit:=wdStory
  33.              Selection.TypeBackspace
  34.              Selection.Delete Unit:=wdCharacter, Count:=1
  35.              '以上三行代码的作用是删除掉分割后的文档出现的末页空白页

  36.              .SaveAs FileName:=MyPath & "/" & Fn
  37.              '保存新文档到原文档所在目录。如果删除“MyPath & "/" & ”,。则保存到“我的文档”中。
  38.              .Close    '关闭新文档
  39.         End With
  40.     Next


  41.     Application.ScreenUpdating = True
  42. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-3-6 18:07 | 显示全部楼层
当然也非常感谢雨雪霏霏老师和守柔版主!!!!!!!!!

TA的精华主题

TA的得分主题

发表于 2012-3-7 10:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
怀英慕者 发表于 2012-3-6 18:06
再次感谢你的热心帮助!!!!!
不过,我测试了一下还是有问题,后来实在是着急,又搜索了一下找到了另 ...

能告诉我出了什么问题嘛?我试了一个200多页的文档,还行的

TA的精华主题

TA的得分主题

发表于 2012-3-7 23:57 | 显示全部楼层

RE: 请教:用vba怎么将一个大型文档按照指定页数进行分割?

sqhsqhli 发表于 2012-3-6 13:50
果然有错误,改成以下可以了。保存位置是word默认的位置,如果你安装office后没有设置过,它在“我的文档” ...


.SaveAs s & ".doc" '此处偷工减料没有采用word默认文件名,直接数字了
改为
.SaveAs (s + 1) / 2 & ".doc" '此处偷工减料没有采用word默认文件名,直接数字了
则文件命名为1、2、3、4、5……

TA的精华主题

TA的得分主题

发表于 2012-3-8 11:40 | 显示全部楼层
不偷工减料应该这样:
Sub 每两页一文档()
On Error Resume Next
Dim s%, mydoc
For s = 1 To ActiveDocument.Range.Information(wdNumberOfPagesInDocument) Step 2
With ActiveDocument
.Range(.GoTo(wdGoToPage, wdGoToNext, , s).Start, VBA.IIf(s + 2 < ActiveDocument.Range.Information(wdNumberOfPagesInDocument), .GoTo(wdGoToPage, wdGoToNext, , s + 2).Start, .Content.End)).Copy
End With
Set mydoc = Documents.Add(Visible:=False)
With mydoc
.Content.Paste
.SaveAs getfirstvisibletextcontent(mydoc) & ".doc" '此处偷工减料没有采用word默认文件名,直接数字了
.Close
End With
Set mydoc = Nothing
Next
End Sub
'获取指定行第一行可见文字
Function getfirstvisibletextcontent(odoc)
Dim oparagraph
Dim strcontent
For Each oparagraph In odoc.Paragraphs
strcontent = getsafefilename(oparagraph.Range.Text)
If Len(strcontent) <> 1 Then
getfirstvisibletextcontent = strcontent
Exit Function
End If
Next
getfirstvisibletextcontent = ""
End Function
'过滤文件名中的无效字符
Function getsafefilename(strfilename)
Dim arrunsafecharacters, strunsafechar
Dim nlndex
arrunsafecharacters = Array("\", "/", ":", "*", "?", """", "<", ">", "|")
For nlndex = 0 To &H2F
strfilename = Replace(strfilename, Chr(nlndex), "")
Next
For Each strunsafechar In arrunsafecharacters
strfilename = Replace(strfilename, strunsafechar, "")
Next
getsafefilename = Left(Trim(strfilename), 20)
'getsafefilename = Left(Trim(strfilename), g_ntitlemaxlen)
End Function
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-11 13:57 , Processed in 0.028165 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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