2016-10-21 3 views
0

Ich benötige Code, wie mein Titel sagt, für die folgende Aufgabe. Ich habe schon eine Menge Code ausprobiert, aber es funktioniert immer noch nicht. enter image description here Ich muss nur 2 Spalten, "SKU" und "Rabatt", in Blatt2 mit der Befehlsschaltfläche verschieben und löschen Sie es sofort.So kopieren Sie Zellen von Blatt 1 nach Blatt 2, ohne Daten auf Blatt 2 zu entfernen

Ich bin schon okay für diese Codierung. Allerdings fängt das Problem gerade erst an. enter image description here Wenn es mir gelingt, die ersten Daten zu verschieben und zu versuchen, die 2. Daten zu verschieben, verschwinden die ersten Daten.

Ich habe bereits viele Möglichkeiten ausprobiert, kann aber immer noch nicht herausfinden, was mit dem Code nicht stimmt.

Überprüfen Sie bitte den folgenden Code:

Sub OUTGOING_GOODS() 
function1 
function2 
clear 
Range_End_Method 
End Sub 

Sub function1() 
Sheets("Invoice Print").Range("B21:B27").Copy Destination:=Sheets("Outgoing Goods").Range("D4") 
End Sub 

Sub function2() 
Sheets("Invoice Print").Range("D21:D27").Copy Destination:=Sheets("Outgoing Goods").Range("L4") 
End Sub 

Sub clear() 
Range("B21:B27").clear 
End Sub 

Ich muss auch auch den Bereich für die Dateneingabe ändern. Wie Sie sehen können, ist der Bereich nur von D21: D27 definiert, aber ich brauche mehr als Zeile 27 für den Fall, dass zusätzliche Daten eingegeben werden.

bereits versucht, den folgenden Code:

With Worksheets("Sheet2") 
    LastRow = .Cells(.Rows.Count, "D").End(xlUp).Row 
    LastRow = .Cells(.Rows.Count, "L").End(xlUp).Row 
    For Each cell In Range("D4:D" & LastRow) 
    DestinationRow = LastRow + 1 
    Next 
    For Each cell In Range("L4:L" & LastRow) 
    DestinationRow = LastRow + 1 
    Next 
End With 

Und

Lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row 
     For i = 1 To InputData 
      Lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row 
      For j = 1 To 3 
        .Cells(lastrow + 1, j).Value = InputData(i, j) 
      Next j 
     Next i 
    End With 

noch Dies funktioniert nicht.

+1

Welche Version Ihres Codes würden Sie bevorzugen, die wir betrachten? Es gibt verschiedene mögliche Probleme mit jedem. Ein generelles Problem, das ich bei beiden sehe, ist, dass Sie auf 'Cells' &' Ranges' verweisen, ohne immer ein 'Worksheet' zu enthalten. Da Ihr Makro inhärent mit 2 Blättern arbeitet, ist dies ein großer Weg, um Dinge falsch zu machen. – JMichael

+0

der erste Code ist bereits erfolgreich. Aber wenn ich einen anderen Code überarbeiten oder hinzufügen möchte, gibt es immer einen Fehler. –

+0

Ich würde vorschlagen, dass Sie die fehlenden Tabellenreferenzen hinzufügen und statt "Ziel" verwenden Sie "Tabellen (" Ausgehende Waren "). Bereich (" D4 "). PasteSpecial xlPasteAll'. Lassen Sie uns wissen, ob das funktioniert. – JMichael

Antwort

1

Auf der Grundlage unserer Diskussionen bisher würde ich folgendes vorschlagen:

Sub Outgoing_Goods_New() 
' 
Dim Outgoing As Worksheet 'Generally it's better to use Worksheet variables. Saves the trouble of having to re-type the sheet name each time you reference the sheet 
Dim Invoice As Worksheet 
Dim LastRow_Invoice As Long 
Dim LastRow_Outgoing As Long 
Set Outgoing = ActiveWorkbook.Worksheets("Outgoing Goods") 
Set Invoice = ActiveWorkbook.Worksheets("Invoice Print") 

'Find the last row of Outgoing column D that's used so we know where to paste the new set of outgoing goods 
LastRow_Outgoing = Outgoing.Range("D1048576").End(xlUp).Row 

'Make sure column L of Outgoing ends at the same point 
If Outgoing.Range("L1048576").End(xlUp).Row > LastRow_Outgoing Then 
    LastRow_Outgoing = Outgoing.Range("L1048576").End(xlUp).Row 
End If 'else column L's last used row is farther up the worksheet or the same row. Either way no need to update the value 

'Determine how much data to copy 
LastRow_Invoice = Invoice.Range("B1048576").End(xlUp).Row 'I'm assuming Column D of Invoice Print has to end at the same row. If not, use the same IF statement as above, but 
    'checking column D of Invoice 

'Copy the data from column B 
Invoice.Range("B2:B" & LastRow_Invoice).Copy 

'Paste to Outgoing Goods 
Outgoing.Range("B" & LastRow_Outgoing).PasteSpecial xlPasteAll 

'Copy Column D of Invoice 
Invoice.Range("D2:D" & LastRow_Invoice).Copy 
Outgoing.Range("L" & LastRow_Outgoing).PasteSpecial xlPasteAll 

'Clear the data from Invoice print 
Invoice.Range("B2:B" & LastRow_Invoice).ClearContents 'Removes the Value, but leaves formatting, comments, etc. alone 

End Sub 

Dies ist vor allem die Logik, die Sie bereits gehabt, aber ich habe einige Bereinigungs Unklarheiten zu beseitigen und die Logik ein wenig genericize. Beachten Sie auch, dass ich die separaten Subs nicht behalten habe. Mit wie wenig Sie tun, es ist nur kein Vorteil, die Logik zu analysieren, vor allem, wenn keiner der Code wiederverwendet wird.

Zuletzt löschte ich Spalte D auf Invoice Print nicht unter der Annahme, dass die Zellen nur Formeln enthielten, die basierend auf den Werten in Spalte B neue Daten einzogen. Wenn dies nicht der Fall ist, sollten Sie eine Sekunde hinzufügen ClearContents zu löschen Spalte D, aber das ist nicht sicher angesichts der Vagheit Ihrer Anwendungsfall.

+0

Hallo, danke für deine Hilfe. Ich habe schon die Antwort. Es muss jedoch noch ein kleines Stück seit der Ausgabe für diesen Code behoben werden. 'If Outgoing.Range (" L1048576 "). Ende (xlUp) .Row> LastRow_Outgoing Dann LastRow_Outgoing = AusgehenderRang (" L1048576 "). Ende (xlUp) .Row Ende If' –

Verwandte Themen