如何使用VBA将标头添加到Excel用户表单中的多列列表框中

vzc*_*czc 12 excel vba excel-vba

是否可以在多列列表框中设置标题而不使用工作表范围作为源?

以下使用分配给列表框的列表属性的变量数组,标题显示为空白.

Sub testMultiColumnLb()
    ReDim arr(1 To 3, 1 To 2)

    arr(1, 1) = "1"
    arr(1, 2) = "One"
    arr(2, 1) = "2"
    arr(2, 2) = "Two"
    arr(3, 1) = "3"
    arr(3, 2) = "Three"


    With ufTestUserForm.lbTest
        .Clear
        .ColumnCount = 2
        .List = arr
    End With

    ufTestUserForm.Show 1
End Sub
Run Code Online (Sandbox Code Playgroud)

Dic*_*ika 17

不,我在列表框上方创建标签作为标题.你可能会认为每次你的lisbox改变时更改标签是一种巨大的痛苦.你是对的 - 这是一种痛苦.第一次设置是一种痛苦,更不用说了.但我还没有找到更好的方法.


Jon*_*ess 7

这是我解决问题的方法:

此解决方案要求您添加第二个ListBox元素并将其放置在第一个元素上方。

像这样:

添加一个附加的列表框

然后,调用函数CreateListBoxHeader以使对齐正确并添加标题项目。

结果:

调用函数CreateListBoxHeader

码:

  Public Sub CreateListBoxHeader(body As MSForms.ListBox, header As MSForms.ListBox, arrHeaders)
            ' make column count match
            header.ColumnCount = body.ColumnCount
            header.ColumnWidths = body.ColumnWidths

        ' add header elements
        header.Clear
        header.AddItem
        Dim i As Integer
        For i = 0 To UBound(arrHeaders)
            header.List(0, i) = arrHeaders(i)
        Next i

        ' make it pretty
        body.ZOrder (1)
        header.ZOrder (0)
        header.SpecialEffect = fmSpecialEffectFlat
        header.BackColor = RGB(200, 200, 200)
        header.Height = 10

        ' align header to body (should be done last!)
        header.Width = body.Width
        header.Left = body.Left
        header.Top = body.Top - (header.Height - 1)
End Sub
Run Code Online (Sandbox Code Playgroud)

用法:

Private Sub UserForm_Activate()
    Call CreateListBoxHeader(Me.listBox_Body, Me.listBox_Header, Array("Header 1", "Header 2"))
End Sub
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你。我喜欢这个方法。我有一个比表单宽度宽的列表框。因此,用户必须水平滚动才能查看其他列。标题列表框不随数据列表框滚动。对于这种情况,您有什么解决方案吗? (2认同)
  • 我不知道为什么随后出现的另一个答案被接受了。对于任何列数来说,这个都更干净、更容易。我只会添加“header.Locked=True”,以避免用户弄乱它。 (2认同)

Ric*_*son 6

我刚才看到这个问题并找到了这个解决方案.如果您的RowSource指向一系列单元格,则多列列表框中的列标题将从紧邻RowSource上方的单元格中获取.

使用此处图示的示例,在列表框内,单词SymbolName显示为标题标题.当我在单元格AB1中更改单词Name时,再次在VBE中打开表单,列标题发生了变化.

屏幕截图显示命名范围和范围外的列标题.

这个例子来自S. Christian Albright的VBA For Modelers中的一本工作簿,我试图弄清楚他是如何在列表框中得到列标题:)

  • 哦对了,您不希望工作表范围作为源。哦,好吧,我希望人们觉得它很有趣。令我惊讶的是,我花了一年时间才注意到这一点。 (4认同)

Lun*_*tik 5

简单回答:没有.

我过去所做的是将标题加载到第0行,然后在显示表单时将ListIndex设置为0.然后用蓝色突出显示"标题",给出标题的外观.如果ListIndex保持为零,则忽略表单操作按钮,因此永远不会选择这些值.

当然,只要选择了另一个列表项,标题就会失去焦点,但此时他们的工作就完成了.

以这种方式执行操作还允许您具有水平滚动的标题,这对于浮动在列表框上方的单独标签很难/不可能.另一方面,如果列表框需要垂直滚动,则标题不会保持可见.

基本上,这是一种妥协,适用于我所处的情况.

  • 如何在"真正的"ListBox上方创建另一个ListBox.这将只包含一行标题,然后同时滚动它们.我没试过,但认为可以做到,不是吗? (2认同)

小智 5

有一种非常简单的解决方案,可以在多列列表框的顶部显示标题。只需将“ columnheads”的属性值更改为“ true”,默认情况下为false。

之后,只需提及属性“ rowsource”中的数据范围(不包括数据范围中的标头),标头应位于数据范围的第一顶行,然后它将自动选择标头,并且标头将被冻结。

如果假设您的数据在“ A1:H100”范围内,并且标题位于“ A1:H1”(这是第一行),那么您的数据范围应该是“ A2:H100”,这需要在属性“ rowsource”和“ columnheads”中提及值应该为真

问候,Asif Hameed

  • 您错过了OP想要完成的工作,而没有使用工作表范围作为source_。 (2认同)