Как заполнить поле со списком после проверки цикла - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь заполнить мой ComboBox1 в UserForm3 рядом данных. Это проблема.

У меня есть 3 листа:

  • Лист1 со списком для завершения
  • Лист2 с именованным диапазоном (Список1, Список2 и т. Д.), Составленный из списка конкретного продуктаlist (например, List1 имеет 3 строки с продуктами Pr1, Pr3 и Pr4)
  • Sheet3 со списком товаров, сохраненных как именованный диапазон «itemlist» (ColumnA с названиями товаров с повторением (Pr1, Pr2, Pr3, Pr1, Pr2, Pr4 и т. Д.) И ColumnB с номерами партий для различных продуктов (Lo1, Lo8, Lo4, Lo2 и т. Д. Для каждого PrX в неупорядоченном списке, т. Е. Pr1 может иметь 3 лота (Lo1, Lo2, Lo3), Pr3 4лоты (Lo4, Lo5, Lo6, Lo7) и т. д.)

Итак, теперь, когда мой макрос нашел именованный диапазон в Sheet1! ColumnA (например, List1 в A2), макрос скопирует строки вSheet1! ColumnB. Работает нормально. Теперь я хочу вызвать UserForm3 для каждой из этих строк Sheet1! ColumnB (т.е. только что скопированные названия продуктов, в моем примере теперь Pr1 в B2, Pr3 в B3 и Pr4 в B4)и заполните список Combobox1 номерами лотов для различных продуктов, найденных вSheet3 (т. Е. Для Pr1 в B2 список Combobox1 должен иметь Lo1, Lo2 и Lo3, Pr3 в B3 должен иметь Lo4, Lo5, Lo6 и Lo7 и т. Д.).

Здесь код для макроса Sheet1

Option Explicit
Public xlot As String
Sub Protocols()
ThisWorkbook.Sheets("Sheet1").UsedRange.Select

    Dim MyRange As Range
    Dim wsI As Worksheet, wsO As Worksheet
    Dim cell As Range
    Dim nm As Name
    Dim xlot As Variant
    Dim rngpro As Variant
    Dim i As Variant


    With ThisWorkbook.Sheets("Sheet1").UsedRange
        Set MyRange = Range(.Cells(2, 1), .Cells(1, 1).Offset(.Rows.Count - 1, .Columns.Count - 1))
        MyRange.Select
    End With

    Set wsI = ThisWorkbook.Sheets("Sheet2")
    Set wsO = ThisWorkbook.Sheets("Sheet1")

On Error Resume Next

For Each cell In MyRange.Columns("A").Cells
If IsEmpty(cell) = True Then                     

Else
  For Each nm In ThisWorkbook.Names              
    If cell.Value = nm.Name Then Exit For   'search through ListX in Sheet2 
  Next nm

       wsI.Range(nm.Name).Copy wsO.Cells(cell.Row, "B") 'copy the founded ListX list in Sheet1 (e.g. the 3 rows for the List1)
       rngpro = wsI.Range(nm.Name).Rows.Count     

       For i = cell.Row To cell.Row + rngpro - 1
       UserForm3.Show
       xlot = UserForm3.ComboBox1.Value
       Cells(i, "C") = xlot    'insert the combobox1 choice in C (e.g. one of the lot number Lo1, Lo2 or Lo3)         
       Next i

End If

Line3: Next cell

On Error GoTo 0

End Sub

А код UserForm3 здесь:

Option Explicit
Public xlot As String
Public i As Variant     'the variable from Sheet1 that userform could be read
Private Sub CommandButton1_Click()
UserForm3.Hide
End Sub
Private Sub ComboBox1_AfterUpdate()
    xlot = ComboBox1.Value
End Sub
Private Sub Label1_Click()
    lcell.Value = ComboBox1.Name
End Sub

Private Sub Userform_Initialize()
    Dim xlots As Variant
    Dim nm As Name
    Dim lcell As Range
    Dim cellot As Range
    Dim wsO As Worksheet
    [itemlist].Select  'the named range table in Sheet3 with product names in column(A) and lot number in column(B)

    For Each lcell In Range("itemlist").Columns(1).Cells
        If lcell.Value = i Then 'search the product name PrX
           Cells(lcell.Row, "B").Value = cellot 'the lot number for the founded PrX (e.g. Pr1)
            With ComboBox1
            .AddItem cellot.Offset(0, 1).Value
            End With
        End If
    Next lcell

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...