UserForm Идентификация правильного листа на основе значения cobo

У меня есть рабочая тетрадь с информацией о клиентах. Существует лист для каждого Клиента, и каждый лист помечен уникальным идентификатором Клиента. Я хочу запустить UserForm, где пользователь выберет клиента в поле со списком. Затем данные из последней строки соответствующего листа заполняют пользовательскую форму.

В другом коде в той же книге я использую словарь сценариев, но все они привязаны к определенному диапазону, на определенном листе. Я понятия не имею, как кодировать пользовательскую форму для поиска по всем листам, чтобы найти тот, имя которого совпадает со значением в поле cobo_ClientID, а затем ввести правильные элементы данных из строки с датой обновления MAX.

Вот пример словаря сценариев, который я использовал в других областях:

Set coboDict = CreateObject("Scripting.Dictionary")
With coboDict
    For Each cStatsClientID In ws1.Range("StatsClientID")
        If Not .exists(cStatsClientID.Value) Then
            .Add cStatsClientID.Value, cStatsClientID.Row
        Else
            If CLng(cStatsClientID.Offset(, -2).Value) > CLng(ws1.Range("B" & .Item(cStatsClientID.Value))) Then
            .Item(cStatsClientID.Value) = cStatsClientID.Row
            End If
        End If
    Next cStatsClientID
    Me.cobo_ClientID.List = Application.Transpose(.keys)
    End With

2 ответа

Между предоставленной ссылкой LastRow и некоторыми советами с другого форума, я думаю, у меня есть решение. Казалось, проблема была в том, как я устанавливал LastRow, а также в том, чтобы найти правильный лист.

Private Sub cobo_ClientID_Change()

Dim Sht As String
Dim LastRow As Long

Sht = Me.cobo_ClientID

With ActiveSheet
LastRow = .Cells(.Rows.Count, "E").End(xlUp).Row
End With

txt_Name = Sheets(Sht).Range("E" & LastRow).Value
txt_DPPymtAmt = Sheets(Sht).Range("H" & LastRow).Value

End Sub

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

Добавьте эти элементы управления в форму пользователя:

  • Поле со списком называется cmbSheets
  • Три текстовых поля названы txtColA, txtColB а также txtColC,

-

Private Sub UserForm_Initialize()

    Dim wrkSht As Worksheet

    'Populate the combo-box with sheet names.
    For Each wrkSht In ThisWorkbook.Worksheets
        With Me.cmbSheets
            .AddItem wrkSht.Name
        End With
    Next wrkSht

End Sub


'Will place the values from the last row columns A:C in textboxes on the form.
Private Sub cmbSheets_Change()
    Dim rLastCell As Range
    Dim shtSelected As Worksheet

    'Set a reference to the sheet selected by the combo box.
    Set shtSelected = ThisWorkbook.Worksheets(cmbSheets.Value)

    Set rLastCell = LastCell(shtSelected)

    With shtSelected
        Me.txtColA = .Cells(rLastCell.Row, 1)
        Me.txtColB = .Cells(rLastCell.Row, 2)
        Me.txtColC = .Cells(rLastCell.Row, 3)
    End With
End Sub

'This function can be placed in a normal module.
'Finds the last cell given a worksheet reference.
Public Function LastCell(wrkSht As Worksheet) As Range

    Dim lLastCol As Long, lLastRow As Long

    On Error Resume Next

    With wrkSht
        lLastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column
        lLastRow = .Cells.Find("*", , , , xlByRows, xlPrevious).Row

        If lLastCol = 0 Then lLastCol = 1
        If lLastRow = 0 Then lLastRow = 1

        Set LastCell = wrkSht.Cells(lLastRow, lLastCol)
    End With
    On Error GoTo 0

End Function  

Примечание. Если какое-либо из значений требует определенного форматирования, его следует добавить с помощью FORMAT Команда при копировании.
Например, если ячейка имеет дату 01/05/2016 на 1 мая 2016 года, она отображается в текстовом поле как 01.05.2016 (преобразована в формат даты США).
Используя код Me.txtColC = Format(.Cells(rLastCell.Row, 3), "dd-mmm-yy") будет отображать дату как 01-мая-16 в форме.
Аналогично валюта должна быть добавлена ​​как Me.txtColB = Format(.Cells(rLastCell.Row, 2), "Currency") в противном случае £15 будет отображаться как 15.

Если вы хотите исключить определенные листы, посмотрите на SELECT CASE...END SELECT кодовые блоки (или IF...ELSE...END IF)

Если вы хотите, чтобы лист изменялся при выборе разных значений в поле со списком, просто добавьте shtSelected.Select до конца cmbSheets_Change() событие.

Другие вопросы по тегам