No.1
电子表是儿时的一个记忆,那个时候,为了戴上一个漂亮的电子表不知道有多么开心,儿时年幼时间并不是什么重要的东西,反正对时间也没有概念,主要是在同学面前伸出手腕那一瞬间的自豪才觉得无比喜悦。
为了回忆童年,也为了追忆逝去的时间,本节主要介绍一下,如何利用VBA来制作一个7位码时间显示效果。
下图为例:
特点:
- 时间大小可以任意调整。
- 数字颜色可任意修改。
- 利用绘制Shape对象图形来达到构建数字效果。
- 时间调用当前电脑时间进行显示。
上图为:图形对象参数设置表。
No.2
对于时间数字大小,可修改本表,以实现其显示的位置、大小以及颜色。
设计代码之初就为了可调节性进行了考虑,所以在不同的应用环境下,稍加修改得以使用。
上图为时间数字显示状态表,本表是固定格式,不能随意更改。
也就是说本表定义了两个状态,一个True,一个False。
True表示显示,False表示隐藏。
本例的显示逻辑为,在首先在Excel中绘制四个时间数字,即小时和分钟的时间数字。
然后提取当前系统时间,分别判断数字,对绘制的小时和分钟进行显示和隐藏属性设置。
最终达到显示效果。
No.3
下面看一下代码实现过程:
按钮代码
Private Sub ShowTime()
DelDagit'清除Excel图形
Dim s As Worksheet
Dim xR As Range, R As Range
Set s = ThisWorkbook.Worksheets("Sheet3")
Set xR = s.Range("A2:A8")
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 设置小时
Dim n As Integer, Ho
Ho = VBA.Format(VBA.Hour(Time), "0#")
n = VBA.Len(Ho)
For i = 1 To n
SetTimeNumber xR, VBA.Mid(Ho, i, 1), i
Next i
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 绘制冒号
Dim dR As Range
Set dR = s.Range("A10:A11")
SetTimeNumber dR, 11, 3
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 设置分钟
Dim m As Integer, Mo
Mo = VBA.Format(VBA.Minute(Time), "0#")
n = VBA.Len(Mo)
For i = 1 To n
SetTimeNumber xR, VBA.Mid(Mo, i, 1), i 3
Next i
End Sub
绘制数字过程:
Private Sub SetTimeNumber(xR As Range, nx, i)
Dim Wx, Hx
Wx = VBA.Val(xR.Item(1).Offset(0, 4).Value) * 2
Hx = VBA.Val(xR.Item(1).Offset(0, 3).Value)
Dim Pobj() As Object
Erase Pobj
For Each R In xR
ReDim Preserve Pobj(R.Row - 2)
Set Pobj(R.Row - 2) = Me.Shapes.AddShape _
(msoShapeRectangle, R.Offset(0, 2) (i - 1) * (Wx Hx), R.Offset(0, 1), R.Offset(0, 4), R.Offset(0, 3))
With Pobj(R.Row - 2)
.Fill.ForeColor.RGB = RGB(10, 12, 22)
.Visible = True
' .Fill.ForeColor.SchemeColor = R.Offset(0, 5)
End With
Next R
If nx <> 11 Then
SetVisible Pobj, nx '设置隐藏
End If
End Sub
设置隐藏部分:
Private Sub SetVisible(Pobj, nx)
Dim sR As Range
Set sR = ThisWorkbook.Worksheets("Sheet2").Range("A2:A11")
Dim vx As Variant, s As Integer
s = 0
For Each vx In Pobj
s = s 1
vx.Visible = sR.Item(nx 1).Offset(0, s)
Next vx
End Sub
时间关系,没有做成动态显示,有兴趣的朋友可做一个试试。
其实,做这个的目的并没有什么意义,一个Time函数就可以实现时间显示,如果说意义的话,应该是可以提高一下逻辑能力。
总结:
本节编码过程中需要用到一些基础的内容知识:
- 字符截取函数:Mid(String,n,n)
- 时间函数:Time
- 小时函数:Hour(Time)
- 分钟函数:Minute(Time)
- 格式化函数:Format(String,"0#")
- Shape对象AddShape()方法
- Range.Offset(row,column)方法
- 过程调用
欢迎关注、收藏