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细胞。
为什么选择错误的范围细胞? 解决方案是什么?
答案 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