2016-05-11 27 views
1

Ich habe ein Stück Code, der eine Zeile von einem Excel zu einem anderen kopiert. Das Problem besteht darin, dass die Spalten E bis G und N bis O einen Verweis auf ein anderes Excel haben und beim Kopieren die Formel nicht den Zellenwert kopiert, was dazu führt, dass die Formel in absteigender Reihenfolge in der Zielspalte wiederholt wird. Ich habe versucht mit verstecken/unhide, aber es macht keinen großen Unterschied. Die Zielspalte D ergibt D1 = 1.xslm/Blatt1/Formel (n1); D2 = 2.xslm/sheet1/formula (n2) ... - das ist die Referenz aus der Quellblattspalte D. In der Quelle sind die Werte in Ordnung, im Ziel ist die Formel einfach falsch und sollte n1 nicht haben , n2 .... Wenn die Quelle 122 in Reihe Ziel ist, sollte es D1 = 1.xslm/sheet1/Formel (N122) ist, D2 = 2.xslm/sheet1/Formel (N122)Kopieren Wert nicht Formel Excel VBA

Sub copy1() 
    Dim c As Range 
    Dim j As Integer 
    Dim Source As Worksheet 
    Dim Target As Worksheet 
    Dim Sour As String 
    Dim Tar As String 
    Dim path As String 
    Dim AutoSR As Workbook 
    Dim asrSheet As Worksheet 
    Set AutoSR = ActiveWorkbook 
    Set Target = AutoSR.ActiveSheet 

    path = "c:\first.xlsm" 
    Tar = "Sheet1" 
    Set Source = Workbooks.Open(path).Sheets(Tar) 
    Source.Unprotect Password:="XXX" 
    Application.DisplayAlerts = False 
    Columns("E:G").EntireColumn.Hidden = False 
    Columns("N:O").EntireColumn.Hidden = False 
    Source.Range("N:O").EntireColumn.Hidden = True 
    For Each c In Source.Range("a1:a" & Cells.SpecialCells(xlCellTypeLastCell).Row) 
     If c = lNum Then 
      Source.Rows(c.Row).Copy Target.Rows(1) 
     End If 
    Next c 
    Source.Range("E:G").EntireColumn.Hidden = True 
    Source.Range("N:O").EntireColumn.Hidden = True 
    Source.Protect Password:="XXX" 
    Source.Activate 
    ActiveWorkbook.Close SaveChanges:=True 
    Set Source = Nothing 

End Sub 

Antwort

2

Replace:

Source.Rows(c.Row).Copy Target.Rows(1) 

von:

Source.Rows(c.Row).Copy 
Target.Rows(1).PasteSpecial xlPasteValues 

Diese Werte einfügen wird und nicht die Formeln

EDIT Diese Antwort ist eine schnelle und dreckige Lösung! Überprüfen Sie das Antwortformular Jeeped für eine umfassendere Verbesserung des OP-Codes.

1

Um zu beginnen, werfen Sie einen Blick auf diese Zeile.

For Each c In Source.Range("a1:a" & Cells.SpecialCells(xlCellTypeLastCell).Row) 

Die Cells.SpecialCells(... nicht explizit auf die Quelle Arbeitsblatt verweisen. Es bezieht sich implizit auf die ActiveSheet property. Zufällig ist dies auch das Arbeitsblatt Quelle, da das Öffnen der Arbeitsmappe es zum ActiveSheet gemacht hat. Dies sollte jedoch nicht verlässlich sein. Besser, alle Arbeitsblatteigenschaften Range.Parent explizit zu definieren.

For Each c In Source.Range("a1:a" & SOURCE.Cells.SpecialCells(xlCellTypeLastCell).Row) 

Soweit nur das Kopieren Werten Sie ein Range.PasteSpecial method mit einem xlPasteType von xlPasteValues ​​nutzen könnten. Die direkte Wertübertragung ist jedoch eine effizientere Methode zur Übertragung von Werten und nicht die Zwischenablage oder .CutCopyMode.

all dies ersetzen,

For Each c In Source.Range("a1:a" & Cells.SpecialCells(xlCellTypeLastCell).Row) 
    If c = lNum Then 
     Source.Rows(c.Row).Copy Target.Rows(1) 
    End If 
Next c 

... mit diesem,

Dim rw as Variant 
With Source 
    rw = Application.Match(lNum, .Columns(1), 0) 
    If Not IsError(rw) Then 
     With .Range(.Cells(rw, "A"), .Cells(rw, .Columns.Count).End(xlToLeft)) 
      Target.Cells(1, 1).Resize(.Rows.Count, .Columns.Count) = .Value 
     End With 
    End If 
End With 

, die an dem passenden Zeile der Quelle Arbeitsblatt alles von Spalte A bis zur letzten besiedelten Zelle nimmt und übertragen die Werte zum Zielarbeitsblatt, das von Spalte A1 ausstrahlt.