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

Zeile löschen durch entfernen

Zeile löschen durch entfernen
15.01.2020 08:53:20
Andre
Hallo zusammen,
nach tagelangen rumtüfteln bin ich ein wenig verzweifelt und versuche über das Schwarmwissen dieses Forums eine Lösung zu erhalten.
Ich stehe vor folgender Herausforderung:
Ich habe im Tabellenreiter A in Spalte B Namen untereinander stehen. Nun soll, möglichst über das Betätigen der Entfernen Taste auf einem Namen, die ganze Zeile in welcher der Name steht gelöscht werden. Dies soll auch in den Tabellenreitern B und C erfolgen. Wobei sich die Zeilenlöschung auf die gleiche Zeile bezieht.
Also ich möchte den Namen in B17 löschen. Durch Betätigen der Entf. Taste wird die Zeile 17 in den Tabellenblättern A, B und C gelöscht.
Wenn das erfolgt ist, soll in diesen Blättern eine Leerzeile am jeweiligen Tabellenende hinzugefügt werden und die Formeln in allen Tabellenblättern aus Zeile 2 bis zum Tabellenende herunterkopiert werden da es diese durch die Zeilenlöschung zerstört hat. (in meiner Beispiel Datei habe ich jetzt keine Formeln hinterlegt).
Ich habe meinen vorhandenen Code in die Beispieldatei kopiert. Ich hoffe ihr könnt mir einen Hinweis geben wie ich diesen anpassen muss um die Kriterien erfüllen zu können.
Danke schon im voraus und einen schönen Tag ;-)
https://www.herber.de/bbs/user/134406.xlsm
Grüße Andre

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Mehrere Anfängerprobleme
15.01.2020 09:05:49
lupo1
1. ENTF ist reserviert für Inhaltslöschung, nicht Tabellen-Strukturveränderung. Dafür richte man sich ein VBA-Sub mit einem Shortcut wie z.B. Strg-E ein.
2. Gleiche Daten hält man nicht auf mehreren Tabellen vor. Du hast mit 16384 genug Spalten, dies auf einem Blatt zu tun.
3. Das mit Deiner Formelhampelei würde man eher wie folgt lösen, statt umständlich hinten anzuhängen:
Angenommen, die Tabelle geht bis Zeile 100 und Du möchtest Zeile 7 löschen. Die Zeile 101 ist frei von Daten, enthält jedoch Formeln und Formate.
Jetzt kopierst Du (bzw. Dein o.g. Strg-E) einfach 8:101 auf die Zeile 7 und alles ist in einem Rutsch erledigt. Auch die Formeln sind schon da.
Anzeige
AW: Mehrere Anfängerprobleme
15.01.2020 09:49:39
Andre
Danke für deine Antwort lupo1!
1. Ich möchte ja eine bestimmte Zeile löschen welche ausgewählt werden soll. Wie ist dies über ein Shortcut möglich? Oder meinst du in der gewünschten Zelle den Shortcut betätigen um den Befehl auszulösen? Dann wüsste ich nicht wie ich dies umsetze das der Code weiß welche Zeile er löschen soll.
2. Die Beispieldatei ist natürlich extrem vereinfacht. Die Daten in den verschiedenen Blättern ist ein Urlaubskalender, eine Schicht Einsatzplanung und eine Hilfstabelle zur Berechnung verschiedener Zwischendaten. Aus diesem Grund auf drei Tabellenblätter aufgeteilt.
3. Der Vorschlag lässt sich leider nicht umsetzen da ich unter der Tabelle noch Daten habe welche dort bleiben müssen. Die Tabelle erstreckt sich also auf die Zeilen 4 - 36 und dort soll sie auch bleiben.
Trotzdem danke für die Denkanstöße.
Die Umsetzung ist ja in VBA ohne Probleme möglich meine Kenntnisse stoßen leider nur ständig an Grenzen.....
Anzeige
Das ist keine Argumentation
15.01.2020 10:00:30
lupo1
1. Ob Du nun ENTF oder Strg-E verwendest: In der zu löschenden Zeile musst Du Dich befinden, wenn Du nicht umständlich in einem Dialog eine Zeilennummer eingeben möchtest.
2. Ich habe Deine Datei nicht geöffnet, weil mir ausreichte, dass Du in verschiedenen Blättern die gleiche Zeile löschen möchtest. Ein (konzeptionelles) No-Go.
3. Du kannst auch die Zeilen 8:1001 auf die Zeilen 7:1000 kopieren ... und viele Zeilen am Ende wären dabei leer. Nur dürfen dann keine Zeilensummen enthalten sein ... oder nur sehr ausgefeilt.
Sollte richtig heißen: Spaltensummen
15.01.2020 10:05:12
lupo1
AW: Zeile löschen durch entfernen
15.01.2020 09:46:26
Stefan
Hallo Andre,
1. also ich stimme lupo zu, das mit dem ENTF funktioniert nicht.
2. Das mit dem Daten trennen habe ich auch nicht ganz verstanden, übersichtlicher und einfacher zu verwalten wäre es, wenn du alles in einem Tabellenblatt hättest, aber funktionieren tut es so auch
ich hab es jetzt mal gelöst, evtl. passt es ja so, zur Erklärung:
Es wird zuerst gesucht, was die aktuell letzte Zeile ist, in der was drinne steht
Dann wird gesucht, welche Zeile mit dem Namen in A1 übereinstimmt, diese wird dann gelöscht, die Zeile 4 kopiert und dann unten eingefügt.
Dass passiert nacheinander auf allen drei Tabellenblättern
Ich hab den Start des Makro mit einem Button gelöst, du kannst aber gerne einen Shortcut drauß machen.
https://www.herber.de/bbs/user/134407.xlsm
Gruß Stefan
Anzeige
AW: Zeile löschen durch entfernen
15.01.2020 11:11:02
Andre
Hallo Stefan,
danke für Deinen Lösungsvorschlag. Die Logik ist mal richtig elegant!!!!
Mein Entf. Vorschlag war eine Krücke da ich mir nicht anders zu helfen wusste. Es hat halt auch mehr schlecht als recht funktioniert. Aber so wie du es gelöst hast ist es natürlich besser....
Hinweis für eventuelle Nutzer: Im Code fehlt bei der Variablen Namenlöschen das n. Nach ergänzen läuft das Makro ohne Probleme in der Beispieldatei.
Leider gibt der Code, wenn ich Ihn in die Originalexcel übernehme, den Inhalt A1 nicht aus. Im Lokalfenster des VBA Editors gibt er als Wert leer zurück obwohl die Zelle befüllt ist. Das macht mich fertig. Ich habe lediglich den Code kopiert und das Sheet "A" umbenannt....
Alles in einem Tabellenblatt wäre für den Code definitive einfacher aber da die Urlaubsplanung allein knapp 380 Spalten hat, möchte ich nicht dahinter oder davor noch eine Schichtplanung hängen. Vor allem weil es komplett verschiedene Tabellen sind in denen täglich gearbeitet wird. Da ist der Wechsel des Reiters einfacher als vor und zurück zu scrollen....
Anzeige
AW: Zeile löschen durch entfernen
15.01.2020 11:26:47
Stefan
Hallo Andre,
danke erstmal für die Rückmeldung, das mit der Variable find ich komisch, du hast zwar recht, aber der Code hat bei mir auch mit fehlendem "n" funktioniert... naja.
Was ist denn der Unterschied zwischen Originaldatei und Bsp.Datei?
Versuch mal nicht den von dir gegebenen Namen (In der BSp.Datei wäre es "A") einzusetzten, sondern den Excel Original-Namen (Tabelle1)
Die Originaldatei kannst du uns nicht zufällig zur Verfügung stellen?
Gruß
Stefan
Aber Achtung!!
15.01.2020 11:41:52
Stefan
wenn du das machst, darfst dus aber nicht so schreiben:
Sheets("Tabelle1").Range("A1").Value

sondern so:
Tabelle1.Range("A1").Value

gruß
Stefan
Anzeige
AW: Aber Achtung!!
15.01.2020 12:16:49
Andre
Hallo Stefan,
die Auswahl findet er jetzt aber es läuft dennoch nicht. Da ich nicht mehr weiter weiß, lade ich dir hier mal das Original, gekürzt um kritische Daten, rein.
Die Datei wirkt im ersten Moment sicher ein wenig verwirrend auf dich aber die Tabellenblätter haben alle eine Funktion, welche sich, nach meinem Kenntnisstand, nicht anders umsetzen lässt.
Ist ja für den Code auch wenig relevant....
Vielleicht kannst du mir mit dem Original jetzt nochmal weiterhelfen.
https://www.herber.de/bbs/user/134420.xlsm
Danke im voraus!!!!
Gruß Andre
Anzeige
AW: Aber Achtung!!
15.01.2020 12:37:20
Stefan
Hallo Andre,
Erklärung:
.Cells(X, 2)

.Cells wählt die Zelle aus, welche bearbeitet/ausgelesen werden soll.
Das X steht für die Zeile (welche sich ja selbst hochzählt)
Die 2 steht für die SpalteB (1=A,2=B,etc.)
Deine Namen stehen in der Spalte D das würde folgende Codezeile ergeben:
.Cells(X, 4)

