2017-08-04 9 views
0

Ich bin immer noch neu in VBA, aber ich versuche, eine kopierte Auswahl von Zeilen und Spalten aus einer anderen Arbeitsmappe in die aktuelle Arbeitsmappe einzufügen. Mein Problem ist, dass es beim Einfügen fehlschlägt, nehme ich an, weil die Auswahl größer als die Zielauswahl ist. Im Folgenden Teil des Codes (ich weiß, schrecklich und mit wählt):Excel VBA Einfügen von sichtbaren Zelle Auswahlfehler

dim i as long 

     Workbooks.Open Filename:="C:\Users\...\File1.xls" 
     Range("A15").Select 
     For i = 1 To n 
      ActiveCell.FormulaR1C1 = "=CONCATENATE(RC[1],RC[2])" 
      ActiveCell.Offset(1, 0).Select 
     Next i 
     Range("Q15").Select 
     For i = 1 To n 
     ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-16] ,'[file2.xlsm]DST'!C1:C18,1,0)" 
     ActiveCell.Offset(1, 0).Select 
     Next i 
     ActiveSheet.Range("$A$14:$Q$103").AutoFilter Field:=17, Criteria1:="#N/A" 
     Range("A1").End(xlDown).SpecialCells(xlCellTypeVisible).Copy 
     Windows("File2.xlsm").Activate 
     ThisWorkbook.Worksheets("sheet2").Activate 
     Range("B1").End(xlDown).Offset(1, -1).Select 
     'moves the active cell to the data end of column A 
     Debug.Print "Active cell is " & ActiveCell.Address(False, False) 
     'it puts the cursor correctly here, but it errors out after in the selection 
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 

Im Grunde ist dies Teil eines Codes, der eine neue Spalte in einer System-Exportdatei (1) ist das Hinzufügen, wo ein einzigartiger Suchschlüssel Die zweite und dritte Spalte wird später in einer VLOOKUP-Formel verwendet, um zu prüfen, ob fehlende Produkte vorhanden sind. Wenn dies der Fall ist, werden diese in der Berichtsdatei (2) am Ende der vorhandenen Daten hinzugefügt. Spalte B wird verwendet, da Spalte A eine Formel hat (eine andere CONCATENATE, die nicht für die Auswahl verwendet werden kann).

Wie kann ich die Auswahl durchführen?

Antwort

0

Der folgende Code ist nicht die Lösung, aber es enthält es.

Dim WbTarget As Workbook 
Dim WsT As Worksheet 
Dim Rng As Range 

Set WbTarget = Workbooks("File2.xlsm")   ' must be open 
Set WsT = WbTarget.Worksheets("Sheet2") 
Set Rng = WsT.Range("B1").End(xlDown).Offset(1, -1) 

With ActiveSheet 
    .Range("$A$14:$Q$103").AutoFilter Field:=17, Criteria1:="#N/A" 
    .Range("A1").End(xlDown).SpecialCells(xlCellTypeVisible).Copy Destination:=Rng 
End With 

Im Grunde ist es vermeidet die PasteSpecial Methode, die Quell- und Ziel erfordern würde, reicht von gleicher Größe zu sein.

Sein großer Fehler ist sein Verweis auf ActiveSheet. Sie haben hier einen Code zum Deklarieren und Festlegen einer Arbeitsmappe, eines Arbeitsblatts und eines Bereichs. Die Zielarbeitsmappe, das Arbeitsblatt und der Bereich werden niemals ausgewählt oder aktiviert. Ich empfehle Ihnen, die Quelle auf die gleiche Weise zu behandeln.

Setzen Sie Option Explicit oben auf Ihrem Codeblatt. Denken Sie daran, dass es am besten ist, alle Deklarationen zu Beginn einer Prozedur zu erstellen, und wenn Sie mir noch einen Rat geben möchten, sollten Sie die Ergebnisse der Arbeitsblattfunktionen in Ihr Arbeitsblatt schreiben und nicht die Arbeitsblattfunktionen.