Заполнение заголовка списка из заголовка столбца - PullRequest
0 голосов
/ 01 мая 2018

1. Фон и цель
Я создаю новую пользовательскую форму для отображения данных из листа Excel («DATA») с таблицей («Tab1») из нескольких столбцов, как показано на рисунке ниже.

В моей форме («TaskMngUserForm») после нажатия кнопки «Список задач» все данные из Tab1 будут отображаться в Listbox1 следующим образом:

  • Заголовок столбца в Tab1 будет отображаться в Listbox1 как заголовок.
  • Данные от 2-й строки до конца в Tab1 будут отображаться в списке 1, соответствующем каждому столбцу.

Также я добавляю событие для действия «Listbox1_Click ()», которое: возвращает строку таблицы «Данные», соответствующую выбранному индексу, которая получается из 2-го столбца выбранной строки ListBox1.

UserForm and Listbox

2. Используя код
Вот мой код использования.

'4. Event for "Tasks List" button
Private Sub Button_TaskList_Click()

ListBox1.ColumnWidths = "20;100;80;100;60;100;80;80;80;200;200;200"
ListBox1.ColumnCount = 12

    With ListBox1

            '.ColumnHeads = True
            .List = Sheets("DATA").Range("B2").CurrentRegion.Value
            .RemoveItem (0)
            .ColumnCount = Sheets("DATA").Cells(2, 2).CurrentRegion.Columns.Count


    End With

Application.ScreenUpdating = True
Label25.Caption = "Total Tasks: " & (Worksheets("DATA").UsedRange.Rows.Count - 1)

End Sub

'6. Event for "Click Listbox" Action
Private Sub ListBox1_Click()

Dim strAddress As String
Dim dataSht As Worksheet

With Me
        If .ListBox1.ListIndex <> -1 Then
        Set dataSht = Sheets("DATA")

        If IsNull(Me.ListBox1.Value) Then
            Call MsgBox("You are selecting on blank row item" & vbNewLine & "Be careful!", vbInformation, "Notification")
            Button_TaskList_Click

        Else
           strAddress = GetIndexRow(.ListBox1.List(.ListBox1.ListIndex, 0), dataSht.Columns("A"))

        '<~~  GetIndexRow returns "Data" sheet row corresponding to the selected Index, which is got from the 2nd column of the selected ListBox row


        TaskMngUserForm.txtIndex.Value = dataSht.Range("A" & strAddress).Value
        TaskMngUserForm.cmbSource.Value = dataSht.Range("B" & strAddress).Value
        TaskMngUserForm.cmbType.Value = dataSht.Range("C" & strAddress).Value
        TaskMngUserForm.cmbCategory.Value = dataSht.Range("D" & strAddress).Value
        TaskMngUserForm.cmbPriority.Value = dataSht.Range("E" & strAddress).Value
        TaskMngUserForm.cmbTaskOwner.Value = dataSht.Range("F" & strAddress).Value
        TaskMngUserForm.cmbStatus.Value = dataSht.Range("G" & strAddress).Value
        TaskMngUserForm.txtOpenDate.Value = dataSht.Range("H" & strAddress).Value
        TaskMngUserForm.txtCloseDate.Value = dataSht.Range("I" & strAddress).Value
        TaskMngUserForm.txtSubject.Value = dataSht.Range("J" & strAddress).Value
        TaskMngUserForm.txtDescription.Value = dataSht.Range("K" & strAddress).Value
        TaskMngUserForm.txtSolution.Value = dataSht.Range("L" & strAddress).Value


        End If
'       TaskMngUserForm.Show
        End If
 End With

Application.ScreenUpdating = True
Label25.Caption = "Check in Task.No:  " & txtIndex.Text

End Sub

3. Проблема и вопрос

Я могу загрузить данные из Tab1 в Listbox1, но не могу заполнить заголовок столбца из Tab1 в заголовок в Listbox1.

Что-то не так в моем коде? Любая помощь или совет будут высоко оценены. Большое спасибо за ваше внимание.

1 Ответ

0 голосов
/ 01 мая 2018

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

Существует только 1 способ заполнить заголовки в ListBox, и это при использовании свойства ListBox1.RowSource. В свойстве RowSource вы должны назначить Range, это один из примеров:

UserForm1.ListBox1.RowSource = "Sheet1!A2:H20"

Это заполняет данные от A2 до H20 в ListBox1, и если для свойства ListBox1 ColumnHeaders установлено значение True, то что-либо на Sheet1! A1: H1 станет заголовком. Это единственный способ.

Причина, по которой многие пользователи скажут вам просто добавить текстовые метки поверх ListBox, чтобы сделать его проще, заключается в том, что когда вы делаете свой список с помощью RowSource, вы всегда должны выяснить, какая последняя строка используется в вашем диапазоне перед тем, как Вы назначаете Range, чтобы избежать пустых строк в вашем ListBox. Это означает, что если у вас есть 20 строк данных и вы назначаете диапазон, содержащий 50 строк, список будет заполнен 50 строками, а последние 30 будут пустыми.

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