Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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,我有一张桌子 我正在尝试将数据粘贴到单元格D7中,以便显示当前框的边缘 我试着用 ActiveSheet.Range("C1").End(xlDown).End(xlToRight).Offset(1, 1).Select 它是一个Excel表格,因此您可以使用表格范围的尺寸进行偏移,并将大小调整为一个单元格 Option Explicit Public Sub AddressOfCell() With ThisWorkbook.Worksheets("Sheet1").ListO

我有一张桌子

我正在尝试将数据粘贴到单元格D7中,以便显示当前框的边缘

我试着用

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”,但是如果在右边或底部有数据,这可能是最好的方法。答案只是一个示例,但是如果工作表上有其他数据,则在任何情况下都需要为范围提供一些起点。如果最后一个单元格是空单元格,则将失败。