Как заполнить Combobox значениями, перечисленными в столбце A (без ручного кодирования)? - PullRequest
0 голосов
/ 15 января 2019

Привет всем! Я решил свой первый вопрос о кнопке обновления. Это вполне работает сейчас. Я подумал, что это невозможно обновить строка БЕЗ ключа или уникального идентификатора (поэтому я сделал столбец A уникальным ID).

  1. Я добавил еще один комбинированный список, расположенный в верхней части списка для поиска / фильтрации. Однако я не знаю, как заполнить комбинированный список БЕЗ РУЧНОГО КОДИРОВАНИЯ, как этот: Stackoverflow . Причина, по которой я не хочу, чтобы это было так, заключается в том, что пользователь будет время от времени добавлять строку, используя пользовательскую форму, а количество строк будет составлять тысячи.

Можно ли как-нибудь заполнить поле со списком, не вводя вручную каждое значение?


Просто обновление о моей проблеме вчера, вот обновленный код и обновленный интерфейс:

enter image description here

     Private Sub btnDelete_Click()

        Dim a As Integer

            If MsgBox("Are you sure you want to delete this row?", vbYesNo + vbQuestion, "Yes") = vbYes Then

                For a = 1 To Range("A100000").End(xlUp).Row
                    If Cells(a, 1) = listHeader.List(listHeader.ListIndex) Then
                    Rows(a).Select
                    Selection.Delete
                End If
            Next a
        End If

    End Sub

Private Sub btnSearch_Click()

'IM THINKING ABOUT REMOVING THE SEARCH BUTTON BECAUSE THE COMBOBOX ITSELF CAN BE USED FOR SEARCHING THE ROW
'IT MAKES THE SEARCH BUTTON USELESS

'Dim x As Long
'Dim y As Long

'x = Sheets("PRESTAGE DB").Range("A" & Rows.Count).End(xlUp).Row
'For y = 2 To x

'If Sheets("PRESTAGE DB").Cells(y, 1).Text = cmbSearch.Value Then
    'cmbSchema.Text = Sheets("PRESTAGE DB").Cells(y, 1)
    'cmbEnvironment.Text = Sheets("PRESTAGE DB").Cells(y, 2)
    'cmbHost.Text = Sheets("PRESTAGE DB").Cells(y, 3)
    'cmbIP.Text = Sheets("PRESTAGE DB").Cells(y, 4)
    'cmbAccessible.Text = Sheets("PRESTAGE DB").Cells(y, 5)
    'cmbLast.Text = Sheets("PRESTAGE DB").Cells(y, 6)
    'cmbConfirmation.Text = Sheets("PRESTAGE DB").Cells(y, 7)
    'cmbProjects.Text = Sheets("PRESTAGE DB").Cells(y, 8)

'End If
'Next y

End Sub

    Private Sub btnView_Click()

        listHeader.RowSource = "A4:H200"

    End Sub

Private Sub cmbAdd_Click()
    Dim sheet As Worksheet
    Set sheet = ThisWorkbook.Sheets("PRESTAGE DB")

    nextrow = sheet.Cells(Rows.Count, 1).End(xlUp).Row + 1

    sheet.Cells(nextrow, 1) = Me.cmbSchema
    sheet.Cells(nextrow, 2) = Me.cmbEnvironment
    sheet.Cells(nextrow, 3) = Me.cmbHost
    sheet.Cells(nextrow, 4) = Me.cmbIP
    sheet.Cells(nextrow, 5) = Me.cmbAccessible
    sheet.Cells(nextrow, 6) = Me.cmbLast
    sheet.Cells(nextrow, 7) = Me.cmbConfirmation
    sheet.Cells(nextrow, 8) = Me.cmbProjects

End Sub

Private Sub cmbSearch_Change()

Dim x As Long
Dim y As Long

x = Sheets("PRESTAGE DB").Range("A" & Rows.Count).End(xlUp).Row
For y = 2 To x

If Sheets("PRESTAGE DB").Cells(y, 1).Text = cmbSearch.Value Then
    cmbSchema.Text = Sheets("PRESTAGE DB").Cells(y, 1)
    cmbEnvironment.Text = Sheets("PRESTAGE DB").Cells(y, 2)
    cmbHost.Text = Sheets("PRESTAGE DB").Cells(y, 3)
    cmbIP.Text = Sheets("PRESTAGE DB").Cells(y, 4)
    cmbAccessible.Text = Sheets("PRESTAGE DB").Cells(y, 5)
    cmbLast.Text = Sheets("PRESTAGE DB").Cells(y, 6)
    cmbConfirmation.Text = Sheets("PRESTAGE DB").Cells(y, 7)
    cmbProjects.Text = Sheets("PRESTAGE DB").Cells(y, 8)

