ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 旧式窗体域如何全选后设置

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-5-18 08:00 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 OKJSJSF 于 2023-5-18 09:37 编辑

下面代码用于WORD宏按钮。
Option Explicit

Sub 窗体域全选()
    Dim i As Byte, i2 As Byte
    With ActiveDocument
        If .ProtectionType <> wdNoProtection Then .Unprotect
        On Error Resume Next
        Do
            i = InputBox("下框中可录数字1234与对应的功能:" & vbCr & 1 & "  添加灰色底纹" & Chr(9) & Space(4) & 2 & "  添加下划线/字体加粗" & vbCr & 3 & "  取消突出显示" & Chr(9) & Space(4) & 4 & "  自定义", "参数设置", 1)
            If i = 1 Or i = 2 Or i = 3 Or i = 4 Then Exit Do
        Loop
        Select Case i
            Case 1
                For i2 = 1 To .FormFields.Count
                    .FormFields(i2).Range.Shading.Texture = wdTexture15Percent
                    .FormFields(i2).Range.Font.Underline = wdUnderlineNone
                    .FormFields(i2).Range.Font.Bold = False
                Next
            Case 2
                For i2 = 1 To .FormFields.Count
                    .FormFields(i2).Range.Shading.Texture = wdTextureNone
                    .FormFields(i2).Range.Font.Underline = wdUnderlineSingle
                    .FormFields(i2).Range.Font.Bold = True
                Next
            Case 3
                For i2 = 1 To .FormFields.Count
                    .FormFields(i2).Range.Shading.Texture = wdTextureNone
                    .FormFields(i2).Range.Font.Underline = wdUnderlineNone
                    .FormFields(i2).Range.Font.Bold = False
                Next
            Case Else
                SendKeys "^", True     '这个是按住CTRL键,目的是为下面逐个选择作准备,可能只有按一次的效果,不能全选成功
                For i2 = 1 To .FormFields.Count
                    .FormFields(i2).Range.Select
                Next
                .Application.Dialogs(wdDialogFormatFont).Show
        End Select
        .Protect Type:=wdAllowOnlyFormFields, NoReset:=True
        MsgBox "执行完毕。"
    End With
End Sub

上面的代码不能达到按住CTRL键不放同时逐个选择窗体域的全选效果,所以无法批量设置窗体域文本格式。



TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-18 09:46 | 显示全部楼层
excel中有多重选定区域的union方法,set area新=union(area新,area),不知道word中有没有这个方法在循环语句中把多个选择的窗体域联合成一个,再一次性设置格式。

TA的精华主题

TA的得分主题

发表于 2023-5-18 11:33 | 显示全部楼层
本帖最后由 batmanbbs 于 2023-5-18 11:34 编辑

