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

bn31dyow  于 2022-11-26  发布在  其他
关注(0)|答案(2)|浏览(321)

几天前,我花了11个小时绞尽脑汁来完成这个任务。每个人要么用绝对值的样本范围回答,要么用完全相对的.offset函数回答。要么他们提到在vba中选择不好,要么他们提供了某种我无法适应的解决方案,要么.select不适用于R1 C1. a.等等。我的脚本现在完成了,和完全运行,但它很慢,因为每次运行宏时,它使用此循环大约2000-3000次:

Do Until Selection.Row = 1
    If Selection.Row <> 1 Then
        Selection.Offset(-1, 0).Select
    End If
Loop

我只想知道,对于当前选中的单元格,无论它在哪里,在vba中有没有更快的方法来选择该(任意)列(相对引用)的顶行(第1行,绝对引用)?

t5fffqht

t5fffqht1#

为了更快地完成,您可以这样进行优化:

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

有一个问题,你不能用单元格(x,y).行代替选择方法吗?这是一个更快的方法。
换句话说,列通常在顶部有一个名称,你可以搜索这个名称,并获得这个位置,然后选择下面的行。

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
wfsdck30

wfsdck302#

不需要迭代查找当前列的顶部:

Selection.End(xlUp).Activate

Range.End(xlUp)成员找到 * 连续 * 数据集的结尾。More info here

Cells(1, Selection.Column).Activate

此方法使用RangeColumn成员返回该列的 number,然后使用Cells函数调用该列的第一行。More info here
或(如上所述)

Selection.Offset(1 - Selection.Row).Select

此方法使用RangeOffset成员。此函数(more info here)有两个可选参数。第一个参数为RowOffset,因此此公式将A21中的单元格偏移-20行,从而得出A1。

  • 编辑以获取更多信息和参考 *

相关问题