ListBox заполняется на основе ComboBox - другая структура данных

На вкладке «Настройка» у меня автоматически создается список листов:

введите здесь описание изображения

Формат столбца: листы с форматом A выглядят одинаково, содержат только разные значения, и все листы с форматом B также выглядят одинаково, снова содержат разные значения .

Теперь я добавляю значения в поле со списком:

Dim db_rows As Long, i As Long
Dim wbs As Workbook
Dim wss As Worksheet

Set wbs = ActiveWorkbook
Set wss = wbs.Worksheets("setting")

db_rows = wss.Cells(Rows.Count, 1).End(xlUp).Row

With cb3
    .Clear
        For i = 2 To db_rows
            If wss.Cells(i, 1).Value <> "" Then
                .AddItem wss.Cells(i, 2).Value
            End If
        Next i
End With
Me.cb3.ListIndex = 0

Затем я хочу заполнить listBox2 на основе значения, нажатого на cb3. Но приведенный ниже код работает одинаково для всех форматов.

Dim NameArray As Variant
With Sheets(Me.cb3.Value)
    NameArray = .Range(.Range("B6"), .Range("B6").End(xlDown))
    NameArray = .Range("A8:H100")
End With
listBox2.List =  NameArray

Пожалуйста помоги.

Пример различных диапазонов в зависимости от формата:

Формат A: Диапазон: A8:H100

Формат B: Диапазон: B10:G50

Формат C: Диапазон: C20:B30 и т.д....


person 4est    schedule 09.01.2017    source источник
comment
Можете ли вы показать нам, что на выходе является по сравнению с тем, что должно быть?   -  person CallumDA    schedule 09.01.2017
comment
см. примеры различных диапазонов   -  person 4est    schedule 09.01.2017
comment
Причина, по которой вы получаете одинаковые результаты для всех листов, заключается в том, что после того, как вы попытаетесь занять массив NameArray с помощью .Range(.Range("B6"), .Range("B6").End(xlDown)), вы перезаписываете следующую строку с помощью NameArray = .Range("A8:H100") (которая всегда имеет одинаковый размер)   -  person Shai Rado    schedule 09.01.2017
comment
так как настроить его на другой источник? например, один раз формат А, а следующий раз формат Б? и исходники должны быть разные   -  person 4est    schedule 09.01.2017


Ответы (1)


Я сделал, как показано ниже:

Dim j, wss1, db_x As Long
Dim selected_value, format_db As String
wss1 = wss.Cells(wss.Rows.Count, "B").End(xlUp).Row
selected_value = Me.cmbListItem2.Value

Dim NameArray3 As Variant
Dim col_numA, col_numB As Integer
col_numA = 6
 col_numB = 3

   For j = 2 To wss1
       If wss.Range("B" & j).Value = selected_value Then
           format_db = wss.Range("C" & j).Value
           Exit For
       End If
   Next

   Select Case format_db
        Case "A"        
                With Sheets(Me.cmbListItem2.Value)
                db_x = .Cells(.Rows.Count, "A").End(xlUp).Row
                NameArray3 = .Range("A8:H" & db_x)
                End With

                With listBox2
                    .ColumnCount = col_numA
                    .List = NameArray3
                    .ColumnWidths = "50;200;50;50;50;50"
                    .MultiSelect = fmMultiSelectMulti
                End With

        Case "B"
                With Sheets(Me.cmbListItem2.Value)
                db_x = .Cells(.Rows.Count, "B").End(xlUp).Row
                NameArray3 = .Range("B10:G" & db_x)
                End With

                With listBox2
                    .ColumnCount = col_numB
                    .List = NameArray3
                    .ColumnWidths = "50;50;50;50;50;50"
                    .MultiSelect = fmMultiSelectMulti
                End With                
        Case Else            
    End Select

Но если вы знаете, как я могу сделать это лучше или по-другому, пожалуйста, поделитесь со мной этой идеей.

person 4est    schedule 10.01.2017