2016-04-12 9 views
1

Ich habe ein Makro, das einige Spalten aus einem BD-Blatt kopiert und in ein anderes Blatt einfügt.Sheet.Select + Kopieren/Einfügen wird nicht funktionieren [Excel 2016]

Ich habe diesen Code in Excel 2007 funktioniert, aber ich habe ein Problem bei der Auswahl eines Blattes, dann Kopieren/Einfügen in Excel 2010 und später. Es scheint das Problem ist nicht in meinem .Select. Es scheint in der PasteSpecial() zu sein, die automatisch die with Sheet() auswählt und andere .copy() ausführt, ohne zum vorherigen Blatt zurückzukehren (der Bildschirm blinkt alle) - ich weiß nicht, ob ich klar genug war. [Manchmal funktioniert es gut, vor allem Debugger]

-Code

Const BD_SHEET As String = "Estrategia" 
Const PRICE_SHEET As String = "Precos" 

Public Sub Execute() 
    .... 

    actualCalculate = Application.Calculation 
    Application.Calculation = xlCalculationManual 

    LoadPrices() 

    Application.Calculate 
    Application.Calculation = actualCalculate 
End Sub 


Private Sub LoadPrices() 
    Dim lastSheet As Worksheet 

    Set lastSheet = ActiveSheet 
    Sheets(BD_SHEET).Select 
    lastRow = [A1000000].End(xlUp).row 

    With Sheets(PRICE_SHEET) 
     Range(Cells(2, 2), Cells(lastRow, 2)).Copy 
     .[A2].PasteSpecial xlPasteValues '<---- Working 

     Range(Cells(2, 7), Cells(lastRow, 7)).Copy 
     .[B2].PasteSpecial xlPasteValues '<---- Working 

     Range(Cells(2, 9), Cells(lastRow, 10)).Copy '<---- Error! 
     .[C2].PasteSpecial xlPasteValues 

     Range(Cells(2, 12), Cells(lastRow, 12)).Copy '<---- Error! 
     .[E2].PasteSpecial xlPasteValues 
    End With 

    lastSheet.Select 
End Sub 

I .Select entfernen und hinzufügen Set theSheet = Sheets(BD_SHEET) aber der Code wird durty sein.

Exemple:

... 
Set lastSheet = ActiveSheet 
Set bdSheet = Sheets(BD_SHEET) 
lastRow = [A1000000].End(xlUp).row 

With Sheets(PRICE_SHEET) 
    bdSheet.Range(bdSheet.Cells(2, 2), bdSheet.Cells(lastRow, 2)).Copy 
    .[A2].PasteSpecial xlPasteValues 
End With 
... 

Antwort

2

but the code is going to be durty.

Das ist, weil Sie es in die falsche Richtung

Statt

With Sheets(PRICE_SHEET) 
    bdSheet.Range(bdSheet.Cells(2, 2), bdSheet.Cells(lastRow, 2)).Copy 
    .[A2].PasteSpecial xlPasteValues 
End With 

Tun Sie dies

012 tun

Verwenden Sie auch nie Hardcoded Werte, um die letzte Zeile zu finden. Möglicherweise sehen Sie This zur Berechnung der letzten Zeile.

Auch

Range1.Copy 
Range2.PasteSpecial xlPasteValues 

als

Range2.Value = Range1.Value 

Anwendung der oben geschrieben, ich habe Ihren Code neu geschrieben. Ist das was du versuchst? (Ungetestet)

Private Sub LoadPrices() 
    Dim wsCopyFrm As Worksheet, wsCopyTo As Worksheet 
    Dim rng As Range 
    Dim lastRow As Long 

    Set wsCopyFrm = ThisWorkbook.Sheets(BD_SHEET) 
    Set wsCopyTo = ThisWorkbook.Sheets(PRICE_SHEET) 

    With wsCopyFrm 
     lastRow = .Range("A" & .Rows.Count).End(xlUp).Row 

     Set rng = .Range(.Cells(2, 2), .Cells(lastRow, 2)) 
     wsCopyTo.Range("A2").Resize(rng.Rows.Count, rng.Columns.Count).Value = rng.Value 

     Set rng = .Range(.Cells(2, 7), .Cells(lastRow, 7)) 
     wsCopyTo.Range("B2").Resize(rng.Rows.Count, rng.Columns.Count).Value = rng.Value 

     Set rng = .Range(.Cells(2, 9), .Cells(lastRow, 10)) 
     wsCopyTo.Range("C2").Resize(rng.Rows.Count, rng.Columns.Count).Value = rng.Value 

     Set rng = .Range(.Cells(2, 12), .Cells(lastRow, 12)) 
     wsCopyTo.Range("E2").Resize(rng.Rows.Count, rng.Columns.Count).Value = rng.Value 
    End With 
End Sub 
Verwandte Themen