Excel 如何在非连续数据块后选择单元格?
我有一张桌子 我正在尝试将数据粘贴到单元格D7中,以便显示当前框的边缘 我试着用Excel 如何在非连续数据块后选择单元格?,excel,vba,Excel,Vba,我有一张桌子 我正在尝试将数据粘贴到单元格D7中,以便显示当前框的边缘 我试着用 ActiveSheet.Range("C1").End(xlDown).End(xlToRight).Offset(1, 1).Select 它是一个Excel表格,因此您可以使用表格范围的尺寸进行偏移,并将大小调整为一个单元格 Option Explicit Public Sub AddressOfCell() With ThisWorkbook.Worksheets("Sheet1").ListO
ActiveSheet.Range("C1").End(xlDown).End(xlToRight).Offset(1, 1).Select
它是一个Excel表格,因此您可以使用表格范围的尺寸进行偏移,并将大小调整为一个单元格
Option Explicit
Public Sub AddressOfCell()
With ThisWorkbook.Worksheets("Sheet1").ListObjects("table1").Range
Debug.Print .Offset(.Rows.Count, .Columns.Count).Resize(1, 1).Address
End With
End Sub
归功于@Chronocidal,它提供了更好的:
Debug.Print .Cells(.Rows.Count + 1, .Columns.Count + 1).Address
请尝试以下代码行:
ActiveSheet.Cells(Rows.Count, 3).End(xlUp).Offset(1, 1).Select
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Offset(1, 1).Select
更新:
无论范围是否为表对象,此方法都将起作用
Sub FindLastCell()
Dim rng As Range
Set rng = ActiveSheet.Range("C1").CurrentRegion
Debug.Print rng.Offset(rng.Rows.Count, rng.Columns.Count).Resize(1, 1).Address
End Sub
用后范围
只需在代码中使用它:
With ActiveSheet.Cells
ActiveSheet.Cells(.Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByRows).Row + 1, _
.Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByColumns).Column + 1).Select
End With
Sub AfterUsedRange()
Dim LastRow As Long
Dim LastCol As Integer
With ActiveSheet.Cells
'Find the LAST real row
LastRow = .Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByRows).Row
' Find the LAST real column
LastCol = .Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByColumns).Column
End With
ActiveSheet.Cells(LastRow + 1, LastCol + 1).Select
End Sub
Sub AfterUsedRange()
Cells(.Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByRows).Row + 1, _
.Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByColumns).Column + 1).Select
End Sub
解释:
With ActiveSheet.Cells
ActiveSheet.Cells(.Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByRows).Row + 1, _
.Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByColumns).Column + 1).Select
End With
Sub AfterUsedRange()
Dim LastRow As Long
Dim LastCol As Integer
With ActiveSheet.Cells
'Find the LAST real row
LastRow = .Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByRows).Row
' Find the LAST real column
LastCol = .Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByColumns).Column
End With
ActiveSheet.Cells(LastRow + 1, LastCol + 1).Select
End Sub
Sub AfterUsedRange()
Cells(.Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByRows).Row + 1, _
.Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByColumns).Column + 1).Select
End Sub
在宏中使用它:
With ActiveSheet.Cells
ActiveSheet.Cells(.Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByRows).Row + 1, _
.Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByColumns).Column + 1).Select
End With
Sub AfterUsedRange()
Dim LastRow As Long
Dim LastCol As Integer
With ActiveSheet.Cells
'Find the LAST real row
LastRow = .Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByRows).Row
' Find the LAST real column
LastCol = .Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByColumns).Column
End With
ActiveSheet.Cells(LastRow + 1, LastCol + 1).Select
End Sub
Sub AfterUsedRange()
Cells(.Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByRows).Row + 1, _
.Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByColumns).Column + 1).Select
End Sub
或者您可以重新装饰:
Sub AfterUsedRange()
Cells(.Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByRows).Row, _
.Find(What:="*", SearchDirection:=xlPrevious, _
SearchOrder:=xlByColumns).Column).Offset(1, 1).Select
End Sub
附笔。
证明“UsedRange”和“SpecialCells”功能如果不可用至少是不可靠的传闻实际上是一个事实
参考代码行:
ActiveSheet.Cells(Rows.Count, 3).End(xlUp).Offset(1, 1).Select
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Offset(1, 1).Select
反对我重新设计的代码行(答案中的第一行)
让我们调用第一行:SpecialCellsCode让我们调用第二行:MyCode 下表显示了一个简单的自我解释场景
A B C D
1 1 1 1
2 2 2
3 3 y
4 x
让我们将第一行和第一列的“交点”称为“UsedRange”:“UsedRange”之后的
现在,打开工作表时MyCode正确地计算AfterUsedRangeAddress是D4
,并选择它(x),而特殊单元格代码也是如此。当我们删除列“C
”中的值3时,MyCode正确地计算AfterUsedRangeAddress是D3
,并选择它(y),但是特殊单元格代码仍然不正确地计算D4
,并选择它(x)
总之,SpecialCellsCode如果不是不可用的话,至少是不可靠的
甚至考虑这样一个测试并进一步调查的想法都来自这个问题。看看范围objectIs A1:C6 a表(Ribbon>Insert>table)上的CurrentRegion属性?我的代码现在应该可以工作了。我已经编辑了太多次了。对不起,我在回答中加了一个附言。非常有趣。另外,我建议您选择一个很好的资源来学习如何处理表。@QHarr
.DataBodyRange
应该是.Range
,否则它将无法识别可能的结果行.Range
表示整个表,而.DataBodyRange
仅表示没有标题行/结果行的数据部分。由于Range.Cells
允许您指定范围外的单元格,因此只需使用Debug.Print.Cells(.rows.Count+1,.Columns.Count+1).Address
在中使用
@Chronocidal非常好!谢谢你的回复。我们将尝试上面的内容,但它不会以表格形式出现。这一部分很有趣,因为上面的内容不是表格。现在将在我的工作簿中尝试虽然.UsedRange对象并非100%无错误,但此方法实际上不会返回高亮显示的单元格。它只提供当前区域的一个范围并将其偏移。@rohrl77:你完全正确,因此我更正了代码。很抱歉给您带来不便。既然您说UsedRange不可靠,您不认为Specialcell也不可靠吗?我会在我的答案上加上一个附言,你是对的。它确实受到同样的限制!底层代码返回到.UsedRange。让我们看看我是否可以改进答案。找到了一种新方法,可以获取当前区域中的最后一个单元格。感谢您对@vbasic208的敏锐关注!很好,但是里面仍然有“C1”,但是如果在右边或底部有数据,这可能是最好的方法。答案只是一个示例,但是如果工作表上有其他数据,则在任何情况下都需要为范围提供一些起点。如果最后一个单元格是空单元格,则将失败。