【问题标题】:How to copy a range to another worksheet with for each loop?如何使用每个循环将范围复制到另一个工作表?
【发布时间】:2019-11-03 05:07:46
【问题描述】:

我想将一个范围复制到另一个工作表中,并在新工作表的前面插入 2 列。它不会复制原始范围。

如果我复制到同一个工作表,它可以工作。

Set ws = ThisWorkbook.Sheets("Sh2")
Set ws2 = ThisWorkbook.Sheets("Sh3")
Set wb = ThisWorkbook

rowNum = ws.UsedRange.Rows.Count

For Each row In ws.Range("A1:A" & rowNum)
    ws2.Range("A1:A" & rowNum).Offset(0, 0).Value2 = wb.Name
    ws2.Range("A1:A" & rowNum).Offset(0, 1).Value2 = ws.Name
Next row

For Each cell In ws.UsedRange
    cell.Offset(10, 2).Value2 = cell.Value2
Next cell

我希望“A”列包含活动工作簿的名称,“B”列包含活动工作表的名称,其他行是原始内容。现在,文件名和工作表的名称已复制到新工作表,但内容没有。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    您编写代码的方向很接近,希望这个示例可以提供帮助。但首先,请在您的代码中添加always use Option Explicit

    在为工作表设置初始变量时,使用更具描述性的变量名称可以更清楚地明确哪个变量用于保存某些数据。我当时设置的示例是

    Dim wb As Workbook
    Dim srcWS As Worksheet
    Dim dstWS As Worksheet
    Set wb = ThisWorkbook
    Set srcWS = wb.Sheets("Sh2")
    Set dstWS = wb.Sheets("Sh3")
    

    接下来,您可以创建一个变量来确定源数据的范围区域:

    Dim srcRange As Range
    Set srcRange = srcWS.UsedRange
    

    如果您要创建前两列以包含工作簿和工作表名称,则实际上不需要循环。通过创建所需大小的Range,单个语句将在该范围内的所有单元格中放置相同的值。因此,您可以使用

    在两个语句中创建您的姓名列
    dstWS.Range("A1").Resize(srcRange.Rows.Count, 1) = wb.Name
    dstWS.Range("B1").Resize(srcRange.Rows.Count, 1) = srcWS.Name
    

    我将建立一个从第三列开始的目标范围,就在两个名称列的右侧:

    Dim dstRange As Range
    Set dstRange = dstWS.Range("C1").Resize(srcRange.Rows.Count, _
                                            srcRange.Columns.Count)
    

    然后用同样的想法,您也可以在单个语句中将整个源范围复制到您的目标:

    dstRange.Value = srcRange.Value
    

    你已经完成了。

    这是一个单独的块中的整个示例:

    Option Explicit
    
    Sub CopyMyRange()
        Dim wb As Workbook
        Dim srcWS As Worksheet
        Dim dstWS As Worksheet
        Set wb = ThisWorkbook
        Set srcWS = wb.Sheets("Sh2")
        Set dstWS = wb.Sheets("Sh3")
    
        Dim srcRange As Range
        Set srcRange = srcWS.UsedRange
    
        dstWS.Range("A1").Resize(srcRange.Rows.Count, 1) = wb.Name
        dstWS.Range("B1").Resize(srcRange.Rows.Count, 1) = srcWS.Name
    
        Dim dstRange As Range
        Set dstRange = dstWS.Range("C1").Resize(srcRange.Rows.Count, _
                                                srcRange.Columns.Count)
        dstRange.Value = srcRange.Value
    End Sub
    

    【讨论】:

    • PeterT,如果我想将它与更多工作簿和工作表一起使用,我该如何编辑此代码?所以我有更多工作簿(每个工作簿有更多工作表),我想将这些原始工作表收集到一个新的单个工作表中。目前,我的代码打开工作簿,将工作表导入另一个工作表,但复制相同的位置,而不是彼此下方。提前感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多