【问题标题】:Excel VBA - Completing another Loop Operation within a Do-While LoopExcel VBA - 在 Do-While 循环中完成另一个循环操作
【发布时间】:2019-09-11 11:31:50
【问题描述】:

我目前正在通过反复试验、宏记录器以及在线阅读/研究来自学 VBA。在大多数情况下,我能够找到解决方法来填补空白。但在这种情况下,我有点挣扎。

我的问题是我在我的 do-while 循环中打开(变量命名工作簿),然后我需要选择一个变量行但静态列数据集,然后将其粘贴到具有指定工作表的模型中。

我希望打开的每个工作簿都运行以下步骤:

  1. 找到活动/打开的工作簿的最后一个空行
  2. 复制该数据
  3. 找到模型指定表的最后一个空行。

问题在于上述第 3 步。虽然我已要求代码找到最后一行,但它似乎“忽略”了这一点并将数据粘贴到模型中的 A2 处。

我尝试过的

  1. 我想避免 used.range 选项,因为我的源数据在所有工作簿上都有标题,在之前的测试中,我无法使用 used.range 获得与 lastRow、lastColumn 选项相同的范围。李>
  2. 使用 byref,这样我就可以调用复制的数据 - 但即使在阅读之后,我也很难理解如何使用它。
  3. 在循环中使用 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


【解决方案1】:

我认为问题在于您在循环之外定义了lastrow。这意味着它被填充了 1 次(可能是第 2 行),并且永远不会更新。您必须为 for 循环的每次迭代重新计算它。

所以是这样的:

    For Each copied_rng In Selection
        lastRow = wshtDest.Cells(wshtDest.Rows.Count, 1).End(xlUp).row + 1
        With wshtDest
        .Activate
        .Cells(lastRow, 1).Select
        .PasteSpecial
        End With
    Next copied_rng

既然你说你还在学习;有一种方法可以检查您的变量是否填充了您期望的值。您可以使用 F8 单步执行您的代码并在 Watch 窗口中跟踪它们:https://bettersolutions.com/vba/debugging/watch-window.htm

希望对您有所帮助。

【讨论】:

  • 天哪……我什至没有想到!我正在使用 debug.print lastRow 来查看它做了什么,但是当我打开一个电子表格时它工作正常,这没有意义!我将在循环内使用带有 lastRow 的代码运行,看看是否有帮助。 brb
  • 经过一些试验和错误,这就像一个魅力!请注意,正确答案与@beek 的答案略有不同 - 正确答案见下文 :) For Each copied_rng In Selection lastRow = wshtDest.Cells(wshtDest.Rows.Count, 1).End(xlUp).Offset(1).row With wshtDest .Activate .Cells(lastRow, 1).Select .PasteSpecial 'End With' Next copied_rng
  • 我认为两者都可以。你的找到最后一行并使用和偏移 1 行,我的找到最后一行并将行号加 1。但无论如何,很高兴我能帮上忙。
  • 抱歉!这就是我快速阅读所得到的!我没有意识到你从我的原始代码中取出了offset(lastRow) 部分。
猜你喜欢
  • 1970-01-01
  • 2018-01-16
  • 2022-10-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2012-01-18
  • 2020-02-20
  • 1970-01-01
相关资源
最近更新 更多