ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

求助:Word表格表线粗细控制

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-5-3 07:43 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
源表行.JPG
邮件合并生成很多类似上面的表行,将以上表行间的段落标记删除,合并为如下一个大表,边框及每三行单元格底线为1磅粗,其他表线为0.5磅粗。问题是我用VBA或手动删除上面的段落标记,表线粗细就变了,无法形成下面的表格。哪位大侠对表线控制有研究,如何控制,删除表间段落标记,表线的粗细不变(表格很多且按月生成,不宜手动设置)?

目的表格

目的表格



Word表格表线粗细控制.rar

9.61 KB, 下载次数: 4

TA的精华主题

TA的得分主题

发表于 2015-5-4 00:52 | 显示全部楼层
Sub test()
'表格框线粗细控制
    Dim i As Paragraph, j As Long, t As Table, h As Long

'循环遍历段落(不在表格内的段落全部删除)
    For Each i In ActiveDocument.Paragraphs
        If i.Range.Information(wdWithInTable) = False Then i.Range.Delete
    Next
    Set t = ActiveDocument.Tables(1)

'当前表格最大行值
    h = t.Rows.Count

'外部框线(酌情选用--不用可变注释)
    Selection.Tables(1).Select
    Options.DefaultBorderLineWidth = wdLineWidth100pt
    Options.DefaultBorderColor = wdColorBrown '褐色(此语句可删除,亦可变注释)
    With Selection.Borders(wdBorderTop)
        .LineStyle = Options.DefaultBorderLineStyle
        .LineWidth = Options.DefaultBorderLineWidth
        .Color = Options.DefaultBorderColor
    End With
    With Selection.Borders(wdBorderLeft)
        .LineStyle = Options.DefaultBorderLineStyle
        .LineWidth = Options.DefaultBorderLineWidth
        .Color = Options.DefaultBorderColor
    End With
    With Selection.Borders(wdBorderBottom)
        .LineStyle = Options.DefaultBorderLineStyle
        .LineWidth = Options.DefaultBorderLineWidth
        .Color = Options.DefaultBorderColor
    End With
    With Selection.Borders(wdBorderRight)
        .LineStyle = Options.DefaultBorderLineStyle
        .LineWidth = Options.DefaultBorderLineWidth
        .Color = Options.DefaultBorderColor
    End With

'内部框线(酌情选用--不用可变注释)
    Selection.Tables(1).Select
    Options.DefaultBorderLineWidth = wdLineWidth050pt
    Options.DefaultBorderColor = wdColorBlue '蓝色(此语句可删除,变可变注释)
    With Selection.Borders(wdBorderHorizontal)
        .LineStyle = Options.DefaultBorderLineStyle
        .LineWidth = Options.DefaultBorderLineWidth
        .Color = Options.DefaultBorderColor
    End With
    With Selection.Borders(wdBorderVertical)
        .LineStyle = Options.DefaultBorderLineStyle
        .LineWidth = Options.DefaultBorderLineWidth
        .Color = Options.DefaultBorderColor
    End With

'首行底线加粗
    Options.DefaultBorderLineWidth = wdLineWidth100pt
    Options.DefaultBorderColor = wdColorRed '红色(此语句可删除,亦可变注释)
    With t.Rows(1).Borders(wdBorderBottom)
        .LineStyle = Options.DefaultBorderLineStyle
        .LineWidth = Options.DefaultBorderLineWidth
        .Color = Options.DefaultBorderColor
    End With

'中间行底线加粗
    For j = 1 To Int((h - 1) / 3 + 1) - 1
        Options.DefaultBorderLineWidth = wdLineWidth100pt
        Options.DefaultBorderColor = wdColorPink '粉红(此语句可删除,亦可变注释)
        With t.Rows(j * 3 + 1).Borders(wdBorderBottom)
            .LineStyle = Options.DefaultBorderLineStyle
            .LineWidth = Options.DefaultBorderLineWidth
            .Color = Options.DefaultBorderColor
        End With
    Next

'尾行底线加粗
    Options.DefaultBorderLineWidth = wdLineWidth100pt
    Options.DefaultBorderColor = wdColorRed '红色(此语句可删除,亦可变注释)
    With t.Rows.Last.Borders(wdBorderBottom)
        .LineStyle = Options.DefaultBorderLineStyle
        .LineWidth = Options.DefaultBorderLineWidth
        .Color = Options.DefaultBorderColor
    End With
    Selection.HomeKey Unit:=wdStory
    MsgBox "处理完毕!!!!!!!!!!!!!!", vbOKOnly + vbExclamation, "表格框线粗细控制"
End Sub

TA的精华主题

TA的得分主题

