代码之家  ›  专栏  ›  技术社区  ›  konahn

我无法访问“Columns(2)”的每个单元格不同于“Range”(“B:B”)“Columns(2)”是什么类型的范围?[副本]

  •  2
  • konahn  · 技术社区  · 7 年前

    我想得到整个范围内的第二列(“A1:B15”)。 当然,我可以使用“范围”(“B1:B15”)”,但范围可能会根据不同的情况而变化,例如不同的工作表。所以我需要动态获取第二列的范围。

    我首先编写的以下代码弹出一个错误(运行时错误13:类型不匹配)。

    Sub test1()
        Dim r As Range
    
        For Each r In Range("A1:B15").Columns(2)
            Debug.Print r     '// Runtime Error '13': Type mismatch.
        Next r
    
    End Sub
    

    令我失望的是,这里的“范围(“A1:B15”)。列(2)”不是一个正常的范围序列。 不过,“范围(“A1:B15”)。列(2)”有一个地址:“$B$1:$B$15” 一开始我不明白这一点。

    为了找出发生错误的原因,我尝试了以下代码。

    Sub test2()
        Dim r As Range, TargetColumn As Range
        Set TargetColumn = Range("A1:B15").Columns(2)
    
        Debug.Print TargetColumn.Count  '//count is  1, not 15
        For Each r In TargetColumn
            Debug.Print r.Address       '//$B$1:$B$15
        Next r
    
    End Sub
    

    “r.address”仅为“$B$1:$B$15.”,而不是“$B$1、$B$2、$B$3…”系列 因此,“Columns(2)”不是一个正常的范围序列,而是一个单一的范围,就像一个范围的合并单元格(“$B$1:$B$15”)。

    为了绕过类型不匹配错误,我更改了如下代码:

    Sub test3()
        Dim r As Range, TargetColumn As Range
    
        Set TargetColumn = Range("A1:B15").Columns(2)
        ' get the range using the address : Range("A1:B15")
        For Each r In Range(TargetColumn.Address)   
            Debug.Print r.Address, r.Value          ' works well
        Next r
    
    End Sub
    

    “列(2)”不是范围的正常系列,而是范围区域的集合。它确实有一个地址,可以在“范围(地址)”中使用

    例如,“Columns(1).address”是“$A$1:$A$15.”,“Columns(2).address”是“$B$1:$B$15.” 它就像“联合(范围($A$1:$A$15”)、范围($B$1:$B$15”)”。 因此,我们无法直接访问“第(2)列”中的每个单元格

    是否有一种更简单的方法来获取列范围,以便我可以访问列范围中的每个单元格? 我相信一定有比“Range(Range(“A1:B15”).Columns(2.address)”或“Range(“A1:B15”).Columns(2)”更好的方法无法运行。”Range(“A1:B15”).Columns(2).EntireRow'返回我不喜欢使用的“B:B”的整个范围。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Storax    7 年前

    我不知道你想要什么,但也许那就是你想要的

    Sub test11()
        Dim r As Range
    
        For Each r In Range("A1:B15").Columns(2).Rows
            Debug.Print r    
        Next r
    
    End Sub
    

    这将在第2列的单个单元格中循环,并且不会出现运行时错误,因为行debug.print r将使用单个单元格的默认项value,但r仍然是一个范围。

        2
  •  1
  •   Dy.Lee    7 年前

    添加单元格:列(2)。单元格

    Sub test2()
        Dim r As Range, TargetColumn As Range
        Set TargetColumn = Range("A1:B15").Columns(2).Cells
    
        Debug.Print TargetColumn.Count  '//count is  1, not 15
        For Each r In TargetColumn
            Debug.Print r.Address       '//$B$1:$B$15
        Next r
    
    End Sub
    

    调试结果

    enter image description here

        3
  •  0
  •   Justyna MK    7 年前

    也许使用Resize&抵消将有助于:

    Sub test1()
        Dim r As Range
    
        For Each r In Range("A1:B15").Resize(Range("A1:B15").Rows.Count, 1).Offset(0, 1)
            Debug.Print r.Address
        Next r
    
    End Sub
    
    推荐文章