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

Zeilenblock löschen und Indirect?? VBA

Zeilenblock löschen und Indirect? VBA
27.11.2013 10:09:24
Alexander
Hallo Leute,
ich habe eine Frage (genauer gesagt 2):
wie schaffe ich es, das in nachfolgendem Code nicht nur eine Zeile (die letzte Beschriebene) sondern ein ganzer Block von 6 Zeilen nach oben mitgelöscht werden (also die Eintragungen und Formatierungen natürlich nur)?
Sub letztenZeilenblocklöschen()
On Error GoTo ErrExit
'finde die letzte Eintragung in Spalte A, lösche die Daten (mit einer Zeile geht das, aber nur   _
_
wenn durchgehend in A etwas steht, hier z.B.: das "h")
'wie schreiben: finde letzte beschriebene Zelle in Spalte A, lösche ab da einen Block von 6  _
Zeilen nach oben? Bis maximal Block 33:38, dann nicht mehr.
'mit Offset hab ich das versucht aber nicht hinbekommen
ActiveSheet.Cells(Cells(Rows.Count, "A").End(xlUp).Row, 18).EntireRow.Clear
ErrExit:
With Err
If .Number  0 Then MsgBox "Fehler: " & "Keine Zeilen zum löschen vorhanden!", _
vbExclamation, "Achtung:"
End With
End Sub

und die 2.ist es möglich mit dem nachfolgenden Code Personaldaten nicht nur stur in alle Monatsblätter zu übertragen, sondern je nach Monatseintrag in "Übersicht E20"= bspw. "August", dann erst ab Monatsblatt August die Daten einzutragen?
Hab schon versucht, mit Indirect das hinzubekommen - aber hoffnungslos... nicht ich.
Sub Datenübertrag_von_Übersicht_in_alle_Monate()
Dim wksÜ As Worksheet
Dim sheet As Worksheet
Set wksÜ = Worksheets("Übersicht")
If MsgBox(Prompt:="Wollen Sie die eingetragenen Personaldaten in alle Monate des  _
Mitarbeiterblattes eintragen?", _
Buttons:=vbYesNo, _
Title:="Alle Personaldaten eingetragen") = vbYes Then
Application.EnableEvents = False
'aktives sheet ist "Übersicht", aus diesem wird der code ausgeführt
'check den monatsnamen der in E20 ("Übersicht") steht,
'schreibe die werte (Bsp.:ÜbersichtE20=August)ab dem monatsblatt August bis letztes monatsblatt  _
_
(Dezember)
For Each sheet In ActiveWorkbook.Worksheets
If sheet.Name  "Übersicht" And sheet.Name  "Fahrzeiten_Januar" And sheet.Name  "  _
_
Fahrzeiten_Februar" Then
With sheet
.Range("a2") = wksÜ.Range("b4")
.Range("e2") = wksÜ.Range("c4")
.Range("a3") = wksÜ.Range("b2")
.Range("j2") = wksÜ.Range("e7")
.Range("l2") = wksÜ.Range("e9")
.Range("q2") = wksÜ.Range("e12")
.Range("r2") = wksÜ.Range("e13")
.Range("s2") = wksÜ.Range("e14")
.Range("t2") = wksÜ.Range("e15")
.Range("u2") = wksÜ.Range("e16")
.Range("v2") = wksÜ.Range("e17")
.Range("w2") = wksÜ.Range("e18")
End With
End If
Next sheet
For Each sheet In ActiveWorkbook.Worksheets
If sheet.Name  "Übersicht" And sheet.Name  "Januar" And sheet.Name  "Februar"  _
Then
With sheet
.Range("c1") = wksÜ.Range("e1")
.Range("c2") = wksÜ.Range("e2")
.Range("c3") = wksÜ.Range("e3")
.Range("c4") = wksÜ.Range("e4")
End With
End If
Next sheet
Else: Exit Sub
End If
If MsgBox(Prompt:="Personaldaten wurden eingetragen!", _
Buttons:=vbOKOnly, _
Title:="Alle Personaldaten wurden eingetragen") = vbOK Then
Application.EnableEvents = True
End If
End Sub

Ich häng noch ne Beispielmappe ran:
https://www.herber.de/bbs/user/88275.xlsm
Danke für jeden Rat und Gruss
Alexander

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

