Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1880to1884
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Code zum kopieren erweitern

Code zum kopieren erweitern
02.05.2022 12:14:16
Andreas
Hi zusammen,
hab einen Code, der Werte aus einer Datei in eine andere kopiert. Das funktioniert auch super, Dank der 1a Hilfe von euch :)
Den Code wollte ich jetzt aber noch erweitern, ein Stückchen hat das auch geklappt, jetzt weiß ich aber leider nicht weiter.
Der Fett markierte Teil im Code ist neu.
Die Werte werden von Spalte FR-GE aus Zeile 35 kopiert.
Möchte aber eigentlich, dass es von Zeile 35-59 kopiert, aber nur die Zeilen, in denen Spalte FR nicht leer ist.
Hoffe jemand kann helfen.
Danke vorab und einen guten Start in die Woche
Gruß Andreas

'unter Anbindung von Bibliothek "Microsoft Scripting Runtime":
'Extras, Verweise..., Hacken bei "Microsoft Scripting Runtime"
Dim FSO As New FileSystemObject
Dim DateiPfad As String
Const sPfadErledigt As String = "X:\Dateipfad\"
Const DateinamenMuster = " K xxx.xlsm"
Private Sub CommandButton1_Click()
Dim Datei As File
Dim Erg As Range
Dim wsPL As Worksheet
Const cNrAdr = "AN1" 'Adresse der Zelle, wo der Planungsnummer zu lesen ist
'1. Prüfen, dass der Pfad gültig ist
'2. Prüfen, ob Dateinummer gültig ist
'3. Prüfen ob Datei bereit existiert
'4. + 5. Vorhandensein prüfen und an der richtige Stelle kopieren
'6. Datein Speichern
'1.
If Pfad_prüfen(sPfadErledigt) Is Nothing Then
MsgBox "Verzeichnis """ & sPfadErledigt & """ nicht vorhanden oder nicht gefunden.", vbExclamation
Exit Sub
End If
'2.
Set wsPL = ThisWorkbook.Worksheets("Planung")
If Not IsNumeric(wsPL.Range(cNrAdr).Value) Then
MsgBox "Nummer """ & wsPL.Range(cNrAdr).Value & """ ist für diese Datei nicht gültig.", vbExclamation
Exit Sub
End If
'3
DateiPfad = sPfadErledigt & Replace(DateinamenMuster, "xxx", wsPL.Range(cNrAdr).Value)
Set Datei = Datei_prüfen(DateiPfad)
If Not Datei Is Nothing Then
If MsgBox("Datei """ & Datei.ShortPath & """ existiert bereits. " & vbCr & vbCr & "Überschreiben?", vbYesNo + vbQuestion)  vbYes Then
Exit Sub
End If
End If
'4. + 5.
With Workbooks("Übersicht.xlsm").Worksheets("Übersicht")
Set Erg = .Range("A32:A" & .Range("A99999").End(xlUp).Row).Find(wsPL.Range("FR32").Value)
If Erg Is Nothing Then Set Erg = .Range("A99999").End(xlUp).Offset(1, 0) 'wenn kein Treffer, dann als neue Zeile am Ende
wsPL.Range("FR32:LA32").Copy
Erg.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End With
 With Workbooks("Übersicht.xlsm").Worksheets("Aufträge")
Set Erg = .Range("A35:A" & .Range("A99999").End(xlUp).Row).Find(wsPL.Range("FR35").Value)
If Erg Is Nothing Then Set Erg = .Range("A99999").End(xlUp).Offset(1, 0) 'wenn kein Treffer, dann als neue Zeile am Ende
wsPL.Range("FR35:GE35").Copy
Erg.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End With
'6.
ThisWorkbook.SaveAs DateiPfad, xlOpenXMLWorkbookMacroEnabled
'    ThisWorkbook.Close
End Sub
Private Sub SuchenErsetzen(Quelle As Range)
Dim Erg As Range
Set Erg = Range(Quelle.EntireColumn.Range("A32"), Quelle.Offset(-1, 0)).Find(Quelle.Value)
If Not Erg Is Nothing Then
Quelle.EntireRow.Copy Erg.EntireRow
Quelle.EntireRow.Delete
End If
End Sub
Function Pfad_prüfen(Pfad As String) As Folder
'gibt einen Folder-Objekt zurück, wenn Pfad vorhanden, sonst Nothing
On Error Resume Next
Set Pfad_prüfen = FSO.GetFolder(Pfad)
End Function
Function Datei_prüfen(Pfad As String) As File
'gibt einen File-Objekt zurück, wenn Pfad vorhanden, sonst Nothing
On Error Resume Next
Set Datei_prüfen = FSO.GetFile(Pfad)
End Function
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("AN31")) Is Nothing And Not Range("AN31") = "" Then _
Workbooks.Open "X:\Produktion\Konfektion\Schneideabteilung\Schneidepläne\Übersicht\Übersicht.xlsm"
End Sub

25
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code zum kopieren erweitern
02.05.2022 14:25:53
Rudi
Hallo,
teste mal

Dim r As Range, rc As Range, a As Range
'vorheriger Code
With Workbooks("Übersicht.xlsm").Worksheets("Aufträge")
Set Erg = .Range("A35:A" & .Range("A99999").End(xlUp).Row).Find(wsPL.Range("FR35").Value)
If Erg Is Nothing Then Set Erg = .Range("A99999").End(xlUp).Offset(1, 0) 'wenn kein Treffer, dann als neue Zeile am Ende
Set r = wsPL.Range("FR35:FR59").SpecialCells(xlCellTypeConstants)
For Each a In r.Areas
If rc Is Nothing Then
Set rc = a.Resize(, 5)
Else
Set rc = Union(rc, a.Resize(, 14))
End If
Next
rc.Copy
Erg.PasteSpecial xlPasteValues
End With
Gruß
Rudi
Anzeige
AW: Code zum kopieren erweitern
02.05.2022 15:22:17
Andreas
Hi Rudi,
Danke für dein Lösungsvorschlag.
Leider kommt bei mir ein Laufzeitfehler 1004. Im Code wird leider nirgends gelb markiert was ihm nicht passt.
Habe mit deinem Abschnitt einfach meinen Fett markierten ersetzt. Ist das richtig, oder muss diese Zeile weiter oben rein, da du eine Bemerkung bzgl. dem vorigen Code in deinem Code hast?

Dim r As Range, rc As Range, a As Range
'vorheriger Code
Gruß Andreas

'unter Anbindung von Bibliothek "Microsoft Scripting Runtime":
'Extras, Verweise..., Hacken bei "Microsoft Scripting Runtime"
Dim FSO As New FileSystemObject
Dim DateiPfad As String
Const sPfadErledigt As String = "X:\Dateipfad\"
Const DateinamenMuster = " K xxx.xlsm"
Private Sub CommandButton1_Click()
Dim Datei As File
Dim Erg As Range
Dim wsPL As Worksheet
Const cNrAdr = "AN1" 'Adresse der Zelle, wo der Planungsnummer zu lesen ist
'1. Prüfen, dass der Pfad gültig ist
'2. Prüfen, ob Dateinummer gültig ist
'3. Prüfen ob Datei bereit existiert
'4. + 5. Vorhandensein prüfen und an der richtige Stelle kopieren
'6. Datein Speichern
'1.
If Pfad_prüfen(sPfadErledigt) Is Nothing Then
MsgBox "Verzeichnis """ & sPfadErledigt & """ nicht vorhanden oder nicht gefunden.", vbExclamation
Exit Sub
End If
'2.
Set wsPL = ThisWorkbook.Worksheets("Planung")
If Not IsNumeric(wsPL.Range(cNrAdr).Value) Then
MsgBox "Nummer """ & wsPL.Range(cNrAdr).Value & """ ist für diese Datei nicht gültig.", vbExclamation
Exit Sub
End If
'3
DateiPfad = sPfadErledigt & Replace(DateinamenMuster, "xxx", wsPL.Range(cNrAdr).Value)
Set Datei = Datei_prüfen(DateiPfad)
If Not Datei Is Nothing Then
If MsgBox("Datei """ & Datei.ShortPath & """ existiert bereits. " & vbCr & vbCr & "Überschreiben?", vbYesNo + vbQuestion)  vbYes Then
Exit Sub
End If
End If
'4. + 5.
With Workbooks("Übersicht.xlsm").Worksheets("Übersicht")
Set Erg = .Range("A32:A" & .Range("A99999").End(xlUp).Row).Find(wsPL.Range("FR32").Value)
If Erg Is Nothing Then Set Erg = .Range("A99999").End(xlUp).Offset(1, 0) 'wenn kein Treffer, dann als neue Zeile am Ende
wsPL.Range("FR32:LA32").Copy
Erg.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End With
Dim r As Range, rc As Range, a As Range
'vorheriger Code
With Workbooks("Übersicht.xlsm").Worksheets("Aufträge")
Set Erg = .Range("A35:A" & .Range("A99999").End(xlUp).Row).Find(wsPL.Range("FR35").Value)
If Erg Is Nothing Then Set Erg = .Range("A99999").End(xlUp).Offset(1, 0) 'wenn kein Treffer, dann als neue Zeile am Ende
Set r = wsPL.Range("FR35:FR59").SpecialCells(xlCellTypeConstants)
For Each a In r.Areas
If rc Is Nothing Then
Set rc = a.Resize(, 5)
Else
Set rc = Union(rc, a.Resize(, 14))
End If
Next
rc.Copy
Erg.PasteSpecial xlPasteValues
End With
'6.
ThisWorkbook.SaveAs DateiPfad, xlOpenXMLWorkbookMacroEnabled
'    ThisWorkbook.Close
End Sub
Private Sub SuchenErsetzen(Quelle As Range)
Dim Erg As Range
Set Erg = Range(Quelle.EntireColumn.Range("A32"), Quelle.Offset(-1, 0)).Find(Quelle.Value)
If Not Erg Is Nothing Then
Quelle.EntireRow.Copy Erg.EntireRow
Quelle.EntireRow.Delete
End If
End Sub
Function Pfad_prüfen(Pfad As String) As Folder
'gibt einen Folder-Objekt zurück, wenn Pfad vorhanden, sonst Nothing
On Error Resume Next
Set Pfad_prüfen = FSO.GetFolder(Pfad)
End Function
Function Datei_prüfen(Pfad As String) As File
'gibt einen File-Objekt zurück, wenn Pfad vorhanden, sonst Nothing
On Error Resume Next
Set Datei_prüfen = FSO.GetFile(Pfad)
End Function
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("AN31")) Is Nothing And Not Range("AN31") = "" Then _
Workbooks.Open "Dateifapd"
End Sub

Anzeige
AW: Code zum kopieren erweitern
02.05.2022 15:31:50
Rudi
kann ich ohne die Mappe nicht nachvollziehen.
Gruß
Rudi
AW: Code zum kopieren erweitern
02.05.2022 16:14:26
Andreas
Okay, die Mappe ist leider ziemlich groß, sobald ich sie kleiner gemacht habe bekommst du eine Kopie :D
Wahrscheinlich erst morgen.
Danke schonmal für deine Hilfe
Gruß Andreas
AW: Code zum kopieren erweitern
02.05.2022 19:06:47
Yal
Hallo Andreas,
vielleicht musst Du mit deiner Erklärung ein Bisschen ausführlicher sein. "Das gleich" mit einem anderen Bereich ist es nicht ganz.
Du musst die Zellen FR35:FR59 auf dem Sheet "Planung" einzel nacheinander lesen (For-Schleife),
prüfen ob die Wert aus diesen FRx -nur bei nicht leer- im Zielbereich bereit vorhanden ist,
wenn vorhanden, ist Zielstelle "in-place" sonst am Ende,
dann den Bereich FRx:GEx kopieren und
an der Zielstelle ablegen.
Dein fett markierten Code müsste dann so aussehen:

With Workbooks("Übersicht.xlsm").Worksheets("Aufträge")
For Each Quelle In wsPL.Range("FR35:FR59").Cells
If Quell.Value  "" Then
Set Erg = .Range("A35:A" & .Range("A99999").End(xlUp).Row).Find(Quelle.Value)
If Erg Is Nothing Then Set Erg = .Range("A99999").End(xlUp).Offset(1, 0) 'wenn kein Treffer, dann als neue Zeile am Ende
Quelle.Resize(1, 14).Copy
Erg.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End If
End If
Next
End With
Resize(1,14), weil FR ist Spalte 174. GE 187, daher 187-174+1=14 Spalten
Du musst auch im Deklarationsbereich (alle Variable werden gewöhnlich am Anfang der Sub gesammelt deklariert) einen
Dim Quelle As Range
hinzufügen.
VG
Yal
Anzeige
AW: Code zum kopieren erweitern
03.05.2022 09:57:31
Andreas
Guten Morgen Yal,
hatte ja gehofft, das du das liest. Den Code hab ich ja damals von dir bekommen :)
Danke für deine Hilfe.
Denn Fett gedruckten Abschnitt hab ich ersetzt.
Beim starten kommt leider eine Fehlermeldung:

Fehler beim Kompilieren:
End If ohne If-Block
Im Code haben die beiden ersten Blöcke ja beide solche DIM Regeln, hab also versucht

Dim Quelle As Range
einmal im ersten und einmal im zweiten Block einzusetzen, die Fehlermeldung bleibt leider die gleiche.
Hab dann versucht 1 End if zu löschen, was aber ja eigentlich keinen Sinn macht, wir haben doch 2x "If" im Code?
Hat daher leider auch nicht funktioniert =( Gibt ein Laufzeitfehler 9.
Hier mal das Tabellenblatt: https://www.herber.de/bbs/user/152815.xlsm
In der Tabelle sind eigentlich Formeln hinterlegt, die musste ich aber durch Werte ersetzten, da die Formeln sich auf viele andere Blätter beziehen.
Danke vorab und Gruß
Andreas
Anzeige
AW: Code zum kopieren erweitern
03.05.2022 10:21:19
peterk
Hallo

With Workbooks("Übersicht.xlsm").Worksheets("Aufträge")
For Each Quelle In wsPL.Range("FR35:FR59").Cells
If Quell.Value  "" Then
Set Erg = .Range("A35:A" & .Range("A99999").End(xlUp).Row).Find(Quelle.Value)
If Erg Is Nothing Then Set Erg = .Range("A99999").End(xlUp).Offset(1, 0) 'wenn kein Treffer, dann als neue Zeile am Ende
Quelle.Resize(1, 14).Copy
Erg.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End If
Next
End With
Peter
AW: Code zum kopieren erweitern
03.05.2022 10:33:26
Andreas
Hi Peter,
Danke für deinen Vorschlag.
Erhalten einen Laufzeitfehler 9. Index außerhalb des gültigen Bereiches.
Woran könnte da liegen?
Gruß Andreas
Anzeige
AW: Code zum kopieren erweitern
03.05.2022 11:20:08
peterk
Hallo
Bei welcher Zeile kommt der Fehler?
Peter
AW: Code zum kopieren erweitern
03.05.2022 11:20:54
Andreas
Es wird leider nichts markiert :(
Gruß Andreas
AW: Code zum kopieren erweitern
03.05.2022 11:40:00
peterk
Hallo
Ist der File "Übersicht.xlsm" in Excel geöffnet?
Gibt es ein Tabellenblatt "Übersicht" in diesem File?
Gibt es ein Tabellenblatt "Aufträge" in diesem File?
Verwende immer "Option Explicit" am Anfang des Modules damit Dir Schreibfehler bei Variablen nicht zum Verhängnis werden

If Quell.Value  "" Then
sollte

If Quelle.Value  "" Then
sein
Peter
AW: Code zum kopieren erweitern
03.05.2022 16:22:22
Andreas
Hi Peter,
ja daran lags.
Muss mir wohl noch angewöhnen jedes einzelne Wort ganz genau anzugucken wenn irgendwas nicht funktioniert :D
Danke dir
Gruß Andreas
Anzeige
AW: Code zum kopieren erweitern
03.05.2022 11:47:44
Yal
Hallo Andreas,
diese Fehler "Index außerhalb des gültigen Bereiches" kommt bei dem Versuch, die 10te Stelle eines Arrays zu lesen, der nur bis 9 gehen würde oder auf einem benannten Element zu zugreifen, das es nicht gibt. Z.B. ein Blatt, dessen Namen geändert wurde. Wir brauchen in dem Code ein Blatt "Planung" und ein "Aufträge".
Tippfehler bei

If Quell.Value  "" Then
was wäre deine Meinung richtig?
"If" arbeitet entweder komplett auf einer Zeile, dann ohne End If:

If irgendwas-was-true-oder-false-ist Then das-mache-ich-bei-true Else das-mache-ich-bei-false
meinstens in kurzform ohne "Else"
oder Mehrzeilig, d.h. "If ... Then auf einer eigenen Zeile sonst nichts und "End If" auf einer eigenen Zeile, eventuell mit einem "Else If" auch allein auf seiner Zeile:

If irgendwas-was-true-oder-false-ist Then
das-mache-ich-bei-true
aber-auch-das
und-das
Else
das-mache-ich-bei-false
aber-auch-das
End If
Kurzform:

If irgendwas-was-true-oder-false-ist Then
das-mache-ich-bei-true
aber-auch-das
und-das
End If
Ich hatte im Code geschlampert und ein If ... Then mache-ich (Einzeilig) und ein paar Zeilen später einen "End If"
VG
Yal

Anzeige
AW: Code zum kopieren erweitern
03.05.2022 16:21:16
Andreas
Hi Yal,
Danke für deine Erklärungen, jetzt funktionierts fast wie es soll :)
Die Werte werden übergeben, aber die letzte Zeile die Werte enthält, hat in der Ausgabedatei nur nullen.
Hat das vielleicht mit dieser Zeile zu tun?
If Erg Is Nothing Then Set Erg = .Range("A99999").End(xlUp).Offset(1, 0) 'wenn kein Treffer, dann als neue Zeile am Ende
Wenn ich da die Null ändere bekomme ich aber Laufzeitfehler.
Gruß Andreas
AW: Code zum kopieren erweitern
03.05.2022 16:46:47
Yal
Hallo Andreas,
eigentlich, die dritte Zeile besagt, etwas zu machen, nur wenn die Eingangswert "" ist. Vorausgesetzt "Quell" in "Quelle" korrigiert wurde.
Schaltet in "Extras", "Optionen" den "Variabledeklaration erforderlich". Diese scheinbar lästige Zwang führt schnell zu weniger Fehler. Diese Einstellung hätte den Vertipper "Quell/Quelle" erkannt, weil Quell nicht definiert ist.

With Workbooks("Übersicht.xlsm").Worksheets("Aufträge")
For Each Quelle In wsPL.Range("FR35:FR59").Cells
If Quelle.Value  "" Then
Set Erg = .Range("A35:A" & .Range("A99999").End(xlUp).Row).Find(Quelle.Value)
If Erg Is Nothing Then Set Erg = .Range("A99999").End(xlUp).Offset(1, 0) 'wenn kein Treffer, dann als neue Zeile am Ende
Quelle.Resize(1, 14).Copy
Erg.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End If
Next
End With
VG
Yal
Anzeige
AW: Code zum kopieren erweitern
03.05.2022 17:33:05
Andreas
Hi Yal,
"Variabledeklaration erforderlich" den Haken hab ich gesetzt.
"Quell" in "Quelle" ist korrigiert.
Ein End If hatte ich gelöscht.
Hab jetzt aber nochmal einfach deinen Code von 16:46 reinkopiert.
Ist aber leider immer noch so dass, zb, wenn in Zeile 38 noch Werte stehen, er die letzten 4 Zeilen kopiert aber in der Datei wo die Werte ausgegeben werden nur die ersten 3 Zeilen angezeigt werden, in der vierten stehen nur Nullen.
Woran könnte das nur liegen :/ ?
Gruß Andreas
AW: Code zum kopieren erweitern
03.05.2022 17:43:53
Yal
Hallo Andreas,
da musst Du vielleicht den Code in Schritt-Modus laufen lassen, dabei die Lokalfenster offen haben und eventuell einen Überwachungsausdruck auf Quelle.Value und auf Quelle.Address haben.
Was passiert mit dem Code? Einfach alles in normaler Sprache gelesen:
_ für jede einzelne Zelle aus FR35:FR59, nimmt bei jedem Druchgang eine Zelle davon in "Quelle"
_ wenn Quelle "" dann
_ suche in woksheets("Aufträge") zwischen A35 und letzte belegte Zelle in Spalte A, ob eine Zelle die Wert von Quelle hat.
_ wenn ja nehme diese Zelle, wenn nicht, nehme die erste leere Zelle in Spalte A (von unten hochkommend)
_ füge dahin die Quelle und die 13 Zellen rechts davon.
Im Schritt-Modus solltest Du in der Lage sein, diese Verhalten zu nachvollziehen.
VG
Yal
Anzeige
AW: Code zum kopieren erweitern
04.05.2022 09:42:29
Andreas
Guten Morgen Yal,
vielen Dank für deine Hilfe.
Hab jetzt mal ganz viel ausprobiert und kann sagen an deinem Code lags nicht, der ist Top.
War mein Fehler, sorry. Hier eine kurze Erklärung falls du wissen möchtest wo mein Fehler lag =)
Das Problem war, dass die Werte aus FR aus einem 2ten Tabellenblatt kamen "Übergabe!O2"
Dort war in Spalte "P" eine Filterformel "FILTER(C2:C26;C2:C26>1;0)"
Die Filterformel habe ich jetzt einfach eine Spalte nach links verschoben und in "P" die Formel "WENN(O2="";"";O2)" eingesetzt.
Jetzt werden keine Zeilen mit Nullen mehr übergeben.
Daher nochmal ein dickes Dankeschön an dich für deinen Code :)
Hab noch was, was ich gerne ergänzen würde, falls du noch Geduld mit mir hast.
Hier mal eine Kopie der Ausgabedatei: https://www.herber.de/bbs/user/152848.xlsm
Und zwar kann es sein, dass die geplanten Rollen "Spalte K" zu dem Auftrag "Spalte A" nicht mit einer Stück-Nr. "Spalte L" erledigt werden können. Dann bleibt ein Rest "Spalte N".
Wenn dann später nochmal für den Auftrag geplant wird und Werte übergeben werden, wäre es super wenn er in Spalte A (in der oben angefügten Datei) sucht ob es die Auftragsnummer in Spalte A schonmal gab. Falls ja, soll er die ganze Zeile die er aus FR-GE kopiert, anstatt darunter hinten dran setzen. Also in Spalte P-AD in die Zeile, in der er die Auftragsnummer gefunden hat.
In dem Codestück darüber suchen und ersetzten wir ja auch schon da wo Zeile 32 übergeben wird.
Bin mir sicher, dass da diese Zeile dafür zuständig ist oder?

Set Erg = .Range("A32:A" & .Range("A99999").End(xlUp).Row).Find(wsPL.Range("FR32").Value)
Im neuen Codeabschnitt haben wir die Zeile ja aber schon auf die Quelle bezogen.

Set Erg = .Range("A35:A" & .Range("A99999").End(xlUp).Row).Find(Quelle.Value)
Kann dass überhaupt über mehrere Zeilen funktionierenden? (FR35:GE59)
Falls du mir nochmal helfen kannst, wäre ich dir super Dankbar :)
Gruß Andreas
AW: Code zum kopieren erweitern
04.05.2022 12:14:28
Yal
Hallo Andreas,
Antworten von unten nach oben:
"Kann dass überhaupt über mehrere Zeilen funktionierenden? (FR35:GE59)"
Es müssen zwar meherere Zeilen betrachtet, aber diese werden einzel in einer For-Schleife behandelt, die in dem Fall 59 - 35 + 1 = 25 mal durchläuft.
"Am Ende des vorhandenen Ergebnisses"
Siehe in der deutschen Version:
_ für jede einzelne Zelle aus FR35:FR59, nimmt bei jedem Druchgang eine Zelle davon in "Quelle"
_ wenn Quelle "" dann
_ suche in woksheets("Aufträge") zwischen A35 und letzte belegte Zelle in Spalte A, ob eine Zelle die Wert von Quelle hat.
_ wenn ja nehme diese Zelle, bzw. die Zelle in Spalte P der gefundenen Zeile
_ wenn nicht, nehme die erste leere Zelle in Spalte A (von unten hochkommend)
_ füge dahin die Quelle und die 13 Zellen rechts davon.
In VBA-Sprache:

With Workbooks("Übersicht.xlsm").Worksheets("Aufträge")
For Each Quelle In wsPL.Range("FR35:FR59").Cells
If Quelle.Value  "" Then
Set Erg = .Range("A35:A" & .Range("A99999").End(xlUp).Row).Find(Quelle.Value)
If Erg Is Nothing Then
Set Erg = .Range("A99999").End(xlUp).Offset(1, 0) 'neue Zeile unten
Else
Set Erg = Erg.EntireRow.Range("P1") 'die Spalte P innerhalb der Zeile des gefundenen Ergebnisses
End If
Quelle.Resize(1, 14).Copy
Erg.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End If
Next
End With
Der Rest wäre eine neue Frage.
VG
Yal
AW: Code zum kopieren erweitern
04.05.2022 15:59:56
Andreas
Hi Yal,
vielen Dank für den angepassten Code.
Hab's versucht. Er kopiert auch schön -aber leider alles weiterhin unten drunter, auch wenn die Auftragsnummer schon im Tabellenblatt Aufträge vorhanden ist.
Hab dann ein bisschen rumprobiert, z.B. dachte ich das in der Zeile:
Set Erg = .Range("A35:A" & .Range("A99999").End(xlUp).Row).Find(Quelle.Value)
die Range auf "A2:A" stehen sollte, da die Tabelle Aufträge wo alles rein kopiert wird ja schon in Zeile 2 anfängt.
Aber leider hat das auch nichts gebracht.
Weißt du vielleicht woran das liegen könnte?
Gruß Andreas
Hmm...
04.05.2022 19:51:37
Yal
Hallo Andreas,
ich kann -und will- das Debugging aus der Ferne nicht machen. Jetzt liegt es an Dir, den Code in Schritt-Modus laufen zu lassen und beobachten, was da passiert.
Dein Rumstauchen in Dunkel wird keine Fortschritt machen, wenn nicht genau weisst, was da passiert. Alles was Du brauchst, ist schon geschrieben worden.
Debug-Tipps
_ Code im Schritt-Modus laufen lassen (F8)
_ dabei das Lokalfenster offen halten (Ansicht, Lokalfenster), um den Zustand der Variablen zu sehen.
_ neugierig sein: was steht in dem Objekt hinter dem "+"
_ Überwachungsausdrücke verwenden: Variable oder Ausdruck markieren, Rechtsklick auf "Überwachung hinzufügen..."
_ Variable verwenden, nur um deren Stand im Lokalfenster zu beobachten.
_ auch gut: Debug.Print xxVariableName, druckt den Zustand eine Variable in das Direktfenster.
VG
Yal
AW: Code zum kopieren erweitern
06.05.2022 11:35:53
Andreas
Hi Yal,
ich mach mal hier unten weiter.
vielen Dank für deine Hilfe und diese Tipps vor allem mit F8 und diesem Lokalfenster.
Bin ja noch ein blutiger Anfänger was VBA angeht und kann da noch viel lernen.
Hab mir jetzt ganz viel Zeit genommen um das zu überprüfen. Vieles was da steht verstehe ich zwar noch nicht,
aber mir ist nichts aufgefallen wo ich jetzt sagen würde daher kommt der Fehler.
Hab mir dann den Code nochmal angeguckt den du mir geschickt hast und festgestellt,
das ich da wahrscheinlich beim kopieren oder speichern was vermasselt haben muss.
Weiß auch nicht genau was da schief gelaufen ist, aber hab ihn nochmal neu eingefügt,
Set Erg = .Range("A35:A" & .Range("A99999").End(xlUp).Row).Find(Quelle.Value) in dieser Zeile die A35 auf A2 geändert und dann gings auf einmal doch.
Hätte mich am liebsten selbst geschüttelt....
Würde jetzt aber gerne noch ein bisschen weiter machen =D
Es funktioniert ja jetzt, dass wenn der Wert in Spalte A schon existiert er die Zeile in Spalte P kopiert.
Das wäre ja der Fall wenn der Auftrag auf 2 Stücknummern geplant wird.
Wenn jetzt eine dritte dazu kommt, müsste er ja prüfen wie oben:
Wenn der Wert in Spalte A schon existiert wird die Zeile in Spalte P kopiert.
Neu: Und wenn der Wert in Spalte P auch schon existiert, soll er die Zeile ab Spalte AE einfügen.
Mit meinem minimalistischen VBA Verständnis, habe ich gehofft, dass das mit der Fett markierten Zeile im Code funktionieren könnte.
With Workbooks("Übersicht.xlsm").Worksheets("Aufträge")
For Each Quelle In wsPL.Range("FR35:FR59").Cells
If Quelle.Value "" Then
Set Erg = .Range("A2:A" & .Range("A99999").End(xlUp).Row).Find(Quelle.Value)
If Erg Is Nothing Then
Set Erg = .Range("A99999").End(xlUp).Offset(1, 0) 'neue Zeile unten
Else
Set Erg = Erg.EntireRow.Range("P1") 'die Spalte P innerhalb der Zeile des gefundenen Ergebnisses
Set Erg = Erg.EntireRow.Range("AE1") 'die Spalte AE innerhalb der Zeile des gefundenen Ergebnisses
End If
Quelle.Resize(1, 14).Copy
Erg.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End If
Next
End With
Das reicht aber wohl leider nicht. Wenn er jetzt Werte in A findet, wird die Zeile direkt ab Spalte AE kopiert.
Kannst du mir sagen, was ich noch anpassen muss?
Vielen Dank vorab
Gruß Andreas
AW: Code zum kopieren erweitern
06.05.2022 16:28:49
Yal
Hallo Andreas,
wenn Du nach dem Du die Spalte P als Einfüge-Ziel ("Erg") festgelegt hast, die Spalte AE als Einfüge-Ziel festlegst, dann ist natürlich immer AE das Ziel.
Da muss dazwischen eine Prüfung stattfinden: ist das Ziel leer oder nicht? nur wenn nicht leer soll das Ziel auf AE festgelgt werden.
Es ist nicht ein Programmierproblem, es ist ein Logikproblem. Daher sage ich den Code immer in natürliche Sprache lesen. So fehlen die Logikfehler schneller auf. Stellt dich immer vor, Du erklärst es jemanden (idealerweise erklärst Du es tatsächlich jemanden): da hättest Du gesagt ich lege das Ziel auf P und direkt danach lege ich das Ziel auf AE... Äh?

Sub Übernehmen()
With Workbooks("Übersicht.xlsm").Worksheets("Aufträge")
For Each Quelle In wsPL.Range("FR35:FR59").Cells
If Quelle.Value  "" Then
Set Erg = .Range("A2:A" & .Range("A99999").End(xlUp).Row).Find(Quelle.Value)
If Erg Is Nothing Then
Set Erg = .Range("A99999").End(xlUp).Offset(1, 0) 'neue Zeile unten
Else
Set Erg = Erg.EntireRow.Range("P1") 'die Spalte P innerhalb der Zeile des gefundenen Ergebnisses
If Erg.Value  "" Then Set Erg = Erg.EntireRow.Range("AE1") 'die Spalte AE innerhalb der Zeile des gefundenen Ergebnisses
End If
Quelle.Resize(1, 14).Copy
Erg.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End If
Next
End With
End Sub
VG
Yal
Funktioniert, Dankeschön!
06.05.2022 16:47:29
Andreas
=D Haha. Oh man, das macht halt wirklich keinen Sinn...
Aber Yal, vielen vielen Dank für deine Hilfe in den letzten Tagen.
So ist es für mich perfekt und es funktioniert alles wie es soll und das freut mich riesig! DANKE :)
Hätte ich ohne deine Arbeit in 1.000 Jahren nicht hinbekommen.
Wünsche dir ein schönes Wochenende
Gruß Andreas
Vielen Dank für die Rückmeldung
07.05.2022 16:25:45
Yal
Für mich ist es wichtig, nicht nur dass Du eine Lösung hast, sondern, dass dein VBA-Kompetenz sich erweitert. Idealerweise brauchst Du dann fürs nächste Projekt nicht mehr 1000 Jahre sondern nur noch 100.
VG
Y'all

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige