如何使用VBA选取整个Excel表格范围?

31

我在c#问题中找到了一个类似的解决方案:如何在c#的Excel.Range对象中选择整个工作表中的所有单元格?

那么在VBA中如何实现呢?

我通常使用“ctrl+shift向下箭头”来选择一个单元格范围。但是当我在宏中运行时,它会编码出A1:Q398247930,例如。 我需要的只是

.SetRange Range("A1:whenever I run out of rows and columns")

我本来可以很容易地自己完成它,而不需要使用宏,但我试图将整个过程制作成宏,并且这只是其中的一部分。

Sub sort()
    'sort Macro
    Range("B2").Select
    ActiveWorkbook.Worksheets("Master").sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Master").sort.SortFields.Add Key:=Range("B2"), _
      SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Master").sort
        .SetRange Range("A1:whenever I run out of rows and columns")
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

编辑:
还有其他地方我可能想使用相同的代码,但范围是“C3:行和列的结束”。在VBA中有没有办法获取文档中最后一个单元格的位置?

11个回答

30

我相信您想找到A1单元格及其周围的区域 - 不一定是表中的所有单元格。 如果是这样 - 只需使用... Range("A1").CurrentRegion


1
有趣的是,如果你刚刚将一个工作表复制到一个新的工作簿中,Range("A1").CurrentRegion.Address 返回的是"A1",而不是工作表上使用的区域。我不得不使用 chancea 的方法 **Range(Cells.Address)**。 - FreeMan

24

您可以使用cells.select来选择工作表中的所有单元格。您可以通过Range(Cells.Address)获取有效地址。

如果您想要找到最后一个已使用范围(Used Range),其中您进行了一些格式更改或输入了值,则可以调用ActiveSheet.UsedRange并从中选择。希望这有所帮助。


3
如果你只需要范围,甚至不需要使用 Cells.Select。仅使用 Cells 就可以得到范围。 - HotN
1
好吧,我的工作簿崩溃了,哈哈,我希望它可以运行,只是需要极高的资源。在运行之前请保存! - FreeSoftwareServers

18

您可以像这样将所有单元格用作对象:

Dim x as Range
Set x = Worksheets("Sheet name").Cells

X现在是一个范围对象,其中包含整个工作表


9

您有几个选项:

  1. 使用UsedRange属性
  2. 查找最后一个使用的行和列
  3. 使用向下移动和向右移动的模拟方法

我个人大多数时候使用Used Range和查找最后一行和列的方法。

以下是使用UsedRange属性的方法:

Sheets("Sheet_Name").UsedRange.Select

此语句将选择工作表中所有使用的范围,需要注意的是,当您删除列和行时,有时它可能无法正常工作。

另一种选择是查找工作表中最后使用的单元格。

Dim rngTemp As Range
Set rngTemp = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
If Not rngTemp Is Nothing Then
    Range(Cells(1, 1), rngTemp).Select
End If

这段代码的作用:

  1. 查找最后一个包含任何值的单元格
  2. 从单元格(1,1)选择到最后一个单元格

嗨,是的,这将捕获单元格最后使用的位置,无论您之间有多少空行 =] - Derek Cheng
应该是 Dim rngTemp As Range - thdoan
是的,我通常使用 ActiveSheet.UsedRange.Select 来选择所有使用过的单元格(包括范围内的任何空白单元格)。 - Monomeeth

4

如果数据是连续的,另一种选择范围内所有单元格的方法是使用 Range("A1", Range("A1").End(xlDown).End(xlToRight)).Select


1
Sub SelectAllCellsInSheet(SheetName As String)
    lastCol = Sheets(SheetName).Range("a1").End(xlToRight).Column
    Lastrow = Sheets(SheetName).Cells(1, 1).End(xlDown).Row
    Sheets(SheetName).Range("A1", Sheets(SheetName).Cells(Lastrow, lastCol)).Select
End Sub

使用ActiveSheet:
Call SelectAllCellsInSheet(ActiveSheet.Name)

1
我发现在许多情况下,使用工作表的".UsedRange"方法比使用".CurrentRegion"方法更为优越。 我曾经遇到过一个截断问题,这是".CurrentRegion"方法的正常行为。当工作表由一列带有空白行(且需要保留这些空白行)时,使用[Worksheets("Sheet1").Range("A1").CurrentRegion]无法得到我想要的结果。在这种情况下,".CurrentRegion"将在第一条记录处截断。我实施了一个解决方法,但最近发现了一个更好的方法;请参见下面的代码,它允许将整个集合复制到另一个工作表或标识实际地址(或仅标识行和列):
Sub mytest_GetAllUsedCells_in_Worksheet()
    Dim myRange

    Set myRange = Worksheets("Sheet1").UsedRange
    'Alternative code:  set myRange = activesheet.UsedRange

   'use msgbox or debug.print to show the address range and counts
   MsgBox myRange.Address      
   MsgBox myRange.Columns.Count
   MsgBox myRange.Rows.Count

  'Copy the Range of data to another sheet
  'Note: contains all the cells with that are non-empty
   myRange.Copy (Worksheets("Sheet2").Range("A1"))
   'Note:  transfers all cells starting at "A1" location.  
   '       You can transfer to another area of the 2nd sheet
   '       by using an alternate starting location like "C5".

End Sub

1
我建议您录制一个宏,就像在这篇文章中所找到的; Excel VBA 宏来过滤记录 但是,如果您正在寻找数据的结尾而不是必要的工作簿的结尾,如果开始和结束数据之间没有空单元格,我经常使用类似于以下内容的东西;
R = 1
Do While Not IsEmpty(Sheets("Sheet1").Cells(R, 1))
    R = R + 1
Loop
Range("A5:A" & R).Select 'This will give you a specific selection

你剩下的是 R = 数据结束后行数的数字。这同样可以用于列,然后你可以使用类似 Cells(C, R).Select 的语句,如果你将 C 作为列的表示。

同我问Derek的澄清一样。这会捕捉到最后一行之间有空行的情况吗? - C. Tewalt
不,当它到达一个空单元格时,它会停止。 - MakeCents

1

这是我使用的代码,我知道它可能需要完善,但我认为它会帮助其他人...

''STYLING''

Dim sheet As Range

' Find Number of rows used
Dim Final As Variant
    Final = Range("A1").End(xlDown).Row

' Find Last Column
Dim lCol As Long
    lCol = Cells(1, Columns.Count).End(xlToLeft).Column

Set sheet = ActiveWorkbook.ActiveSheet.Range("A" & Final & "", Cells(1, lCol ))
With sheet
    .Interior.ColorIndex = 1
End With

0

关于第一个问题,我正在研究同样的事情。 录制宏后,我得到的结果是从选择单元格A76开始:

Sub find_last_row()
    Range("A76").Select
    Range(Selection, Selection.End(xlDown)).Select
End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接