Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1884to1888
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

VBA Kopieren und als Wert einfügen

VBA Kopieren und als Wert einfügen
02.06.2022 12:07:45
Markus
Hallo zusammen,
ich bin noch ein ziemlicher VBA Anfänger und versuche mich mit dem Makro recordingtool voranzubringen.
Ich habe mir hierzu schonmal rat aus dem Forum geholt, und das Archivforum zu diesem Thema ist unter dem folgenden Link: https://www.herber.de/forum/messages/1869289.html
Mir fehlen nun noch die folgenden Schritte bevor die Datei gespeichert wird:
1. In der Registerkarte: Budgetplan 2023 sollen die Spalten L bis N kopiert und an der gleichen Stelle als Werte wieder eingefügt werden, damit die Formeln dahinter verschwinden.
2. In der Registerkarte: Stundensätze 2023 sollen die Spalten B bis P und die Spalten S bis T kopiert und an der gleichen Stelle wieder als Wert eingefügt werden.
3. Da für jeden Kunden eine Datei gespeichert wird, muss die Datei nach dem Speichern in den Ursprungszustand. Die oberen Schritte müssten also wieder Rückgängig gemacht werden.
Ich habe meine Schritte in dem VBA "Code" entsprechend Beschrieben:
----------------------------------------------------
Option Explicit

Sub sbKdListe()
Dim lloRow As Long, lshUE As Worksheet, lshST As Worksheet, lshDB As Worksheet, lshKUSP As Worksheet, lrgCells As Range, lstrPath As String
lstrPath = ThisWorkbook.Path
Set lshUE = Sheets("Budgetplan 2023")
Set lshST = Sheets("Stundensätze 2023")
Set lshDB = Sheets("1. MDS-Daten_gesamt")
Set lshKUSP = Sheets("2. MDS-Daten_SVerweis")
With Sheets("Kundenliste")
'alle Einträge in Spalte A in Tabelle "Kundenliste" werden durchlaufen
For lloRow = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
'erster gefundener Eintrag (danach alle Folgenden) wird in Zelle C3 in Tabelle "Budgetplan 2023" eingetragen
.Range("A" & lloRow).Copy lshUE.Range("C1")
.Range("A" & lloRow).Copy lshST.Range("C1")
'in Tabelle "1. MDS-Daten_gesamt" wird der Autofilter aktiviert und es wird jeweils nach gefundenem Eintrag gefiltert
lshDB.Range("$A$1:$AA$" & lshDB.Cells(lshDB.Rows.Count, 1).End(xlUp).Row).AutoFilter Field:=3, Criteria1:=lshUE.Range("C1")
'wenn in Tabelle "2. MDS-Daten_SVerweis" (alte/vorherige) Dateneinträge vorhanden...
If lshKUSP.Cells(lshKUSP.Rows.Count, 1).End(xlUp).Row >= 3 Then
'...werden diese gelöscht
lshKUSP.Range("A3:AA" & lshKUSP.Cells(lshKUSP.Rows.Count, 1).End(xlUp).Row).Value = ""
End If
'die Tabelle "1. MDS-Daten_gesamt" wird durchlaufen
For Each lrgCells In lshDB.Range("A3:AA" & lshDB.Cells(lshDB.Rows.Count, 1).End(xlUp).Row).Rows
'nur die sichtbaren Zeilen in Tabelle "Datenbank" werden kopiert...
If lrgCells.RowHeight > 0 Then
'...und in Tabelle "2. MDS-Daten_SVerweis" untereinander eingefügt
lshDB.Range("A" & lrgCells.Row & ":AA" & lrgCells.Row).Copy lshKUSP.Range("A" & lshKUSP.Cells(lshKUSP.Rows.Count, 1).End(xlUp).Row + 1)
End If
Next
'nach Einfügen aller gefilterten Datenzeilen wird die Datei als Kopie mit dem Dateinamen "Budgetplanung_KUNDENNAME_Datum.xlsm" gespeichert; anstelle von KUNDENNAME steht der jeweilige Kundenname aus Zelle A1 in Tabelle "Budgetplan 2023"
ThisWorkbook.SaveCopyAs lstrPath & "\Budgetplanung_" & lshUE.Range("C1") & "_" & Date & ".xlsm"
Next
End With
'aufräumen: die Hauptdatei wird wieder in den Ursprungszustand zurückgesetzt
'in Zelle A3 in Tabelle "Busgetplan 2023" steht wieder der Platzhalter "Kundenname"
lshUE.Range("C1").Value = "Kundenname"
lshST.Range("C1").Value = "Kundenname"
'in Tabelle "1. MDS-Daten_gesamt" wird der Autofilter deaktiviert
lshDB.Rows.AutoFilter
'in Tabelle "2. MDS-Daten_SVerweis" werden alle Datenzeilen gelöscht, sodass nur die Überschriftenzeile erhalten bleibt
If lshKUSP.Cells(lshKUSP.Rows.Count, 1).End(xlUp).Row >= 2 Then
lshKUSP.Range("A2:AA" & lshKUSP.Cells(lshKUSP.Rows.Count, 1).End(xlUp).Row).Value = ""
End If
Set lshUE = Nothing
Set lshST = Nothing
Set lshDB = Nothing
Set lshKUSP = Nothing
End Sub
Mit Sicherheit gibt es hierzu noch weitere Fragen. Gerne jederzeit Bescheid geben.
Vielen Dank und viele Grüße,
Markus
P.S.: natürlich hätte ich auch gleich die Datei hochgeladen, aber das funktioniert mit dem Makro leider nicht. Falls es hierfür einen Workaround gibt, gerne Bescheid geben.

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Kopieren und als Wert einfügen
02.06.2022 15:30:31
Rudi
Hallo,
du solltest die Änderungen in einer Kopie der Datei vornehmen. Dann musst du nichts rückgängig machen.
Schema:

Sub aaaaa()
Dim wkbKundenDatei As Workbook, strKundenDatei As String, strPath As String
Dim KundenNummer
Dim lloRow As Long
Dim lshUE As Worksheet, lshST As Worksheet, lshDB As Worksheet, lshKUSP As Worksheet
Dim lrgCells As Range, lstrPath As String
lstrPath = ThisWorkbook.Path
'Kopie speichern und öffnen
KundenNummer = "12345"
strPath = ThisWorkbook.Path & "\KundenDateien\"
strKundenDatei = strPath & KundenNummer
ThisWorkbook.SaveCopyAs strKundenDatei
strKundenDatei = Dir(strKundenDatei & "*", vbNormal)  'Namen inkl. Endung ermitteln
Set wkbKundenDatei = Workbooks.Open(strPath & strKundenDatei)  'Kopie öffnen
With wkbKundenDatei
Set lshUE = .Sheets("Budgetplan 2023")
Set lshST = .Sheets("Stundensätze 2023")
Set lshDB = .Sheets("1. MDS-Daten_gesamt")
Set lshKUSP = .Sheets("2. MDS-Daten_SVerweis")
'    etc,
'    dein weiterer Code
End With
End Sub
Gruß
Rudi
Anzeige
AW: VBA Kopieren und als Wert einfügen
02.06.2022 16:19:08
Markus
Da für jeden Kunden eine eigene Datei abgespeichert wird, muss dieser aber doch Rückgängig gemacht werden. Außerdem sehe ich in deinem Code nicht, wo die Spalten ausgewählt, kopiert und als Wert eingefügt werden?
Dein Code sagt lediglich, dass die Datei abgespeichert werden soll? Das ist in meinem doch schon drin :)
AW: VBA Kopieren und als Wert einfügen
02.06.2022 16:40:13
Rudi

Das ist in meinem doch schon drin
du sollst die Kopie speichern bevor du die Änderungen machst und die Änderungen in der Kopie machen. Dann musst du nichts rückgängig machen.
Die Formeln kannst du z.B. mit

