从范围对象中选择单元格

时间:2018-05-24 06:14:44

标签: vba excel-vba excel

Function test()
Dim rnge As Range
Set rnge = Range("sheet1!$B$2:$B$3")
For i = 1 To rnge.Count
rnge.Cells(i, rnge.Column).Select
Next i
End Function

它正在选择C2和C3细胞。

为什么选择错误的范围细胞? 解决方案是什么?

3 个答案:

答案 0 :(得分:1)

首先,对于"sheet1!$B$2:$B$3",此Range无效。您应该像这样使用它:Sheets("sheet1").Range("B2:B3"),即第一部分(在点之前)是工作表引用,然后我们指定要使用的单元格范围。

现在,rnge.Count等于2,因此它将从1 To 2循环(请注意rnge.Column等于2)分别选择:Cells(1, 2)和{{1分别为Cells(2, 2)的第一个单元格,即B2,因此它将选择C2和C3。

为什么分别选择rnge?因为您使用了rnge,这确实非常好!

希望有所帮助。

答案 1 :(得分:1)

确定。我有点生疏,但我认为你唯一真正的问题是这行代码的列偏移:

   rnge.Cells(i, rnge.Column).Select

应该只是:

   rnge.Cells(i).Select

只有一个参数,您可以有效地遍历每个单元格,首先是第一行中的每一列,然后是下一行中的每一列,依此类推。并且这个指数肯定不是零基础。在.Net可能但在VBA中基于零的索引是罕见的。

我倾向于使用altnerative For Each迭代器:

   For Each cell In rnge.Cells
     ...
   Next cell

我认为第二个参数是一个列偏移量(在您的情况下为值2),但由于您的选择只有一个列宽,它只是处理选择之外的单元格。两个值参数用于x,y样式寻址,因此只产生这个怪癖。请记住,x,y基于1,1是您范围的左上角单元格,而不是表单。

其余的只是猜测你的意图。

您的代码将依次选择每个单元格。

如果您打算只选择所有单元格,那么:

  Range("sheet1!$B$2:$C$3").Select

可能会这样做。

或者,如果您只想选择某些单元格,例如根据单元格的状态,那么您需要将单元格组合在另一个范围内,例如:

Dim selectionRange As Range
For Each cell In rnge.Cells
    If selectionRange Is Nothing Then
        Set selectionRange = cell
    Else
        Set selectionRange = Union(cell, selectionRange)
    End If
Next cell
If Not selectionRange Is Nothing Then
    selectionRange.Select
End If

另请注意,如果Sheet1不是活动工作表,那么我认为任何选择该工作表上的单元格的尝试都会导致错误。

无论如何,我现在可能已经开始讨论主题,所以我会把它留在那里。

答案 2 :(得分:-1)

你的Counter for for循环是基于零的!你应该使用:

For i = 0 To rnge.Count - 1

哦,你还应该定义你的变量: Dim i as integer