【发布时间】:2018-05-07 19:40:35
【问题描述】:
我迷路了,并试图在多个论坛上找到这个特定问题,但似乎无法将其拼凑起来。希望非常快速的问题。此代码旨在:
- 在 5 个工作表中搜索包含数据的最后一个单元格。它应该搜索除“A”或“B”列之外的数据,因为这些数据可能为空,也可能不为空。
- 对数组中的所有 5 个工作表重复
- 将源工作簿中 5 个工作表中的所有数据依次粘贴到“工作表 4”上
我遇到的问题是 maybe usedrange.copy 奇怪地复制了 5 个工作簿中的所有数据。它似乎没有复制所有数据(也许计算列 A 以查找最后使用的行并基于此进行复制?)。
是否有不同的方式来实现我需要做的事情?我认为这会更容易,因为它只是从 5 张纸上复制所有数据并粘贴到不同的 wkbk 中……但是……不。非常感谢任何帮助。
Sub Notes2()
'Last row in column
Dim WS As Worksheet, shAry As Variant, i As Long
Dim AOFF As Range
Dim rOWIS As Integer
Dim wb As Workbook, wb2 As Workbook
Dim vFile As Variant
'Set source workbook
Set wb = ActiveWorkbook
Set WS = Worksheets("Sheet 4")
With WS
Set LastCell = .Cells(.Rows.Count, "A").End(xlUp)
LastCellRowNumber = LastCell.Row + 1
End With
'Open the target workbook
vFile = Application.GetOpenFilename("Excel-files,*.xlsx", _
1, "Select File To Open", , False)
'if the user didn't select a file, exit sub
If TypeName(vFile) = "Boolean" Then Exit Sub
Application.ScreenUpdating = False
Set wb2 = Workbooks.Open(vFile)
With wb2
shAry = Array(.Sheets("Week 1"), .Sheets("Week 2"), .Sheets("Week 3"), .Sheets("Week 4"), .Sheets("Over 30"))
End With
For i = LBound(shAry) To UBound(shAry)
shAry(i).UsedRange.Copy
wb.Activate
WS.Cells(Rows.Count, 3).End(xlUp).End(xlUp)(2).PasteSpecial xlPasteValues
Application.CutCopyMode = False
Next
Application.ScreenUpdating = True
'Close
wb2.Close False
End Sub
【问题讨论】:
-
您真的要连续使用两次
.End(xlUp)吗?这样做会覆盖 WS 表中的一行或多行数据。试试这个:WS.Cells(Rows.Count, 3).End(xlUp)(2).PasteSpecial xlPasteValues从工作表末尾的第一个空白行开始粘贴数据。 -
我不是故意这样连续两次。我的错误。即使在更正之后,问题似乎仍因某种原因而存在。这是要复制的 excel wkbk:ufile.io/fkz2z 和源 wkbk:ufile.io/6r9yf。我刚刚添加了一个包含更正代码的蓝色按钮。如果您使用该宏,您可以看到正在发生的事情。它只是不想看起来有条不紊地复制和粘贴并将它们混合起来
-
找到粘贴数据的更好方法是:
WS.Cells(WS.Cells.SpecialCells(xlCellTypeLastCell).Row + 1, 3).PasteSpecial xlPasteValues。这将从第一个未使用的行 C 列开始粘贴数据。(ps 虽然您花时间模拟数据很好,但我不喜欢从未知来源下载文件。更新您的问题以反映代码更改,并可能包括数据的屏幕截图。此外,如果问题仍然存在,请将您的数据减少到尽可能少的数量,以便准确了解发生了什么。 -
效果很好。有点儿。它修复了非常奇怪的粘贴问题并且它是对齐的。但是,我使用此代码的电子表格的固有部分需要 P-T 列中的某些公式。它们只是计算其他(不相关)数据的公式。看起来这是粘贴在公式结束的那些列下方(第 1000 行是它停止的位置)。您是否知道任何快速修改粘贴代码以跳过读取这些列并将 A - O 粘贴到左侧的快速方法,它是第一个空白行?
-
来自stackoverflow.com/questions/37077059... 尝试:
Set LastCell = WS.Range("C:O").Find(What:="*", SearchDirection:=xlPrevious)和WS.Cells(LastCell.Row + 1, 3).PasteSpecial xlPasteValues。