【问题标题】:Populating header of Listbox from column header从列标题填充列表框的标题
【发布时间】:2018-05-01 02:47:30
【问题描述】:

1.背景和目的
我正在创建一个用户表单来显示 Excel 工作表(“DATA”)中的数据,其中包含多列的表(“Tab1”),如下图所示。

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

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

我还为“Listbox1_Click()”操作添加了一个事件,该事件从所选 ListBox1 行的第二列返回与所选索引对应的“数据”表行。

用户窗体和列表框

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。

【问题讨论】:

    标签: vba excel excel-formula


    【解决方案1】:

    我最近编写了一个包含标题的用户表单,我可以为您解答。

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

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

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

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

    【讨论】:

    • 感谢您的及时评论。知道了。我试图像这样修改我的代码,但仍然没有显示列标题。这里有什么问题吗?设置 rng = Sheets("DATA").Range("A1").CurrentRegion.Offset(1, 0).Resize(rng.Rows.Count - 1) 与 ListBox1 .List = rng.Value .ColumnHeads = True .ColumnCount = Sheets("DATA").Cells(2, 2).CurrentRegion.Columns.Count .ColumnWidths = "20;80;90;80;80;50;50;100;80;80;80;80;150; 150;150" .ColumnCount = 15 结束于
    • @Holmes 如答案所述,您必须使用 Rowsource 属性,不是 List 属性。
    • @Rory:我尝试使用 RowSource 属性,但没有在 Listbox1 中显示。设置 rng = Sheets("DATA").Range("A1").CurrentRegion.Offset(1, 0).Resize(rng.Rows.Count - 1) 与 ListBox1 .RowSource = rng.Address .ColumnHeads = True .ColumnCount = Sheets("DATA").Cells(2, 2).CurrentRegion.Columns.Count .ColumnWidths = "20;80;90;80;80;50;50;100;80;80;80;80;150; 150;150" .ColumnCount = 15 结束于
    • @Holmes 如果不是活动工作表,则需要包含工作表名称:.Rowsource = "DATA!" &amp; rng.address
    • 谢谢大家。我用这段代码解决了这个问题:“.RowSource = rng.Address(external:=True)”。非常感谢您的帮助。
    【解决方案2】:

    不需要代码或公式。包括标题作为数据页面定义因素的一部分,我的名为 RecordsGoodCharacters,即工作表的名称。

    1. 突出显示所需的工作表单元格和列。包括标题作为定义因素的一部分。我的是该工作表的 RecordsLanguages,即工作表名称。

    2. 在左上角输入名称,定义高亮区域,然后按键盘上的 ENTER,如果不使用键盘,它将不起作用。

    3. 定义后,打开您的 VBA 用户表单

    4. 点击列表框

    5. 在显示左侧的属性中,在 RowSource 区域中,键入使用的定义名称。

    列表框将显示包含标题的列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-06
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多