1

我正在使用 Excel 2007 开发一种模板。用户将使用它来创建属于 3 级类别的记录。用户应该能够创建新类别、指定现有类别或不指定。一条记录可能属于多个类别。

我想知道我最好的选择是向用户展示类别结构。类别用作标签,因此基本上不需要 VBA 编程。Excel 中是否有适合这种情况的控件或功能?

4

2 回答 2

1

我只是使用内置的数据验证功能。将它指向一个列表,然后用户将看到一个浮动级别的下拉菜单。 编辑: 好的,那么这里的基本原理是链表。对于每个子类别,都会有类别文本和父类别。每当主类别更改时,您都会重新过滤子类别以仅显示属于该父类别的项目。

有很多方法可以实现这个想法。这是一个简单的例子。要使用它,请创建一个带有两个组合框的用户表单并粘贴代码。

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
于 2010-01-20T03:10:30.990 回答
0

用户应该能够创建新类别、指定现有类别或不指定。一条记录可能属于多个类别。

问题 - 如果用户为类别的任何级别指定一个新条目,该新条目是否应该成为后面几行显示的选项列表的一部分?

如果是这样,这比使用 excel 公式和验证更容易完成。相反,您应该在线搜索使用组合框的动态列表的 VBA 示例。

于 2010-01-22T22:27:28.190 回答