Excel Macro VBA löschen bestimmter Zellen

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Du musst zuerst die input-box einer Variablen zuweisen, zB:
FNam = InputBox("..... . . die Argumente entnimmst Du der aktuellen Hilfe.

[Besonderheit: Willst Du mit der Input-Box einen Bereich festlegen, musst Du mit Set BerBezeich = Application.inputbox(..;......;8) das festlegen, ist hier aber nicht der Fall.]

Der Vorname wird mit CNam = InputBox("..... der Variablen CNam zugewiesen, aber erst im Ablauf bei Bedarf (wenn FNam gefunden, es sei denn, Du wolltest Optional Nur nach dem Vornamen suchen. Als Suchbereich für FNam legst Du die Spalte C:C fest und c musst Du ebenfalls als Variable anmelden (dringend empfohlen:Option Explicit mit Deklaration aller Variablen: Dim FNam, CNam, c ! den Typ der Variablen zu deklarieren, zB As String etc, erspare ich mir ohne spürbare Nachteile)).
Dann mit Schleife suchen (geht auch anders mit find, aber ich machs immer so, wenn auch langsamer, ist leichter zu vermitteln, find hat recht komplexe Syntax):
For Each c in Activesheet.Range("C:C").SpecialCells (xltextvalues) oder so ähnlich.
if c.value = FNam then CNam = inputbox(.... if c.offset(0, 1).calue = CNam then c.entirerow.delete: MSGbox("FNam & ", " & CNam & " gelöscht"): End
Next c MSGbox("FNam & ", " & CNam & " wurde nicht gefunden!") end sub

War zwar eine Trockenübung, aber mit online-Hilfe und Kontextmenüs bzw mitlaufender Syntax-Anzeige wirst Du das schon hinkriegen!


Iamiam  23.12.2011, 02:42

Nachdem das wegschicken der AW länger gedauert hat als das Schreiben (??? grrrr! liegs am O2UMTS oder an GF oder an meinem Rechner?), nur noch kurz eine Bemerkung: oben ist die EINzeilige Variante von if...then verwendet, die Folgebefehle werden mit Doppelpunkt am Zeilenende aneinandergehängt. Das geht dann, wenn jedees Nichtzutreffen keine alternative Aktion (...else...) erfordert, sondern das Makro einfach so fortgesetzt werden kann, nachdem die Befehle im ...then... erfüllt sind. [hier: verlassen des Makros, ansonsten die Fortsetzung der Schleife. Ich hätte allerdings noch eine weitere Abfrage einbauen sollen, die das Makro beim nächsten Buchstaben verlässt (sofern die Liste alphabetisch geordnet ist)

0
schildente 
Beitragsersteller
 23.12.2011, 08:00
@Iamiam

Okay, an sich hab ich die Logik verstanden, allerdings wofür ist das c? Das erschließt sich mir leider nicht. Das dass Makro aufhört wenn der nächste Buchstabe anfängt wäre ja bloß Zusatz um die Bearbeitungsgeschwindigkeit zu erhöhen wenn ich das richtig versteh.

0
Iamiam  23.12.2011, 13:25
@schildente

c (kann genausogut auch Zelle oder Wrzlbrmpf heissen) ist das Element, aus dem sich Range("C:C") [oder auch Range("C:H")] zusammensetzt, also DAS Element der nächsten Ebene (VBA macht da automatische Vorgaben, was was ist), braucht bei Nutzung der Vorgabe also nicht extra festgelegt zu werden.
Bei Columns("3:8") (Syntax?) wäre das vermutlich die Einzelspalte, bei c.Characters.Text das Einzelzeichen.
Könntest genausogut auch schreiben :

For i = 1 to Range("C:C").Cells.Count Step = 1 '[auch Step = 1 ist Vorgabe]
'musst dann aber weitermachen mit:
Range("C:C").Cells(i) 'anstatt c, ist also umständlicher!
.....
i = i + 1
Next i

(das i nach Next könntest Du Dir sogar sparen, aber es wird übersichtlicher bei Verschachtelungen, wenn mans schreibt.
Sehe aber, dass ich oben schludrig gearbeitet habe. So wärs richtig:
if c.value = FNam then CNam = inputbox(....): if c.offset(0, 1).value = CNam then c.entirerow.delete: MSGbox(FNam & ", " & CNam & " gelöscht"): End

Vielleicht heißt die erste Zeile auch
For Each c in Activesheet.Range("C:C").Cells.SpecialCells (xltextvalues) Das siehst Du im Objektkatalog (Kontext-Anzeige nützen!), ob SpecialCells ein mögliches Argument schon für Range(). oder erst für .Cells. ist.

0
Iamiam  23.12.2011, 13:30
@Iamiam

und wieder ein Fehler:
For i = 1 to i = Range("C:C").Cells.Count

0

ich finde übrigens das Editorformat sehr schwer lesbar, was die Farbdarstellung der unterschiedlichen Lategorien angeht.
Ich hab Dir deshalb mal einen Screenshot von meiner Einstellung gemacht, nur als Beispiel, dass es auch anders geht! Ist natürlich Geschmackssache!
Das ist auch gleichzeitig ein Beispiel für ein Sub mit InputBox und Set.
Das Stop setze ich oft nicht an den Anfang, sondern an die vorletzte Zeile, so bleiben alle Variablen zur Überprüfung erhalten. Ausserdem verwende ich zur Überprüfung von Zwischenzuständen den Befehl
debug.print "Beschreibung1: " & Variable1 & "...Beschreibung2: " & Variable2 'etc. Viel Spass und Erfolg!

Beispiele VBA Funktion, -Sub und -Editor-Format - (programmieren, Microsoft Excel, VBA)

schildente 
Beitragsersteller
 23.12.2011, 21:59

Erst einmal danke für deine mühe, funktioniert auch ganz gut aber 2 Probleme tun sich mir noch auf:

Das ist mein Code bis jetzt: Sub Finden ()

Dim NName Dim VName Dim c

NName = InputBox("Bitte Nachname eingeben", "Nachname")

            Sheets(i).Activate
            For Each c In ActiveSheet.Range("C:C").SpecialCells(xlTextValues)

            If c.Value = NName Then VName = InputBox("Bitte Vornamen eingeben", "Vorname")
             For i = 1 To Sheets.Count
            If c.Offset(0, 1).Value = VName Then c.EntireRow.ClearContents
         Next

Next i End Sub

Und zwar hält er bei gefundenen Nachnamen an und fragt nach den Vornamen so das bei doppelten Nachnamen nur der richtige gelöscht wird allerdings wenn der vorname doppelt vorkommt wird die Zeile auch gelöscht. Und da ich den selben Namen in mehreren Blättern(1. für jeden KW) stehen habe läuft er nun alle Blätter durch und durchsucht sie nach diesen Namen, das Problem ist nur das die Namen verknüpft sind, d.h. Ich habe ein Eingabe Blatt und alle anderen Blätter holen sich die Namen daher, hinter den Namen steht dann immer noch Arbeitszeiten. Nun fängt er blöderweiße mit suchen und löschen genau in dem Datenblatt an so das die Verknüpfung dahin ist und in den anderen Blättern natürlich nichts mehr gelöscht werden kann, langer Text kurzer Sinn: kann man die Reihenfolge ändern bei welchem Blatt das Makro beginnt und aufhört?

Und wieder einmal Danke im Vorraus und natürlich Frohe Weihnachten.

0
Iamiam  23.12.2011, 23:45
@schildente

versuch mal, das Namensstammblatt an die erste Stelle zu schieben und fang mit For i = 2 to WorkSheets.count an!
Benütze übrigens nicht Sheet, sondern Worksheet, bzw Worksheets. Diagrammblätter sind nämlich auch Sheets und Dialogformulare auch! Das könnte zu Fehlern führen, weniger, dass in diesen Blättern was passierte, sondern dass beim Zählen was unbeabsichtigtes rauskommt.
Nur Activesheet ist eindeutig, nämlich das, was gezeigt wird bzw in dem der Cursor/sonstige Markierung, zB Diagramm, aktiv ist!

und For i = 1 to i = Range("C:C").Cells.Count war doch falsch, aber das hast Du ja selbst schon korrigiert. (ich verwechsle das ständig, aber habs heut bei einem anderen µ bemerkt!)

0
Iamiam  24.12.2011, 00:01
@Iamiam

Die Sendezeiten sind ein Graus, ich kann zZt nichts mehr korrigieren oder zufügen! Also: Du kannst das Stammblatt ja hinterher wieder an seinen alten Platz zurückschieben. zur Alternative: Du kannst auch bei Worksheets.Count - 1 aufhören ! Oder i = 1 to 5 und die gleiche Schleife nochmals For i = 7 to 12 (in einem Rutsch geht das glaube ich nicht, zumindest nicht so. Evtl mit einer zwischenzeile nach For: if i = 6 then i = 7 oder sowas, also eins überspringen, hab ich aber noch nie gemacht. Bei For Each geht das natürlich nicht, höchstens so: if Worksheet.Name = "xyz" then goto ausgelassen. vor der Next-Zeile muss dann eine Zeile sein, in der
ausgelassen: steht, also mit Doppelpunkt und sonst nichts in der Zeile. Das erkennt VBA dann als Sprungmarke. Alle Aktionen dazwischen werden also ausgelassen. Du kannst mit Sprungmarken auch zurückgehen, ist im Prinzip eine Verzweigung, die auch bedingt sein kann. Ich benutze gelegentlich die Abfolge am Ende: ... Exit Sub Marke: noch irgendein Befehl anstatt des normalen Ablaufs und dann erst End Sub

0
Iamiam  24.12.2011, 20:41
@Iamiam

hab jetzt erst Dein Problem mit dem löschen bei zwei gleichen Vornamen realisiert. So müsste das gehen:

Option Explicit '< sollte unbedingt rein, weglassen kann zu recht frustrierender Fehlersuche führen!
korrigiertes

Sub FindenNamenSchildente()

Dim NName, VName, c, i

NName = InputBox("Bitte Nachname eingeben", "Namen löschen")

For i = 1 To Worksheets.Count

  Worksheets(i).Activate

  For Each c In ActiveSheet.Range("C:C").SpecialCells(xlTextValues)

     If c.Value = NName Then VName = InputBox("Bitte Vornamen von " & NName & " eingeben", "Namen löschen") '¹)

     If c.Offset(0, 1).Value = VName Then c.EntireRow.ClearContents '.Clear: auch Formate, .delete entfernt Zeile

  Next

Next i

MsgBox "Name " & VName & " " & NName & " gelöscht!"

End Sub

'¹) Es sollte immer ein erkennbarer Bezug zum Stand der Suche sichtbar sein:
' nach einer Störung weißt Du vielleicht nicht mehr, bei welchen NName oder welcher Stufe Du warst!

0
Iamiam  24.12.2011, 21:12
@Iamiam

wenn Du natürlich zweimal gleichen Nach- und Vornamen untereinander stehen hast, brauchst Du noch ein drittes Kriterium, zB zweiten Vornamen oder sen/jun an definierter Stelle oder Geburtsdatum etc. Könnte aber ohne neue Schleife, nur mit neuer input-Box, neuer Variablen und neuer offset(0, n)-Abfrage gelöst werden, wobei es etwas umständlicher wird, bei Bedarf den zweiten Namen zu löschen. (ginge auch mit MSGbox, wo alle Charakteristika genannt werden, und ja/nein/abbr-Buttons. Bei mehr gleichen Namen müsste man zu anderen Techniken greifen (zB mit MSG-Box in einer neuen Variablen die offset-Zeile hochzählen und das Ergebnis jeweils in der MSG-Box darstellen, ebenfalls mit ja/nein/abbr-Buttons)

0
schildente 
Beitragsersteller
 09.01.2012, 16:53
@Iamiam

Hallo,

ich hoffe du bist gut ins neue Jahr gerutscht. ;) Ne das Problem tritt nicht bei gleichen Vor und Zunamen auf sondern nur bei gleichem Vornamen. Bsp.: Ich habe einen Schulz Martin; Schulz Robert & Meier Martin, wenn ich jetzt Schulz Martin löschen lassen will löscht er mir auch Meier Martin, da selber Vorname. Und wenn ich das For i = 2 to WorkSheets.count an so versuche und dabei mein Datenblatt an erster Stelle habe wird es ja garnicht mehr berücksichtigt, oder sehe ich das falsch?

Nochmals danke.

0
Iamiam  10.01.2012, 12:31
@schildente

erst mal danke für den Stern!
Ich muss mich in das Problem erst wieder reinvertiefen, vielleicht heut abend im Zug (wenn der Saft im Laptop reicht) oder heut nacht, wenn nicht zu müde. Aber ich werd mich auf alle Fälle nochmal dransetzen!

0
Iamiam  10.01.2012, 15:46
@Iamiam

wenn Du das "Stammblatt" ganz nach hinten setzt, löscht er darin zuletzt, Sollte das problem mit den nicht mehr findbaren Verknüpfungen lösen (hoffe ich).

Warum gleiche Vornamen gelöscht werden, verstehe ich zwar nicht, denn c wird ja über den Nachnamen gefunden und die Schleife nicht neu ausgeführt, aber man muss vielleicht nicht alles verstehen.

Eine doppelte Bedingung sollte das Problem auf alle Fälle lösen:
If c.Value = NName And c.Offset(0, 1).Value = VNameThen c.EntireRow.Clear
oder, wenn die Zeile entfernt werden soll:
...Then c.entirerow.delete

gehts jetzt?

0