【问题标题】:Create a Combo Box from a copied range从复制的范围创建组合框
【发布时间】:2021-01-19 07:36:35
【问题描述】:

我选择了要在组合框中显示的范围。 代码如下。

Sheet5.Activate
ActiveSheet.ListObjects("Table6").Range.AutoFilter Field:=1, Criteria1:= _
    "=*E*", Operator:=xlAnd
Range("A1").Select
ActiveCell.Offset(1, 2).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy

在不改变上面代码的情况下,有没有办法改变下面的代码来选择Selection.Copy

或者有没有办法将Range(Selection, Selection.End(xlDown)) 部分更改为Selection.Copy 以上?

With cbE
    Me.cbE.List = Worksheets("EMP").Range(Selection, Selection.End(xlDown)).Value
End With

如何从表格中过滤掉行(基于包含特定文本的第 1 列)并在组合框中显示过滤列(第 4 过滤列)?


更新

    With Sheet4
        Dim lastRow As Long
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        
        Dim filterRange As Range
        Set filterRange = .Range("A2:A" & lastRow)
        
        With filterRange
            .AutoFilter 1, "E"
            Dim filterE As Range
            Set filterE = .Range("A1:A" & lastRow).Columns(5).SpecialCells(xlCellTypeVisible)
        End With
    End With
    Me.cbE.List = Worksheets("EMP&Customers").Range(filterE, filterE.End(xlDown)).Value

上面是我拥有的最新代码,它工作正常,除了第一个和最后一个过滤单元格之间的任何单元格也将在组合框中可见。

Issue_elaboration

【问题讨论】:

  • 不,您只能参考所选范围。一旦您复制它并选择其他内容,Excel 就无法再分辨剪贴板中的哪个范围了。 • 实际上,您的问题似乎是X/Y problem:您要求X,但您的问题是Y。请edit 并包括您实际想要实现的目标。 • 还要确保不要使用.Activate.Select 这是一个非常糟糕的做法:请参阅How to avoid using Select in Excel VBA
  • 在用范围填充组合之前假设过滤是错误的,您需要用过滤后的范围填充组合?如果是,理论上你应该使用SpecialCells(xlCellTypeVisible),但是如果你尝试使用List 来处理这样一个不连续的范围,它只会加载它的第一个区域。您应该处理范围以使其现有区域成为连续的范围。那么,为了这样的目的而选择,只是消耗Excel资源而没有带来任何好处的事情......
  • 好的,如果我要改变我的问题。如何从表格中过滤掉行(包含特定文本的第一列)并在组合框中显示过滤列(第 4 过滤列)?
  • @HyunE 你做了一些研究吗?互联网上充满了如何用过滤值填充组合框的示例。
  • 我已经在这个问题上纠结了好几个小时。如果我可以简单地用谷歌搜索并找到解决方案,就不会在这里问。所以请不要那样跟我说话。

标签: excel vba combobox


【解决方案1】:

将您选择的范围设置为您以后可以使用的变量,即使选择发生更改,也可以引用该范围。

With Sheet5
    .ListObjects("Table6").Range.AutoFilter Field:=1, Criteria1:="=*E*", Operator:=xlAnd

    Dim CopiedRange As Range 'set your range to a variable
    Set CopiedRange = .Range(.Cells(2, 3), .Cells(2, 3).End(xlDown))

    CopiedRange.Copy 'you can remove this line unless you want to paste the copied range somewhere.
End With

'Use this variable to refer to the range
Me.cbE.List = Worksheets("EMP").Range(CopiedRange, CopiedRange.End(xlDown)).Value

【讨论】:

    【解决方案2】:

    请尝试下一个方法:

    复制表单代码模块中的下一个代码(如果其Initialize事件已被使用,请同时添加以下事件代码):

    Private Sub UserForm_Initialize()
      Dim sh As Worksheet, rngVis As Range, arrVis, cbE As MSForms.ComboBox
      
      Set sh = Sheet5 'ActiveSheet - I used it to make some tests...
      With sh
         .ListObjects("Table6").Range.AutoFilter field:=1, Criteria1:="=*E*", Operator:=xlAnd
         Set rngVis = .Range(.cells(2, 3), .cells(2, 3).End(xlDown)).SpecialCells(xlCellTypeVisible)
      End With
      arrVis = makeContRng(rngVis)
      Me.cbE.list = WorksheetFunction.Transpose(arrVis)
    End Sub
    
    Private Function makeContRng(rng As Range) As Variant 'continuous with one column
        Dim arr, ar As Range, iRow As Range, i As Long, j As Long, k As Long
        
        ReDim arr(1 To rng.cells.count, 1 To 1)
        For Each ar In rng.Areas
            k = k + 1
             arr(k, 1) = ar.Value
        Next ar
        makeContRng = arr
    End Function
    

    【讨论】:

    • 非常感谢,但我在 ``` .list = WorksheetFunction.Transpose(arrVis) ``line 处遇到类型不匹配错误
    • @Hyun E: 奇怪...请在With Me.cbE: Debug.Print Ubound(arrVis), Ubound(arrVis, 2): Stop 之前添加此代码行并再次运行代码。代码将停在添加的行上。它在即时窗口中返回什么(在 VBE 中,按Ctrl + G)?您确定要处理 C:C 列吗?
    • @Hyun E:你有时间来测试我的建议吗?如果有不清楚的地方,请随时问...
    猜你喜欢
    • 1970-01-01
    • 2022-08-18
    • 2016-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    相关资源
    最近更新 更多