lshUE.Range("B:P").Copy
lshUE.Range("B:P").PasteSpecial xlPasteValues
eliminieren.
Anzeige
AW: VBA Kopieren und als Wert einfügen
02.06.2022 22:21:53
Yal
Hallo Markus,
Rudi hat recht: Du hast eine Datei "abc.xlsm". Davon speicherst Du eine Kopie als "123.xlsm", wovon eine Kopie als "456", usw.
Die Datei "abc.xlsm" ist dann weiterhin absolut unberührt. Es gibt nichts, was abgebaut werden soll.
Anderes Thema: warum filtern, um dann die Zellehöhe zu prüfen? Warum nicht die Werte selbst prüfen (ohne zu filtern)?
Wenn dann musst Du auf sichtbare Zellen beschränken:

    For Each Z In Range(Range("A2"), Range("A99999").End(xlUp)).SpecialCells(xlCellTypeVisible)
Debug.Print Z.Address, Z.Value, Z.Resize(1, 27).Address 'Beispiel-Code
Next
Ohne Filter könnte es so aussehen:
(achte auf einem sauberen Einrücken. Das A&O für Profi als auch Anfänger)

Sub sbKdListe()
Dim lshUE As Worksheet, lshST As Worksheet, lshDB As Worksheet, lshKUSP As Worksheet
Dim Kd As Range  'Zelle für Kundenname
Dim Dat As Range ' Zelle für Datensätze. Nur Zelle in Spalte A, mit Resize wird daraus den A1:AA1 der jeweilige Zeile erzeugt.
lstrPath = ThisWorkbook.Path
Set lshUE = Sheets("Budgetplan 2023")
Set lshST = Sheets("Stundensätze 2023")
Set lshDB = Sheets("1. MDS-Daten_gesamt")
Set lshKUSP = Sheets("2. MDS-Daten_SVerweis")
'Budgetplan 2023 sollen die Spalten L bis N als Wert fixiert werden
lshUE.Range("L:N") = lshUE.Range("L:N").Value
'Stundensätze 2023 sollen die Spalten B bis P und die Spalten S bis T als Wert fixiert werden
lshST.Range("B:P") = lshST.Range("B:P").Value
lshST.Range("S:T") = lshST.Range("B:P").Value
With Sheets("Kundenliste")
'alle Einträge in Spalte A in Tabelle "Kundenliste" werden durchlaufen
For Each Kd In Range(.Range("A2"), .Cells(.Rows.Count, 1).End(xlUp)).Cells
'erster gefundener Eintrag (danach alle Folgenden) wird in Zelle C3 in Tabelle "Budgetplan 2023" eingetragen
Kd.Copy lshUE.Range("C1")
Kd.Copy lshST.Range("C1")
'wenn in Tabelle "2. MDS-Daten_SVerweis" (alte/vorherige) Dateneinträge vorhanden...
With Sheets("2. MDS-Daten_SVerweis").Range("A999999").End(xlUp) 'es sei denn, Du hast mehr als 1 Mio Datensätze... in xl2019 Rows.Count = 1048576.
If .Row >= 3 Then Range(Parent.Range("AA3"), .Cells(1)).ClearContents '.Cells(1), weil With ist bereit die Zelle selbst, aber es muss was nach dem Punkt geben
End With
'die Tabelle "1. MDS-Daten_gesamt" wird durchlaufen
For Each Dat In Range(lshDB.Range("A3"), lshDB.Cells(lshDB.Rows.Count, 1).End(xlUp)).Cells
If Dat.Text = Kd.Text Then Dat.Resize(1, 27).Copy lshKUSP.Range("A999999").End(xlUp).Offset(1, 0) '...und in Tabelle "2. MDS-Daten_SVerweis" untereinander eingefügt
Next
'nach Einfügen aller gefilterten Datenzeilen wird die Datei als Kopie mit dem Dateinamen "Budgetplanung_KUNDENNAME_Datum.xlsm" gespeichert; anstelle von KUNDENNAME steht der jeweilige Kundenname aus Zelle A1 in Tabelle "Budgetplan 2023"
ThisWorkbook.SaveCopyAs lstrPath & "\Budgetplanung_" & Kd.Text & "_" & Date & ".xlsm"
Next
End With
ThisWorkbook.Saved = True
ThisWorkbook.Close False
End Sub
VG
Yal
Anzeige

336 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige