Excel / VBA - 如何选择当前所选单元格所在的列(相对)的顶行(绝对)?

时间:2018-05-09 06:55:44

标签: excel vba

我前几天花了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,绝对引用)(相对引用) )?

2 个答案:

答案 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