Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1324to1328
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 nach Überschriften suchen, kopieren & löschen

VBA nach Überschriften suchen, kopieren & löschen
22.08.2013 13:36:47
Sandra
Hallo zusammen,
ich brauche mal Eure Hilfe.
Aus einem Forum habe ich unten stehenden Code, den ich auch schon etwas an meine Bedürfnisse anpassen konnte. Leider komme ich jetzt nicht mehr weiter.
Ich habe eine Datei "Mangelgesamtliste". Wenn ich das Makro ausführe soll folgendes passieren:
Wenn in Spalte A ein "ja" steht, dann soll die Zeile kopiert, in meine Liste "Vorlage Zustandsbeschreibung" eingefügt und danach gelöscht werden.
Das funktioniert auch schon super. Aber:
Die Zeile darf nicht 1 zu 1 kopiert werden - auch nicht mit der Formatierung. Und die Datei in der die Zeile eingefügt wird darf nicht immer überschrieben werden.
Also traumhaft wäre es, wenn die Datei "Vorlage Zustandsbeschreibung geöffnet wird und nach dem Einfügen der Zeile(n) automatisch mit Namen (Datum von heute YY.MM.DD BV Mangelliste) unter einem festen Pfad gespeichert wird und wenn es den Namen schon gibt einfach eine laufende Nummer hinten dran.
Dazu muss beim Kopieren folgendes passieren:
In der Tabelle in der das Makro steht sind in Zeile 2 Überschriften, diese müssen mit der Zeile 284 in der Datei Vorlage Erfassungsliste übereinstimmen. Also wenn es in beiden Tabellen die Spalte "Gewerk" gibt, dann soll der Inhalt aus der Zelle übertragen werden. Von Gewerk zu Gewerk.
Dazu hatte ich auch mal einen Code - aber in einem anderen Zusammenhang und ich weiß nicht wie ich den mit dem unten stehenden zusammenbringen kann.
Hier mal ein Teil des Codes:
Sub Maengelliste_TEST()
Dim oXlSM As Workbook, oXML As Workbook
Dim nIndexXLSM, nIndexXML, MaxRow As Long, nIndex As Long
Dim rngXLSM As Range, rngXML As Range, ArrayXLSM
Dim strFehler As String
Dim ArrayQuelle, ArrayZiel
Const sListZeichen$ = "• "
'hier stehen die Überschriften, nach denen gesucht wird
'Wichtig! Die Reihenfolge muss bei beiden identisch sein
ArrayQuelle = Array("Betrifft", "verortete Zustandsbeschreibung", "Mangelart", "Vertragsart", "  _
_
Gewerkegruppe", "Gewerk", "Level A", "Level B", "Level C", "Level D", "Raum", "Achse", "Foto", " _
Frist", "Nachfrist", "letzte Nachfrist", "Auftragnehmer", "funktional", "Vorbereitung der Abnahme", "sicherheits-relevant", "Restleistung", "optisch", "Anspruch unsicher")
ArrayZiel = Array("betrifft", "Zustandsbeschreibung", "Mangelart", "Vertragsart", " _
Gewerkegruppe", "Gewerk", "Level A", "Level B", "Level C", "Level D", "Raum", "Achse", "Foto", " _
Frist", "Nachfrist", "letzte Nachfrist", "Auftragnehmer", "funktional", "Vorbereitung der Abnahme", "sicherheits-relevant", "Restleistung", "optisch", "Anspruch unsicher")
'hier wird festgelegt welche Datei geöffnet werden soll und wo diese gespeichert ist
Set oXML = Workbooks.Open(Filename:= _
"\\c\0000 Intern\0000 Mangeltool\Muster\VORLAGE Zustandsbeschreibung.xml")
Set oXlSM = ThisWorkbook 'ThisWorkbook = die xlsm-Datei, in der dieser Code steht

Hier der Code, von dem ich glaube, dass er eine gute Grundlage zur Weiterbearbeitung ist.
Option Explicit
Sub copyAndDelete()
Dim objWbMaster As Workbook, objWbArchiv As Workbook
Dim objShSrc As Worksheet, objShTgt As Worksheet
Dim rng As Range, rngCopy As Range
Dim strFileArchiv As String, strFirst As String, strMsg As String
Dim lngNext As Long
Dim blnOpen As Boolean
On Error GoTo ErrExit
strFileArchiv = "\\C:\0000 Intern\0000 Mangeltool\Muster\VORLAGE Zustandsbeschreibung.xml" '  _
_
Pfad und Name der Uploaddatei Anpassen!
Set objWbMaster = ThisWorkbook
Set objShSrc = objWbMaster.Sheets("Mängel vor der Abnahme") 'Tabellenname in 'Gesamtliste  _
anpassen' - Anpassen!
Set rng = objShSrc.Range("A:A").Find(What:="ja", LookAt:=xlWhole, _
LookIn:=xlValues, MatchCase:=False, After:=objShSrc.Range("A" & Rows.Count))
If Not rng Is Nothing Then
strFirst = rng.Address
Do
If rngCopy Is Nothing Then
Set rngCopy = rng.EntireRow
Else
Set rngCopy = Union(rngCopy, rng.EntireRow)
End If
Set rng = objShSrc.Range("A:A").FindNext(rng)
Loop While Not rng Is Nothing And strFirst  rng.Address
End If
If Not rngCopy Is Nothing Then
For Each objWbArchiv In Application.Workbooks
If objWbArchiv.FullName = strFileArchiv Then Exit For
Next
If objWbArchiv Is Nothing Then
Set objWbArchiv = Workbooks.Open(strFileArchiv)
blnOpen = True
End If
Set objShTgt = objWbArchiv.Sheets("neue Zustandsbeschreibungen") 'Tabellenname in ' _
Uploaddatei' - Anpassen!
With objShTgt
lngNext = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
rngCopy.Copy .Cells(lngNext, 1)
End With
If blnOpen Then
objWbArchiv.Close True
Else
objWbArchiv.Save
End If
strMsg = rngCopy.Rows.Count
rngCopy.Delete
objWbMaster.Save
MsgBox "Es wurden " & strMsg & " Datensätze übertragen!", vbInformation, "Hinweis"
Else
MsgBox "Es wurden keine Datensätze gefunden!", vbInformation, "Hinweis"
End If
ErrExit:
If Err.Number > 0 Then
MsgBox "Fehlernummer:" & vbTab & Err.Number & vbLf & vbLf & _
"Fehlertext:" & vbTab & Err.Description, vbExclamation, "Fehler"
End If
With Application
.ScreenUpdating = True
.EnableEvents = True
End With
Set objShSrc = Nothing
Set objShTgt = Nothing
Set objWbMaster = Nothing
Set objWbArchiv = Nothing
Set rng = Nothing
Set rngCopy = Nothing
End Sub

Meint Ihr, Ihr könntet mir helfen?
Vielen lieben Dank & Sonnige Grüße
Sandra

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA nach Überschriften suchen, kopieren & löschen
23.08.2013 15:11:37
fcs
Hallo Sandra,
um dir besser helfen und das Ergebnis testen zu können wären 2 Beispiel Dateien mit ggf. anonymisierten hilfreich
1. Datei mit Tabelle, die die auszuwertenden/übertragenden Daten enthält. Die Tabelle muss nur ca. 10 Zeilen Testdaten enthalten.
2. Vorlagedatei mit Spaltentiteln in Zeile 284 in die die Trefferdaten übertragen werden sollen.
Packe beide Dateien in eine ZIP-Datei und lade sie hier hoch.
Gruß
Franz

AW: VBA nach Überschriften suchen, kopieren & löschen
24.08.2013 00:01:16
fcs
Hallo Sandra,
ich hab jetzt mal auf Basis einer früheren Problemlösung dein Makro angepasst, so dass die Werte Zellenweise in die jeweils korrespondierende Spalte übertragen werden.
Ich hab allerdings keine bis wenig Erfahrung im Umgang mit XML-Dateien.
Ich hab das Makro mit einer normalen Arbeitsmappe als Vorlage getestet.
Namen von Pfaden, Dateien und Tabellenblättern muss du natürlich noch anpassen.
Gruß
Franz
Textdatei mit Makro:
https://www.herber.de/bbs/user/87004.txt

Anzeige
AW: VBA nach Überschriften suchen, kopieren & löschen
26.08.2013 15:24:06
Sandra
Hallo Franz,
ich habe die Anpassungen vorgenommen, aber irgendwie klappt es nicht. Zum einen wird die Vorlagedatei überspeichert - nicht mit neuem Namen woaders gespeichert. Die Formatierung wird mit übernommen und das Einfügen an den erforderlichen Stellen funkttioniert auch nicht.
Dazu kommt das Problem, das es bei der Erfassungsdatei eine Spalte gibt, die in der Vorlagedatei anders heißt. Die Reihenfolge der Spalten ist auch unterschiedich. Kann man das vielleicht mit dem Codeteil den ich gepostet hatte hinbekommen?
Hier jetzt erst einmal die Testdateien. Dier die Vorlagedatei:
https://www.herber.de/bbs/user/87032.zip
Und hier die Erfassungsdatei:
https://www.herber.de/bbs/user/87033.zip
Ich hoffe Du kannst was damit anfangen.
Hier noch eine Zusammenstellung, welcher Text wo hin muss.
(von Erfassung zu Vorlage)
A - enfällt (nicht kopieren)
B - enfällt (nicht kopieren)
C - enfällt (nicht kopieren)
D - B
E - enfällt (nicht kopieren)
F - D
G - E
H - F
I - enfällt (nicht kopieren)
J - G
K - H
L - I
M - J
N - K
O - L
P - M
Q - N
R - O
S - P
T - R
U - S
V - enfällt (nicht kopieren)
W - T
X - U
Y - V
Z - W
AA - X
AB - Y
AC - C
Könnte man ggf. auch eine Prüfung einbauen? Ich hatte mal diese hier für eine ähnliche Datei, könnte man diese wieder mit einbinden?:
'hier erfolgt die Prüfung nach ggf. vergessenen Zellen
Dim zeile As Long, spalte As Long
Dim i As Integer
Dim strausgabe As String, strzelle As String, x As String
Dim wks As Worksheet
Dim check As Boolean
Set wks = Sheets(1)
Dim spalten()
Dim spaltennamen()
Dim spaltenausgabe()
x = ""
spalten() = Array(4, 5, 6, 7, 8, 9, 15, 19)
spaltennamen() = Array("In der Spalte Mangelart (D)", "In der Spalte Vertragsart (E)", "In der  _
Spalte Gewerkegruppe(F)", "In der Spalte Gewerk (G)", "In der Spalte Level A (J)", "In der Spalte Level B (K)", "In der Spalte Frist (O)", "In der Spalte Auftragnehmer (S)")
spaltenausgabe() = Array(x, x, x, x, x, x, x, x)
For i = 0 To UBound(spalten())
spaltenausgabe(i) = spaltennamen(i) & " in den Zeilen: "
Next i
With wks
For zeile = 285 To 1000
If .Cells(zeile, 2).Value  "" Then
For i = 0 To UBound(spalten())
On Error GoTo schleife
If Cells(zeile, spalten(i)).Value = 0 Then
schleife:
spaltenausgabe(i) = spaltenausgabe(i) & vbCrLf & zeile & ",  " & vbCrLf
check = True
End If
Next i
End If
Next zeile
End With
If check = True Then
For i = 0 To UBound(spalten())
strausgabe = strausgabe & spaltenausgabe(i) & vbCrLf
Next i
MsgBox "Fehlerhaft ausgefüllte Zellen: " & vbCrLf & vbCrLf & _
strausgabe
Exit Sub
Else
MsgBox "Es konnten keine leeren Zellen in den Spalten Mangelart (D), Vertragsart (E),  _
Gewerkegruppe (F), Gewerk (G), Frist (O) und Auftragnehmer (S) gefunden werden!"
End If
Vielen Dank für Deine Hilfe!
Grüße
Sandra

Anzeige
AW: VBA nach Überschriften suchen, kopieren & löschen
26.08.2013 15:27:01
Sandra
Hallo Franz, ich noch einmal!
Glatt hätte ich es vergessen ... ich bekam Außerdem noch eine Fehlermeldung:
Fehler 52 Dateiname oder -nummer falsch.
So, nun aber...
Sonnige Grüße
Sandra

AW: VBA nach Überschriften suchen, kopieren & löschen
27.08.2013 02:24:49
fcs
Hallo Sandra,
ich kann die von dir beobachteten Probleme nicht nachvollziehen.
Ich hab die Verzeichnisse für Vorlage Datei und die erstellte Datei an meine Testverzeichnisse angepasst und dannach das Makro gestartet.
Bis auf die Spalte "Zustandsbeschreibung", die in deiner Test.xlsm im Spaltentitel ein zusätzliches Leerzeichen am Ende hat wurden alle Zeilen korrekt Übertragen.
Es werden keine Formate kopiert und die Ergebnisdatei wird korrekt unter dem neuen Namen gespeichert.
Ich hab keine Ahnung, was da bei dir schiefläuft. Auch die Fehlermeldung zur Datei taucht bei mir nicht auf.
Ich hab jetzt die Spaltenzuordnung im Code jetzt fest vorgegeben, damit die umbenannte Spalte korrekt übertragen wird. Das Testmakro hab ich in modifizierter Form eingebaut. Werden leere Zellen in Gesamtliste gefunden, dann werden die Daten nicht kopiert.
Gruß
Franz
In der ZIP-Datei findest du deine Testdatei mit dem modifizierten Makro nach Ausführung des Makros "Test_Copy_and_Delete" und die xml-Datei mit den kopierten Daten.
https://www.herber.de/bbs/user/87041.zip

Anzeige
funktioniert, aber eine Kleinigkeit habe ich verge
27.08.2013 12:01:15
Sandra
Hallo Franz,
Du bist ein Held! Keine Ahnung was ich falsch ahtte, aber jetzt läuft es!!! Ich habe nur leider eine Kleinigkeit vergessen... *schäm*
Das Makro muss vorm löschen erst einmal den Blattschutz aufheben.... Kannst Du mir das vielleicht noch ergänzend sagen? Ansonsten bin ich wunschlos glücklich! :) P. s. Es ist natürlich Kennwortgeschützt. Als Test-Kennwort habe ich jetzt einfach "TEST" genommen.
Ich weiß es geht irgendwie hiermit:
Sub YesProtect()
Dim wks As Worksheet
For Each wks In Worksheets
wks.Protect "TEST"
Next wks
End Sub
Sub NoProtect()
Dim wks As Worksheet
For Each wks In Worksheets
wks.Unprotect "TEST"
Next wks
End Sub
Aber wie kann ich das in das bestehende Makro einarbeiten?
1.000 Dank!!!
Gruß
Sandra

Anzeige
AW: funktioniert, aber eine Kleinigkeit habe ich verge
27.08.2013 14:03:43
fcs
Hallo Sandra,
so ist das halt mit den Kleinigkeiten. Sie halten einen auf Trab.
Passe den Abschnitt in dem die Zeilen gelöscht und die Mappe gespeichert wird wie folgt an.
Fall der Autofilter auch bei geschütztem Blatt funktionieren soll, dann musst du die passenden Einstellungen mal mit dem Makrorecorder aufzeichnen.
Gruß
Franz
    objShSrc.Unprotect Password:="TEST"
rngCopy.Delete
objShSrc.Protect Password:="TEST"
objWbMaster.Save

SUPER!!! DAAAAAAAANKEEEEEE!!!!
28.08.2013 11:13:50
Sandra
:)

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige