研究和分享Excel知识和技术是自已的一项业余爱好,自已平时主要花的时间还是在工作上,毕竟这是自已的饭碗。说实在的,工作确实很忙,想要上班时“偷”点时间来写Excel文章的机会很小,因此都是晚上或者周末来准备要发表的文章,这样才能实现每日的分享。
以前自已都是使用纸和笔来记录在公众号中待发表和已发表的文章,一来有一个文章清单,让自已可在其中挑选要发表的文章,免得搞混淆和重复,二来也便于在特定的时间段总结一下。今年的1月1日在立自已今年的flag时,突然想到,自已一直在研究Excel和VBA的应用技术,何不将这个清单搬到Excel上,岂不是更好!
下图1是用于记录文章的3个工作表。其中,“待发表”工作表中是已经写好但还未推送的文章,“已发表”工作表中是已经推送过的文章,“分类”工作表中存放着文章的类别。
图1
在“分类”工作表中,定义动态的名称,以便于添加或删除类别时实现列表的动态更新。定义动态名称如下图2所示。
图2
下图3是“待发表”工作表的结构。其中,列B中使用了“数据验证”功能,可以在下拉列表中选择上图2中的分类项,列C中的下拉列表可选择“是”或“否”。
图3
如果在“待发表”工作表中填好数据后,在列C相应单元格中选择“是”,则会将该单元格所在行的记录复制到“已发表”工作表中。下图4是“已发表”工作表的结构。
图4
实现上述功能的代码如下,在VBE中双击“待发表”工作表模块,输入下面的代码:
Private Sub Worksheet_Change(ByVal Target As Range)
'工作表变量
Dim wksUnPublish AsWorksheet
Dim wksPublished AsWorksheet
'工作表中最后一行
Dim lngLastRow As Long
'当前单元格所在行
Dim lngCurRow As Long
'信息框响应
Dim iMsg As Integer
'获取当前行行号
lngCurRow = Target.Row
'当前单元格在列C,或值为空或"否",则退出
If Intersect(Target,Range("C:C")) Is Nothing Or _
Range("C"& lngCurRow) = "" Or _
Range("C"& lngCurRow) = "否" Then Exit Sub
'赋值工作表
Set wksUnPublish =Worksheets("待发表")
Set wksPublished =Worksheets("已发表")
'获取"已发表"工作表最后一行行号
lngLastRow =wksPublished.Range("B" & Rows.Count).End(xlUp).Row
'当前行列D中单元格值为"是"且列A和列B中的值不为空
If Range("C"& lngCurRow) = "是" And _
Range("A"& lngCurRow) <> "" And _
Range("B"& lngCurRow) <> "" Then
'弹出询问信息框并获取用户所选值
iMsg = MsgBox("要推送这篇文章吗?", vbYesNo)
'如果用户单击"是"
If iMsg = vbYes Then
'将当前行复制到"已发表"工作表相应行
wksUnPublish.Range("A" &lngCurRow & ":B" & lngCurRow).Copy _
wksPublished.Range("B" & lngLastRow + 1)
'输入序号
wksPublished.Range("A" & lngLastRow + 1) = lngLastRow
'输入日期
wksPublished.Range("D" & lngLastRow + 1).Value = Date
'删除"待发表"工作表中相应行
wksUnPublish.Range("A" & lngCurRow).EntireRow.Delete
Else
'如果用户单击"否"
Range("C" & lngCurRow).Value = "否"
End If
End If
End Sub
实现效果如下图5所示。
图5