ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 关于word文档分割的

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-6-24 14:41 | 显示全部楼层
13907933959 发表于 2016-6-24 14:16
前辈好!

我把这几句放在一起运行了。

如果只拿掉oSrcDoc.Activate这句呢?

TA的精华主题

TA的得分主题

发表于 2016-6-24 15:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
dafanshu1 发表于 2016-6-24 14:41
如果只拿掉oSrcDoc.Activate这句呢?

前辈好!

拿掉了这一句后还会报错,运行时也一样提示错误’4605 ’ 宏运行不了。
oSrcDoc.Activate

TA的精华主题

TA的得分主题

发表于 2016-6-24 16:17 | 显示全部楼层
13907933959 发表于 2016-6-24 15:22
前辈好!

拿掉了这一句后还会报错,运行时也一样提示错误’4605 ’ 宏运行不了。

如果单独运行这两句呢:
Documents.Add
ActiveDocument.Bookmarks("\page").Range.Select

TA的精华主题

TA的得分主题

发表于 2016-6-25 06:51 | 显示全部楼层
dafanshu1 发表于 2016-6-24 16:17
如果单独运行这两句呢:
Documents.Add
ActiveDocument.Bookmarks("\page").Range.Select

前辈好!
单独运行了这2句,可运行,并看到新建了一个空白页。
Sub SplitEveryFivePagesAsDocuments()
      Documents.Add
      ActiveDocument.Bookmarks("\page").Range.Select
End Sub

TA的精华主题

TA的得分主题

发表于 2016-6-25 12:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Sub SplitEveryFivePagesAsDocuments()
  2.     Dim oSrcDoc As Document, oNewDoc As Document
  3.     Dim strSrcName As String, strNewName As String
  4.     Dim oRange As Range, tmpRange As Range
  5.     Dim nIndex As Integer, nSubIndex As Integer, nTotalPages As Integer, nBound As Integer
  6.     Dim fso As Object
  7.    
  8.     Const nSteps = 200         ' 修改这里控制每隔几页分割一次
  9.    
  10.     Set fso = CreateObject("Scripting.FileSystemObject")
  11.     Set oSrcDoc = ActiveDocument
  12.     Set oRange = oSrcDoc.Content
  13.    
  14.     nTotalPages = ActiveDocument.Content.Information(wdNumberOfPagesInDocument)
  15.     oRange.Collapse wdCollapseStart
  16.     oRange.Select
  17.     For nIndex = 1 To nTotalPages Step nSteps
  18.         Set oNewDoc = Documents.Add
  19.         If nIndex + nSteps > nTotalPages Then
  20.             nBound = nTotalPages
  21.         Else
  22.             nBound = nIndex + nSteps - 1
  23.         End If
  24.         For nSubIndex = nIndex To nBound
  25.             oSrcDoc.Activate
  26.             Set tmpRange = oSrcDoc.Bookmarks("\page").Range
  27.             tmpRange.MoveEnd(wdCharacter,-1)
  28.             tmpRange.Copy
  29.             oSrcDoc.Windows(1).Activate
  30.             Application.Browser.Target = wdBrowsePage
  31.             Application.Browser.Next
  32.    
  33.             oNewDoc.Activate
  34.             oNewDoc.Windows(1).Selection.Paste
  35.         Next nSubIndex
  36.         strSrcName = oSrcDoc.FullName
  37.         strNewName = fso.BuildPath(fso.GetParentFolderName(strSrcName), _
  38.                      fso.GetBaseName(strSrcName) & "_" & (nIndex \ nSteps + 1) & "." & fso.GetExtensionName(strSrcName))
  39.         oNewDoc.SaveAs strNewName
  40.         oNewDoc.Close False
  41.     Next nIndex
  42.     Set oNewDoc = Nothing
  43.     Set oRange = Nothing
  44.     Set oSrcDoc = Nothing
  45.     Set fso = Nothing
  46.     MsgBox "结束!"
  47. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2016-6-25 13:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 loquat 于 2016-6-25 20:38 编辑

针对此类问题,我也写了一个比较复杂的,可以去批量调用
发现这个代码远没有我下面写的代码那么简单,目前发现在分割位置遇到表格时以下代码处理会有问题。
单个文件调用方式如下:
  1. Sub callItYourOwn()
  2. SplitEveryFewPagesAsDocuments ActiveDocument, 5
  3. End Sub
复制代码

多个文件调用方式如下:
假设arr里存储的是你待处理的word文件列表
  1. Sub callItYourOwn()
  2. Dim aDoc As Document
  3. For i = LBound(arr) To UBound(arr)
  4.     Set aDoc = Documents.Open(arr)
  5.     SplitEveryFewPagesAsDocuments arr(i), 5
  6. Next
  7. End Sub
复制代码

'主程序代码如下:
  1. Sub SplitEveryFewPagesAsDocuments(ByVal aDoc As Document, ByVal splitPages&)
  2. Application.ScreenUpdating = False
  3. Dim aPageCount&, aSplitTimes&, i&
  4. Dim aStart&, aEnd&, aFilePath$, aFileName$
  5. Dim aRange As Range, wdApp As Word.Application
  6. Set wdApp = GetObject(, "Word.Application")
  7. aPageCount = aDoc.ComputeStatistics(wdStatisticPages)  '获取目标文档的页数
  8. If aPageCount <= splitPages Then Exit Sub              '目标文档页数少于分割页数,则退出
  9. aFilePath = aDoc.Path                                  '获取文件路径
  10. aFileName = Left(aDoc.Name, InStrRev(aDoc.Name, ".doc") - 1)  '获取文件名
  11. If Dir(aFilePath & "" & aFileName, vbDirectory) = "" Then    '如果以目标文件名为名称的文件夹不存在
  12.     MkDir aFilePath & "" & aFileName                         '则新建该文件夹
  13. End If
  14. Set aRange = aDoc.Range(0, 0)                          '对象初始化,排除光标移动
  15. aSplitTimes = -Int(-(aPageCount / splitPages))         '分割后的文档份数
  16. For i = 1 To aSplitTimes
  17.     aStart = aRange.GoTo(wdGoToPage, wdGoToAbsolute, i * splitPages).Start  '分割页起始位置
  18.     If i = aSplitTimes Then
  19.         aEnd = aDoc.Content.End - 1
  20.     Else
  21.         aEnd = aRange.GoTo(wdGoToPage, wdGoToAbsolute, (i + 1) * splitPages).Start - 1
  22.     End If
  23.     Set aRange = aDoc.Range(aStart, aEnd)
  24.     Do While InStr(1, "11121314", Asc(Right(aRange.Text, 1)))  '去掉末尾的所有占位符,换行符,分页符,自动换行符,分栏符,分节符
  25.         aRange.MoveEnd 1, -1
  26.     Loop
  27.     aRange.Copy
  28.     With wdApp.Documents.add
  29.         .Content.Text = ""
  30.         .Content.Paste
  31.         .SaveAs aFilePath & "" & aFileName & "" & aFileName & "_" & format(i, "000") & Mid(aDoc.Name, InStrRev(aDoc.Name, ".doc"))
  32.         .Close False
  33.     End With
  34. Next i
  35. If aDoc.FullName = ActiveDocument.FullName Then
  36.     Exit Sub  '如果是在处理当前文档,直接退出程序
  37. Else
  38.     aDoc.Close False  '否则,关闭文档,且不保存退出
  39. End If
  40. MsgBox "已完成!!!"
  41. Application.ScreenUpdating = False
  42. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2016-6-25 13:55 | 显示全部楼层
上述代码,第2个参数就是按几页分割1次。还没审核通过,审核通过就可以看到

TA的精华主题

TA的得分主题

发表于 2016-6-25 14:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 13907933959 于 2016-6-25 14:31 编辑

前辈好!
感谢前辈多次出手相助!
25的代码一复制粘贴进代码窗口,这句tmpRange.MoveEnd(wdCharacter,-1)就显示为红色,运行后提示“编译错误,语法错误” 宏运行不了。请前辈再看看,谢谢!

TA的精华主题

TA的得分主题

发表于 2016-6-25 14:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 13907933959 于 2016-6-25 15:01 编辑
loquat 发表于 2016-6-25 13:54
针对此类问题,我也写了一个比较复杂的,可以去批量调用
单个文件调用方式如下:
出错了…

TA的精华主题

TA的得分主题

发表于 2016-6-25 14:57 | 显示全部楼层
loquat 发表于 2016-6-25 13:54
针对此类问题,我也写了一个比较复杂的,可以去批量调用
单个文件调用方式如下:

前辈好!
单个文件调用:运行后提示“运行时错误 ’4608’,数值超出范围” 宏运行不了。进代码窗口查看、空箭头指向该句Set aRange = aDoc.Range(aStart, aEnd)代码,代码为黄色突出显示状。

多个文件调用:运行后提示“运行时错误 ’13’,类型不匹配” 宏运行不了。进代码窗口查看、空箭头指向该句For i = LBound(Arr) To UBound(Arr)代码,代码为黄色突出显示状。 请前辈再看看,谢谢!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 11:38 , Processed in 0.044675 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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