2012-07-11 28 views
0

我有兩個工作簿(源和目標),我想將源工作簿中的列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.,並且當單擊調試按鈕它指向第三行代碼。

回答

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 

UPDATE:

看起來形成你的代碼,您正試圖將三個答案貼在下面列。你可以修改上面的代碼做的所有三列是這樣的:

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 
+0

@Lavan Madaparambil我沒有看到您的評論,因爲這是他的其他答案。你使用我的解決方案還是他的? 上面的代碼只有三個依賴關係。 1 - 工作簿名稱「source」,2 - 名爲目標的工作簿,3 - 每個工作簿中名爲「sheet1」的工作表均不屬於工作簿。 – danielpiestrak 2012-07-24 13:56:12

+0

您可能會在參考工作簿時遇到困難。不要使用yoru原始代碼中的「target」和「Source」來替換它們,而是使用完整的文件路徑來替換它們:「C:\ testFolder \ anotherfolder \ target.xls」其中「C:\ testfolder \ anotherfolder \ 「是文件的修改,並且擴展名.xls,.xlsx或.xlsm與文件類型匹配。 (.xls是針對Excel的舊版本的) – danielpiestrak 2012-07-24 14:00:41

+0

我會試試這個,回到你的問題 – 2012-07-25 07:03:43

0

旋上@ 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 
+0

thanx很多安迪holaday和瘸子 還有一個問題。宏在我的電腦上正在運行微軟Office 2010.但它的不能在運行2007 Office的任何其他電腦上工作。 可能是什麼問題。 – 2012-07-24 11:17:33

+0

@andy holaday是否有任何性能的原因,誰通過範圍對象循環,而不是通過查看行號將被使用,或者這是一個美學改變?看來,excel實際上是參考工作表來查找循環的每次迭代的地址的字符串vlaue,這會增加表單和表單的引用,從而降低性能。我錯了嗎?此外,爲什麼使用'ActiveSheet.UsedRange'而不是完全限定的'Workbooks(「Source.xlsm」)。表格(「Sheet1」)。UsedRange'關於通過代碼的一致性。 – danielpiestrak 2012-07-24 14:15:23

+0

最後,如果操作使用了您的代碼,那麼您將引用文件擴展名.xlsm或。xlsm,這是OP使用2007/2010的假設,可能並非如此(可能會導致OP的評論中的問題),我在此迴應了您的想法,將工作簿名稱完全限定到下一級,並解釋爲:上面的評論。 – danielpiestrak 2012-07-24 14:17:20