Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1872to1876
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
VBA Kopieren einfügen überschreiben
01.03.2022 09:15:06
Andreas
Guten Morgen zusammen,
hab einen Code, der Werte aus einer Datei, nenne die mal "Planung" kopiert und diese in eine zweite Datei überträgt "Übersicht".
In Übersichts-Datei, werden die Werte dann immer in die nächste freie Zeile kopiert.
Hier der Schnipsel, der das machen soll:

ThisWorkbook.Worksheets("Planung").Range("FL2:KT2").Copy
Workbooks("Übersicht.xlsm").Worksheets("Übersicht").Range("A99999").End(xlUp).Offset(1, 0).PasteSpecial _
Paste:=xlPasteValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Das funktioniert auch super. Hätte jetzt aber gerne, dass wenn der erste Wert -also der, der aus FL2 aus der Planungs-Datei kommt schon in der Übersichts-Datei enthalten ist,diese Zeile in der Übersichts-Datei überschrieben wird, anstatt eine neue Zeile anzulegen.
Danke vorab und Gruß Andreas
Da ich mich mit VBA leider sehr wenig auskenne, hier zur Sicherheit mal der Vollständige Code:

'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:\Andreas\"
Const DateinamenMuster = " K xxx.xlsm"
Private Sub CommandButton1_Click()
Dim Datei As File
'1. Prüfen, dass der Pfad gültig ist
'2. Prüfen, ob Dateinumemr gültig ist
'3. Prüfen ob Datei bereit existiert
'4. Daten übertragen
'5. Datein Speichern
'1.
If Pfad_prüfen(sPfadErledigt) Is Nothing Then
MsgBox "Verzeichnis """ & sPfadErledigt & """ nichtvorhadne oder nicht gefunden.", vbExclamation
Exit Sub
End If
'2.
If Worksheets("Ausgang").Range("AK1").Value = "" Or Not IsNumeric(Worksheets("Planung").Range("AK1").Value) Then
MsgBox "Nummer """ & Worksheets("Planung").Range("AK1").Value & """ ist für diese Datei nicht gültig.", vbExclamation
Exit Sub
End If
'3
DateiPfad = sPfadErledigt & Replace(DateinamenMuster, "xxx", Worksheets("Planung").Range("AK1").Value)
Set Datei = Datei_prüfen(sPfadErledigt & Replace(DateinamenMuster, "xxx", Worksheets("Planung").Range("AK1").Value))
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.
ThisWorkbook.Worksheets("Planung").Range("FL2:KT2").Copy
Workbooks("Übersicht.xlsm").Worksheets("Übersicht").Range("A99999").End(xlUp).Offset(1, 0).PasteSpecial _
Paste:=xlPasteValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'5.
ThisWorkbook.SaveAs DateiPfad, xlOpenXMLWorkbookMacroEnabled
'    ThisWorkbook.Close
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

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Kopieren einfügen überschreiben
01.03.2022 09:15:41
Andreas
Hab versehentlich 2 mal gepostet, sorry.
Wie kann ich das löschen?
Gruß Andreas
AW: VBA Kopieren einfügen überschreiben
01.03.2022 10:06:40
Yal
Hallo Andreas,
Ich habe zuerst gedacht, ich brauche deine Datei, aber es geht auch ohne:

'unter Anbindung von Bibliothek "Microsoft Scripting Runtime":
'Extras, Verweise..., Haken bei "Microsoft Scripting Runtime"
Dim FSO As New FileSystemObject
Dim DateiPfad As String
Const sPfadErledigt As String = "X:\Andreas\"
Const DateinamenMuster = " K xxx.xlsm"
Private Sub CommandButton1_Click()
Dim Datei As File
'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. Daten übertragen
'5. Vorhandensein prüfen und ersetzen
'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.
If Worksheets("Ausgang").Range("AK1").Value = "" Or Not IsNumeric(Worksheets("Planung").Range("AK1").Value) Then
MsgBox "Nummer """ & Worksheets("Planung").Range("AK1").Value & """ ist für diese Datei nicht gültig.", vbExclamation
Exit Sub
End If
'3
DateiPfad = sPfadErledigt & Replace(DateinamenMuster, "xxx", Worksheets("Planung").Range("AK1").Value)
Set Datei = Datei_prüfen(sPfadErledigt & Replace(DateinamenMuster, "xxx", Worksheets("Planung").Range("AK1").Value))
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.
ThisWorkbook.Worksheets("Planung").Range("FL2:KT2").Copy
With Workbooks("Übersicht.xlsm").Worksheets("Übersicht").Range("A99999").End(xlUp).Offset(1, 0)
.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
'5.
SuchenErsetzen .Range
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("A2"), 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
VG
Yal
(ich weiss inzwischen, dass "Haken" nicht mit "ck" geschrieben wird ;-)
Anzeige
AW: VBA Kopieren einfügen überschreiben
01.03.2022 13:07:05
Andreas
Hi Yal,
stimmt den Code habe ich ja von dir bekommen, Danke nochmal ;D
Also irgendwas mache ich falsch, oder ich hab blöd erklärt.
Wie ich das verstehe, will deine Ergänzung prüfen ob die Datei vorhanden ist und diese ersetzen.
Was ich aber ersetzen möchte, ist in der Datei Übersicht die Werte, die aus der Planung da rein kopiert werden.
ThisWorkbook.Worksheets("Planung").Range("FR2:KZ2").Copy
Workbooks("Übersicht.xlsm").Worksheets("Übersicht").Range("A99999").End(xlUp).Offset(1, 0).PasteSpecial _
Paste:=xlPasteValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Hier wird ja alles kopiert, was im Tabellenblatt Planung in FR2:KZ2 steht und in der zweiten Datei "Übersicht" dann in "A:EI" eingefügt (immer in die nächste freie Zeile).
(Das Modul "ÜbersichtÖffnen" gehört da auch noch dazu).
Wenn der Wert, der aus FL2 kopiert wird, in der Übersichtsdatei in der Spalte A schon irgendwo vorhanden ist, dann soll die ganze Zeile in der Übersichtsdatei mit den Werten aus FL2:KT2 ersetzt werden und nicht in eine neue Zeile geschrieben werden.
Kann irgendwie nur eine Datei verlinken? Daher hab ich das Tabellenblatt aus der Übersichtsdatei mal die die gleiche Mappe kopiert:
https://www.herber.de/bbs/user/151481.xlsm
So habe ich mir den Ablauf eigentlich vorgestellt:
1. Datei Planung wird geöffnet, Werte werden eingetragen / funktioniert
2. Bei einem Eintrag in Zelle "E3" im Tabellenblatt Planung (da findet nämlich auf jeden Fall eine Eingabe statt) wird die zweite Datei "Übersicht" geöffnet / funktioniert
3. Mit auslösen des Makros "(Tabelle6) Planung" werden die Werte aus den Zellen "FR2:KZ2" im Tabellenblatt Planung kopiert und in dem Tabellenblatt "Übersicht in
die nächste freie Zeile geschrieben. / funktioniert
4. In der Zelle "FR2" im Tabellenblatt Planung steht die Haupt-Auftragsnummer. Gibt es im Tabellenblatt "Übersicht" schon eine Zeile, in der in Spalte "A" schon diese Nummer vorhanden ist, sollen die Werte überschrieben werden, anstatt eine neue Zeile zu befüllen. / funktioniert nicht
Gruß Andreas
Anzeige
AW: VBA Kopieren einfügen überschreiben
01.03.2022 14:39:49
Yal
Hallo Andreas,
verstehe ich nicht, was ich nicht verstanden haben soll.
(wenn Du schon Aufzählung verwendest, wäre es toll, wenn Du dieselbe wie im Coding verwendest)
1,2,3,4 habe ich überhaupt nicht verändert. Nur dein 5 habe ich zu 6 gemacht, weil ich meinem 5 reingebracht habe.
In diesem 5 wird in der Zieltabelle (bei einer Kopie spricht man von Quelle und Ziel) geprüft, ob der Wert die aus "FL2" gekommen ist, aber jetzt in der erste freie Zelle in Spalte A (also jetzt nicht mehr frei, sondern vom, Wert aus FL2 belegt), nennen wir diese Zelle Ax, irgendwo in der Zieltabelle zwischen A2:A(x-1) schon vorhanden ist, wenn ja (nennen wir die Zelle Ay, dabei ist y zwischen 2 und x-1), dann wird die ganze Zeile von Ax über die ganze Zeile von Ay kopiert (überschreibend) und anschliessend die ganze Zeile von Ax gelöscht (nicht Inhalt gelöscht, sondern Zeile gelöscht).
Also wenn
D;1
E;2
F;3
vorhanden wäre, und es kommt dazu
E;5
F;6
R;7
dann ist das Endergebnis
D;1
E;5
F;3
F;6
R;7
Wenn Du aber meinst, "alle Werte aus den kommenden Daten müssen ggü das Vorhandenen geprüft und bei Gleichheit erstezen statt hizufügen", dann ist es zwar ganz anderes aber schon "a bissele" anders.
Ich gehe davon aus, dass ich auch richtig verstanden, dass es nur von Quelle zu Zilel eine Datenaustausch gibt und keine Rückkopplung. Dein Satz
"4. In der Zelle "FR2" im Tabellenblatt Planung steht die Haupt-Auftragsnummer. Gibt es im Tabellenblatt "Übersicht" schon eine Zeile, in der in Spalte "A" schon diese Nummer vorhanden ist, sollen die Werte überschrieben werden, anstatt eine neue Zeile zu befüllen."
ist für mich uneindeutig.
VG
Yal
Anzeige
AW: VBA Kopieren einfügen überschreiben
04.03.2022 15:52:31
Andreas
Hallo Yal,
Danke für deine Antwort und entschuldige bitte meine späte Rückmeldung, bin die letzten 2 Tage leider ausgefallen - jetzt wieder halbwegs Einsatzbereit.
Hab leider noch nicht so viel Erfahrung mit Programmierungen, entschuldige daher bitte, wenn meine Ausdrucksweise nicht immer ganz korrekt ist.
Hab das ganze mit deinem Code jetzt nochmal probiert, aber irgendetwas mache ich falsch?
Bekomme jetzt eine Fehlermeldung:
Laufzeitfehler 450:
Falsche Anzahl an Argumenten oder ungültige Zuweisung zu einer Eigenschaft
Gelb markiert wird das:
'5.
SuchenErsetzen .Range
Weißt du vielleicht woran das liegen könnte?
Gruß und Dank vorab
Andreas
Anzeige
AW: VBA Kopieren einfügen überschreiben
04.03.2022 15:56:04
Yal
oha, sorry, mein Fehler.
Andere

Private Sub SuchenErsetzen(Quelle As Range)
in

Private Sub SuchenErsetzen(ByVal Quelle As Range)
VG
Yal
AW: VBA Kopieren einfügen überschreiben
04.03.2022 16:41:49
Andreas
Danke für die schnelle Rückmeldung :)
Hab's ausgetauscht, der Fehler kommt leider immer noch. Was ich aber ziemlich merkwürdig finde ist, dass die Werte trotzdem in die Datei übertragen werden.
Er schreibt sie aber immer in eine neue Zeile anstatt sie zu ersetzen, auch wenn die Nummer bereits vorhanden ist.
Der Code sieht aktuell so aus:

'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:\Produktion\Konfektion\Schneideabteilung\Schneidepläne\"
Const DateinamenMuster = " K xxx.xlsm"
Private Sub CommandButton1_Click()
Dim Datei As File
'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. Daten übertragen
'5. Vorhandensein prüfen und ersetzen
'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.
If Worksheets("Planung").Range("AN1").Value = "" Or Not IsNumeric(Worksheets("Planung").Range("AN1").Value) Then
MsgBox "Nummer """ & Worksheets("Planung").Range("AN1").Value & """ ist für diese Datei nicht gültig.", vbExclamation
Exit Sub
End If
'3
DateiPfad = sPfadErledigt & Replace(DateinamenMuster, "xxx", Worksheets("Planung").Range("AN1").Value)
Set Datei = Datei_prüfen(sPfadErledigt & Replace(DateinamenMuster, "xxx", Worksheets("Planung").Range("AN1").Value))
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.
ThisWorkbook.Worksheets("Planung").Range("FR2:KZ2").Copy
With Workbooks("Übersicht.xlsm").Worksheets("Übersicht").Range("A99999").End(xlUp).Offset(1, 0)
.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
'5.
SuchenErsetzen .Range
End With
'6.
ThisWorkbook.SaveAs DateiPfad, xlOpenXMLWorkbookMacroEnabled
'    ThisWorkbook.Close
End Sub
Private Sub SuchenErsetzen(ByVal Quelle As Range)
Dim Erg As Range
Set Erg = Range(Quelle.EntireColumn.Range("A2"), 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
Hast du noch eine Idee, woran das liegen könnte?
Danke vorab und schon mal ein schönes Wochenende
Gruß Andreas
Anzeige
AW: VBA Kopieren einfügen überschreiben
04.03.2022 23:04:34
Yal
Hallo Andreas,
Heilendsack! S'kâ ett war sei!
Ich habe doch 2 Dateien aufgebaut, um es vollständig zu testen.
Ich habe 2 Fehler gefunden:
_ SuchernErsetzen sollte nicht ".Range" übergeben werden, sondern ".Cells"

SuchenErsetzen .Cells
Es übergibt alle Zellen der gegebenen Range. In dem Fall gibt es immer nur eine.
_ In SuchenErsetzen macht die Beschränkung der Suchbereich Problem. Ich habe sie wie folgt umgesetzt (und diesmal vollständig getestet):

Set Erg = Quelle.Worksheet.Range("A2:A" & Quelle.Row - 1).Find(Quelle.Value)
Somit sollte den Skript jetzt fehlerfrei/vollständig laufen.
VG
Yal
Anzeige
AW: VBA Kopieren einfügen überschreiben
04.03.2022 23:31:05
Yal
Hallo Andreas,
ejtz komme ich drauf, dass es eigentlich absurd, etwas reinzukopieren, dann zu testen, ob es schon existiert, um es nochmal an eine andere Stelle zu pasten und was wir als erstes reinkopiert haben wieder zu löschen.
Neue Version: zuerst prüfen, ob vorhanden, dann an der richtige Stelle reinpasten.
Die separate Function "SuchenErsetzen" ist nicht mehr notwendig, dafür ist die Variable "Erg" in der Hauptprocedure.
Dazu auch einen wsPL-Variable, um zu vermeiden, dass man überall Thisworkbook.Worksheets("Planung") mitschleppen muss.

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("A2:A" & .Range("A99999").End(xlUp).Row).Find(wsPL.Range("FR2").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("FR2:KZ2").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
VG
Yal
Anzeige
Soooooooo GUT =D
07.03.2022 12:05:22
Andreas
YAAAAAAAAAAAL,
du Spitze!!!
vielen vielen Dank. Es funktioniert genauso wie ich es mir gewünscht habe =D
Danke für deine Geduld und dein Durchhaltevermögen. Ich weiß, hab's dir nicht leicht gemacht.
Bin dir sehr sehr Dankbar und wünsche dir eine super Woche.
Gruß Andreas

307 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige