如何将数据从一个工作表中的行复制到另一个工作簿中的另一个?

我可以把一个体面的macros放在一起,做我所需要的,但是我忘记了这个范围每天都会改变。
具体来说,行数会变得更高。 现在我的macros通过并隐藏没有今天的date的任何行,然后将设置的范围复制到另一个工作簿中的工作表。 我唯一的问题是,范围每天都会改变,所以我想我需要一种方法来复制只有其余数据隐藏的行中的数据,然后将其粘贴到其他工作簿。

Sub automate() Dim cell As Range For Each cell In Range("AB2:AB30000") If cell.Value < Date And cell.Value <> Empty Then cell.EntireRow.Hidden = True Next Range("K28336:K28388,O28336:O28388,P28336:P28388,Q28336:Q28388,R28336:R28388,S28336:S28388,T28336:T28388,U28336:U28388,V28336:V28388,Y28336:Y28388,AA28336:AA28388,AB28336:AB28388").Select Selection.Copy Workbooks.Open ("\\gvwac09\Public\Parts\Test\2014 IPU.xlsx") Sheets("Historical Data").Activate ActiveSheet.Range("c1").End(xlDown).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlPasteFormats ActiveSheet.Paste 

这是迄今为止我的macros。 对不起,如果我没有正确格式化这个post,这是新的。

我不明白你正在尝试什么,但我相信我可以给你一些有用的指针。

我不解释我在下面的代码中使用的陈述。 在Visual Basic编辑器的帮助中查找它们,或者尝试在Web上search“Excel VBA xxxxx”。 如果有必要回来的问题,但你可以发现自己越多,你的技能会发展得越快。

首先你需要find包含数据的最后一行。 检查每一行到AB30000只是浪费时间。 下面的macrosDemo1演示了两种技术。 有更多的技术来find最后一排,在任何情况下都不适合。 search“[excel-vba]查找最后一行的StackOverflow”。 尽pipe我使用的第一种技术远非最受欢迎,但还是有很多相关的问题和答案。

一般build议:如果您可以将您的需求分解为一系列单一问题(例如“查找最后一行”),您会发现在StackOverflow中search答案会更容易。

如果要修改工作表,请始终在macros的起始处包含Application.ScreenUpdating = False 。 没有这个声明,每次你隐藏一行,Excel都会重画屏幕。

我已经创build了一些我希望能够代表您的数据的testing数据。 我有两个工作表SourceDestSource包含完整的数据集。 我将选定的行复制到Dest

我已经使用自动filter,如果它会给你你想要的效果,这将比你的技术快得多。 使用键盘上的自动filter进行播放。 如果您能find所需的效果,请打开macros录制器,使用“自动筛选器”获取所需的select,然后closuresmacros录制器。 调整macroslogging器的语句以删除Selection并replaceDemo2的相应语句。

Demo2的秘密是Set Rng = .AutoFilter.Range.SpecialCells(xlCellTypeVisible)Rng设置为可见的行。 如果你不能让自动filter按照你的意愿工作,你决定使用你当前的技术来设置不感兴趣的行,那么保留这个语句来获得剩余的行。 不过,我认为macrosDemo3使用更好的技术。

 Option Explicit Sub demo1() Dim ColLast As Long Dim Rng As Range Dim RowLast As Long Application.ScreenUpdating = False With Worksheets("Source") ' This searches up from the bottom of column AB for a cell with a value. ' It is the VBA equivalent of placing the cursor at the bottom of column AB ' and clicking Ctrl+Up. RowLast = .Cells(Rows.Count, "AB").End(xlUp).Row Debug.Print "Last row with value in column AB: " & RowLast ' This searches for the last cell with a value. Set Rng = .Cells.Find(What:="*", After:=.Range("A1"), SearchDirection:=xlPrevious) If Rng Is Nothing Then ' Worksheet is empty Else RowLast = Rng.Row ColLast = Rng.Column Debug.Print "Last cell with value is: (" & RowLast & ", " & ColLast & _ ") = " & Replace(Rng.Address, "$", "") End If End With End Sub Sub Demo2() Dim Rng As Range Dim SearchDate As String SearchDate = "14-May-14" Application.ScreenUpdating = False With Sheets("Source") .Cells.AutoFilter .Cells.AutoFilter Field:=28, Criteria1:=SearchDate Set Rng = .AutoFilter.Range.SpecialCells(xlCellTypeVisible) End With ' Rng.Address has a maximum length of a little under 256 characters. ' Rng holds the addresses of all the visible rows but you cannot display ' all those addresses in an easy manner. However, this is only to give ' you an idea of what is in Rng; the Copy statement below uses the full ' set of addresses. Debug.Print "Visible rows: " & Rng.Address Rng.Copy Worksheets("Dest").Range("A1") End Sub Sub Demo3() Dim RngToBeCopied As Range Dim RowCrnt As Long Dim RowLast As Long Dim SearchDate As Long ' Excel holds dates as integers and times as fractions. SearchDate = CLng(DateValue("20 May 2014")) With Worksheets("Source") RowLast = .Cells(Rows.Count, "AB").End(xlUp).Row ' Include header row in range to be copied Set RngToBeCopied = .Rows(1) For RowCrnt = 2 To RowLast If .Cells(RowCrnt, "AB").Value = SearchDate Then Set RngToBeCopied = Union(RngToBeCopied, .Rows(RowCrnt)) End If Next End With Debug.Print RngToBeCopied.Address RngToBeCopied.Copy Worksheets("Dest").Range("A1") End Sub