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

suche n. letz. ausgefüllte Zeile; autom. Speichern

suche n. letz. ausgefüllte Zeile; autom. Speichern
24.09.2013 17:19:39
Sandra
Hallo zusammen,
ich habe schon oft Hilfe von Euch bekommen und ich glaube ganz fest daran, dass mein heutiges Problem für Euch ein Klacks ist.
Unten angefügt findet Ihr den Code. Diesen habe ich soweit schon für meine neuen Bedürfnisse ganz gut anpassen können. Nun aber meine Änderungswünsche:
Im Moment wird nach dem Öffnen der Vorlagedatei immer direkt in Zeile 3 eingefügt. In Zukunft muss allerdings die letzte ausgefüllte Zeile gesucht und darunter eingefügt werden. Allerdings sind die Zeilen die nicht verwendet werden nicht ganz leer. Es müsste in einer bestimmten Spalte gesucht werden. Z. B. In Spalte G. Also suche die erste leere Zeile in der G leer ist.
Als zweites muss das automatische Speichern geändert werden. Damit eine Liste fortgeführt werden kann, muss das Makro immer auf die gleiche Datei zurückgreifen. Und zwar immer auf: "_Gesamtliste zur Mangelerfassung.xlsm". Deshalb muss nach dem Übertrag diese Datei "überspeichert" werden. Zeitgleich sollte eine Sicherungskopie abgespeichert werden. Diese dann mit aktuellem Datum.
Und eine Sache wäre noch gut. Die Message-Box, die ausgibt, dass die Daten jetzt kopiert werden. Diese Meldung kommt, auch wenn danach eine Fehlermeldung wegen fehlender Einträge auftaucht. Das irritiert meine Kollegen.
Meint Ihr, ihr könnt mir hierbei helfen?
Wenn ihr noch einmal Musterdateien braucht, sagt bescheid. Aber ich hoffe es geht so.

Option Explicit
Sub prc_Testen_Copy_and_Delete2()
If fncTesten = True Then
Call prcCopyAndDelete
Else
'do nothing, es gibt Zellen mit fehlenden Werten
End If
End Sub
Sub Password()
Dim strInput As String
strInput = InputBox("Zum Übertragen der Mängel in die Gesamtliste geben Sie bitte das  _
entsprechende Passwort ein.", "Passwort")
If strInput = "" Then Exit Sub
If strInput = "0123+++" Then
Call prcCopyAndDelete2
Else
MsgBox "Dieses Passwort ist falsch!", vbExclamation, "Fehler"
End If
End Sub
Private Sub prcCopyAndDelete2()
Dim objWbMaster As Workbook, objWbArchiv As Workbook
Dim objShSrc As Worksheet, objShTgt As Worksheet
Dim rng As Range, rngCopy As Range
Dim strPfad As String, strFileArchiv As String, strFirst As String, strMsg As String
Dim lngNext As Long, lngZeileTgt As Long
Dim varTest As Variant
Dim arrSpalten() As Long
Dim arrSpaltenSource
Dim arrSpaltenTarget
On Error GoTo ErrExit
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
'Pfad und Name der Vorlagedatei                                          ggf. anpassen!
strFileArchiv = "\0000 Intern\0200 Doku\0274 Mangeltool\Erfassung\_
Gesamtliste zur Mangelerfassung.xlsm"
'Verzeichnis für erstellte Datei                                        - ggf. Anpassen
strPfad = "\0000 Intern\0200 Doku\0274 Mangeltool\Erfassung"
Set objWbMaster = ThisWorkbook '=Datei mit Gesamtliste
'Tabellenname in Gesamtliste                                       - Name ggf anpassen!
Set objShSrc = objWbMaster.Sheets("Mängel vor der Abnahme")
'Prüfen ob Vorlage-Datei geöffnet
For Each objWbArchiv In Application.Workbooks
If LCase(objWbArchiv.FullName) = LCase(strFileArchiv) Then Exit For
Next
If objWbArchiv Is Nothing Then
Set objWbArchiv = Workbooks.Open(strFileArchiv, ReadOnly:=True)
Else
MsgBox "Die Vorlagedatei ist geöffnet. Bitte die Datei schließen und das Makro neu starten! _
_
", , _
"Makro: copyAndDelete"
GoTo ErrExit
End If
'Ziel-Tabellenname in Vorlagedatei'                                   - ggf. Anpassen!
Set objShTgt = objWbArchiv.Sheets("Mängel vor der Abnahme")
'Spaltentitel-Zuordnungen
'Spalten im Blatt "Mängel vor der Abnahme" - in Erfassungsliste
arrSpaltenSource = Array("AF", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P" _
_
, "Q", "R", "S", "T", _
"U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE")
'zugeordnete Spalten im Blatt "Mängel vor der Abnahme" - in Gesamtliste
arrSpaltenTarget = Array("C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", _
_
"Q", "R", "S", "T", _
"U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE")
'Nummern der Spalten in ein Array einlesen
ReDim arrSpalten(0 To UBound(arrSpaltenSource), 1 To 2)
For lngNext = LBound(arrSpaltenSource) To UBound(arrSpaltenSource)
arrSpalten(lngNext, 1) = objShSrc.Range(arrSpaltenSource(lngNext) & "1").Column
arrSpalten(lngNext, 2) = objShSrc.Range(arrSpaltenTarget(lngNext) & "1").Column
Next
Erase arrSpaltenSource, arrSpaltenTarget
lngZeileTgt = 2
'"nein, Übernahme in Gesamtliste" in Spalte A suchen
Set rng = objShSrc.Range("A:A").Find(What:="nein, Übernahme in Gesamtliste", LookAt:=xlWhole,  _
_
_
LookIn:=xlValues, MatchCase:=False, After:=objShSrc.Range("A" & Rows.Count))
If Not rng Is Nothing Then
strFirst = rng.Address
Do
lngZeileTgt = lngZeileTgt + 1
strMsg = CStr(Val(strMsg) + 1) 'nein, Übernahme in Gesamtliste-Zeilen mitzählen
'Werte in Zeile übertragen
For lngNext = 0 To UBound(arrSpalten, 1)
With objShTgt
.Cells(lngZeileTgt, arrSpalten(lngNext, 2)).Value = _
objShSrc.Cells(rng.Row, arrSpalten(lngNext, 1)).Value
End With
Next
'Zeile(n) merken für späteres löschen
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
'neuen Dateinamen ermitteln
strFileArchiv = strPfad & "\" & Format(Date, "YYMMDD") & " Gesamtliste zur Mängelerfassung." _
_
'Prüfen, ob Datei schon vorhanden
varTest = Left(strFileArchiv, Len(strFileArchiv) - 1)
lngNext = 0
Do Until Dir(strFileArchiv & "*") = ""
lngNext = lngNext + 1
strFileArchiv = varTest & Format(lngNext, "00") & "."
Loop
strFileArchiv = Left(strFileArchiv, Len(strFileArchiv) - 1)
objWbArchiv.SaveAs Filename:=strFileArchiv, FileFormat:=objWbArchiv.FileFormat
objShSrc.Unprotect Password:="01234++"
rngCopy.Delete
objShSrc.Protect Password:="01234++"
objWbMaster.Save
MsgBox "Es wurden " & strMsg & " Datensätze übertragen!", vbInformation, "Hinweis"
Else
objWbArchiv.Close savechanges:=False
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
Erase arrSpalten
End Sub
'hier erfolgt die Prüfung nach ggf. vergessenen Zellen
Function fncTesten() As Boolean
Dim zeile As Long
Dim i As Integer
Dim strausgabe As String
Dim wks As Worksheet
Dim check As Boolean
Dim spaltenA1()
Dim spalten()
Dim spaltennamen()
Dim spaltenausgabe()
Set wks = ActiveWorkbook.Worksheets("Mängel vor der Abnahme")
'Prüfen, ob Autofilter gesetz
With wks
If .AutoFilterMode = True Then
If .FilterMode = True Then .ShowAllData
End If
End With
'im Blatt "Mängel vor der Abnahme" zu überprüfende Spalten, ob Zelle ausgefüllt
spaltenA1() = Array("C", "F", "G", "H", "I", "J", "L", "M", "N", "T", "W")
ReDim spalten(LBound(spaltenA1) To UBound(spaltenA1))
ReDim spaltennamen(LBound(spaltenA1) To UBound(spaltenA1))
ReDim spaltenausgabe(LBound(spaltenA1) To UBound(spaltenA1))
For i = 0 To UBound(spaltenA1)
spalten(i) = wks.Range(spaltenA1(i) & "1").Column 'Nummern der zu überprüfenden Spalten
spaltennamen(i) = "In der Spalte " & wks.Cells(2, spalten(i)).Text & " (" & spaltenA1(i) & " _
_
)"
Next
With wks
'Prüfen, ob in Zeilen mit "nein, Übernahme in Gesamtliste" in Spalte A alle zu prüfenden   _
_
Spalten ausgefüllt sind
For zeile = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
If LCase(.Cells(zeile, 1).Value) = "nein, Übernahme in Gesamtliste" Then
'zu prüfende Spalten abarbeiten
For i = 0 To UBound(spalten())
'Prüfen, ob leer oder = ""
If IsEmpty(Cells(zeile, spalten(i))) Or Cells(zeile, spalten(i)).Value = ""   _
_
Then
If spaltenausgabe(i) = "" Then
spaltenausgabe(i) = "    " & zeile
Else
spaltenausgabe(i) = spaltenausgabe(i) & ",   " & zeile
End If
check = True
End If
Next i
End If
Next zeile
End With
If check = True Then
'Ausgabetext für Meldung zusammenstellen
strausgabe = "Geprüfte Spalten:" & vbLf
For i = 0 To UBound(spaltenA1)
If i = UBound(spaltenA1) Then
strausgabe = strausgabe & "und (" & spaltenA1(i) & ")" & vbLf & vbLf & _
"Fehlerhaft ausgefüllte Zellen: " & vbLf & vbLf
Else
strausgabe = strausgabe & "(" & spaltenA1(i) & "), "
End If
Next
'Spalten mit fehlern anfügen
For i = 0 To UBound(spalten())
If spaltenausgabe(i)  "" Then
spaltenausgabe(i) = spaltennamen(i) & " in den Zeilen: " & vbLf & spaltenausgabe(i)
strausgabe = strausgabe & spaltenausgabe(i) & vbCrLf
End If
Next i
MsgBox strausgabe & vbLf & vbLf & "Daten werden jetzt kopiert", _
vbOKOnly, "Prüfen ""nein, Übernahme in Gesamtliste""-Zeilen"
fncTesten = False
Else
'Ausgabetext für Meldung zusammenstellen
strausgabe = "Es konnten keine leeren Zellen in den Spalten "
For i = 0 To UBound(spaltenA1)
If i = UBound(spaltenA1) Then
strausgabe = strausgabe & "und " & wks.Cells(2, spalten(i)).Text & " (" & spaltenA1(i)   _
_
_
& ") gefunden werden!"
Else
strausgabe = strausgabe & wks.Cells(2, spalten(i)).Text & " (" & spaltenA1(i) & "), "
End If
Next
MsgBox strausgabe & vbLf & vbLf & "Daten werden jetzt kopiert", _
vbQuestion + vbOKOnly, "Prüfen ""nein, Übernahme in Gesamtliste""-Zeilen"
fncTesten = True
End If
End Function