Betreff
Datum
Anwender
Anzeige
zu Frage 1)
27.11.2013 10:15:59
Klaus
Hallo Alexander,
zu Frage 1): das geht mit RESIZE statt mit OFFSET!
ActiveSheet.Cells(Cells(Rows.Count, "A").End(xlUp).Row - 6, 18).Resize(6, 1).EntireRow.Clear
Grüße,
Klaus
noch offen für 2)

AW: zu Frage 1) Rezize... o.k. Danke vorerst
27.11.2013 10:40:07
Alexander
Klaus! wieder was gelernt und das hilft mir sehr...
Danke vielmals
Die Zeile musste ich übrigens noch verändern (Row. - 5 anstelle von - 6) denn die letzte Zeile wurde stehen gelassen aber die sollte mit wech (also ab letzter Zeile (incl) und 5 weitere nach oben löschen).
Mein Fehler.
ActiveSheet.Cells(Cells(Rows.Count, "A").End(xlUp).Row - 5, 18).Resize(6, 1).EntireRow.Clear
Dank und Gruss
Alexander

Anzeige
zu Frage 1 nochmal...
27.11.2013 11:17:19
Alexander
Hallo Klaus,
zum 1. Code hab ich noch die Frage wie wir die Möglichkeit zum Löschen von Zeilenblöcken begrenzen,
nämlich darf der ganze Zirkus nicht über Zeile 33 weiter nach oben gehen.
Weißt du da eine Möglichkeit?
Gruss
Alexander

AW: zu Frage 1 nochmal...
27.11.2013 14:17:48
Klaus
Hallo Alexander,
Weißt du da eine Möglichkeit?
Da müsste es ein einfaches IF davor tun, oder?
Grüße,
Klaus M.vdT.

AW: Zeilenblock löschen und Indirect? VBA
27.11.2013 10:36:18
GuentherH
Hallo Alexander,
erster Teil:
ActiveSheet.range(Cells(Cells(Rows.Count, "A").End(xlUp).Row, 18),Cells(Cells(Rows.Count, "A").End(xlUp).Row-5, 18)).EntireRow.Clear
zweiter Teil:
wenn Du nur Sheets mit gültigen Monatsname und "Übersicht" hast, dann in der Art:

If Sheet.Name  "Übersicht" Then
Minmonat = DateValue("01." & Sheets("Uebersicht").Range("C8") & " 2000")
sheetmonat = DateValue("01." & Sheet.Name & " 2000")
If sheetmonat >= Minmonat Then
...übertragen...
End If
End If

Beste Grüße,
Günther

