Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 范围选择法_Excel_Vba - Fatal编程技术网

Excel 范围选择法

Excel 范围选择法,excel,vba,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

我需要更多有经验的人就我面临的一些情况提出建议。我在下表中有一个测试样本数据

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
我的具体查询是,通过
UsedRange
SpecialCells(xlCellTypeLastCell)
FIND
方法,我得到了相同的结果。尽管这些或其他方法的使用取决于手头的情况,但考虑到这种特殊的数据情况,对特定方法的优先选择是有保证的

编辑:

基于@vbasic208的评论和@QHarr引用的一篇优秀文章,我倾向于采用以下方法在一般情况下进行测距。我想使用中建议的最后一个函数查找范围的最后一行和最后一列。范围将根据定位单元格、最后一行和最后一列的值进行设置

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
根据所附的快照,我在一些示例情况下测试了上述代码。我测试了删除格式化行之前和删除格式化行之后确定的范围的正确性。此外,在应用过滤器的情况下,它给出了正确的范围,即使在H列的标题行中可以看到过滤器复选标记

范围修改前后的结果如下:

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

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

我想知道这种方法是否有一些注意事项。

CurrentRegion已经失败,如果隐藏某些列行或删除它们,UsedRange或SpecialCells将失败。这使得Find方法成为最佳(100%证明)方法。但是您必须正确地使用它:计算最后一行和最后一列
rLastCell
可能是您案例中的最后一个单元格,但不是这样做的。实际上,您已经计算了最后一行中的最后一个单元格,该单元格可能不在最后一列中。假设第一个单元格是已知的(A1)。@vbasic208我没有提到
lastrow
确定,因为这是最传统的方法,但您关于隐藏行或列的观点没有引起我的注意。您提到的关于最后一列的另一点,假设
D10:D11
值在
G10中;G11和D10:D11都是空的,在这种情况下,包括一些隐藏的行或列,您对用于范围确定的代码语法有什么建议,并且是防错的。@VBASIC208代码语法可能没有防错的方法或方法那么重要。@VBASIC208可能是在最后一行中查找最后一个单元格,然后在最后一列中查找最后一个单元格。如果是这样的话,任何指向这篇文章的指针都会用正确的语法来描述这种方法。请看“s”的“分数”。
17: 8 
Sheet1        $A$1:$H$17

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