End If
Next y


End Sub

    Private Sub cmbUpdate_Click()

    Dim x As Long
    Dim y As Long

    x = Sheets("PRESTAGE DB").Range("A" & Rows.Count).End(xlUp).Row
    For y = 2 To x
    If Sheets("PRESTAGE DB").Cells(y, 1).Text = cmbSchema.Value Then
    Sheets("PRESTAGE DB").Cells(y, 2) = cmbEnvironment
    Sheets("PRESTAGE DB").Cells(y, 3) = cmbHost
    Sheets("PRESTAGE DB").Cells(y, 4) = cmbIP
    Sheets("PRESTAGE DB").Cells(y, 5) = cmbAccessible
    Sheets("PRESTAGE DB").Cells(y, 6) = cmbLast
    Sheets("PRESTAGE DB").Cells(y, 7) = cmbConfirmation
    Sheets("PRESTAGE DB").Cells(y, 8) = cmbProjects

    End If
    Next y

    End Sub

    Private Sub CommandButton5_Click()
        listHeader.RowSource = ""

    End Sub


    Private Sub listHeader_Click()

    'Dim rngMyData As Range
    Dim x As Long
    Dim y As Long

        cmbSchema.Value = UserForm1.listHeader.Column(0)
        cmbEnvironment.Value = UserForm1.listHeader.Column(1)
        cmbHost.Value = UserForm1.listHeader.Column(2)
        cmbIP.Value = UserForm1.listHeader.Column(3)
        cmbAccessible.Value = UserForm1.listHeader.Column(4)
        cmbLast.Value = UserForm1.listHeader.Column(5)
        cmbConfirmation.Value = UserForm1.listHeader.Column(6)
        cmbProjects.Value = UserForm1.listHeader.Column(7)

    End Sub

Некоторые проблемы на данный момент:

  1. Кнопка поиска работает, отображая значения строк в выпадающих списках ниже, но НЕ в списке.

  2. Кнопка обновления работает только через кнопку поиска. Как уже упоминалось, кнопка поиска отображает значение строки в выпадающем списке, затем пользователь вводит / редактирует значение в выпадающем списке, нажимает КНОПКУ ОБНОВЛЕНИЯ, и строка обновляется, как и должно быть.

  3. КНОПКА ОБНОВЛЕНИЯ НЕ РАБОТАЕТ, когда я нажимаю кнопку «Просмотр списка» и выбираю строку из списка. Значение строки по-прежнему отображается в выпадающих списках, но когда я пытаюсь изменить значение и нажать кнопку обновления, оно больше не работает.

Это сбивает с толку, но я действительно пытаюсь все выяснить.

1 Ответ

0 голосов
/ 15 января 2019

из подсказок , которые вы даете, «наиболее вероятным» решением является замена всех этих Me.Cells на ThisWorkbook.Sheets("TRY DB").Cells

, поэтому вы можете использовать блок With myObject...End With и начинать с точки (.) всех ссылок на объекты, на которые вы хотите сослаться на myObject, следующим образом:

Private Sub cmbUpdate_Click()

    Dim z As Long
    Dim x As Long

    With ThisWorkbook.Sheets("TRY DB") ' reference wanted sheet in wanted workbook

        z = Application.WorksheetFunction.CountA(.Range("A:A")) 

        For x = 2 To z
            If .Cells(x, "A").Value = Me.cmbSchema.Text Then
                .Cells(x, "B").Value = Me.cmbEnvironment.Text
                .Cells(x, "C").Value = Me.cmbHost.Text
                .Cells(x, "D").Value = Me.cmbIP.Text
                .Cells(x, "E").Value = Me.cmbAccessible.Text
                .Cells(x, "F").Value = Me.cmbLast.Text
                .Cells(x, "G").Value = Me.cmbConfirmation.Text
                .Cells(x, "H").Value = Me.cmbProjects.Text

                ' exit for ' <-- uncomment this line if your data layout is such that you are to update only one line
            End If
        Next

    End With
End Sub

Кстати, стоя listHeader.RowSource = "A4:H1000" в вашем Sub btnView_Click(), вы также можете изменить For x = 2 To z на For x = 4 To z

...