ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何读取和设置Word导航栏宽度

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-9-6 12:51 来自手机 | 显示全部楼层 |阅读模式
以下代码可以实现打开Word时,固定导航栏宽度。虽然可以在代码里面设置宽度,但还是交互性不友好,不修改代码的话,导航栏宽度固定了不能改,不是每个用户都会用VBA。
需求:如果手动拖拽修改了导航栏宽度,关闭Word之前,VBA获取导航栏宽度,保存宽度到注册表,下次重启Word时,读取注册表,设置导航栏宽度为注册表里面的数据。
我是VBA新手,哪位大神可以解决以上问题?

Sub AutoOpen()
'Word导航窗格的宽度调整后怎么固定住,下次就不用再调了?
' set iwidth
'
  Dim iwidth As Integer
  iwidth = 260 'change to suit
  With Application.CommandBars("Navigation")
    .Visible = True
    .Width = iwidth
  End With
End Sub

TA的精华主题

TA的得分主题

发表于 2022-9-11 12:05 | 显示全部楼层
无需用到注册表。可添加一个AutoClose的自动宏,再在其中添加一个Variables集合对象成员,并设定该文档变量的值为断位窗格宽度即可,然后再相应修改AutoOpen的设置以读取文档变量值。文档变量值是保存在文档中的,只是不容易看到而已。关于Variables的用法可查看帮助文件。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-9-13 18:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 pxt2001 于 2022-9-13 18:43 编辑

感谢楼上回复,我通过保存数据到注册表,近似解决了此问题。
1、虽然读取不到当前导航窗格宽度,但可以保存数据到注册表,打开Word时读取注册表数据,来设置导航窗格宽度。
2、打开Word后,编写一个带窗体的宏,接收用户输入数据,点击确认按钮,保存数据到注册表。
效果如下:
动画.gif



代码如下(VBA新手,高手见笑了。但代码的功能有点意思,搜索全网没找到类似功能):


'两个函数:读写用户窗体位置到注册表
Public Function Getwz_form()
    Dim wz, arr
    wz = GetSetting("MyApp", "Startup", "wz_窗体位置", "100-100")
    If (wz Like "*-*") = False Then
        wz = "100-100"
    End If
    arr = Split(wz, "-")
    Getwz_form = arr
End Function

Public Function Setwz_form(s)
    SaveSetting "MyApp", "Startup", "wz_窗体位置", s
End Function

'启动Word时,读取注册表,设置导航栏宽度

Sub AutoOpen()
    'Word导航窗格的宽度调整后怎么固定住,下次就不用再调了?
    wid = GetSetting("MyApp", "Startup", "wid_导航栏宽度", "260-1")
    If (wid Like "*-*") = False Then
        wid = "260-1"
    End If
    arr = Split(wid, "-")
    wid = arr(0) 'change to suit
    With Application.CommandBars("Navigation")
        .Visible = arr(1)
        .Width = wid
    End With
End Sub


'主程序

Sub 导航栏宽度()
    UserForm3_导航栏宽度.Show 0
End Sub


'用户窗体代码

Private Sub UserForm_Initialize()
    arr = Getwz_form()
    UserForm3_导航栏宽度.left = Val(arr(0))
    UserForm3_导航栏宽度.top = Val(arr(1))
    '读取注册表内容
    wid = GetSetting("MyApp", "Startup", "wid_导航栏宽度", "260-1")
    If (wid Like "*-*") = False Then
        wid = "260-1"
    End If
    arr = Split(wid, "-")
    TextBox1.Value = Val(arr(0))
    CheckBox1.Value = arr(1)
    With Me.TextBox1
        .SetFocus
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
End Sub

Private Sub CommandButton1_Click()  '点击确认按钮'
    Dim s As String
    If CheckBox1.Value = True Then
        vis = "1"
    Else
        vis = "0"
    End If
    s = TextBox1.Text & "-" & vis
    SaveSetting "MyApp", "Startup", "wid_导航栏宽度", s
    s = CStr(Me.left) & "-" & CStr(Me.top)
    Call Setwz_form(s)
    'MsgBox "文字框输入的内容是:" + TextBox1.Value + TextBox2.Value
    '保存变量值到注册表
    'UserForm_导航栏宽度.hide
    With Application.CommandBars("Navigation")
        .Visible = vis
        .Width = Val(TextBox1.Text)
    End With
    With Me.TextBox1
        .SetFocus
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
End Sub

Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
    'TextBox1_Enter无效
'    MsgBox ("进入了文本框1")
    With Me.TextBox1
        .SetFocus
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
End Sub

Private Sub CommandButton2_Click()  '点击取消按钮
    s = CStr(Me.left) & "-" & CStr(Me.top)
    Call Setwz_form(s)
    Unload UserForm3_导航栏宽度
End Sub

Private Sub UserForm_Click()
    With Me.TextBox1
        .SetFocus
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
End Sub


TA的精华主题

TA的得分主题

发表于 2022-9-14 22:38 | 显示全部楼层
可试试如下代码的效果(随意调整宽度后关闭文档)
  1. Sub AutoOpen()
  2.     Dim aVar As Variable
  3.     Dim TF As Boolean
  4.     Dim wid As Integer
  5.    
  6.     For Each aVar In Variables
  7.         If aVar.Name = "NavigationWidth" Then
  8.             wid = aVar.Value
  9.             TF = True
  10.             Exit For
  11.         End If
  12.     Next
  13.    
  14.     With Application.CommandBars("Navigation")
  15.         .Visible = True
  16.         If TF = True Then .Width = wid Else .Width = 200
  17.     End With
  18. End Sub

  19. Sub AutoClose()
  20.     '获取文档关闭时导航窗格的宽度并保存
  21.     Dim aVar As Variable
  22.     Dim TF As Boolean
  23.    
  24.     For Each aVar In Variables
  25.         If aVar.Name = "NavigationWidth" Then
  26.             TF = True
  27.             Exit For
  28.         End If
  29.     Next
  30.     If TF = False Then Variables.Add "NavigationWidth"
  31.     With Application.CommandBars("Navigation")
  32.         .Visible = True
  33.         If Variables("NavigationWidth").Value <> .Width Then
  34.             Variables("NavigationWidth").Value = .Width
  35.             ActiveDocument.Save
  36.         End If
  37.     End With
  38. End Sub
复制代码

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-12-29 03:10 , Processed in 0.037910 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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