【问题标题】:Listbox selection to hide/unhide correspondent column隐藏/取消隐藏对应列的列表框选择
【发布时间】:2017-10-23 15:53:11
【问题描述】:

我在 Sheet1 的“A”列中有动态行,这些行填充在列表框选择表单上。

111
222
333
444
....

现在在我的 Sheet2 上,我将 B2 行上的这些数据转换为:

111 | 222 | 333 | 444 | ...

我想为列表框中的任何项目选择,代码隐藏对应的列。如果我在列表框中选择 111 和 333,它会隐藏整个列“A”和“C”。 希望它有意义。 OK 按钮应该运行代码。

 Private Sub cmdOK_Click()
        Dim sh1 As Worksheet
        Dim sh2 As Worksheet
        Dim i As Integer, hdn2 As String
        Dim hdn3 As Variant, col As Long, header As Range
        Set sh2 = ActiveWorkbook.Sheets("Sheet2")

   Set header = sh2.Range("2:2")

       For i = 0 To Me.lstMultiChoice.ListCount - 1
       col = Application.WorksheetFunction.Match(lstMultiChoice.List(i, 0), header, 0)
       If Me.lstMultiChoice.Selected(i) = True Then
       sh2.Columns(col).Hidden = False
       hdn2 = hdn2 & lstMultiChoice.List(i, 0) & ","
    Else
       sh2.Columns(col).Hidden = True
    End If
  Next
      Set sh1 = ActiveWorkbook.Sheets("List Data")
      hdn3 = Split(Left(hnd2, Len(hdn2) - 1), ",")
      sh2.Range(sh2.Cells(4, 4), sh2.Cells(4 + UBound(hdn3), 4)).Value = Application.Transpose(hdn3)
    End Sub

【问题讨论】:

    标签: vba listbox


    【解决方案1】:

    我为你做了一个新的答案,因为编辑把另一个变成了怪物。 代码现在包括查找列的实际位置。 您需要添加一行以清除从 D4 开始的先前条目,因为如果先前的列表较长,则某些条目将保留在那里。如果找不到 col,您还需要进行错误捕获。

    Private Sub ListBox1_Change()
      Dim sh2 As Worksheet
      Dim i As Integer, hdn2 as string
      Dim hdn3 as Variant, col as long, header as Range
      Set sh2 = ActiveWorkbook.Sheets("Sheet2")
      Set header = sh2.Range("2:2")
    
      For i = 0 To Me.ListBox1.ListCount - 1
        col = Application.WorksheetFunction.Match(ListBox1.List(i, 0), header, 0)
        If Me.ListBox1.Selected(i) = True Then
          sh2.Columns(col).Hidden = True
          hdn2 = hdn2 & ListBox1.List(i, 0) & ","
        Else
          sh2.Columns(col).Hidden = False
        End If
      Next
      hdn3 = Split(Left(hnd2, Len(hdn2) - 1), ",")
      Sheet1.Range(Sheet1.Cells(4, 4), Sheet1.Cells(4 + UBound(hdn3), 4)).Value = Application.Transpose(hdn3)
    End Sub
    

    【讨论】:

    • 哇,这现在很有魅力 :) 我稍微编辑了你的答案(参见我的第一篇文章中的代码):第一次交换隐藏/取消隐藏,这很好 第二次我想在列表框中写入选定的项目到写在不同的工作簿(列表数据)中但出现错误。
    • 不要使用名称 LlstData,而是在 VBA 项目资源管理器中查找工作表的名称,例如 SheetX。然后使用SheetX.Range(SheetX.Cells....
    【解决方案2】:

    如果我理解正确,这就是你需要的:

    Private Sub ListBox1_Change()
      Dim sh1 As Worksheet
      Dim i As Integer, hdn as string
      Set sh1 = ActiveWorkbook.Sheets("Sheet2")
      hdn = "Hidden columns: "
    
      For i = 0 To Me.ListBox1.ListCount - 1
        If Me.ListBox1.Selected(i) = True Then
          sh1.Columns(i + 1).Hidden = True
          hdn = hdn & ListBox1.List(i, 0) & ", "
        Else
          sh1.Columns(i + 1).Hidden = False
        End If
      Next
      Sheet1.Cells(4, 4).Value = Left(hdn, Len(hdn) - 2)
    End Sub
    

    【讨论】:

    • @Williams:感谢您的回答。您的代码根据列表框中的项目订单隐藏列,例如。通过选择“2”行隐藏“B”列,或选择“3”和“4”行,隐藏C和D列。“B”行中的单元格值与列表框中的值之间没有匹配数据。我我不确定这是否会发生。
    • 另外,如何将列表框中的选定项目导出(写入)到 Sheet1 到例如单元格 D4?谢谢
    • 既然你说on my Sheet2 I have these data transposed 我认为listitems 和columns 的顺序应该是一样的。
    • 感谢 itsLex,不幸的是,无论值如何,它仍在查看行顺序(如果我们称其为标题)。我交换两个值作为测试,但它没有用。但是您的导出选定列表框值正在工作。如何更改它以分别在列中、从上到下以及在单元格内填充这些值。再次感谢您的时间和帮助。干杯
    • 您应该根据实际列填充您的列表框。这样顺序将永远是正确的。我编辑了代码以添加您请求的选定列范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    相关资源
    最近更新 更多