ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 怎么实现VBA排版文章后的落款和时间

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-8-15 16:55 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
自动排版标题居中就好了,文章后的落款和时间却要置于右侧,算法是个问题,实现起来也问题多多。代码如下,求指教。
Sub 排版文章结尾的落款和时间()
'排版文章结尾的落款和时间
'调整落款和时间位置,分别可能有以下情况:1、有落款和时间。2、只有时间无落款。3、落款为xxx:,如合同等待签字类型。4、落款很长或几个单位
                 Dim ew As Range, ew2 As Range, ew3 As Range, ha As Integer, i As Integer, p As Integer
           '删除文章后空行和空格段,以及倒数第二段空段落
                Do While ActiveDocument.Paragraphs.Count > 1
                Set ew = ActiveDocument.Paragraphs(ActiveDocument.Paragraphs.Count).Range
                If Len(Replace(ew.Text, " ", "")) = 1 Then
                ActiveDocument.Paragraphs(ActiveDocument.Paragraphs.Count).Range.Delete
                Else
                Exit Do
                End If
                Loop
                If Not (ew.Text Like "*年*月*" & Chr(13)) Then GoTo voa: '如果最后一段非时间格式则倒数1-2段不必排版,
                '至此,已经明确最后一段时间,再检查倒数2段
                 Do While ActiveDocument.Paragraphs.Count > 2
                Set ew2 = ActiveDocument.Paragraphs(ActiveDocument.Paragraphs.Count - 1).Range
                If Len(Replace(ew2.Text, " ", "")) = 1 Then
                ActiveDocument.Paragraphs(ActiveDocument.Paragraphs.Count - 1).Range.Delete
                Else
                Exit Do
                End If
                Loop
     '删除文章后空行和空格段,以及倒数第二段空段落

        '取最大行字符数,最多遍历15行,还有更好的办法吗?页面设置ActiveDocument.PageSetup.CharsLine不可用
Selection.EndKey unit:=wdStory
y = Selection.Information(wdFirstCharacterLineNumber)
Selection.HomeKey unit:=wdStory
Do Until i = 15 Or i = y - 2
Selection.MoveDown unit:=wdLine, Count:=1
Selection.HomeKey unit:=wdLine
Selection.EndKey unit:=wdLine, Extend:=wdExtend
i = i + 1
p = Len(Selection.Range.Text)
If p > ha Then ha = p
Loop
           '取最大行字符数ha
     With ActiveDocument
  If (Len(ew2.Text) < (ha * 3 / 4)) And (ew.Information(wdFirstCharacterLineNumber) - ew2.Information(wdFirstCharacterLineNumber) = 1) Then
   '落款时间都有
   '将倒数第三行空行删除
   Do While ActiveDocument.Paragraphs.Count > 3
                Set ew3 = ActiveDocument.Paragraphs(ActiveDocument.Paragraphs.Count - 2).Range
                If Len(Replace(ew3.Text, " ", "")) = 1 Then
                ActiveDocument.Paragraphs(ActiveDocument.Paragraphs.Count - 2).Range.Delete
                Else
                Exit Do
                End If
Loop '将倒数第三行空行删除
Set ew = ActiveDocument.Paragraphs(ActiveDocument.Paragraphs.Count).Range
ew.ParagraphFormat.Alignment = wdAlignParagraphLeft
ew.Text = Replace(LTrim(RTrim((ew.Text))), Chr(13), "") '去掉左右侧可能空格,落款可能是多个主体,故中间空格保留
  If Int(Len(ew.Text) / 2) < Round(ha / 4 + 0.4, 0) Then
For i = 1 To Len(Space(ha - (Len(ew.Text) - (Round(ha / 4, 0) - Int(Len(ew.Text) / 2)))))
ActiveDocument.Range(ew.Start, ew.Start).InsertBefore "  "
Next
End If
Set ew2 = ActiveDocument.Paragraphs(ActiveDocument.Paragraphs.Count - 1).Range
ew2.ParagraphFormat.Alignment = wdAlignParagraphLeft
ew2.Text = Replace(LTrim(RTrim((ew2.Text))), Chr(13), "") '去掉左右侧可能空格,落款可能是多个主体,故中间空格保留
  If Int(Len(ew2.Text) / 2) < Round(ha / 4 + 0.4, 0) Then
For i = 1 To Len(Space(ha - (Len(ew2.Text) - (Round(ha / 4, 0) - Int(Len(ew2.Text) / 2)))))
ActiveDocument.Range(ew2.Start, ew2.Start).InsertBefore "  "
Next
End If
ew2.InsertBefore Chr(13)
ew2.InsertBefore Chr(13)
ElseIf (Len(ew2.Text) >= ha * 3 / 4) Or (ew.Information(wdFirstCharacterLineNumber) - ew2.Information(wdFirstCharacterLineNumber) <> 1) Then
  '落款太长不符合,仅仅排时间