楼主,我也刚刚接触VBA,不妥之处见谅。
case else 之间的语句,我写了一段子程序,供参考。(也可能会有更好办法,请高手指教)
image.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-18 15:25 | 显示全部楼层
batmanbbs 发表于 2023-5-18 11:33
楼主,我也刚刚接触VBA,不妥之处见谅。
case else 之间的语句,我写了一段子程序,供参考。(也可能会有 ...

谢谢了!您这个应该能行。好像word2003实战技巧精粹中有类似的语句。被编辑对象可以累加。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-18 23:03 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
batmanbbs 发表于 2023-5-18 11:33
楼主,我也刚刚接触VBA,不妥之处见谅。
case else 之间的语句,我写了一段子程序,供参考。(也可能会有 ...

在您的指点下,窗体域终于能全选操作了,解决了我多年的困惑。使用WORD多年,一直都用旧式窗体域功能,2003版的底纹可以打印不必设置,2007版的底纹只用于识别窗体位置,打印时自动消失,必须另外设置。但窗体域多个时无法一次性选定后设置,定位功能跟本没用。所以做个宏按钮完全必要。但文档中一旦有了窗体域,就无法录制宏,所以您帮我写的代码跟本无法录制得到。看了您写的这个代码,查了下帮助,还是无法理解,什么用户组用户权限一直是一窍不通的计算机盲区。

Sub 窗体域打印设置()
    Dim i As Byte, ff As FormField
    With ActiveDocument
        If .ProtectionType <> wdNoProtection Then .Unprotect
        On Error Resume Next
        Do
            i = InputBox("下框中可录数字1234与对应的打印效果:" & vbCr & "1  加灰色底纹             2  加下划线、字形加粗" & vbCr & "3  取消前二项设置      4  其它设置", "参数设置", 1)
            If i = 1 Or i = 2 Or i = 3 Or i = 4 Then Exit Do
        Loop
        Select Case i
            Case 1
                For Each ff In .FormFields
                    With ff.Range
                        .Shading.Texture = wdTexture15Percent
                        .Font.Underline = wdUnderlineNone
                        .Font.Bold = False
                    End With
                Next
            Case 2
                For Each ff In .FormFields
                    With ff.Range
                        .Shading.Texture = wdTextureNone
                        .Font.Underline = wdUnderlineSingle
                        .Font.Bold = True
                    End With
                Next
            Case 3
                For Each ff In .FormFields
                    With ff.Range
                        .Shading.Texture = wdTextureNone
                        .Font.Underline = wdUnderlineNone
                        .Font.Bold = False
                    End With
                Next
            Case Else
                For Each ff In .FormFields
                    ff.Range.Select
                    Selection.Range.Editors.Add wdEditorEveryone     '逐个增加可编辑区域
                Next
                .SelectAllEditableRanges wdEditorEveryone
                .DeleteAllEditableRanges wdEditorEveryone
                .Application.Dialogs(wdDialogFormatFont).Show
        End Select
        .Protect Type:=wdAllowOnlyFormFields, NoReset:=True
        MsgBox "执行完毕。"
    End With
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-18 23:09 | 显示全部楼层
WORD的代码的单词总是那么长长的,由多个组合而成。

TA的精华主题

TA的得分主题

发表于 2023-5-19 00:06 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
OKJSJSF 发表于 2023-5-18 23:03
在您的指点下,窗体域终于能全选操作了,解决了我多年的困惑。使用WORD多年,一直都用旧式窗体域功能,20 ...

建议在case else之后应该先执行一次 .DeleteAllEditableRanges wdEditorEveryone
因为之前有可能设置过选区,必须先取消,以防万一。
这个和查询前执行.ClearFormatting是一个道理。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-19 07:21 | 显示全部楼层
batmanbbs 发表于 2023-5-19 00:06
建议在case else之后应该先执行一次 .DeleteAllEditableRanges wdEditorEveryone
因为之前有可能设置过 ...

正想咨询您这句重复代码的作用呢!因为我试了可以不要。太谢谢了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-19 07:58 | 显示全部楼层
batmanbbs 发表于 2023-5-19 00:06
建议在case else之后应该先执行一次 .DeleteAllEditableRanges wdEditorEveryone
因为之前有可能设置过 ...

我又试了几次,还是发现这句重复的可以不要。
一、加了窗体的文档,一般总是保护的,只能填写窗体。目的是防止误删窗体及错误修改文档其它内容 。这种情况选区只能是窗体或窗体中的部份文本。所以单击按钮执行后,只对所有窗体进行设置,窗体以外的内容不会被设置。
二、有窗体的文档未保护前。如先选定其它几处文本内容,单击按钮执行后,仍只对所有窗体进行设置,窗体以外的选区文本内容没有被设置。
三、如果是没有窗体的文档,执行时相当于常规操作。
不知我有没其它疏忽的地方?

TA的精华主题

TA的得分主题

发表于 2023-5-19 11:09 | 显示全部楼层
本帖最后由 batmanbbs 于 2023-5-19 11:33 编辑
OKJSJSF 发表于 2023-5-19 07:58
我又试了几次,还是发现这句重复的可以不要。
一、加了窗体的文档,一般总是保护的,只能填写窗体。目的 ...

就你的代码应该可以不用重复,但我个人觉得这是养成良好习惯的问题。

比如我上面的提到的查询前执行.ClearFormatting,我查询之后也会执行一次.ClearFormatting。

因为代码面对的情况不尽相同,什么情况都可能会遇到,应该尽量考虑周全,所以一般还是会先取消一下原来的选择,不管原来是否选择过。

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 09:03 , Processed in 0.045738 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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