范围选择方法难题

时间:2019-01-26 02:49:45

标签: excel vba

在我遇到的某些情况下,我需要更多有经验的人的建议。下表中有一个测试样本数据。

hello   good    day today
hello   good    day today
hello   good    day today
hello   good    day today
hello   good    day today
hello   good    day today


hello   good    day today
                    today
                    today

我使用了4种方法来根据以下代码确定范围,并通过FIND方法来确定最后一个单元格。

Sub test()
Dim ws As Worksheet
Dim myRange As Range
Dim myRange1 As Range
Dim myRange2 As Range
Dim rLastCell As Range

    Set ws = ThisWorkbook.ActiveSheet
    With ws
    Set myRange = .Range(.Cells(1, 1), .Range("A1").SpecialCells(xlCellTypeLastCell))
            Debug.Print ws.Name, myRange.Address
'set range with used area
    Set myRange1 = ws.UsedRange
        Debug.Print ws.Name, myRange1.Address
'set range with currentegion
    Set myRange2 = .Range("A1").CurrentRegion
        Debug.Print ws.Name, myRange2.Address
' finding lastcell and then set range
    Set rLastCell = ActiveSheet.Cells.Find(What:="*", After:=.Cells(1, 1), LookIn:=xlFormulas, LookAt:= _
    xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False)
        Debug.Print rLastCell.Address
    End With
End Sub

Debug.Print的结果是

Book1         $A$1:$D$11
Book1         $A$1:$D$11
Book1         $A$1:$D$6
$D$11

我的具体查询是,通过UsedRangeSpecialCells(xlCellTypeLastCell)FIND方法获得的结果相同。尽管使用这些方法或其他方法取决于当前的情况,但考虑到这种特定的数据情况,仍然有必要优先选择特定的方法。

编辑:

基于@ VBasic2008的评论和@QHarr推荐的出色文章,我倾向于采用一般方法论来确定范围。我想利用Ron de Bruin Aricle中建议的Last函数查找范围的Last Row和Last Column。范围将根据锚单元格以及“最后一行和最后一列的值”进行设置。

Sub Range_Detrmine()
    Dim ws As Worksheet
    Dim LastRow As Long
    Dim LastCol As Long
    Dim rng As Range
    Dim Frng As Range
    Set ws = ThisWorkbook.ActiveSheet

With ws
    ' Use all cells on the sheet
    Set rng = .Cells

    ' Find the last row
      LastRow = Last(1, rng)

      LastCol = Last(2, rng)

    Set Frng = .Range(.Cells(1, 1), .Cells(LastRow, LastCol))
    Debug.Print LastRow & ":"; LastCol
    Debug.Print ws.Name, Frng.Address
End With

End Sub



Function Last(choice As Long, rng As Range)
'Ron de Bruin, 5 May 2008
' 1 = last row
' 2 = last column
' 3 = last cell
    Dim lrw As Long
    Dim lcol As Long

    Select Case choice

    Case 1:
        On Error Resume Next
        Last = rng.Find(What:="*", _
                        After:=rng.Cells(1), _
                        Lookat:=xlPart, _
                        LookIn:=xlFormulas, _
                        SearchOrder:=xlByRows, _
                        SearchDirection:=xlPrevious, _
                        MatchCase:=False).Row
        On Error GoTo 0

    Case 2:
        On Error Resume Next
        Last = rng.Find(What:="*", _
                        After:=rng.Cells(1), _
                        Lookat:=xlPart, _
                        LookIn:=xlFormulas, _
                        SearchOrder:=xlByColumns, _
                        SearchDirection:=xlPrevious, _
                        MatchCase:=False).Column
        On Error GoTo 0

    Case 3:
        On Error Resume Next
        lrw = rng.Find(What:="*", _
                       After:=rng.Cells(1), _
                       Lookat:=xlPart, _
                       LookIn:=xlFormulas, _
                       SearchOrder:=xlByRows, _
                       SearchDirection:=xlPrevious, _
                       MatchCase:=False).Row
        On Error GoTo 0

        On Error Resume Next
        lcol = rng.Find(What:="*", _
                        After:=rng.Cells(1), _
                        Lookat:=xlPart, _
                        LookIn:=xlFormulas, _
                        SearchOrder:=xlByColumns, _
                        SearchDirection:=xlPrevious, _
                        MatchCase:=False).Column
        On Error GoTo 0

        On Error Resume Next
        Last = rng.Parent.Cells(lrw, lcol).Address(False, False)
        If Err.Number > 0 Then
            Last = rng.Cells(1).Address(False, False)
            Err.Clear
        End If
        On Error GoTo 0

    End Select
End Function

我根据所附快照在某些示例情况下测试了以上代码。我测试了在删除格式化行之前和删除格式化行之后确定的范围的正确性。此外,即使应用了过滤器,它也会给出正确的范围,即使在Column H的标题行中可以看到过滤器检查标记 Range Before Range After

    Debug.Print LastRow & ":"; LastCol
    Debug.Print ws.Name, Frng.Address

范围修改前后的结果是:

17: 8 
Sheet1        $A$1:$H$17

14: 7 
Sheet2        $A$1:$G$14

我想知道这种方法是否有一些警告。

0 个答案:

没有答案