ew.Text = LTrim(RTrim(Replace((ew.Text), Chr(13), ""))) & Chr(13) '去掉右侧可能空格
ew.ParagraphFormat.Alignment = wdAlignParagraphLeft
If Int(Len(Trim(ew)) / 2) < 7 Then
For i = 1 To 8 - Int(Len(LTrim(RTrim(Replace((ew.Text), Chr(13), "")))) / 2)
ActiveDocument.Range(ew.Start, ew.End - 1).InsertAfter " "
Next
ew.InsertBefore Chr(13)
ew.InsertBefore Chr(13)
End If
End If '都不满足条件,不需要排、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
'落款为xxx:待签字类型
voa:
Set ew = Nothing
Set ew2 = Nothing
Set ew3 = Nothing
End With

End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-8-15 17:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
刚看到413191246se以下代码,用数组直接定义取值,在A4里很好,问题是如果是讲话稿,时间放在标题下他可能也把排右侧了。  另外,我的想法是搞清楚每行最多字符数,让落款时间自适应,比如,A3纸张排个通告,可能每行字符就比较多了,落款能不能根据行的最大字符数和自身的字符数自动调整到合理位置。


Sub 落款()
    Dim arr, r As Range, j&
    arr = Array(17.25, 16.75, 16.25, 15.75, 15.2, 14.6, 14.15, 13.5, 12.95, 12.3, 11.95, 11.4, 10.95, 10.4, 9.85, 8.95, 7.95, 6.95)
    With ActiveDocument.Content.Find
        .ClearFormatting
        .Text = "^13[0-9]{4}年[0-9]{1,2}月[0-9]{1,2}日^13"
        .Forward = True
        .MatchWildcards = True
        Do While .Execute
            With .Parent
                .MoveStart
                If .Style = "标题 1" Then
                    .Start = .End
                Else
                    With .ParagraphFormat
                        .Alignment = wdAlignParagraphRight
                        .CharacterUnitRightIndent = 5.9
                    End With
                    Set r = .Previous(4, 1)
                    With r
                        If .Text Like "*[!。:;,、!?…—.:;,!?]?" Then
                            .InsertBefore Text:=vbCr & vbCr & vbCr
                            .SetRange Start:=.Paragraphs.Last.Range.Start, End:=.Paragraphs.Last.Range.End
                            j = Len(.Text)
                            If j > 20 Then j = 20
                            If .Font.Size = 16 Then
                                .ParagraphFormat.CharacterUnitFirstLineIndent = arr(j - 3)
                            ElseIf .Font.Size = 14 Then
                                .ParagraphFormat.CharacterUnitFirstLineIndent = arr(j - 3) + 3.15
                            End If
                        Else
                            .InsertAfter Text:=vbCr
                        End If
                        .Next(4, 1).Select
                        Exit Sub
                    End With
                End If
            End With
        Loop
    End With
End Sub

TA的精华主题

TA的得分主题

发表于 2020-8-15 20:41 | 显示全部楼层
本帖最后由 413191246se 于 2020-8-15 20:45 编辑

* 楼主,好久不见!我最近发布的《金秋版》,可否试用了?请提宝贵意见。
* 你对落款要求较高,我要求就较低。其实,我不想要较多代码,够用就好。
* 你读没读过2012《国家机关公文规范(或标准)》PDF?里面有新规定:落款时间必须右空四个汉字。。。不是自己想放到哪里就放到哪里的。
* 楼主,我的最新《金秋版》,如果没用过,建议试用一下,现在的排版速度已经比过去快不少了。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-8-16 10:58 来自手机 | 显示全部楼层
网上有新规范了。关于落款有根据长度适当调整的表述。另,我写这代码不特别针对公文,主要用在起草的讲话稿,证明,个人小结之类的,化繁为简,偷点小懒。几年不动手了,皮毛也忘了,见笑见笑

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-8-16 10:59 来自手机 | 显示全部楼层
413191246se 发表于 2020-8-15 20:41
* 楼主,好久不见!我最近发布的《金秋版》,可否试用了?请提宝贵意见。
* 你对落款要求较高,我要求就较 ...

这个是百度上的
IMG_20200816_104550.jpg

TA的精华主题

TA的得分主题

发表于 2020-8-18 20:27 | 显示全部楼层
终于遇到同道中人啊!先顶再细看!

“发文机关署名”和“成文日期”自动排版的问题,我也研究了好久,一直没有找到理想的解决方案。

期待高人出手!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 06:07 , Processed in 0.036837 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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