Anzeige
AW: Zeilenblock löschen und Indirect? VBA
27.11.2013 11:27:40
Alexander
Hallo Günther,
Hervorragend!
Auch deine Version des 1. Teils funzt...
Nur auch an dich (wie auch an Klaus weiter oben), wie begrenze ich die Löschmöglichkeit?
Es darf auf keinen Fall über die Zeile 33 weiter nach oben gelöscht werden.
Der Codeteil für Frage 2 löööft ebenso, sehr gut und danke!!!
Ich habe natürlich nicht nur Blattnamen mit Monatsnamen... aber die nehme ich am Anfang von der Prozedur aus...
nur hab ich noch ein Problem deswegen. Weiter unten im Code spreche ich mit einer ähnlichen Prozedur die dazugehörigen Fahrzeit-Monatsblätter an. Die lauten natürlich alle "Fahrzeiten_Januar" usw..
Kann man die analog obigem auch irgendwie ansprechen und die Daten übertragen.
Ich häng den gesamten Code noch mal her:
Sub Datenübertrag_von_Übersicht_in_alle_Monate()
Dim wksÜ As Worksheet
Dim sheet As Worksheet
Set wksÜ = Worksheets("Übersicht")
If MsgBox(Prompt:="Wollen Sie die eingetragenen Personaldaten in alle Monate des  _
Mitarbeiterblattes eintragen?", _
Buttons:=vbYesNo, _
Title:="Alle Personaldaten eingetragen") = vbYes Then
Application.EnableEvents = False
'aktives sheet ist "Übersicht", aus diesem wird der code ausgeführt
'check den monatsnamen der in E20 ("Übersicht") steht, schreibe die werte (Bsp.:ÜbersichtE20= _
August)ab dem monatsblatt August bis letztes monatsblatt (Dezember)
For Each sheet In ActiveWorkbook.Worksheets
If sheet.Name  "Übersicht" And sheet.Name  "Feiertage" And sheet.Name  "Gesamtü _
bersicht" And sheet.Name  "Fahrzeiten_Januar" And sheet.Name  "Fahrzeiten_Februar" And sheet.Name  "Fahrzeiten_März" And sheet.Name  "Fahrzeiten_April" And sheet.Name  "Fahrzeiten_Mai" And sheet.Name  "Fahrzeiten_Juni" And sheet.Name  "Fahrzeiten_Juli" And sheet.Name  "Fahrzeiten_August" And sheet.Name  "Fahrzeiten_September" And sheet.Name  "Fahrzeiten_Oktober" And sheet.Name  "Fahrzeiten_November" And sheet.Name  "Fahrzeiten_Dezember" Then
Minmonat = DateValue("01." & Sheets("Übersicht").Range("E20") & " 2013")
sheetmonat = DateValue("01." & sheet.Name & " 2013")
If sheetmonat >= Minmonat Then
'...übertragen...
With sheet
.Range("a2") = wksÜ.Range("b4")
.Range("e2") = wksÜ.Range("c4")
.Range("a3") = wksÜ.Range("b2")
.Range("j2") = wksÜ.Range("e7")
.Range("l2") = wksÜ.Range("e9")
.Range("q2") = wksÜ.Range("e12")
.Range("r2") = wksÜ.Range("e13")
.Range("s2") = wksÜ.Range("e14")
.Range("t2") = wksÜ.Range("e15")
.Range("u2") = wksÜ.Range("e16")
.Range("v2") = wksÜ.Range("e17")
.Range("w2") = wksÜ.Range("e18")
End With
End If
End If
Next sheet
For Each sheet In ActiveWorkbook.Worksheets
If sheet.Name  "Übersicht" And sheet.Name  "Feiertage" And sheet.Name  "Gesamtü _
bersicht" And sheet.Name  "Januar" And sheet.Name  "Februar" And sheet.Name  "März" And sheet.Name  "April" And sheet.Name  "Mai" And sheet.Name  "Juni" And sheet.Name  "Juli" And sheet.Name  "August" And sheet.Name  "September" And sheet.Name  "Oktober" And sheet.Name  "November" And sheet.Name  "Dezember" Then
With sheet
.Range("c1") = wksÜ.Range("e1")
.Range("c2") = wksÜ.Range("e2")
.Range("c3") = wksÜ.Range("e3")
.Range("c4") = wksÜ.Range("e4")
End With
End If
Next sheet
Else: Exit Sub
End If
If MsgBox(Prompt:="Personaldaten wurden eingetragen!", _
Buttons:=vbOKOnly, _
Title:="Alle Personaldaten wurden eingetragen") = vbOK Then
Application.EnableEvents = True
End If
End Sub

Danke und Gruss
Alexander

Anzeige
AW: Zeilenblock löschen und Indirect? VBA
27.11.2013 11:45:33
GuentherH
Hallo Alexander,
mit der Funktion Mid(Test,12,len(Test)) erhältst Du das was rechts von "fahrzeiten_" steht.
Kommt natürlich immer leichter zu Fehlern wegen ungeeigneten Blattnamen :-(
Um die "mindestens Zeile 33" abufangen:

LetztZeile=ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row
if LetztZeile 
Gruß,
Günther

AW: Zeilenblock löschen und Indirect? VBA
27.11.2013 12:43:18
Alexander
Hi Günther,
Danke für die sehr hilfreichen Hinweise! Es klappt.
Sag mal, kannst du mir die 18 in diesem Codeteil erklären?
Ich hatte den teil aus einer anderen Datei und hab umgeschrieben...
hab mit der 18 herumprobiert (Verändert in 15, 20, ect.) und hatte keine merkliche
Änderung. Ich kann mich auch nicht mehr errinnern wofür das stand.
Außer die 0 konnte ich alles setzen, ohne dass der Code etwas anderes bewirkt hätte.
Keine Ahnung!
ActiveSheet.range(Cells(letzteZeile, 18),Cells(letzteZeile-5, 18)).EntireRow.Clear
Gruß
Alexander

Anzeige
AW: Zeilenblock löschen und Indirect? VBA
27.11.2013 13:27:50
GuentherH
Hallo Alexander,
Cells(Reihe,Spalte);
mit EntireRow wird dann auf alle Spalten erweitert, dehalb hier keine Wirkung, solange es eine gültige Spaltennummer.
Beste Grüße,
Günther

Ahh, verstehe! Danke Günther, alles erledigt
27.11.2013 13:40:35
Alexander
.

317 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige