【问题标题】:Copy values, not formulas from columns复制值,而不是列中的公式
【发布时间】:2012-08-07 00:36:28
【问题描述】:

我有两个工作簿(源和目标),我想将源工作簿中的 A 列复制到目标工作簿中的 A 列。 我在上面使用了这段代码。

Sub CopyColumnToWorkbook()
    Dim sourceColumn As Range, targetColumn As Range

    Set sourceColumn = Workbooks("Source").Worksheets("Sheet1").Columns("A")
    Set targetColumn = Workbooks("Target").Worksheets("Sheet1").Columns("A")

    sourceColumn.Copy Destination:=targetColumn
End Sub

但源工作表包含带有公式的单元格。我只想复制单元格值,而不是公式。

我应该对上面的代码做哪些修改?


Sub BOM()
    Dim sourceColumn As Range, targetColumn As Range

    Set sourceColumn = Workbooks("MASTER").Worksheets("Sheet1").Columns("C")
    Set targetColumn = Workbooks("BOM").Worksheets("Sheet1").Columns("A")

    sourceColumn.Copy Destination:=targetColumn

    Set sourceColumn = Workbooks("MASTER").Worksheets("Sheet1").Columns("D")
    Set targetColumn = Workbooks("BOM").Worksheets("Sheet1").Columns("B")

    sourceColumn.Copy Destination:=targetColumn

    Set sourceColumn = Workbooks("MASTER").Worksheets("Sheet1").Columns("E")
    Set targetColumn = Workbooks("BOM").Worksheets("Sheet1").Columns("C")

    sourceColumn.Copy Destination:=targetColumn


End Sub

这是我用来将单元格从一个工作簿复制到另一个工作簿的代码。它在运行 Windows 7 Excel 2010 的 PC 上运行良好,但我想在使用 XP Excel 2007 的 PC 上运行相同的代码。

我在运行宏时收到Runtime error: Subscript out of range.,当我点击调试按钮时,它指向第三行代码。

【问题讨论】:

    标签: vba excel excel-2007 excel-2010


    【解决方案1】:

    有很多方法可以解决这个问题,这是我最喜欢的:

    Sub CopyColumnToWorkbook()
    
        Dim iCopyingRow as long '-counter for which row we are copying at the moment
        Dim iLastRowToCopy as long '- lookup for last row to copy
        With  Workbooks("Source").Sheets("Sheet1")
            iLastRowToCopy = .Range("A" & .Rows.Count).End(xlUp).Row
        End With
    
    
        For iCopyingRow = 1 to iLastRowToCopy 
            Workbooks("Target").Sheets("Sheet1").Range("A" & iCopyingRow ).value = _
                 Workbooks("Source").Sheets("Sheet1").Range("A" & iCopyingRow ).value
        Next iCopyingRow 
    
    End Sub
    

    更新:

    看起来像您在下面发布的代码中您尝试复制三列的答案。你可以修改上面的代码来做这三列:

    Sub CopyColumnToWorkbook()
    
        Dim iCopyingRow as long '-counter for which row we are copying at the moment
        Dim iLastRowToCopy as long '- lookup for last row to copy
        With  Workbooks("Source").Sheets("Sheet1")
            iLastRowToCopy = .Range("A" & .Rows.Count).End(xlUp).Row
        End With
    
    
        For iCopyingRow = 1 to iLastRowToCopy 
            Workbooks("Target").Sheets("Sheet1").Range("A" & iCopyingRow ).value = _
                 Workbooks("Source").Sheets("Sheet1").Range("C" & iCopyingRow ).value
            Workbooks("Target").Sheets("Sheet1").Range("B" & iCopyingRow ).value = _
                 Workbooks("Source").Sheets("Sheet1").Range("D" & iCopyingRow ).value
            Workbooks("Target").Sheets("Sheet1").Range("C" & iCopyingRow ).value = _
                 Workbooks("Source").Sheets("Sheet1").Range("E" & iCopyingRow ).value
        Next iCopyingRow 
    
    End Sub
    

    【讨论】:

    • @Lavan Madaparambil 我没有看到您的评论,因为这不是他的其他答案。你是在使用我的解决方案还是他的解决方案?上面的代码只有三个依赖。 1- 工作簿名称为“源”,2 - 工作簿名为目标,3 - 每个工作簿中名为“sheet1”的工作表都不是工作簿特定的。
    • 您在引用工作簿时可能会遇到困难。不要使用 yoru 原始代码中的“目标”和“源”字样,而是尝试用完整的文件路径替换它们,如下所示:“C:\testFolder\anotherfolder\target.xls”,其中“C:\testfolder\anotherfolder\ " 是对文件的修改,文件扩展名 .xls、.xlsx 或 .xlsm 与文件类型匹配。 (.xls 适用于旧版本的 excel)
    • 我会试试这个然后回复你
    【解决方案2】:

    @gimp 解决方案的一个转折点。唯一的重大变化是这避免了建立范围的串联。

    Sub CopyColumnToWorkbook2()
    Dim TheRange As Range
    Dim ACell As Range
      Set TheRange = Application.Intersect(Range("A:A"), ActiveSheet.UsedRange)
      For Each ACell In TheRange.Cells
        Workbooks("Target.xlsx").Sheets("Sheet1").Range(ACell.Address).Value = _
          Workbooks("Source.xlsm").Sheets("Sheet1").Range(ACell.Address).Value
      Next ACell
    End Sub
    

    【讨论】:

    • thanx alot andy holaday and Gimp 还有一个问题。宏在运行 microsoft office 2010 的我的电脑上运行良好。但它不适用于运行 2007 office 的任何其他电脑。可能是什么问题。
    • @andy holaday 是否有任何性能原因会使用循环范围对象而不是查看行号,或者这是一种美学变化?似乎 excel 实际上是在引用工作表来查找循环的每次迭代的地址的字符串 vlaue,这会增加对工作表的引用,从而降低性能。我在这里错了吗?此外,关于代码的一致性,为什么要使用ActiveSheet.UsedRange 而不是完全限定的`Workbooks("Source.xlsm").Sheets("Sheet1").UsedRange`。
    • 最后,如果 Op 使用了您的代码,您将引用文件扩展名 .xlsm 或 .xlsm,这是假设 OP 使用的是 2007 / 2010 可能不正确,(和可能导致 OP 评论中的问题)我在这里回应了您的想法,即完全限定工作簿名称到下一个级别,并在上面的评论中进行了解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多