我正在使用 Excel 2007 开发一种模板。用户将使用它来创建属于 3 级类别的记录。用户应该能够创建新类别、指定现有类别或不指定。一条记录可能属于多个类别。
我想知道我最好的选择是向用户展示类别结构。类别用作标签,因此基本上不需要 VBA 编程。Excel 中是否有适合这种情况的控件或功能?
我正在使用 Excel 2007 开发一种模板。用户将使用它来创建属于 3 级类别的记录。用户应该能够创建新类别、指定现有类别或不指定。一条记录可能属于多个类别。
我想知道我最好的选择是向用户展示类别结构。类别用作标签,因此基本上不需要 VBA 编程。Excel 中是否有适合这种情况的控件或功能?
我只是使用内置的数据验证功能。将它指向一个列表,然后用户将看到一个浮动级别的下拉菜单。 编辑: 好的,那么这里的基本原理是链表。对于每个子类别,都会有类别文本和父类别。每当主类别更改时,您都会重新过滤子类别以仅显示属于该父类别的项目。
有很多方法可以实现这个想法。这是一个简单的例子。要使用它,请创建一个带有两个组合框的用户表单并粘贴代码。
Option Explicit
Private masCat2() As String
Private Sub UserForm_Initialize()
Me.ComboBox1.List = CreateTestData(0)
With Me.ComboBox2
masCat2 = CreateTestData(1)
End With
End Sub
Private Sub ComboBox1_Change()
Me.ComboBox2.List = FilterArray(masCat2, Me.ComboBox1.Value)
End Sub
Private Function FilterArray(ByRef vals() As String, ByVal match As String) As String()
Dim i As Long, j As Long
Dim asVals() As String
ReDim asVals(UBound(vals, 1)) As String
For i = 0 To UBound(vals, 1)
If vals(i, 0) = match Then
asVals(j) = vals(i, 1)
j = j + 1
End If
Next
ReDim Preserve asVals(j - 1)
FilterArray = asVals
End Function
Private Function CreateTestData(ByVal series As Long) As String()
Dim asRtnVal() As String
Select Case series
Case 0
ReDim asRtnVal(1) As String
asRtnVal(0) = "Thing1"
asRtnVal(1) = "Thing2"
Case 1
ReDim asRtnVal(3, 1) As String
asRtnVal(0, 0) = "Thing1"
asRtnVal(1, 0) = "Thing1"
asRtnVal(2, 0) = "Thing2"
asRtnVal(3, 0) = "Thing2"
asRtnVal(0, 1) = "ThingA"
asRtnVal(1, 1) = "ThingB"
asRtnVal(2, 1) = "ThingC"
asRtnVal(3, 1) = "ThingD"
End Select
CreateTestData = asRtnVal
End Function
用户应该能够创建新类别、指定现有类别或不指定。一条记录可能属于多个类别。
问题 - 如果用户为类别的任何级别指定一个新条目,该新条目是否应该成为后面几行显示的选项列表的一部分?
如果是这样,这比使用 excel 公式和验证更容易完成。相反,您应该在线搜索使用组合框的动态列表的 VBA 示例。