从列标题填充Listbox的标题

时间:2018-05-01 02:47:31

标签: excel vba excel-vba excel-formula

1。背景&目的
我创建了新的用户表单来显示Excel表格中的数据(" DATA")和多列的表格(" Tab1"),如下图所示。

在我的表单(" TaskMngUserForm")中,点击"任务列表"按钮,Tab1中的所有数据将显示在Listbox1上,如下所示:

  • Tab1中的列标题将在Listbox1上显示为标题。
  • Tab1中从第2行到结尾的数据将显示在与每列对应的Listbox1上。

此外,我还要添加一个动作事件" Listbox1_Click()"那:返回"数据"与所选索引对应的表格行,该索引从所选ListBox1行的第2列获得。

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中的Header。

我的代码有什么问题吗? 任何帮助或建议将受到高度赞赏。 非常感谢你的关注。

1 个答案:

答案 0 :(得分:2)

我最近将UserForm编码为包含标题,我可以为您解答此问题。

只有一种方法可以填充ListBox上的标题,即使用ListBox1.RowSource属性时。在RowSource属性中,您必须分配一个Range,这是一个示例:

<a asp-area="" asp-controller="Manage" asp-action="Index" title="Manage">
  <span class="glyphicon glyphicon-user" style="color:white"></span> 
    Hello @UserManager.GetUserName(User).Split('@')[0]!
</a>

这将在ListBox1上填充从A2到H20的数据,如果ListBox1 ColumnHeaders属性设置为True,那么Sheet1!A1:H1上的任何内容都将成为标题。这是唯一的方法。

许多用户会告诉您只是在ListBox上添加文本标签以使其更容易的原因是因为当您使用RowSource执行列表时,您必须始终找出您的Range上使用的最后一行是什么您指定范围以避免ListBox上的空行。这意味着,如果您有20行数据并且指定了包含50行的范围,则列表框将填充50行,最后30行将为空。