Vielen lieben Dank!
Viele Grüße
Sandra

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

Betreff
Datum
Anwender
Anzeige
AW: suche n. letz. ausgefüllte Zeile; autom. Speichern
25.09.2013 07:34:59
fcs
Hallo Sandra,
ich hab jetzt mal versucht ohne Testmöglichkeit deine Makros anzupassen,
Die geänderten Passagen hab ich markiert.
Textdatei mit Makros:
https://www.herber.de/bbs/user/87401.txt
Gruß
Franz

klappt, aber Prüfung funktioniert nicht (mehr)
25.09.2013 08:13:14
Sandra
Guten Morgen Franz,
ich wusste auf Euch ist Verlass!
Deine Änderungen funktionieren prima. Ich hoffe nur, dass die Kollegen nicht noch Änderungswünsche haben.
Was aber nicht oder nicht mehr funktioniert ist die prüfung nach vergessenen Einträgen.
Der entsprechende Teil im Code:
'hier erfolgt die Prüfung nach ggf. vergessenen Zellen
Function fncTesten() As Boolean
Dim zeile As Long
Dim i As Integer
Dim strausgabe As String
Dim wks As Worksheet
Dim check As Boolean
Dim spaltenA1()
Dim spalten()
Dim spaltennamen()
Dim spaltenausgabe()
Set wks = ActiveWorkbook.Worksheets("Mängel vor der Abnahme")
'Prüfen, ob Autofilter gesetz
With wks
If .AutoFilterMode = True Then
If .FilterMode = True Then .ShowAllData
End If
End With
'im Blatt "Mängel vor der Abnahme" zu überprüfende Spalten, ob Zelle ausgefüllt
spaltenA1() = Array("C", "F", "G", "H", "I", "J", "L", "M", "N", "T", "W")
ReDim spalten(LBound(spaltenA1) To UBound(spaltenA1))
ReDim spaltennamen(LBound(spaltenA1) To UBound(spaltenA1))
ReDim spaltenausgabe(LBound(spaltenA1) To UBound(spaltenA1))
For i = 0 To UBound(spaltenA1)
spalten(i) = wks.Range(spaltenA1(i) & "1").Column 'Nummern der zu überprüfenden Spalten
spaltennamen(i) = "In der Spalte " & wks.Cells(2, spalten(i)).Text _
& " (" & spaltenA1(i) & ")"
Next
With wks
'Prüfen, ob in Zeilen mit "nein, Übernahme in Gesamtliste" in Spalte A alle _
zu prüfenden Spalten ausgefüllt sind
For zeile = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
If LCase(.Cells(zeile, 1).value) = "nein, Übernahme in Gesamtliste" Then
'zu prüfende Spalten abarbeiten
For i = 0 To UBound(spalten())
'Prüfen, ob leer oder = ""
If IsEmpty(Cells(zeile, spalten(i))) _
Or Cells(zeile, spalten(i)).value = "" Then
If spaltenausgabe(i) = "" Then
spaltenausgabe(i) = "    " & zeile
Else
spaltenausgabe(i) = spaltenausgabe(i) & ",   " & zeile
End If
check = True
End If
Next i
End If
Next zeile
End With
Im Ursprungscode hatte es funktioniert. Nun weiß ich nicht ob es an meiner Anpassung lag oder vielleicht an der Änderung die ich von Euch erbeten habe.
Könntest Du da bitte noch einmal drüber schauen?
In diesem teil hate ich nur eine Überarbeitung. Wa jetzt "nein, Übernahme in Gesamtliste" war vorher "ja". Mehr habe ich nicht gemacht. Und mit "ja Wäre Super wenn Du dafür auch eine Lösung hast.
Danke & Viele Grüße
Sandra

