分享

VBA模块化编程实例:动态添加单元格批注

 冷茶视界 2024-05-20 发布于江苏
大家好,我是冷水泡茶。
今天在论坛上看到一个求助贴:[求助]给单元格添加注释

详细需求:

请大神帮忙,给单元格添加注释,注释内容来源其他表。请看附件。单元格数量可多可少,不固定。不知能否实现;

这是一个监考表,需要对监考老师所在单元格进行注释,注释内容为监考次数,必监科目,不监科目,当鼠标对准某个老师,就显示注释内容,鼠标移走了,注释也就删除了。 

具体数据表格:

1、监考表,每个科目对应监考老师的姓名

2、基础信息设置,每个老师对应有监考次数,必监考科目、不监考科目,这两个字段是一个课程代码的数字组合,在批注中需要转成对应的课程名称

关于添加单元格批注,我们分享过两个案例:

1、命令按钮跟随选定单元格,自动填列数据并插入批注
2、图片预览:根据图片文件路径插入图片批注

这个案例需要步骤还不少,正好我们前面分享过关于VBA模块化编程的文章,我们就拿这个例子来试一试,尽量“模块化” :

基本思路:

我们准备使用数组、字典来处理数据。
1、我们设置一个过程getDic,用来存放数据,主要是老师的姓名,对应批注的文本
(1)我们把“基础信息设置”表装入数组arr;由于表头字段包括换行、空格,我们用一个自定义函数textProcess来把上述特殊字符替换掉,使之成为一行纯文本,方便我们使用Pxy函数来定位字段。
(2)我们循环arr,先把课程代码作为key、考试课程作为Item装入字典dic。
(3)我们再循环arr,把老师的姓名作为装入字典,把对应批注文本作为Item。在这过程中,我们定义一个函数getSubject,根据“必监考科目”、“不监考科目”的代码来获取和个课程名称的字符串,用于组合成批注文本:
Function getSubject(str As String, dic As Object) As String    '//根据数字,查找对应的科目名称    Dim temp As String    For i = 1 To Len(str)        temp = temp & dic(Mid(str, i, 1))    Next    getSubject = tempEnd Function
2、我们定义一个添加批注的过程:addComment(rng As Range, text As String),把指定文本添加到单元格批注。
3、我们在工作表的Selection Change事件中,我们根据目标单元格,到dic中提取批注文本,并把这个文本添加到目标单元格的批注中。
4、把与目标单元格相同的老师名称统一标色(这是需求文件中已有的代码)。

VBA代码

代码详见第二条推文

后记

1、“基础信息设置”表中,它的表头中包含空格、回车,给数据处理带来麻烦,建议表头字段还是要规范为宜。
2、本来我是打算定义一个自定义函数getText,根据“监考表”中点击的单元格,直接循环数组,取得批注文本,但发现速度有一丁点儿慢,于是改为在字典中提取文本(把所有老师对应的批注文本都加入字典),仅在首次点击时加载字典,后面如果字典正常,就直接从字典中读取数据。
好,今天就到这里,我们下期再会!
~~~~~~End~~~~~~

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多