Wie kann ich mit Excel VBA, Werte mit bestimmtem Wortteil in einer Spalte finden und dann die zugehörigen Zeilenwerte ausgeben lassen - alle anderen Zeilen weg?

...komplette Frage anzeigen

2 Antworten

Das Beispiel aus dem Netz könnte man deutlich kürzen. Es fehlt Dir dann aber noch die Eingabe des Suchbegriffs, der ist ja noch fest hinterlegt.

Sub Del()
Dim i As Integer
Application.ScreenUpdating = False
For i = 5 To 1 Step -1 ' 5 muss zur Anzahl der Zeilen in deinem Fall passen!
If InStr(Sheets("Needles").Cells(i, 2).Value, "oct") > 1 Then .Rows(i).Delete
Next
Application.ScreenUpdating = True
End Sub

Das Problem mit schneller Hilfe bei VBA ist, dass es nur begrenzt hilft - wenn Du selbst nicht nachvollziehen kannst, was im Code passiert, ist es schwer notwendige Anpassungen vorzunehmen.

Es führt nach meiner Meinung kein Weg daran vorbei, sich etwas mehr mit VBA/Userforms und Co zu beschäftigen, wenn man es einsetzen will.

Zum Erstellen einer Userform kannst Du hier etwas nachlesen
http://www.ms-excel.eu/vba/vba-userform/vba-userform-textbox.html

Für Deinen Fall brauchst Du nur eine TextBox und einen Button.

Anstelle des festen Begriffs ("oct) im obigen Beispiel würde man dann userform1.textbox1.value nehmen - also das, was in der TextBox erfasst wurde. Die ganze Sub Del() wäre dann ein Ereignis, dass beim Betätigen des Buttons gestartet wird. Steht auch im Link, das Private Sub CommandButton1_Click()

Habe noxh was neues gefunden, es funktioniert ganz gut soweit

das Problem ist nur dass ich den Wortteil (z.B.OCT) aus der datumsspalte z.B. 10-OCT-2015 nicht auslesen lassen kann bisher, wie könnte ich denn das unten anpassen das nur mid ausgelesen wird bei Spalte 2

Sub FortDamit()
Dim wksQuelle As Worksheet
Dim wksZiel As Worksheet
Dim lngSpalte As Long
Dim lngLetzteZeile As Long
Dim lngLetzteZeileZiel As Long
Dim lngZeile As Long
lngSpalte = 2 '=B
Set wksQuelle = ActiveWorkbook.Worksheets("Zusammen") 'Anpassen!!!!
Set wksZiel = ActiveWorkbook.Worksheets("Zusammen") 'Anpassen!!!!

lngLetzteZeile = wksQuelle.Cells(wksQuelle.Rows.Count, lngSpalte).End(xlUp).Row
For lngZeile = lngLetzteZeile To 2 Step -1
If wksQuelle.Cells(lngZeile, lngSpalte).Value <> "-JUL-" Then
wksQuelle.Rows(lngZeile).Delete
End If
Next

End Sub

0
@Sascha19833891

ich mag heute nicht mehr, aber soviel doch noch: For-Schleifen in VBA sind langsam (oft seehhr laaangsaam!). Es gibt auch den Befehl find, der ist sehr schnell

Und anstatt der Inputbox geht auch die Abfrage eines Zellwerts (entweder per Range(Adresse).value oder Range(benannte Zelle), im letzten Fall ists verschiebbar.

und dann noch Zelle.entirerow.copy bzw insert, paste, etc.

1
@Iamiam

habe eine Lösung für mich gefunden mit einer dropdownbox und 0-1 System und lookup :) das ging dann doch am einfachsten, verknüpft mit ein paar ifs - danke an alles die versucht haben zu helfen ;) !!

1

Für die Eingabebox würde ich ein Userform erstellen mit einer OK- und einer Abbrechen-Schaltfläche und einem Kombinationsfeld (Combobox) oder einer Listbox.

Das selektieren der passenden Zeilen würde ich über einen Filter lösen. Die Handhabe des Filters kannst du dir über eine Makroaufzeichnung anschauen.

Schonmal danke für das erste feedback, leider kenne ich mich mit dem programmieren von markros recht dürftig aus :( ich weiss wie man eine dropdownbox erstellt und mit formel paar dinge macht, aber mit dem rest, also makros, kenne ich mich leider quasi nicht aus :(

0
@Sascha19833891

Dann würde ich zunächst die Anforderungen an das Programm reduzieren. Nimm eine normale Inputbox, in der der Monat als Zahl von 1 bis 12 eingegeben werden muss.

Dann such die Zellen in Spalte B über 

sMonat = InputBox(...)
For Each rZelle in Range("B:B")
  If rZelle.Value = sMonat Then
    ...
  End If
Next
1
@Sascha19833891

Bisher hatte ich eine Dropdown box und die Formel:

{=IFERROR(SMALL(IF($S$1:$S$25=$Q$1;ROW($R$1:$R$25));ROW(1:1));"")} verwendet gehabt aber da die liste 12000 items und mehr hat, hat excel das nicht gepakct

daher verusche ich es jetzt mit nem makro aber keine ahnung wie ich da ansetzen muss

0
@Sascha19833891

habe das im netzt gefunden, aber funzt irgendwie nicht

habe worksheetnamen auf meinen angepasst

case aud OCT ging dann nicht zu finden

Sub Delete()

Dim i As Integer

Application.ScreenUpdating = False

With Worksheets("Needle")

    For i = 2400 To 2 Step -1

        Select Case .Cells(i, 15).Value

            Case 0, 25, 50, 75, 100

                GoTo Naechste

            Case Else

                .Rows(i).Delete

        End Select

Naechste:

    Next

End With

Application.ScreenUpdating = True

End Sub

0

Was möchtest Du wissen?