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