【问题标题】:VBA using a ListBox to multi select entire column in excelVBA使用列表框在excel中多选整个列
【发布时间】:2019-12-17 17:27:30
【问题描述】:

我有一个 excel 文件,我在其中从第 2 行动态加载列标题,直到我命中一个空值并将所有这些值放入一个列表框中转置。这部分正在按我的预期工作。

我的问题是,如何使用列表框项来选择命名标题所在的整个列?

所以在 A2 B2 C2 中,我将名为 Widget 1、2、3 的标题分别加载到列表框中。当用户窗体加载时,这些在列表框中按顺序加载。在列表框中,我希望能够单击小部件 2 和 3 并选择这些整列。我不希望它被硬编码,因为我希望它是一个选择,因为我可以选择小部件 1 和 3 或任何需要的随机选择。

我可以有多达 50 个小部件....所以这些小部件都会在启动时加载到列表框中,我需要能够选择任何这些值并让它们选择相应的列....

这就是我遇到问题的地方,如何进行多选。

提前感谢您的帮助。

编辑:

这是 Private Sub UserForm_Initialize() 上使用的代码

    'Figure out how many actual columns headers there are and then search for signal names

'Dim Lastcol As String
Dim FoundColumnRangeCalculated As Variant
Dim Lastcol As Variant
Dim FoundColumnRange As Variant

With ActiveSheet
Lastcol = .Cells(2, .Columns.Count).End(xlToLeft).Column
''MsgBox Lastcol
End With


'Convert numerical column location to letter value to use as dynamic range header lookup

Dim NumberToColumn As Variant
Dim SearchColumn
SearchColumn = Lastcol
NumberToColumn = Left(Cells(1, SearchColumn).Address(1, 0), InStr(1, Cells(1, SearchColumn).Address(1, 0), "$") - 1)
'MsgBox NumberToColumn

'Build the actual range from found column headers
FoundColumnRangeCalculated = "A2:" & (NumberToColumn & Lastcol)

'Transfer headers vertically to the list box for user to see

ListBox1.List = Application.WorksheetFunction.Transpose(Range(FoundColumnRangeCalculated))

Imported List Box Transposed on UserForm Load

所以现在当我单击或多次单击(未显示在此图像中,但多次单击要启用的选择选项)项目时,我希望在单击每个项目时选择它所代表的相应列。

Columns that the items are drawn from

由于它们是按从左到右的“顺序”构建的,我假设它是 1:1 匹配和搜索和选择,但我在尝试对其中的那部分进行排序时遇到了麻烦......很多关于获取它的数据,解析等.....我只是只需要一个“选择listbox项目时,使用选择以启用它的列”。

列不能针对范围进行硬编码,因为标题可能是 A:F、A:AA 或 A:ZZ.......所以它必须是动态匹配。

感谢那些回复的人,希望这个编辑过的帖子和图片能满足搁置状态。

【问题讨论】:

  • 你已经尝试过的代码在哪里?
  • 另外,数据截图会更容易理解。
  • 我已经编辑了帖子并添加了图片,希望这能澄清我最初的询问

标签: excel vba selection


【解决方案1】:

如果您想遍历标题的单元格。如果名称匹配不止一次,它会为一个小部件选择多个列。

适用于 ActiveSheet。

Dim result As Range
Dim criteria As String
Dim colcount As Integer

criteria = "widget1" ' Matching value
colcount = 10 ' Header columns count

For i = 1 To colcount
  ' Loop on 2nd row
  If Cells(2, i).Value = criteria Then
    ' If string matched with a cell's value
        If result Is Nothing Then
            ' if it's first match, set it as result column selection
            Set result = Columns(i)
        Else
            ' if it's not first match, add it to result selection
            Set result = Union(result, Columns(i))
        End If
  End If
Next

' Select result seletion
If Not result Is Nothing Then
    result.Select
End If

【讨论】:

  • 您可以使用Range.Find 而不是循环,这将是更快的单线方法。另外,你应该在答案中添加一些解释,这样更容易理解。
  • VBA 不会喜欢你代码中的// cmets。
  • 还有一个 Listener Private Sub ListBox1_Click() 或更多。所以不需要按钮。 :)
  • 感谢您的努力,我能够利用上一篇文章中的答案。我也会尝试一下,因为有多种方式来做事是件好事。最好的。
【解决方案2】:

要选择多个列可以尝试类似

Option Explicit
Private Sub ListBox1_Change()
Dim Ws As Worksheet, Rng As Range, c As Range, Sel As Range
Dim i As Long, Xval As Variant
Set Ws = ThisWorkbook.Sheets("Sheet1")
Set Rng = Ws.Range(Ws.Cells(2, 1), Ws.Cells(2, Me.ListBox1.ListCount))

    For i = 0 To Me.ListBox1.ListCount - 1
        If Me.ListBox1.Selected(i) Then
        Xval = Me.ListBox1.List(i)
            Set c = Rng.Find(Xval, LookIn:=xlValues)
                If Not c Is Nothing Then
                    If Sel Is Nothing Then
                    Set Sel = Ws.Columns(c.Column)
                    Else
                    Set Sel = Union(Sel, Ws.Columns(c.Column))
                    End If
                End If
        End If
    Next
    If Not Sel Is Nothing Then
    Sel.Select
    End If
End Sub

【讨论】:

  • 这完全符合我的要求,无论是在单选模式还是多选模式下。我只做了一项更改,因为我的文档只会而且绝对不会是多标签工作表,而更改是:[code] Set Ws = ActiveSheet [\code]
  • 这段代码运行良好,我正在寻求额外的帮助,以获取引起我注意的功能。是否可以修改此处的内容以允许在选择项目时使用命令按钮向上/向下重新排序列表框项目,然后将列本身“移动”以遵循列表框顺序?因此,如果传入的默认列是 1、2、3 并且我将其重新排序为 1、3、2,那么该列及其行中的所有数据是“剪切/粘贴”还是重新排序?我看到很多重新排序,但我想保留这段代码来完成它....如果可能的话。请指教? TY
  • 我无法清楚您想如何重新排序列。如果只是想使用向上/向下按钮重新排序列,则不需要多选列表框,这比在列之间交换更容易。请在这方面进一步澄清。但是,如果答案解决了您的问题,请点击答案旁边的勾号来接受答案,以坚持 SO 精神。
  • 我的其他代码的编写方式,它使用基于列表框选择的选择并将其粘贴到另一个工作簿,它在选择之后按顺序执行,所以它不记得顺序是什么选择是,只是被选择的列并以这种方式粘贴它们。所以我的想法是,添加向上/向下按钮来移动列表框项目,该列应该“移动”或在项目向上或向下移动时交换,而不会在列表“向上”或“向下”移动时损坏现有数据。这有意义吗?如果需要,我可以添加一些模拟图像。感谢您的回复。
  • 要添加说明,我希望列从左到右“匹配”列表框从上到下排序(由于转置)。这是因为如果传入的文件设置不正确(我无法控制),来自源的数据可能会“乱序”出现,其中列表框允许将“相同”类型的数据分组在一起。因此,重新排序允许在移至下一步之前进行更正。希望这有助于增加清晰度而不是混淆。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多