我前几天花了11个小时把我的大脑分开来做这件事。每个人要么使用绝对值的样本范围,要么使用完全相对的.offset函数进行回答。或者他们提到在vba中选择它并不好,或者它们提供了我无法适应的某种解决方法,或者。选择不适用于R1C1 ......等等。我的脚本现在已经完成,并且使用以下循环代码完全正常运行,但它很慢,因为每次运行宏时它会使用此循环大约2000-3000次:
Do Until Selection.Row = 1
If Selection.Row <> 1 Then
Selection.Offset(-1, 0).Select
End If
Loop
我只是想知道,对于当前选择的任何单元格,无论它在哪里,都有更快的方法在vba中。选择该(任意)列的顶行(行#1,绝对引用)(相对引用) )?
答案 0 :(得分:1)
无需迭代查找当前列的顶部:
Selection.End(xlUp).Activate
.End(xlUp)
的{{1}}成员查找连续数据集的结尾。 More info here
或
Range
此方法使用Cells(1, Selection.Column).Activate
的{{1}}成员返回该列的 number ,然后使用Column
函数调用第一行那一栏。 More info here
或(如上所述)
Range
此方法使用Cells
的{{1}}成员。此函数(more info here)有两个可选参数。第一个是Selection.Offset(1 - Selection.Row).Select
,因此该公式将A21中的单元格偏移-20行,从而得到A1。
编辑了更多信息和参考资料
答案 1 :(得分:0)
为了做得更快,你可以像这样优化:
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Do Until Selection.Row = 1
If Selection.Row <> 1 Then
Selection.Offset(-1, 0).Select
End If
Loop
Application.ScreenUpdating = True
Application.Calculation = xlAutomatic
一个问题,你不能使用Cells(x,y).row而不是Selection metod?这是一种更快捷的方式。
换句话说,列名称在顶部有一个名称,您可以搜索此名称并获取此位置以选择下面的行。 像这样:
Private Sub CommandButton1_Click()
Dim intColumn As Integer
intColumn = ObtainColumn(Range("A1:F1"), "NameColum")
intRow = ObtainRow(Range("A1:A10"), "NameColum")
Cells(intRow, intColumn).Select
End Sub
Function ObtainColumn(rng As Range, strValue As String) As Long
Dim lCol As Long
'Set rng = ActiveSheet.Cells
On Error Resume Next
lCol = 0
lCol = rng.Find(What:=strValue, _
After:=rng.Cells(1), _
LookAt:=xlWhole, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Column
ObtainColumn = lCol
On Error GoTo 0
End Function
Function ObtainRow(rng As Range, strValue As String) As Long
Dim lRow As Long
'Set rng = ActiveSheet.Cells
lRow = 0
On Error Resume Next
lRow = rng.Find(What:=strValue, _
After:=rng.Cells(1), _
LookAt:=xlWhole, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
ObtainRow = lRow
On Error GoTo 0
On Error GoTo 0
End Function