发表于 2015-5-4 00:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
因代码要审核,故直接上附件吧!(代码全在附件内) macro 表格框线粗细控制.rar (803 Bytes, 下载次数: 11)

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-4 07:00 | 显示全部楼层
收到,谢谢!我是用下列代码将邮件合并的表行合并成大表,效率不错。问题是合并后表线粗细变化:
Sub TableJoiner()
Dim oTab As Table
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
你的代码能够重新设置表线的粗细。最好是能找到规律,一劳永逸(表格不一定是3行一粗线)。

邮件合并生成文档.rar

739.07 KB, 下载次数: 9

TA的精华主题

TA的得分主题

发表于 2015-5-4 21:13 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-5 18:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 cncalyl 于 2015-5-5 18:46 编辑
413191246se 发表于 2015-5-4 21:13
楼主,什么规律?

首先,谢谢你的热心回复和帮助!我的问题是帮助网友及善尽美地解决Word邮件合并问题时产生的(见帖:[求助] Excel word mail merge 邮件合并 难题求解)。起初我是想通过在Word邮件合并主文档中设置表格中线样式,在邮件合并得到文档中只是用VBA删除紧跟表格后的回车,将多个表行合并成一个大表,不劳驾VBA设置表线粗细,更通用,有时可能是四行、五行一粗线等等。事实上经过反复在选定表行后“边框和底纹”下的“自定义”表线宽度,再点工具栏“田字”图标右面的倒三角,点选“内部横框线”,我找到一定规律:与Word分节符相似,表行合并后的横线不以前一表行的默认的“内部横框线”为准,而是以后一表行的默认的“内部横框线”为准。经过设置后生成的邮件合并文档见:“11.邮件合并生成的初步文档.doc”,可以手动删除表行后的回车合并成一个大表,实现了每三行一粗底线,但粗线表行的顶线也是粗线,其他符合要求(见文档12,注:如果Micro$oft以上一表行的底线作为合并后的内部横框线,就能实现我的最初想法!)。最后,由于上述缺陷,改进了后邮件合并主文档,使合并生成的文档经过单合并后表内框线均为0.5磅(见文档21),再用VBA设置实现了每三行一粗底线。代码如下:
Sub TableJoiner()
Dim oTab As Table, i As Integer, j As Integer
Application.ScreenUpdating = False    '关闭屏幕更新
For Each oTab In ActiveDocument.Tables '删除紧跟表格后的回车,使各表行连成一个表
    With oTab.Range.Characters.Last.Next
         If .Characters.First = vbCr Then .Delete
    End With
Next
For i = 2 To ActiveDocument.Tables.Count Step 2  '对当前文档中偶数表格进行格式设置
    Set oTab = ActiveDocument.Tables(i)
    With oTab.Borders '设置表格外边框格式
         .OutsideLineStyle = wdLineStyleSingle
         .OutsideLineWidth = wdLineWidth075pt
    End With
    For j = 1 To oTab.Rows.Count Step 3 '表格每三行底线为粗线
        With oTab.Rows(j).Borders(wdBorderBottom)
             .LineStyle = wdLineStyleSingle
             .LineWidth = wdLineWidth075pt
        End With
    Next j
Next i
Application.ScreenUpdating = True    '打开屏幕更新

End Sub

最终实现.rar

1.44 MB, 下载次数: 5

我的起初想法.rar

1.44 MB, 下载次数: 3

TA的精华主题

TA的得分主题

发表于 2015-5-5 20:28 | 显示全部楼层
楼主,不好意思,没看明白你楼上的问题。我觉得我的代码已经完全解决了你1楼的问题(虽然没有你提供的代码简洁)。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-6 00:54 | 显示全部楼层
413191246se 发表于 2015-5-5 20:28
楼主,不好意思,没看明白你楼上的问题。我觉得我的代码已经完全解决了你1楼的问题(虽然没有你提供的代码简 ...

是的,你的代码似乎是在录制的宏基础上修改的,有点繁琐,但能够实现我刚开始所提的要求。所以,我在回帖中首先致谢。但有一点提请注意,你的代码起始部分是将文档非表格的内容全部删除,以实现表格合并,考虑的不是很周全。再举个不周全的例子,我曾经见过有人写的代码,他想的是VBA程序只运行一次,但别人可能运行多次,运行一遍结果变一次。以此共勉,共同提高。

TA的精华主题

TA的得分主题

发表于 2015-5-6 18:07 | 显示全部楼层
嗯,我觉得楼主已经提示是邮件合并的结果,所以,用循环遍历段落的方法去除不在表格内的段落。是的,框线那些宏都是录制的宏,拼凑在一起的。——像previous或last这样的语句,我不太会用,接触也少,我主要是对文字段落和表格初步掌握一点,看来,楼主对VBA掌握比我高多了!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-19 23:23 , Processed in 0.044123 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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