【问题标题】:LOOP: Copy Cells Value (in a list) from one Sheet to Another循环:将单元格值(在列表中)从一个工作表复制到另一个工作表
【发布时间】:2016-05-30 15:26:07
【问题描述】:

此宏的目的是将一个单元格值(从一个长列表中)复制到位于不同工作表中的另一个单元格。

这是我的代码:

Sub journalben()

Set rawben = Sheets("BEN")
Set finaljnl = Sheets("JNL_BEN")

    Set Rng = Range("G2:G1048576")
    For Each cell In Rng
        'test if cell is empty
        If cell.Value <> "" Then

        finaljnl.Range("L4").Value = rawben.Range("G5").Value
        finaljnl.Range("K4").Value = rawben.Range("L5").Value
        End If
    Next
End Sub

借助图片,我将解释我想要实现的目标:

  1. 在 Sheet1(“BEN”)中,G 和 L 列中有一个列表。
  2. 我将从 Sheet1 复制单元格 G5 并将其粘贴到 Sheet2 ("JNL_BEN") Range K4 中。
  3. 接下来我将从 Sheet1 复制单元格 L5 并将其粘贴到 Sheet2 ("JNL_BEN") Range L4 中。
  4. 复制下一行,和第2行和第3行一样,但这次会调整下面的1行。
  5. 复制整个列表。这意味着到底部。该列表是动态的,有时会包含 5,000 行。

由于某些原因,复制整个列不是此宏的选项,因为必须将 sheet1 中的单元格从左到右(或水平)粘贴或放置在 Sheet2 中。

我希望你能抽出一些时间来帮助我。我的代码不起作用,我猜 FOR EACH 的实现不正确。我不确定 FOR EACH 是否是最好的代码。

感谢任何人对此的帮助。非常感谢!愿原力与你同在。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    试试这个:

    Sub journalben()
        Dim i As Long, lastRow As Long
    
        Set rawben = Sheets("BEN")
        Set finaljnl = Sheets("JNL_BEN")
    
        lastRow = rawben.Cells(Rows.Count, "G").End(xlUp).Row
    
        For i = 5 To lastRow
            'test if cell is empty
            If rawben.Range("G" & i).Value <> "" Then
                finaljnl.Range("K" & i - 1).Value = rawben.Range("G" & i).Value
                finaljnl.Range("L" & i - 1).Value = rawben.Range("L" & i).Value
            End If
        Next i
    End Sub
    

    我从5 开始FOR,因为您图像中的数据从单元格G5 开始(不考虑标题)。

    【讨论】:

      【解决方案2】:

      为此使用数字变量会更容易:

      Sub journalben()
      
      Set rawben = Sheets("BEN")
      Set finaljnl = Sheets("JNL_BEN")
      
          Set Rng = rawben.Range("G4:G1048576")
          For i = Rng.Cells(1,1).Row to Rng.Cells(1,1).End(xlDown).Row
              'test if cell is empty
              If rawben.Range("G" & i).Value <> vbNullString Then
                  finaljnl.Range("L" & i - 1).Value = rawben.Range("G" & i).Value
                  finaljnl.Range("K" & i - 1).Value = rawben.Range("L" & i).Value
              End If
          Next i
      End Sub
      

      【讨论】:

      • 嗨@R3uK,感谢您的帮助。我不确定出了什么问题,但是当我运行您的代码时,什么都没有发生。不确定“Set Rng = Range("G2:G1048576")”是否正确。我尝试删除这一行,但它给了我一个错误。
      • @BenDaggers 没有发生任何事情的原因是因为您从第 2 行的此代码开始。请参阅下面的类似答案。
      • @BenDaggers :我的错,我没注意,但你的范围从第 4 行开始,xlDown 不能这样工作。我编辑了范围(请注意,精确您正在谈论的工作表对象要好得多,否则它将采用活动工作表)。看一下@Mrig 的解决方案,使用xlUp 如果数据不连续,找到最后一行会更安全!
      • 完全同意。没注意到。非常感谢您的努力。
      • @ib11 - 我仍然建议不要使用'Rng.SpecialCells(xlCellTypeLastCell).Row',因为如果你删除单元格,'.SpecialCells(xlCellTypeLastCell)' 仅在工作表被重新计算时重新保存看到这个link
      【解决方案3】:

      您应该使用简单的 for 循环。使用起来更容易。

      此外,要使其动态化并转到范围中的最后一个单元格,请使用 SpecialCells 方法。

      您的范围需要从第 5 行开始正确设置。

      代码如下:

      Sub journalben()
      
      Set rawben = Sheets("BEN")
      Set finaljnl = Sheets("JNL_BEN")
      
          Set Rng = Range("G5:G1048576")
          For i = Rng.Cells(1,1).Row to Rng.SpecialCells(xlCellTypeLastCell).Row
              If rawben.Range("G" & i).Value <> vbNullString Then
                  finaljnl.Range("L" & CStr(i - 1)).Value = rawben.Range("G" & CStr(i)).Value
                  finaljnl.Range("K" & CStr(i - 1)).Value = rawben.Range("L" & CStr(i)).Value
              End If
          Next i
      End Sub
      

      【讨论】:

      • xlCellTypeLastCell 不是查找工作表中最后一个数据单元格的好方法,请参阅:stackoverflow.com/questions/11169445/…
      • 我当然可以使用xlUp,但是由于即使最后一个单元格被删除,也已经测试了空单元格,因此循环由于xlCellTypeLastCell而继续,它们仍然会被忽略,因为If。所以这段代码仍然可以使用。因此,与您自那以后更正的顶部带有xlDown 的不可行代码相反,不合理地投反对票。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      • 2018-04-20
      相关资源
      最近更新 更多