【问题标题】:How do I copy a range of formula values and paste them to a specific range in another sheet?如何复制一系列公式值并将它们粘贴到另一个工作表中的特定范围?
【发布时间】:2014-03-06 01:37:10
【问题描述】:

我正在尝试让一个 excel 宏工作,但我在从包含公式的单元格中复制值时遇到问题。

到目前为止,这就是我所拥有的,它适用于非公式单元格。

Sub Get_Data()
    Dim lastrow As Long

    lastrow = Sheets("DB").Range("A65536").End(xlUp).Row + 1

    Range("B3:B65536").Copy Destination:=Sheets("DB").Range("B" & lastrow)
    Range("C3:C65536").Copy Destination:=Sheets("DB").Range("A" & lastrow)
    Range("D3:D65536").Copy Destination:=Sheets("DB").Range("C" & lastrow)
    Range("E3:E65536").Copy Destination:=Sheets("DB").Range("P" & lastrow)
    Range("F3:F65536").Copy Destination:=Sheets("DB").Range("D" & lastrow)
    Range("AH3:AH65536").Copy Destination:=Sheets("DB").Range("E" & lastrow)
    Range("AIH3:AI65536").Copy Destination:=Sheets("DB").Range("G" & lastrow)
    Range("AJ3:AJ65536").Copy Destination:=Sheets("DB").Range("F" & lastrow)
    Range("J3:J65536").Copy Destination:=Sheets("DB").Range("H" & lastrow)
    Range("P3:P65550").Copy Destination:=Sheets("DB").Range("I" & lastrow)
    Range("AF3:AF65536").Copy Destination:=Sheets("DB").Range("J" & lastrow)

End Sub

我怎样才能让它粘贴公式的值?

如果这可以更改/优化,我也将不胜感激。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    你可以改变

    Range("B3:B65536").Copy Destination:=Sheets("DB").Range("B" & lastrow)
    

    Range("B3:B65536").Copy 
    Sheets("DB").Range("B" & lastrow).PasteSpecial xlPasteValues
    

    顺便说一句,如果你有 xls 文件(excel 2003),如果你的 lastrow 大于 3,你会得到一个错误。

    尝试改用此代码:

    Sub Get_Data()
        Dim lastrowDB As Long, lastrow As Long
        Dim arr1, arr2, i As Integer
    
        With Sheets("DB")
            lastrowDB = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
        End With
    
        arr1 = Array("B", "C", "D", "E", "F", "AH", "AI", "AJ", "J", "P", "AF")
        arr2 = Array("B", "A", "C", "P", "D", "E", "G", "F", "H", "I", "J")
    
        For i = LBound(arr1) To UBound(arr1)
            With Sheets("Sheet1")
                 lastrow = Application.Max(3, .Cells(.Rows.Count, arr1(i)).End(xlUp).Row)
                 .Range(.Cells(3, arr1(i)), .Cells(lastrow, arr1(i))).Copy
                 Sheets("DB").Range(arr2(i) & lastrowDB).PasteSpecial xlPasteValues
            End With
        Next
        Application.CutCopyMode = False
    End Sub
    

    注意,上面的代码确定了A 列中DB 工作表上的最后一个非空行(变量lastrowDB)。如果您需要为DB 表中的每个目标列查找 lastrow,请使用下一个修改:

    For i = LBound(arr1) To UBound(arr1)
       With Sheets("DB")
           lastrowDB = .Cells(.Rows.Count, arr2(i)).End(xlUp).Row + 1
       End With
    
       ' NEXT CODE
    
    Next
    

    您也可以使用下一种方法来代替Copy/PasteSpecial。替换

    .Range(.Cells(3, arr1(i)), .Cells(lastrow, arr1(i))).Copy
    Sheets("DB").Range(arr2(i) & lastrowDB).PasteSpecial xlPasteValues
    

    Sheets("DB").Range(arr2(i) & lastrowDB).Resize(lastrow - 2).Value = _
          .Range(.Cells(3, arr1(i)), .Cells(lastrow, arr1(i))).Value
    

    【讨论】:

    • 感谢您的发帖。我用数组尝试了第一个代码,但出现错误“脚本超出范围”,在将 With Sheets(“Sheet1”) 更改为“DB”后,它什么也没做。仅供参考,我使用的是 Excel 2010。我还没有尝试过其他选项。有什么建议吗?
    • 我也更正了这部分。 >> arr1 = 数组(“B”、“C”、“D”、“E”、“F”、“AH”、“AIH”、“AJ”、“J”、“P”、“AF”)
    • 您应该将Sheet1 行中的With Sheets("Sheet1") 更改为from wich 您正在处理数据的工作表名称。例如。如果您将数据从工作表mySheet 复制到工作表DB,则应将Sheet1(与With Sheets("Sheet1") 一致)更改为mySheet。如果要从活动工作表复制,请将With Sheets("Sheet1")更改为With ActiveSheet(它将数据从当前活动工作表复制到DB工作表)
    • 你比我快。我正要评论那件事。我在测试时这样做了,效果很好。非常感谢你的帮助。我会继续测试,如果我有任何问题,我会告诉你。
    【解决方案2】:

    如果您将工作表中的每一列复制到不同的工作表中会怎样? 示例:mysheet 的 B 行到 sheet1 的 B 行,mysheet 的 C 行到 sheet 2 的 B 行...

    【讨论】:

    • 这应该是一条评论
    • 不确定是否应该是评论;似乎是对答案的尝试,尽管很糟糕。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多