Excel 2013 VBA — ActiveX Cascading ComboBoxes — проблема с наличием только связанных значений в cmb4

То, чего я пытаюсь достичь, - это каскадные или зависимые поля со списком, и с помощью я, наконец, добился успеха со всеми 4.

ComboBox1 = Category
ComboBox2 = Sub Category
ComboBox3 = Location (unique to chosen subcategory)
ComboBox4 = Customer (unique to chosen subcategory and location)

Происходит то, что в comboBox4 все клиенты для выбранного местоположения заполняют поле со списком4 вместо всех клиентов для выбранного местоположения, которые также совпадают с подкатегорией.

ComboBox1 = cmbRent
ComboBox2 = cmbSub
ComboBox3 = cmbLoc
ComboBox4 = cmbCust

Все мои коды находятся на рабочем листе "ДИАГРАММА". Все мои данные расположены на рабочем листе «ДАННЫЕ». Все мои поля со списком расположены «ДИАГРАММА».

Данные, на которые ссылаются, находятся в 4 столбцах в порядке расположения полей.

Column1 = Category
Column2 = Sub Category
Column3 = Location 
Column4 = Customer

Я чувствую, что мне нужно ссылаться на Selection в cmbSub и cmbLoc, чтобы добиться того, чего я хочу?

Вот все мои коды со списком, которые применяются к рабочему листу

    Private Sub cmbRent_Change()

    Dim wsChart As Worksheet
    Dim wsData As Worksheet
    Dim listOfValues As String 'To store list of values already added
    Dim ValueToAdd As String 'To store new value to add
    listOfValues = ""
    Set wsChart = ThisWorkbook.Sheets("CHART")
    Set wsData = ThisWorkbook.Sheets("DATA")


    MyVal = Me.cmbRent.Value

    'loop thru col B
    lr = ThisWorkbook.Sheets("DATA").Cells(Rows.Count, 1).End(xlUp).Row

    'clear cmbSub
        ThisWorkbook.Sheets("CHART").cmbSub.Clear


     For x = 2 To lr
    If MyVal = wsData.Cells(x, 1) Then
       'add to combobox
        ValueToAdd = wsData.Cells(x, 2) 'Get value from worksheet
        If InStr(listOfValues, wsData.Cells(x, 2)) = 0 Then
        'Check to see if the value has already been added
        'If not, add to values added and add the item to the combobox.
              listOfValues = listOfValues & ValueToAdd
              Me.cmbSub.AddItem ValueToAdd
        End If
    End If
    Next x

          ThisWorkbook.Sheets("CHART").cmbSub.ListIndex = -1
    End Sub

        Private Sub cmbSub_Change()

    Dim wsChart As Worksheet
    Dim wsData As Worksheet
    Dim listOfValues As String 'To store list of values already added
    Dim ValueToAdd As String 'To store new value to add
    listOfValues = ""
    Set wsChart = ThisWorkbook.Sheets("CHART")
    Set wsData = ThisWorkbook.Sheets("DATA")

    MyVal = ThisWorkbook.Sheets("CHART").cmbSub.Value

    'loop thru col c
    lr = wsData.Cells(Rows.Count, 2).End(xlUp).Row

          ThisWorkbook.Sheets("CHART").cmbLoc.Clear

    For x = 2 To lr
    If MyVal = wsData.Cells(x, 2) Then
       'add to combobox
        ValueToAdd = wsData.Cells(x, 3) 'Get value from worksheet
        If InStr(listOfValues, wsData.Cells(x, 3)) = 0 Then
        'Check to see if the value has already been added
        'If not, add to values added and add the item to the combobox.
              listOfValues = listOfValues & ValueToAdd
              ThisWorkbook.Sheets("CHART").cmbLoc.AddItem ValueToAdd
        End If
    End If
    Next x

        ThisWorkbook.Sheets("CHART").cmbLoc.ListIndex = -1


      End Sub


      Private Sub cmbLoc_Change()

    Dim wsChart As Worksheet
    Dim wsData As Worksheet
    Dim listOfValues As String 'To store list of values already added
    Dim ValueToAdd As String 'To store new value to add
    listOfValues = ""
    Set wsChart = ThisWorkbook.Sheets("CHART")
    Set wsData = ThisWorkbook.Sheets("DATA")

    MyVal = ThisWorkbook.Sheets("CHART").cmbLoc.Value

    'loop thru col D
    lr = wsData.Cells(Rows.Count, 3).End(xlUp).Row

          ThisWorkbook.Sheets("CHART").cmbCust.Clear

    For x = 2 To lr
    If MyVal = wsData.Cells(x, 3) Then
       'add to combobox
        ValueToAdd = wsData.Cells(x, 4) 'Get value from worksheet
        If InStr(listOfValues, wsData.Cells(x, 4)) = 0 Then
        'Check to see if the value has already been added
        'If not, add to values added and add the item to the combobox.
              listOfValues = listOfValues & ValueToAdd
              ThisWorkbook.Sheets("CHART").cmbCust.AddItem ValueToAdd
        End If
    End If
     Next x

        ThisWorkbook.Sheets("CHART").cmbCust.ListIndex = -1


    End Sub

