Как заполнить ListBox в пользовательской форме набором переменных из последней строки? - PullRequest
0 голосов
/ 04 мая 2019

У меня есть рабочий лист Sheet1, с данными в диапазоне от A: R, строки продолжают добавляться по мере ввода новой записи. С каждой записью диапазон строк различается, поэтому строки в столбце «А» повторяются, так что это хорошо видно в сводной таблице. Теперь, чтобы проверить, была ли вставлена ​​последняя запись, один из способов проверить это - нажать клавиши «Ctrl + Down». У меня есть ListBox в пользовательской форме для заполнения последней введенной записи. Но он показывает только 1 строку, которая является последней строкой. Как показать, что эта конкретная запись предполагает 5 строк?

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

enter image description here

Вот скриншот пользовательской формы с ListBox, когда я нажимаю «CommandButton1»

Снимок экрана пользовательской формы при нажатии CommandButton1

Private Sub CommandButton1_Click()
Dim Rng As Range
Dim lr As Long
Dim x(1 To 2, 1 To 18), y As Long
    With Worksheets("Sheet1")
         lr = .Cells(.Rows.Count, 1).End(xlUp).Row
        UserForm1.ListBox1.ColumnCount = 18
        For y = 1 To 18
            x(1, y) = .Cells(1, y)
            x(2, y) = .Cells(lr, y)
        Next y
              UserForm1.ListBox1.List = x
    End With
UserForm1.Show
End Sub

Я хочу, чтобы запись 025 - GRACE PHILLIPS (из базы данных) отображалась в ListBox, а затем при добавлении новой записи должна отображаться введенная новая

Ответы [ 2 ]

0 голосов
/ 04 мая 2019

Давайте попробуем другой подход, используя ADODB.recordset

  Option Explicit

Private Sub CommandButton1_Click()

    Dim criteria As String, fldName As String, shtName As String
    Dim con As Object  ' ADODB.Connection
    Dim rcd As Object  ' ADODB.Recordset
    Dim colCount As Long

    ' Assuming the list has a header
    Set con = GetExcelConnection(ThisWorkbook.FullName, True)

    Set rcd = CreateObject("ADODB.Recordset")
    'Set rcd = New ADODB.Recordset

    ' Assuming the list is on the first sheet and
    shtName = ThisWorkbook.Sheets(1).Name

    ' Reading the list into a recordset
    With rcd
        .ActiveConnection = con
        .CursorType = 2  ' adOpenDynamic
        .LockType = 3    ' adLockOptimistic
        .Source = "SELECT * FROM [" & shtName & "$]"
        .Open
    End With

    colCount = rcd.Fields.Count + 1
    ' Move to the last record in the list
    rcd.MoveLast

    ' Trying to find the row where S.L.No. does contain avalue
    Do While IsNull(rcd.Fields(0).Value)
        rcd.MovePrevious
        If rcd.BOF Then
            MsgBox "No S.L.No found", vbOKOnly + vbCritical, "Error - Exit"
            Exit Sub
        End If
    Loop

    ' get the value and the fieldname for the filter
    criteria = rcd.Fields(0).Value
    fldName = rcd.Fields(0).Name


    ' Filter the list by the value in the first column and last row
    ' This assumes you do not have different areas with the same value
    rcd.Filter = fldName & " = '" & criteria & "'"

    ' Prpearing everything for the Userform
    Dim frm As New UserForm1
    Load frm
    With frm
        .ListBox1.ColumnCount = colCount
        .ListBox1.Column = rcd.GetRows   ' This transfers the filtered records into the lsitbox
        .Show
    End With

End Sub

Function GetExcelConnection(ByVal Path As String, _
    Optional ByVal Headers As Boolean = True) As Object
    Dim strConn As String
    Dim objConn As Object ' ADODB.Connection
    Set objConn = CreateObject("ADODB.Connection")
    strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & Path & ";" & _
        "Extended Properties=""Excel 8.0;HDR=" & _
        IIf(Headers, "Yes", "No") & """"
    objConn.Open strConn
    Set GetExcelConnection = objConn
End Function
0 голосов
/ 04 мая 2019

Я бы сделал это так

Вариант 1 Вы можете использовать CurrentRegion, чтобы получить диапазон.Я не уверен, что это работает для вас.

Private Sub CommandButton1_Click()
    Dim rg As Range
    Set rg = Range("A1").CurrentRegion
    ListBox1.List = rg.Value
End Sub

Вариант 2 Или вы определяете последнюю строку, как вы сделали в своем опубликованном коде, и используете этот

Private Sub CommandButton1_Click()
    Dim rg As Range
    Dim lr As Long
    lr = Cells(Rows.Count, 1).End(xlUp).Row
    Set rg = Range("A1:R" & lr)
    ListBox1.List = rg.Value
End SUb

Пожалуйста, добавьте таблицу и ссылку на пользовательскую форму по мере необходимости.

Обновление На основе использования комментария для rg в Вариант 2 в следующей строке

Set rg = Range("A" & lr & ":R" & lr)

Обновление 2 Я предположил, что строки, которые вы хотите добавить в список, идентифицируются первым столбцом, который содержит SLNo.

Private Sub CommandButton2_Click()

    Dim rg As Range, rg1 As Range
    Dim lr As Long

    lr = Cells(Rows.Count, 1).End(xlUp).Row
    Set rg = Range("A1" & ":R" & lr)

    rg.AutoFilter Field:=1, Criteria1:=rg.Cells(lr, 1).Value
    Set rg1 = rg.SpecialCells(xlCellTypeVisible)
   ' Assumption is the newly added rows are in one and therefore in the last area
    Set rg1 = rg1.Areas(rg1.Areas.Count)


    ListBox1.ColumnCount = rg.Columns.Count
    ListBox1.List = rg1.Value

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