在现代软件开发中,用户界面和用户体验(UI/UX)的设计至关重要。然而,并非所有情况下都能选择最适合的工具或框架。本文将介绍一种在Excel环境中设计和实现UI/UX的框架,尽管它可能不是最优的选择,但在某些特定场景下,如受限于Microsoft Office环境,它提供了一种可行的解决方案。
在为客户开发一个替换调度器时,由于客户的安全限制,只能使用MS Office。这意味着不得不使用Excel和VBA来完成任务。在开发过程中,遇到了代码维护困难、代码和图形的可扩展性问题,以及易用性问题。为了解决这些问题,决定开发一个框架,以模拟WPF的优点,尽可能简化开发过程。
框架的主要目标是实现代码的可维护性、可扩展性和易用性。通过创建两个主要的类——CellView和TemplateView——来实现这些目标。CellView类简化了与单个单元格的交互,而TemplateView类则作为模板类使用,用于定义视图的层次结构和布局。
CellView类是一个轻量级对象,它包含一个指向特定单元格的Range对象和一些属性访问器。这些属性访问器使得与单元格的交互更加简单。例如,可以通过Value属性来获取或设置单元格的值,通过Text属性来获取或设置单元格的文本,通过Address属性来获取单元格的地址。
Private pRg As Range ' Gets/Sets cell this object points to
Public Property Get Pos() As Range
Set Pos = pRg
End Property
Public Property Let Pos(Value As Range)
Set pRg = Value
End Property
Private Function IsInit() As Boolean
IsInit = (Not pRg Is Nothing)
End Function
Public Property Get Value() As String
If IsInit Then
Value = Pos.Value
End If
End Property
Public Property Let Value(val As String)
If IsInit Then
Pos.Value = val
End If
End Property
' ... 其他属性 ...
TemplateView类用于定义视图的层次结构和布局。每个视图都知道并引用其父视图和子视图。这种设计使得视图的放置和缩放变得简单直观。
Private pParentView As Variant ' Replace 'Variant' with actual parent class
Private pSett As Settings
Private pRg As Range
Private pViewWidth As Integer
Private pViewHeight As Integer
Private pInit As Boolean
Public Function Init(parentView As Variant)
If Not pInit Then
Set pParentView = parentView
Set pSett = Singletons.GetSettings
pViewWidth = 1
pViewHeight = 1
End If
pInit = True
End Function
' ... 其他方法 ...
要使用这个框架,首先需要探索提供的Excel文件及其代码。然后,可以通过创建CellView和TemplateView对象来构建UI/UX。例如,可以创建一个EmpTtlView对象来处理单个员工的日总计数据。
Public TimeWk As CellView
Public GoalWk As CellView
Public SalesWk As CellView
Public OverUnderWk As CellView
Public TimeYTD As CellView
Public GoalYTD As CellView
Public SalesYTD As CellView
Public OverUnderYTD As CellView
Public TimeLbl As CellView
Public GoalLbl As CellView
Public SalesLbl As CellView
Public OverUnderLbl As CellView
' ... 初始化和设置位置 ...