Если вам нужна дополнительная информация, перейдите по этой ссылке: Excel '13 VBA Cascading ComboBox — проблемы с получением уникальных значений в Combobox2


person ecoffman    schedule 06.08.2015    source источник


Ответы (1)


Проблема в том, что вы не выполняете сравнение для подкатегории в своем коде.

Более серьезная проблема, с которой вы столкнулись, заключается в том, что вы, похоже, не понимаете, что делает код. Я бы потратил некоторое время, чтобы пройтись по вашему коду и попытаться понять, что делает каждая строка. Возможно, еще раз посмотрите видео, на которое вы ссылались в одном из своих постов.

Часть вашего кода, которая проверяет, какие значения помещать в combobox4, она же cmbCust, находится здесь:

If MyVal = wsData.Cells(x, 3) Then

Это проверка MyVal, который ранее был определен как:

MyVal = ThisWorkbook.Sheets("CHART").cmbLoc.Value

Это только выбор в cmbLoc, который соответствует местоположению, но не включает подкатегорию.

Вам нужно сделать две проверки, и я бы поправил имена переменных, чтобы они были более понятными.

Dim LocVal As String
Dim SubCatVal As String

....more code here

LocVal = ThisWorkbook.Sheets("CHART").cmbLoc.Value
SubCatVal = ThisWorkbook.Sheets("CHART").cmbSub.Value

....more code here


'Now do the comparison
If LocVal = wsData.Cells(x, 3) And SubCatVal = wsData.Cells(x,2) Then
    ValueToAdd = wsData.Cells(x, 4) 

.....Rest of code in the if statement
person OpiesDad    schedule 06.08.2015
comment
Прежде всего, еще раз спасибо за ваш ответ. Однако я понимаю, что делает каждая строка, я просто не совсем понимаю, как заставить их делать это без помощи других. Я поиграл с изменением тех частей, которые вы упоминаете, например, изменил то, на что ссылается myVal, но вернул все обратно к как я сначала имел это для того чтобы опубликовать здесь. как я уже упоминал в своем исходном посте, я чувствую, что мне нужно ссылаться как на подкатегорию, так и на местоположение. Я действительно ценю вашу помощь! - person ecoffman; 06.08.2015
comment
И кстати, Вы КРАСИВЫЙ мужчина, Сработало!! Я работаю над этим время от времени, пытаясь учиться на ходу уже почти 1,5 месяца. Переходим к следующей части проекта! - person ecoffman; 07.08.2015
comment
Не пытался осуждать... Я просто пытался внести предложения, которые могли бы помочь вам учиться, чтобы вы могли редактировать вещи в будущем. Я заметил ваш комментарий о том, что, по вашему мнению, вам нужно, но не было комментариев о том, что вы пробовали и в каких строках вам нужна помощь. Я рад помочь, так как знаю, что не у всех есть опыт, и я видел крупных CS с похожими проблемами, и просто пытался дать совет. - person OpiesDad; 07.08.2015
comment
Тон не так просто передать по тексту! Я действительно ценю это. - person ecoffman; 07.08.2015