Anzeige
Pfad für Archivdatei vorgeben
25.09.2013 08:17:25
Sandra
Hallo Franz,
eine Frage noch...
Können wir einen Pfad festlegen, wo die Archivdatei abgelegt wird? Wenn die da landet wo auch die Erfassungslisten liegen .... dann bekomme ich bestimmt Ärger. Denn es werden sehr sehr viele Listen werden. Alleine diese Liste, wofür dieser Code ist, gibt es in 9 verschiedenen Varianten.
DANKE!!!
Gruß
Sandra

Pfad ist erledigt, Prüfung leere Zellen nicht
25.09.2013 11:22:03
Sandra
Hallo Franz,
wer lesen kann .... ich habe den Pfad ja selbst vorgegeben... *schäm*
...habe es geändert. :)
Gruß Sandra
P. s. Aber die Prüfung der Zellen ist noch offen.

Speichern funktioniert nicht
25.09.2013 11:30:57
Sandra
Hllo Franz,
ich schon wieder ...
Wenn ich das Makro ausführe bekomme ich die Meldung, dass es diese Datei schon gibt und ob ich diese Überschreiben will. Soweit so gut. Ich drücke "ja", Makro läuft zu Ende. Wenn ich dann in den Pfad gucke ist die Datei nicht mit neuem Stand da, sondern mit altem Stand. Die Archivdatei funktioniert einwandfrei.
Was ist das Problem?
Gruß
Sandra

