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

copy & past

copy & past
22.09.2020 11:26:32
Tom
Hallo Zusammen,
ich würde Eure Unterstützung benötigen. Die Code holt sich alle Werte aus einer Tabelle, wenn die Zeilen in der Spalte B NICHT leer sind und wenn in der Spalte Y noch kein Datum gesetzt wurde. Nachträgliche Änderungen können erneut abgefragt und unten angehängt werden.
Ich würde folgende Änderung benötigen.
- es soll nicht die komplette Tabelle in meine Auswerttabelle übertragen werden, sondern nur die Spalten A bis L, mit Berücksichtigung der oben beschriebenen Parameter.
-Sobald ich eine Auswertung erstellt habe, speichere ich unter der Angebotsnummer ab. Eine weitere Auswertung mit der selben Datei ist nicht möglich, da der Dateiname umbenannt wurde und mit dem im Code hinterlegten Namen "Auswertung.xlsx" nicht mehr übereinstimmt.
Bei Fragen gerne melden und Danke schon einmal.
Gruß Tom
Hier der Code.

Option Explicit
Sub prcCopy_to_Auswertung()
'übertragung bestimmter Zeilen aus Protokoll in Auswertung
Dim wkbP As Workbook, wksProtokoll As Worksheet
Dim objListP As ListObject, objListA As ListObject
Dim wkbAusw As Workbook, wksAusw As Worksheet, strPfadAusw As String, strDateiAusw As  _
String
Dim i As Integer, strTitel As String
Dim zeiP As Long
Dim rngCopy As Range, rngA As Range
Dim varLfdNr As Variant, varID
Const bolUeberschreiben As Boolean = True 'Wenn False, dann werden beim Aktualisieren schon  _
_
_
vorhandene Einträge nicht überschrieben
strPfadAusw = "\\mndemucfs004\Virtuelle_Auftragsbearbeitung_Bus-Gate\AAP-Stadtbus\ _
04_Bewertung\"     'Verzeichnis mit der Auswertungs-Datei  'anpassen!!
strDateiAusw = "Auswertung.xlsx"          'Name der Auswertungs-Datei - ggf. anpassen!!
'Offene Arbeitsmappe mit Blatt "Protokoll" suchen
For Each wkbP In Application.Workbooks
If fncCheckSheetName(wkbP, "Protokoll") = True Then
Set wksProtokoll = wkbP.Worksheets("Protokoll")
Exit For
End If
Next
If wkbP Is Nothing Then
MsgBox " Die Datei mit dem Blatt ""Protokoll"" ist nicht geöffnet!", vbOKOnly, "Daten in   _
_
_
Auswertung übertragen"
Exit Sub
End If
'Prüfen, ob die Auswertungsdatei vorhanden ist
If Dir(strPfadAusw & strDateiAusw)  "" Then
'Prüfen, ob Auswertungsdatei göffnet
For Each wkbAusw In Application.Workbooks
If LCase(wkbAusw.Name) = LCase(strDateiAusw) Then Exit For
Next
If wkbAusw Is Nothing Then
'Auswertungsdatei öffnen
Set wkbAusw = Application.Workbooks.Open(strDateiAusw)
End If
Set wksAusw = wkbAusw.Worksheets(1)
Set objListA = wksAusw.ListObjects(1)
wkbAusw.Activate
Application.ScreenUpdating = False
'Tabellen/ListObjects im Blatt "Protokoll" abarbeiten
For i = 1 To wksProtokoll.ListObjects.Count
Set objListP = wksProtokoll.ListObjects(i)
With objListP
With .DataBodyRange
For zeiP = 1 To .Rows.Count
'Prüfen, ob Spalte B (BV-Version) mit Inhalt und Spalte Y (Datum Antwort) leer
If .Cells(zeiP, 2)  "" And .Cells(zeiP, 25) = "" Then
varLfdNr = .Cells(zeiP, 1).Value
varID = "LO" & Format(i, "00") & "|" & Format(varLfdNr, "000")
Set rngCopy = .Rows(zeiP)
With objListA
If .ListRows.Count = 0 Then 'Listobject hat nur eine Titelzeile und eine  _
Datenzeile ohne Daten
.Range.Cells(2, 1) = varID
rngCopy.Copy
.Range.Cells(2, 2).PasteSpecial
.ListRows.Add
Else
With .DataBodyRange
'ID in Spalte A suchen
Set rngA = .Columns(1).Find(varID, LookIn:=xlValues, lookat:=xlWhole)
If rngA Is Nothing Then 'neuer Eintrag
rngCopy.Copy
.Cells(.Rows.Count, 2).PasteSpecial Paste:=xlPasteValues
.Cells(.Rows.Count, 1).Value = varID
objListA.ListRows.Add
Else  'Eintrag schon vorhanden
If bolUeberschreiben = True Then
rngCopy.Copy
rngA.Offset(0, 1).PasteSpecial Paste:=xlPasteValues
End If
End If
End With '.DataBodyRange
End If
End With 'objListA
End If
Next zeiP
End With
End With 'objListP
Next i
Application.CutCopyMode = False
objListA.DataBodyRange.EntireRow.AutoFit
Application.ScreenUpdating = True
Else
MsgBox "Datei " & vbLf & strDateiAusw & vbLf & "nicht gefunden!", _
vbOKOnly, "Daten in Auswertung übertragen"
End If
End Sub
Public Function fncCheckSheetName(wkb As Workbook, strSheetName As String) As Boolean
Dim objSheet As Object
On Error GoTo Fehler
Set objSheet = wkb.Sheets(strSheetName)
fncCheckSheetName = True
Fehler:
End Function

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: copy & past
26.09.2020 05:11:07
fcs
Hallo Tom,
ersetze
                  Set rngCopy = .Rows(zeiP)

