Как разрешить пользователям указывать многоуровневые категории в Excel? - PullRequest
1 голос
/ 20 января 2010

Я разрабатываю своего рода шаблон для Excel 2007. Пользователи будут использовать его для создания записей, которые относятся к 3-уровневым категориям. Пользователь должен иметь возможность создать новую категорию, указать существующую категорию или не указывать ее. Запись может принадлежать нескольким категориям.

Мне интересно, что мой лучший выбор - представить структуру категорий пользователям. Категории служат метками, поэтому в основном не требуется программирования на VBA. Есть ли какие-либо элементы управления или функции в Excel, подходящие для этой ситуации?

Ответы [ 2 ]

1 голос
/ 20 января 2010

Я бы просто использовал встроенную функцию проверки данных.Укажите на список, и тогда пользователям будет представлен раскрывающийся список с плавающим уровнем. Редактировать: Хорошо, тогда основной принцип здесь - это связанные списки.Для каждой подкатегории будет текст категории и родительская категория.Каждый раз, когда изменяется основная категория, вы повторно фильтруете подкатегорию, чтобы показать только элементы, принадлежащие этой родительской категории.

Есть много способов реализовать эту идею.Вот тривиальный пример.Чтобы использовать его, создайте пользовательскую форму с двумя выпадающими списками и вставьте код.

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
0 голосов
/ 23 января 2010

Пользователь должен иметь возможность создать новый категория, укажите существующую категорию или не указывать один. Запись может принадлежат нескольким категориям.

Вопрос. Если пользователь указывает новую запись для какого-либо уровня категории, должна ли эта новая запись стать частью списка параметров, показанного в последующих строках?

Если это так, это более чем легко сделать с помощью формул Excel и проверки. Вместо этого вы должны искать в Интернете примеры VBA для динамических списков, используя поля со списком.

...