Anzeige
Speichern funktioniert nicht - Abbruch = Fehler
25.09.2013 11:45:02
Sandra
Hallo Franz,
bei "abbrechen" oder "nein" passiert das:
Userbild
Wenn ich das so lasse wird demnächst mein Telefon heißlaufen. :(
Es wäre gut, wenn das Überschreiben ohne Rückmeldung funktioniert. Oder, wenn man Excel nicht überlisten kann, dass die Makroausführung abgrbrochen wird, mit einer Msg-Box in der ich die Begründung eintragen kann. Wenn man nicht überschreiben will, dann wird nix geöffnet, kopiert und/oder gelöscht. Es passiert einfach nichts. Es kommt die Msg-Box und da kann man dann noch einmal entscheiden, ob man nun doch überschreiben will oder ob man alles abbrechen will.
Du kannst das doch bestimmt?
Ich höre jetzt lieber auf bis ich was von Dir gehört habe - sonst schreibe ich und schreibe ich und Du weißt nachher gar nicht mehr was Du zuerst angucken sollst.
Gruß
Sandra

Anzeige
AW: Speichern funktioniert nicht - Abbruch = Fehler
25.09.2013 14:25:06
fcs
Hallo Sandra,
es ist schwierig zu beurteilen, wo man jetzt ggf. anpassen muss.
an der Testfunktion hab ich nur den Meldungstext angepasst, für den Fall das leere Zellen vorhanden sind.
Welches Makro wird denn gestartet, wenn ein Anwender die Datei öffnet?
Nach der Eingabe des korrekten Passworts wird zur Zeit das Makro prcCopyAndDelete2 gestartet.
  If strInput = "0123+++" Then
Call prcCopyAndDelete2

evtl. musst du hier das Makro prc_Testen_Copy_and_Delete2 starten.
Meldung beim Speichern:
Es kann sein, dass die Zieldatei schreibgeschützt geöffnet wird, wenn ein anderer Anwender sie geöffnet hat. Deshalb sollte die Zieldatei ggf. sofort nach dem Kopieren der Einträge wieder geschlossen werden.geschlossen werden.
Ich hab noch eine entsprechende Prüfung eingebaut, so dass das Makro nach entsprechender Meldung abgebrochen wird.
Das Speichern der Archivdatei erfolgt dann ohne Rückfragen und die Datei wird nach dem Speichern sofort wieder geschlossen.
https://www.herber.de/bbs/user/87408.txt
Gruß
Franz

Anzeige
funktioniert
25.09.2013 17:03:59
Sandra
Hallo Franz,
Dein Tip war Gold wert. Es lag wirklich daran.
Nach der Eingabe des korrekten Passworts wird zur Zeit das Makro prcCopyAndDelete2 gestartet.
If strInput = "0123+++" Then
Call prcCopyAndDelete2
evtl. musst du hier das Makro prc_Testen_Copy_and_Delete2 starten.
Was das Speichern angeht .... das passierte hier: C:\Program Files (x86)\Microsoft Office\Office14
ich weiß nur nicht warum?! Im Code war doch eigentlich ein Pfad vorgegeben?!
Mit Deiner Überarbeitung funktioniert es jetzt aber. :)
Ich glaube vorerst war es das - bis ich das Ergebnis vorstellen muss ... Also, vielleicht melde ich mich demnächst noch einmal.
Gruß und
DAAAAAAAANKEEEEEEEEEEEEEEE
Sandra
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige