【问题标题】:Select multiple non contiguous ranges using Range() and Cells()使用 Range() 和 Cells() 选择多个非连续范围
【发布时间】:2019-01-22 21:06:33
【问题描述】:

我试图弄清楚如何使用RANGE()CELLS() 选择多个不连续的范围。

我的工作表(Sheet5)看起来像这样:

 | A | B | C |    D   | E |     F     |
 +---+---+---+--------+---+-----------+
1|...|...|...|Category|...|Description|
2|...|...|...|Apple   |...|Fruit      |
3|...|...|...|Carrot  |...|Vegetable  |
4|...|...|...|Hat     |...|Clothing   |
  • 我想将Category 列和Description 列设置为可以复制并粘贴到另一个文件的范围。
  • 列标题在第一行。
  • 我要查找的列当前位于Column DColumn F,但它们可能会移动。
  • 这两列是不连续的范围,例如,我不想选择Column E 中的任何内容。

到目前为止,我的代码找到了Category 列、Description 列和lastrow。当我使用变量来选择范围时,我使用的是Range()Cells()

我的代码:

Sub SelectNonContiguousRangeCells()

'Create variables
Dim wb As Workbook
Dim ws As Worksheet
Dim rng As Range
Dim lastrow As Long
Dim strCat As String
Dim strDesc As String
Dim rngCat As Range
Dim rngDesc As Range
Dim rngCopy As Range

'Initialize variables
Set wb = ThisWorkbook
Set ws = Sheet5
lastrow = ws.Range("A1").End(xlDown).Row

'Find the column headers
strCat = "Category New"
strDesc = "Requirement Description"
Set rngCat = ws.Range("A1:Z1").Find(strCat)
Set rngDesc = ws.Range("A1:Z1").Find(strDesc)

'Set the copy range
Set rngCopy = Range(Range(Cells(1, rngCat.Column), Cells(lastrow, rngCat.Column)), Range(Cells(1, rngDesc.Column), Cells(lastrow, rngDesc.Column))).SpecialCells(xlCellTypeVisible)
Debug.Print rngCopy.Address

End Sub

在我的Debug.Print 中返回的范围是$D$1:$F$449,这是一个连续的范围,而我希望看到$D$1:$D$449,$F$1:$F$449,这是一个非连续的范围。

我查看了this answer 并找到了一些有用的信息,但它似乎对非连续范围没有帮助。

我也一直在浏览 MSDN 上的 Range.Cells documentation,但没有运气。

如何使用我的变量来选择包含 CategoryDescription 的列,而两者之间没有任何内容?

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    您可以使用Union 来完成此操作。

    您还需要针对未找到任何标头值的选项进行编码。否则,您最终可能会将 Nothing 的值推入会出错的范围

    Option Explicit
    
    Sub SelectNonContiguousRangeCells()
    
    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet5")
    Dim rngCat As Range, rngDesc As Range, rngCopy As Range
    Dim lastrow As Long
    
    lastrow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
    
    Set rngCat = ws.Range("A1:Z1").Find("Category New").Resize(lastrow, 1)
    Set rngDesc = ws.Range("A1:Z1").Find("Requirement Description").Resize(lastrow, 1)
    
    If Not rngCat Is Nothing Then
        If Not rngDesc Is Nothing Then
            Set rngCopy = Union(rngCat, rngDesc)
        End If
    End If
    
    Debug.Print rngCopy.Address (False, False)
    
    End Sub
    

    【讨论】:

    • 我没遇到过Union,谢谢!而且我没想过使用 resize 来进一步缩短代码。我想澄清一下,我设置的是Sheet5 工作表codename,而不是“Sheet5”工作表名称,所以Set ws = ThisWorkbook.Sheets("Sheet5") 需要是Set ws = Sheet5。并同意错误处理,这个例子很棒!
    • 啊,我只是在缩短其他内容,以便进行测试。我所做的任何改变都不是关键的。 Union 是您唯一要寻找的东西。我也带走了一些字符串变量。如果它们只被使用一次,我只是将它们用引号括起来。我只调暗重复字符串以避免变量块。也使遵循代码更容易
    • 好点。在我的代码工作版本中,我在昏暗的字符串周围设置了 cmets,告诉我如果用户更改了列的名称,我应该在哪里更改它,但我同意代码更简洁。非常感谢。
    猜你喜欢
    • 2021-11-29
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多