ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] VBA做界面,录入书签,支持格式内容设定

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-1-31 00:16 | 显示全部楼层 |阅读模式
我在做word模板的时候,对标题,项目,类型,厂商,以及页眉页脚进行了书签的设定,目的是实现,一次输入,处处相同。
为了防止模板使用人员,不知道哪儿是书签的定义的点,我使用了域-ask来在文档开始的时候对各个书签进行定义。
但是,书签数量比较多,所以,窗口不停的跳出,每个都需要确认和关闭,很麻烦。
不知道,是否可以用VBA设计一个界面,在文档打开的时候,自动跳出,并收集各个书签的数值和内容,而后,在文件相应的部位,统一更新,并保持一致。

谢谢

TA的精华主题

TA的得分主题

发表于 2020-1-31 09:22 | 显示全部楼层
搜索一下Document_Open和用户窗体,也许会有所收获。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-31 10:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
昨晚搞了一会儿,基本搞定
image.png
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-31 11:41 | 显示全部楼层
出现了一个新问题,我测试的时候,使用了一个空白文档,三个书签均无内容,vba报错。修改后还是不行,请各位专家帮忙看看。
Private Sub UserForm_Initialize()

Dim BMRange1 As Range, BMRange2 As Range, BMRange3 As Range

Set BMRange1 = ActiveDocument.Bookmarks("title").Range '将书签内容赋予变量
If IsNull(BMRange1.Text) = True Then
Set BMRange1 = Empty '如果指定书签内容为空,则向其赋一个长度为空白的值
ActiveDocument.Bookmarks.Add "title", BMRange1 '重新生成书签内容
End If

Set BMRange2 = ActiveDocument.Bookmarks("company").Range '将书签内容赋予变量
If IsNull(BMRange2.Text) = True Then
Set BMRange2 = Empty '如果指定书签内容为空,则向其赋一个长度为空白的值
ActiveDocument.Bookmarks.Add "company", BMRange2 '重新生成书签内容
End If

Set BMRange3 = ActiveDocument.Bookmarks("project").Range '将书签内容赋予变量
If IsNull(BMRange3.Text) = True Then
Set BMRange3 = Empty '如果指定书签内容为空,则向其赋一个长度为空白的值
ActiveDocument.Bookmarks.Add "project", BMRange3 '重新生成书签内容
End If

'Set BMRange1 = ActiveDocument.Bookmarks("title").Range '将书签内容赋予变量
'Set BMRange2 = ActiveDocument.Bookmarks("company").Range '将书签内容赋予变量
'Set BMRange3 = ActiveDocument.Bookmarks("project").Range '将书签内容赋予变量

TextBox1.Value = BMRange1.Text '将书签变量的内容赋予文本框
TextBox2.Value = BMRange2.Text '将书签变量的内容赋予文本框
TextBox3.Value = BMRange3.Text '将书签变量的内容赋予文本框

End Sub

Private Sub CommandButton1_Click()

Dim BMRange1 As Range, BMRange2 As Range, BMRange3 As Range

'Set BMRange1 = ActiveDocument.Bookmarks("title").Range '将书签内容赋予变量
'Set BMRange2 = ActiveDocument.Bookmarks("company").Range '将书签内容赋予变量
'Set BMRange3 = ActiveDocument.Bookmarks("project").Range '将书签内容赋予变量

Set BMRange1 = ActiveDocument.Bookmarks("title").Range '将书签内容赋予变量
If IsNull(BMRange1.Text) = True Then
Set BMRange1 = Empty '如果指定书签内容为空,则向其赋一个长度为空白的值
ActiveDocument.Bookmarks.Add "title", BMRange1 '重新生成书签内容
End If

Set BMRange2 = ActiveDocument.Bookmarks("company").Range '将书签内容赋予变量
If IsNull(BMRange2.Text) = True Then
Set BMRange2 = Empty '如果指定书签内容为空,则向其赋一个长度为空白的值
ActiveDocument.Bookmarks.Add "company", BMRange2 '重新生成书签内容
End If

Set BMRange3 = ActiveDocument.Bookmarks("project").Range '将书签内容赋予变量
If IsNull(BMRange3.Text) = True Then
Set BMRange3 = Empty '如果指定书签内容为空,则向其赋一个长度为空白的值
ActiveDocument.Bookmarks.Add "project", BMRange3 '重新生成书签内容
End If

BMRange1 = TextBox1.Value '将文本框的内容赋予书签变量
BMRange2 = TextBox2.Value '将文本框的内容赋予书签变量
BMRange3 = TextBox3.Value '将文本框的内容赋予书签变量

ActiveDocument.Bookmarks.Add "title", BMRange1 '重新生成书签内容
ActiveDocument.Bookmarks.Add "company", BMRange2 '重新生成书签内容
ActiveDocument.Bookmarks.Add "project", BMRange3 '重新生成书签内容

Unload UserForm1

End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-31 17:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我修改了一下编码,现在如果文本开始没有定义任何书签也不会报错。
但是问题是。
1. 生成的书签连在一起,及:第二个书签涵盖了第一个书签的内容,第三个书签涵盖了第一,二个书签的内容。我试图在生成每个书签后插入文字或者空格进行隔离,但是没有用。
2. 每次打开文件(运行vba),如果不做任何操作,只是点击确认,书签的内容会一次次的累加,第一次打开文件书签是AAA,第二次打开文件,不做任何修改,书签变成了AAAAAA

详情见附件,请指教

书签录入 - 副本.rar

35.96 KB, 下载次数: 3

TA的精华主题

TA的得分主题

发表于 2020-2-1 12:34 | 显示全部楼层
tengshj 发表于 2020-1-31 17:19
我修改了一下编码,现在如果文本开始没有定义任何书签也不会报错。
但是问题是。
1. 生成的书签连在一起 ...

问题的原因在于三个range连在一起了,这样改变内容时容易导致range的重叠。
range最好不要连在一起,可以中间用个空格分开就不会有问题了。当然,本例的情况也可以通过修改range首尾位置来修正:
  1. Private Sub CommandButton1_Click()
  2. Dim BMRange1 As Range, BMRange2 As Range, BMRange3 As Range
  3.     '将书签内容赋予变量
  4.     Set BMRange1 = ActiveDocument.Bookmarks("title").Range
  5.     Set BMRange2 = ActiveDocument.Bookmarks("company").Range
  6.     Set BMRange3 = ActiveDocument.Bookmarks("project").Range
  7.     '将文本框的当前内容赋给书签变量
  8.     BMRange1.Text = TextBox1.Value
  9.    
  10.     BMRange2.Text = TextBox2.Value
  11.     BMRange1.SetRange BMRange1.Start + Len(TextBox2.Value), BMRange1.End '修正结束点位置
  12.     BMRange3.Text = TextBox3.Value
  13.     BMRange2.SetRange BMRange2.Start + Len(TextBox3.Value), BMRange2.End '修正结束点位置

  14.     '重新生成书签内容
  15.     ActiveDocument.Bookmarks.Add "title", BMRange1
  16.     ActiveDocument.Bookmarks.Add "company", BMRange2
  17.     ActiveDocument.Bookmarks.Add "project", BMRange3
  18.     ActiveDocument.Fields.Update
  19.     Unload UserForm1
  20. End Sub
复制代码
书签录入测试.rar (32.4 KB, 下载次数: 15)


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-1 13:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zhanglei1371 发表于 2020-2-1 12:34
问题的原因在于三个range连在一起了,这样改变内容时容易导致range的重叠。
range最好不要连在一起,可 ...

,这个加空格的解决的方法,简直是出乎意料。完全想不到。。怎么感觉更像个bug。

还是end的方法比较高大上。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-1 14:20 | 显示全部楼层
zhanglei1371 发表于 2020-2-1 12:34
问题的原因在于三个range连在一起了,这样改变内容时容易导致range的重叠。
range最好不要连在一起,可 ...

再问一个问题,为什么BMRange1的end的修正,在BMRange2赋值之后?而不是在BMRange1赋值之后马上做呢?不会出现问题吗?
或者可以在BMRange1~3赋值全部完成之后,在一起做end的修正吗?

谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-1 16:21 | 显示全部楼层
zhanglei1371 发表于 2020-2-1 12:34
问题的原因在于三个range连在一起了,这样改变内容时容易导致range的重叠。
range最好不要连在一起,可 ...

在使用时出现两个问题。
1. 书签内容有空格时,会出现不能完全读取书签内容
2. 文档多次打开修改时,书签内容的最后会每次都加一个硬回车

TA的精华主题

TA的得分主题

发表于 2020-2-1 16:29 | 显示全部楼层
tengshj 发表于 2020-2-1 14:20
再问一个问题,为什么BMRange1的end的修正,在BMRange2赋值之后?而不是在BMRange1赋值之后马上做呢?不 ...

因为刚刚赋值之后其没有变化;BMRange2赋值之后其值才发生了变动。可以通过debug.print BMRange1.text来随时追踪观察值的变化来得知。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 13:22 , Processed in 0.048629 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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