ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 将多个表格后的回车删除,使其后的表格连接成一个大表的VBA

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-3-18 16:58 | 显示全部楼层 |阅读模式
TableJoiner() 是“目录类型邮件合并指引”帖子,目录合并成的一个个表格后的回车删除,连接成一个大表的VBA代码(老外写的)。我是480个两行16列的合并表格,运行起来奇慢无比,还不如我手工删除的快!在我的笔记本上运行一晚上也无反应,只有在我家的i7 920台式机上,运行半天,才得出结果。后分析估计是每个单元格都是一个段落,估计它是遍历了所有的单元格,所以才慢!
TableJoinerNew()是我写的,思路是循环文档中所有的表格,选择表的最后一行,然后下移一行跳出表格,再选择当前行,如果是回车,就删除。运行速度挺快的,结果似乎也是正确的。
我是首次写Word VBA代码,请守柔版主帮忙看看,是否写的啰嗦,有无问题,特别是否存在副作用。谢谢!

Sub TableJoiner()
Dim oPara As Paragraph
Application.ScreenUpdating = False    '关闭屏幕更新
For Each oPara In ActiveDocument.Paragraphs
  With oPara.Range
    If .Information(wdWithInTable) = True Then
      With .Next
        If .Information(wdWithInTable) = False Then
          If .Text = vbCr Then .Delete
        End If
      End With
    End If
  End With
Next
Application.ScreenUpdating = True    '打开屏幕更新
End Sub

'------------------------------
Sub TableJoinerNew()
Dim oTab As Table
Application.ScreenUpdating = False    '关闭屏幕更新
For Each oTab In ActiveDocument.Tables
    oTab.Cell(oTab.Rows.Count, 1).Select
    Selection.SelectRow
    Selection.MoveDown Unit:=wdLine, Count:=1
    Selection.HomeKey Unit:=wdLine
    Selection.MoveDown Unit:=wdLine, Count:=1, Extend:=wdExtend
    If Selection.Range.Text = vbCr Then Selection.Range.Delete
Next
Application.ScreenUpdating = True    '打开屏幕更新
End Sub

TA的精华主题

TA的得分主题

发表于 2011-3-18 21:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
要传几页纸的附件来看看,再对症下药,如每两个表格之间有几个空行啊

TA的精华主题

TA的得分主题

发表于 2011-3-19 09:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
如要简单的,可以试试如下代码当然,对文档有特别要求。
  1. Sub test()
  2.     Application.ScreenUpdating = False
  3.     Do While ActiveDocument.Tables.Count > 1
  4.         ActiveDocument.Tables(1).Range.Characters.Last.Next.Delete
  5.     Loop
  6.     Application.ScreenUpdating = True
  7. End Sub
复制代码

[ 本帖最后由 sylun 于 2011-3-19 09:41 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-4-3 11:28 | 显示全部楼层

回复 3楼 sylun 的帖子

十分感谢热心回复,给我很大启发!不过你的代码如果文档无表格,什么也不做;有表格,似乎是进入了死循环。修正为如下代码可行,且无副作用,完全可以代替老外写的效率极差的那段代码:
Sub TableJoinerNew()
Dim oTab As Table, cString As String
Application.ScreenUpdating = False    '关闭屏幕更新
For Each oTab In ActiveDocument.Tables
      With oTab.Range.Characters.Last.Next
              If .Characters.First = vbCr Then .Delete
      End With
Next
Application.ScreenUpdating = True    '打开屏幕更新
End Sub

[ 本帖最后由 cncalyl 于 2011-4-3 16:36 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-4-3 13:54 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-8-28 18:26 | 显示全部楼层
With oTab.Range.Characters.Last.Next
可以再简练点吧---->
With oTab.Range.Next
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-25 20:23 , Processed in 0.035216 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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