durch
                  Set rngCopy = .Range(.Cells(zeiP, 1), .Cells(zeiP, 12))
LG
Franz
AW: copy & past
26.09.2020 10:52:11
Tom
Hallo Franz,
dank Dir für Deine erneute Änderung.
Wie würde sich das mit dem Namen lösen lassen?
LG Tom
AW: copy & past
26.09.2020 11:56:03
Tom
Hallo Franz,
dank Dir für Deine erneute Änderung.
Wie würde sich das mit dem Namen lösen lassen?
LG Tom
AW: copy & past
26.09.2020 14:38:49
Tom
Hallo Franz,
dank Dir für Deine erneute Änderung.
Wie würde sich das mit dem Namen lösen lassen?
LG Tom
Anzeige
AW: copy & past
26.09.2020 16:49:04
Tom
Hallo Franz,
dank Dir für Deine erneute Änderung.
Wie würde sich das mit dem Namen lösen lassen?
LG Tom
AW: copy & past
26.09.2020 18:42:15
Tom
Hallo Franz,
dank Dir für Deine erneute Änderung.
Wie würde sich das mit dem Namen lösen lassen?
LG Tom
AW: copy & past
26.09.2020 18:53:36
Tom
Hallo Franz,
dank Dir für Deine erneute Änderung.
Wie würde sich das mit dem Namen lösen lassen?
LG Tom
AW: copy & past
28.09.2020 10:11:48
fcs
Hallo Tom,
der einfachste Weg ist ein Dateiauswahl-Dialog zur Auswahl der Angebotsdatei und diese dann schreibgeschützt? zu öffnen.
Falls es immer die zuletzt gespeicherte Angebotsdatei sein soll, dann macht es Sinn, das Speichern unter der Angebotsnummer per Makro zu steuern und dabei den gewählten Dateinamen in der Datei mit dem Kopiermakro zu speichern. Das Kopiermakro müsste dann eine Anweisung bekommen, den in einer Zelle gespeicherten Dateinamen auszulesen und dann die entsprechende Datei zu öffnen - am besten schreibgeschützt.
LG
Franz
Option Explicit
Sub prcCopy_to_Auswertung()
'übertragung bestimmter Zeilen aus Protokoll in Auswertung
Dim wkbP As Workbook, wksProtokoll As Worksheet
Dim objListP As ListObject, objListA As ListObject
Dim wkbAusw As Workbook, wksAusw As Worksheet
Dim strPfadAusw As String, strDateiAusw As String
Dim i As Integer, strTitel As String
Dim zeiP As Long
Dim rngCopy As Range, rngA As Range
Dim varLfdNr As Variant, varID
Const bolUeberschreiben As Boolean = True 'Wenn False, dann werden beim _
Aktualisieren schon vorhandene Einträge nicht überschrieben
'Startverzeichnis für Auswahl der Auswertungs-Datei  - anpassen!!
strPfadAusw = _
"\\mndemucfs004\Virtuelle_Auftragsbearbeitung_Bus-Gate\AAP-Stadtbus\04_Bewertung\"
'Offene Arbeitsmappe mit Blatt "Protokoll" suchen
For Each wkbP In Application.Workbooks
If fncCheckSheetName(wkbP, "Protokoll") = True Then
Set wksProtokoll = wkbP.Worksheets("Protokoll")
Exit For
End If
Next
If wkbP Is Nothing Then
MsgBox " Die Datei mit dem Blatt ""Protokoll"" ist nicht geöffnet!", vbOKOnly, _
"Daten in Auswertung übertragen"
Exit Sub
End If
'Auswertungsdatei auswählen
With Application.FileDialog(msoFileDialogOpen)
.Title = "Bitte die Auswertungsdatei/letzte Angebotsdatei auswählen!"
.InitialFileName = strPfadAusw & "\"
.AllowMultiSelect = False
If .Show = -1 Then
strDateiAusw = .SelectedItems(1)
Else
Exit Sub
End If
End With
'Auswertungsdatei/Angebotsdatei schreibgeschützt öffnen
Set wkbAusw = Application.Workbooks.Open(strDateiAusw, ReadOnly:=True)
Set wksAusw = wkbAusw.Worksheets(1)
Set objListA = wksAusw.ListObjects(1)
wkbAusw.Activate
Application.ScreenUpdating = False
'Tabellen/ListObjects im Blatt "Protokoll" abarbeiten
For i = 1 To wksProtokoll.ListObjects.Count
Set objListP = wksProtokoll.ListObjects(i)
With objListP
With .DataBodyRange
For zeiP = 1 To .Rows.Count
'Prüfen, ob Spalte B (BV-Version) mit Inhalt und Spalte Y (Datum Antwort) leer
If .Cells(zeiP, 2)  "" And .Cells(zeiP, 25) = "" Then
varLfdNr = .Cells(zeiP, 1).Value
varID = "LO" & Format(i, "00") & "|" & Format(varLfdNr, "000")
'zu kopierenden Bereich (APlaten A bis L) setzen
Set rngCopy = .Range(.Cells(zeiP, 1), .Cells(zeiP, 12))
With objListA
If .ListRows.Count = 0 Then 'Listobject hat nur eine Titelzeile und eine _
Datenzeile ohne Daten
.Range.Cells(2, 1) = varID
rngCopy.Copy
.Range.Cells(2, 2).PasteSpecial
.ListRows.Add
Else
With .DataBodyRange
'ID in Spalte A suchen
Set rngA = .Columns(1).Find(varID, LookIn:=xlValues, lookat:=xlWhole)
If rngA Is Nothing Then 'neuer Eintrag
rngCopy.Copy
.Cells(.Rows.Count, 2).PasteSpecial Paste:=xlPasteValues
.Cells(.Rows.Count, 1).Value = varID
objListA.ListRows.Add
Else  'Eintrag schon vorhanden
If bolUeberschreiben = True Then
rngCopy.Copy
rngA.Offset(0, 1).PasteSpecial Paste:=xlPasteValues
End If
End If
End With '.DataBodyRange
End If
End With 'objListA
End If
Next zeiP
End With
End With 'objListP
Next i
Application.CutCopyMode = False
objListA.DataBodyRange.EntireRow.AutoFit
Application.ScreenUpdating = True
End Sub
Public Function fncCheckSheetName(wkb As Workbook, strSheetName As String) As Boolean
Dim objSheet As Object
On Error GoTo Fehler
Set objSheet = wkb.Sheets(strSheetName)
fncCheckSheetName = True
Fehler:
End Function

Anzeige
AW: copy & past
28.09.2020 13:56:44
Tom
Hallo Franz,
ich habe jetzt versucht den Code auszuführen und es kommt die Meldung "Index außerhalb des gültigen Bereichs"!?
Den Bereich des Codes würde ich jetzt mal herausnehmen, weil ich sonst jedes Mal eine Datei öffnen muss, die das Tabellenblatt "Protokoll" enthält.
    'Startverzeichnis für Auswahl der Auswertungs-Datei  - anpassen!!
strPfadAusw = _
"\\mndemucfs004\Virtuelle_Auftragsbearbeitung_Bus-Gate\AAP-Stadtbus\04_Bewertung\"
'Offene Arbeitsmappe mit Blatt "Protokoll" suchen
For Each wkbP In Application.Workbooks
If fncCheckSheetName(wkbP, "Protokoll") = True Then
Set wksProtokoll = wkbP.Worksheets("Protokoll")
Exit For
End If
Next
If wkbP Is Nothing Then
MsgBox " Die Datei mit dem Blatt ""Protokoll"" ist nicht geöffnet!", vbOKOnly, _
"Daten in Auswertung übertragen"
Exit Sub
End If

LG Tom
Anzeige
AW: copy & past
28.09.2020 14:51:55
fcs
Hallo Tom,
Den Bereich des Codes würde ich jetzt mal herausnehmen, weil ich sonst jedes Mal eine Datei öffnen muss, die das Tabellenblatt "Protokoll" enthält.
Das wird nicht funktionieren, dann in diesem Abschnitt werden die Mappe und das Tabellenblatt gesetzt, in dem die Daten stehen, die durchsucht und ggf. kopiert werden sollen.
Der Variablen wksProtokoll muss zwingend das Tabellenblatt mit den zu kopierenden Daten zugewiesen werden.
Falls dies das aktive Tabellenblatt ist, dann kannst du den Code, den du löschen wolltest ersetzen durch:
       set wkbP  = ActiveWorkbook
Set wksProtokoll = ActiveSheet
LG
Franz
Anzeige
AW: copy & past
28.09.2020 15:06:53
Tom
Hallo Franz,
stimmt....so siehts besser aus. Danke
Weshalb kommt jetzt der Fehler "Index außerhalb des gültigen Bereichs"?
LG Tom
AW: copy & past
28.09.2020 23:59:04
fcs
Hallo Tom,
ich hab jetzt keine Kristallkugel, die mir da weiterhilft.
In beiden Tabellenblättern
a) Tabellenblatt in dem die zu durchsuchenden/kopierenden Daten stehen
b) Tabellenblatt in das die Daten kopiert werden
müssen die Daten jeweils in einem als Tabelle definierten Zellbereich stehen.
So war es jedenfalls in den Dateien, die ursprünglich mal für die aufbereitet hatte.
LG
Franz
AW: copy & past
30.09.2020 16:24:35
Tom
Hallo Franz,
daran hat sich auch nichts geändert.
Die Einschränkung dass nur bis zur Spalte 12 abgerufen werden soll, löst den Index Fehler aus..
LG Tom
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige