【发布时间】:2019-09-11 11:31:50
【问题描述】:
我目前正在通过反复试验、宏记录器以及在线阅读/研究来自学 VBA。在大多数情况下,我能够找到解决方法来填补空白。但在这种情况下,我有点挣扎。
我的问题是我在我的 do-while 循环中打开(变量命名工作簿),然后我需要选择一个变量行但静态列数据集,然后将其粘贴到具有指定工作表的模型中。
我希望打开的每个工作簿都运行以下步骤:
- 找到活动/打开的工作簿的最后一个空行
- 复制该数据
- 找到模型指定表的最后一个空行。
问题在于上述第 3 步。虽然我已要求代码找到最后一行,但它似乎“忽略”了这一点并将数据粘贴到模型中的 A2 处。
我尝试过的
- 我想避免 used.range 选项,因为我的源数据在所有工作簿上都有标题,在之前的测试中,我无法使用 used.range 获得与 lastRow、lastColumn 选项相同的范围。李>
- 使用 byref,这样我就可以调用复制的数据 - 但即使在阅读之后,我也很难理解如何使用它。
-
在循环中使用 wbSource 和 wbDest 并指定范围,我想避免这种情况,除非可以解释或提供关于如何在循环中使用它的示例,因为我一直无法做到这一点工作。
Sub GetAllFileNames() Dim Folder As String Dim FullFileName As String Dim FileStart As String Dim wbThis, wbSource As Workbook Dim lastRow As Long Dim wshtDest As Worksheet Set wbThis = ThisWorkbook Set wshtDest = wbThis.Sheets("Report") lastRow = wshtDest.Cells(wshtDest.Rows.Count, 1).End(xlUp).Offset(lastRow).row + 1 'rlastRow = ReportSht.Cells(ReportSht.Rows.Count, 1).End(xlUp).Offset(lastRow).row Folder = Sheet1.Range("C7") & "\" FileStart = "D1*" FullFileName = Dir(Folder & FileStart) On Error Resume Next Do While FullFileName <> "" Workbooks.Open Folder & FullFileName Call source_rng For Each copied_rng In Selection With wshtDest .Activate .Cells(lastRow, 1).Select .PasteSpecial End With Next copied_rng ' wshtDest.Range("A" & rlastRow).Offset(1).Select Debug.Print lastRow Debug.Print FullFileName FullFileName = Dir() ' moves to next file DoEvents 'Ensure Workbook has opened before moving on to next line of code Application.CutCopyMode = False Loop End Sub Sub source_rng() Dim sht As Worksheet Dim lastRow, lastColumn As Long Dim StartCell, copied_rng As Range Set sht = ActiveSheet Set StartCell = Range("A2") 'Find Last Row and Column lastRow = sht.Cells(sht.Rows.Count, StartCell.Column).End(xlUp).row lastColumn = sht.Cells(StartCell.row, sht.Columns.Count).End(xlToLeft).Column 'Select Range sht.Range(StartCell, sht.Cells(lastRow, lastColumn)).Copy End Sub
目前,上述代码不会产生任何错误,但是当删除循环并打开 1 个电子表格并将其复制并粘贴到模型中时,模型中的 lastRow 查找工作正常。
但是,当循环到位时,每个打开的工作簿的数据都会复制到模型中的 A2 处,它应该找到下一个空行并将源数据粘贴到该点。
【问题讨论】:
-
将此代码行放在
With wshtDest:lastRow = .Cells(wshtDest.Rows.Count, 1).End(xlUp).Offset(lastRow).row + 1下。你总是得到'A2',因为你没有在粘贴后更新你的lastRow -
感谢@gaback - 对它进行了排序,但是 lastRow 代码也需要 tweeking 到:
lastRow = .Cells(wshtDest.Rows.Count, 1).End(xlUp).Offset(1).row--- 否则它永远不会回到模型数据的末尾:) -
欢迎来到 Stack Overflow!你在编译你的问题方面做得很好。我只是建议您始终努力在最后明确您的问题。您需要的东西必须一眼就看清楚。
标签: excel vba copy do-while paste