需要一个;简单的;excel宏来查找列中的底部单元格,创建一个区域并复制它

需要一个;简单的;excel宏来查找列中的底部单元格,创建一个区域并复制它,excel,vba,Excel,Vba,我有一个电子表格,我正在使用它来编译文本,这些文本一直在变化 在列AD的第4行(AD4)中,我将文本的内容放进去,它可以有1000到4000行的数据。它每次都会更改,因此没有静态范围名称。我需要一个宏 在该列中查找最后一段数据 然后自动“拖动一个框”从该点向左拖动两列(AB4) 并复制它。。。(3000行的文本将是AB4:AD3004)(宏停在那里,待复制的文本高亮显示) 当前版本正确地找到了底部单元格,但是如果我第二次使用新数据运行宏,它会继续尝试复制相同的区域。(我使用公式Define.

我有一个电子表格,我正在使用它来编译文本,这些文本一直在变化

在列AD的第4行(AD4)中,我将文本的内容放进去,它可以有1000到4000行的数据。它每次都会更改,因此没有静态范围名称。我需要一个宏

  • 在该列中查找最后一段数据
  • 然后自动“拖动一个框”从该点向左拖动两列(AB4)
  • 并复制它。。。(3000行的文本将是AB4:AD3004)(宏停在那里,待复制的文本高亮显示)
当前版本正确地找到了底部单元格,但是如果我第二次使用新数据运行宏,它会继续尝试复制相同的区域。(我使用公式Define.Name方法来命名单元格,然后选择AB4:LastRow)但无论数据是否转到第4000行,它始终是3160

Sub Last_row()
Cells(Application.Rows.Count, 30).End(xlUp).Select
' following lines of code are useless
Range("AB4:AD3160").Select
Range("AD3160").Activate
Selection.Copy
End Sub

您当前的代码对感兴趣的范围进行硬编码
范围(“AB4:AD3160”)。选择

此代码将定义从AB4到AD列中最后一个非空单元格的动态范围

然后,您可以使用此范围(无需选择)更改其他位置的值(注意,您可能不需要实际复制
rng1
,可以直接将这些值转储到单独的范围,而无需复制和粘贴

Sub Last_row()
Dim rng1 As Range
Set rng1 = Range([ab4], Cells(Rows.Count, 30).End(xlUp))
rng1.Copy
End Sub
更新:如何将动态大小范围从一张图纸复制到另一张图纸,而无需复制和粘贴的示例:

Sub Last_row2()
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim rng1 As Range

    Set ws1 = Sheets(1)
    Set ws2 = Sheets(2)
    Set rng1 = ws1.Range(ws1.[ab4], ws1.Cells(Rows.Count, 30).End(xlUp))
    ws2.[a1].Resize(rng1.Rows.Count, rng1.Columns.Count).Value = rng1.Value
End Sub

您当前的代码对感兴趣的范围进行硬编码
范围(“AB4:AD3160”)。选择

此代码将定义从AB4到AD列中最后一个非空单元格的动态范围

然后,您可以使用此范围(无需选择)更改其他位置的值(注意,您可能不需要实际复制
rng1
,可以直接将这些值转储到单独的范围,而无需复制和粘贴

Sub Last_row()
Dim rng1 As Range
Set rng1 = Range([ab4], Cells(Rows.Count, 30).End(xlUp))
rng1.Copy
End Sub
更新:如何将动态大小范围从一张图纸复制到另一张图纸,而无需复制和粘贴的示例:

Sub Last_row2()
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim rng1 As Range

    Set ws1 = Sheets(1)
    Set ws2 = Sheets(2)
    Set rng1 = ws1.Range(ws1.[ab4], ws1.Cells(Rows.Count, 30).End(xlUp))
    ws2.[a1].Resize(rng1.Rows.Count, rng1.Columns.Count).Value = rng1.Value
End Sub

要直接回答您的问题:

With Sheet1
    .Range("AB4", .Cells(Rows.Count, "AD").End(xlUp)).Copy
End With
在不使用剪贴板的情况下复制到特定位置

With Sheet1
    .Range("AB4", .Cells(Rows.Count, "AD").End(xlUp)).Copy Sheet2.[A1]
End With
复制并排除格式:

With Sheet1
    With .Range("AB4", .Cells(Rows.Count, "AD").End(xlUp))
        Sheet2.Cells(1, "A").Resize(.Rows.Count, .Columns.Count).Value = .Value
    End With
End With

注意:用您的实际工作表代码名替换上面的所有工作表代码名(工作表1、工作表2)。

要直接回答您的问题:

With Sheet1
    .Range("AB4", .Cells(Rows.Count, "AD").End(xlUp)).Copy
End With
在不使用剪贴板的情况下复制到特定位置

With Sheet1
    .Range("AB4", .Cells(Rows.Count, "AD").End(xlUp)).Copy Sheet2.[A1]
End With
复制并排除格式:

With Sheet1
    With .Range("AB4", .Cells(Rows.Count, "AD").End(xlUp))
        Sheet2.Cells(1, "A").Resize(.Rows.Count, .Columns.Count).Value = .Value
    End With
End With

注意:用实际的工作表代码名替换上面的所有工作表代码名(工作表1、工作表2)。

这是在MS Office Excel 2007中。顺便说一句。这是在MS Office Excel 2007中。顺便说一句。