In deiner bsp.Datei waren die Namen in Spalte B, deshalb die 2.
Dein neuer Code:
Sub MA_loeschen()
Dim lZeile As Integer
Dim X As Integer
Dim Y As Integer
Dim Namenlöschen
lZeile = 12
X = 12
Namenlöschen = Sheets("Personalplanung").Range("H1").Value    'In A1 steht der Name welcher gelö _
scht werden soll
With Sheets("Qualifikationsmatrix")
For X = 12 To 65                        'Wird gesucht, welche die letzte befüllte Zeile  _
ist (um nachert direkt unten einfügen zu können
If .Cells(X, 4)  "" Then
Y = X
End If
Next X
For lZeile = 12 To 65
If .Cells(lZeile, 4) = Namenlöschen Then     'Wenn der Name mit dem Namen in spalte  _
B übereinstimmt, wird gelöscht
.Rows(lZeile).Delete
Y = Y
.Cells(Y, 1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Sheets("Personalplanung").Rows(lZeile).Delete  'Zeile löschen
Sheets("Personalplanung").Cells(Y, 1).Insert Shift:=xlDown, CopyOrigin:= _
xlFormatFromLeftOrAbove
Sheets("Historie_Einsatzplan").Rows(lZeile).Delete
Sheets("Historie_Einsatzplan").Cells(Y, 1).Insert Shift:=xlDown, CopyOrigin:= _
xlFormatFromLeftOrAbove
Exit Sub        'Sub verlassen, wenn löschen ausgeführt wurde
End If
Next lZeile
End With
End Sub
Gruß
Stefan
Anzeige
AW: Aber Achtung!!
15.01.2020 13:04:21
Andre
Der Wahnsinn. Es läuft!
Ich habe jetzt nur doch die Schwierigkeit, dass ich nicht die Zeile 12 kopieren möchte, sondern am Ende der Tabelle eine Zeile einfügen. Nach dem Einfügen sollen die Formeln aus Zeile 12 nach unten kopiert werden. Bei deiner ersten Lösung wird die Zeile 12 samt Mitarbeiter ans Ende kopiert.
Vielleicht hast du hier noch einen praktikablen Weg.
Aber selbst wenn nicht möchte ich mich für deine Mühe bedanken. Du hast mir bereits jetzt super weitergeholfen!!!! Zeigt mir direkt auf wie ineffizient ich bin, wenn es um VBA geht....
Grüße Andre
AW: Aber Achtung!!
15.01.2020 13:27:35
Stefan
Hallo Andre,
.Range(.Cells(Y, 1), .Cells(Y, 3)).delete

mit dem Code würde er in deim Tabellenblatt die Daten in der Spalte A-D (1-4) rauslöschen.
.Rows(lZeile).Delete
Y = Y
.Cells(Y, 1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
.Range(.Cells(Y, 1), .Cells(Y, 4)).delete
Jeweils unter deinem insert Code einfügen, bei den anderen noch das Tabellenblatt hinzufügen und die Spalten ändern und dann klappts.
gruß
Stefan
Anzeige
AW: Aber Achtung!!
15.01.2020 14:06:40
Andre
Hmmmm so richtig läuft es nicht. Er löscht zwar die Zeile fügt jedoch keine ein und zieht auch nicht die Formeln nach unten durch.
Das er die Formel nicht von Zeile 12 in die letzte Zeile kopiert sondern herunter zieht ist wichtig, da es sich um dynamische Formeln handelt.
Gruß Andre
So jetzt aber
15.01.2020 14:48:22
Stefan
Hallo Andre,
so mein letzter Versuch für heute:
Option Explicit
Dim X As Integer
Dim Y As Integer
Dim Z As Integer
Sub MA_loeschen()
Dim lZeile As Integer
Dim Namenlöschen
lZeile = 12
X = 12
Namenlöschen = Sheets("Personalplanung").Range("H1").Value
Call Zellewählen
For lZeile = 12 To 65
If Sheets("Qualifikationsmatrix").Cells(lZeile, 4) = Namenlöschen Then
With Sheets("Qualifikationsmatrix")
.Rows(lZeile).Delete
.Rows(Y).Insert
.Range(.Cells(Z, 2), .Cells(Z, 40)).Copy Range(.Cells(Y, 2), .Cells(Y, 40))
End With
With Sheets("Personalplanung")
.Rows(lZeile).Delete
.Rows(Y).Insert
.Range(.Cells(Z, 23), .Cells(Z, 100)).Copy Range(.Cells(Y, 23), .Cells(Y,  _
100))
End With
With Sheets("Historie_Einsatzplan")
.Rows(lZeile).Delete
.Rows(Y).Insert
.Range(.Cells(Z, 10), .Cells(Z, 40)).Copy Range(.Cells(Y, 10), .Cells(Y, 40) _
)
.Cells(Z, 1).Copy .Cells(Y, 1)
End With
Exit Sub
End If
Next lZeile
End Sub
Private Sub Zellewählen()
With Sheets("Qualifikationsmatrix")
For X = 12 To 200
If .Cells(X, 4)  "" Then
Y = X
Z = Y - 1
Else
Exit Sub
End If
Next X
End With
End Sub
Ich hoffe das funktioniert jetzt so wie geplant
Gruß
Stefan
Anzeige
AW: Danke
15.01.2020 19:04:35
Andre
Es funktioniert!
Stefan, ich bin Dir unendlich dankbar!!!
Unglaublich wie schnell du mir helfen konntest.....
Grüße und vielleicht bis bald hier im Forum
Andre
Gerne
16.01.2020 05:18:24
Stefan
Und danke für die Rückmeldung
Gruß Stefan

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige