Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

Was für ein Makro brauche ich?





Frage

Hallo alle zusammen, ich habe in Makro programmieren keine so große Ahnung, deshalb brauch ich eure Hilfe. Und zwar möchte ich meine EXCEL-Tabelle nach einem bestimmten Wert durchsuchen und die Zeile die den Wert enthält mit der Autofilter-funktion ausfiltern. In Zelle C2 steht mein Suchwort und mit dem Button "suchen" möchte ich die Suche starten. Mein Makro sieht bis jetzt so aus: Sub suchen() Range("C2").Select SendKeys "^c" SendKeys "^f" SendKeys "^v" SendKeys "~" SendKeys "{down}" SendKeys "~" SendKeys "{esc}" SendKeys "{F2}" SendKeys "{esc}" Dim SpNr As Integer Dim Such As String AutoFilterMode = False SpNr = ActiveCell.Column Such = ActiveCell.Value Selection.AutoFilter Field:=SpNr, Criteria1:=Such, Operator:=xlAnd End Sub Bis jetzt siehts so aus, dass ich den Wert in C2 kopiere, das Suchenfenster öffne, den kopierten wert einfüge, suche und das Suchenfenster danach wieder schließe. Jetzt ist das Feld mit dem gesuchten Wert markiert, aber die Autofilter-Funktion filtert nicht die Tabelle. Wenn ich das alles Manuel mache und dieses Makro extra starte funktionierts... Dim SpNr As Integer Dim Such As String AutoFilterMode = False SpNr = ActiveCell.Column Such = ActiveCell.Value Selection.AutoFilter Field:=SpNr, Criteria1:=Such, Operator:=xlAnd Bitte HELFT mir.

Antwort 1 von coros

Hallo Diminic,

kopiere nachfolgendes Makro in ein StandardModul und starte es über z.B. eine Befehlsschaltfläche.

Option Explicit

Sub Suchen_und_Filtern()
Dim Suchbegriff As Range, Addresse As String, FindColumn As Integer
Dim Bereich As Range
Application.ScreenUpdating = False
Set Bereich = Range("A3:IV65536")
Bereich.AutoFilter
With Bereich
Set Suchbegriff = .Find(What:=Range("C2"), LookIn:=xlValues)
If Not Suchbegriff Is Nothing Then
Addresse = Suchbegriff.Address
FindColumn = Suchbegriff.Column
Do
Set Suchbegriff = .FindNext(Suchbegriff)
Loop While Not Suchbegriff Is Nothing And Suchbegriff.Address <> Addresse
End If
End With
Bereich.AutoFilter Field:=FindColumn, Criteria1:=Range("C2")
End Sub


Mit dem Makro wird der Bereich "A3:IV65536" nach dem Suchbegriff aus Zelle C2 durchsucht. Wenn der Suchbegriff gefunden wurde, wird die Spaltenindexnummer, in der sich der gefundenen Begriff befindet, in die Variable "FindColumn " geschrieben und danach wird für den Bereich A3:IV65536 der Autofilter markiert und der gefundene Begriff gefiltert.

Ich hoffe, Du meintest das so. Bei Fragen melde Dich bitte.

Solltest Du nicht wissen, wie Du den Code in Deine Datei bekommst, dann schau mal auf meiner HP in der Rubrik Anleitungen und dort dann in der Anleitungsnummer 3 nach. Dort stelle ich dazu eine bebilderte Anleitung zur Verfügung, die Dir sicherlich helfen wird.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 2 von dominic_kammerer

DAS FEEDBACK.

Absolut genial.
Danke für die sehr schnelle und sehr exakte Antwort. Hat alles 1A geklappt.

Antwort 3 von dominic_kammerer

Hallo Oliver,

hab noch ein kleines Problemchen festgestell. Ich habe in einer Zelle mehrere Artikelnummern, z.B. 430; 529; 221
kann man die Suchfunktion so ändern, dass er mir die Zeile herausfiltert auch wenn ich nur eine Artikelnummer angebe z.B. 529 ?

Im Moment muss ich den genauen Zellinhalt suchen, sonst filtert er mir nicht die Zeile heraus.

Gruß Dominic

Antwort 4 von coros

Hallo Dominic,

versuche es mal mit nachfolgendem Makro. Kopiere es wieder in ein StandardModul.

Option Explicit

Sub Suchen_und_Filtern()
Dim Suchbegriff As Range, Addresse As String, FindColumn As Integer
Dim Bereich As Range, Fundtext As String
Application.ScreenUpdating = False
Set Bereich = Range("A3:IV65536")
Bereich.AutoFilter
With Bereich
Set Suchbegriff = .Find(What:=Range("C2"), LookIn:=xlValues)
If Not Suchbegriff Is Nothing Then
Addresse = Suchbegriff.Address
FindColumn = Suchbegriff.Column
Fundtext = Suchbegriff.Value
Do
Set Suchbegriff = .FindNext(Suchbegriff)
Loop While Not Suchbegriff Is Nothing And Suchbegriff.Address <> Addresse
End If
End With
Bereich.AutoFilter Field:=FindColumn, Criteria1:=Fundtext
End Sub


Bei Fargen melde Dich wieder.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 5 von dominic_kammerer

Hallo Oliver,

so jetzt bin ich endlos glücklich. Danke für deine hilfreichen Tipps. Nun funktioniert es so wie ich mir das vorgestellt habe.

Gruß Dominic

Antwort 6 von dominic_kammerer

Hallo Oliver,

hab noch ne Kleinigkeit. Wäre es möglich die gefilterte Zeile von Spalte B nach Q zu markieren und dann in ein anderes Tabellenblatt z.B. "Lagerverwaltung" in Zelle C13 zu kopieren. Was dann noch super währe wenn ich die Zeile dort dann verändern könnte und mit einem "Speichern" Button wieder in die Tabelle einfügen könnte.

Am wichtigsten ist mir aber wie zu beginn geschrieben...die gefilterte Zeile von Spalte B nach Q zu markieren ...

Gruß Dominic

Antwort 7 von coros

Hallo Diminic,

mit nachfolgendem Code, wird Dir der Bereich B:Q der gefilterten Zeile kopiert und in Blatt "Lagerverwaltung" in Zelle C13 eingefügt.

Option Explicit

Sub Suchen_und_Filtern()
Dim Suchbegriff As Range, Addresse As String, FindColumn As Integer
Dim Bereich As Range, Fundtext As String, FindRow As Long
Application.ScreenUpdating = False
Set Bereich = Range("A3:IV65536")
Bereich.AutoFilter
With Bereich
Set Suchbegriff = .Find(What:=Range("C2"), LookIn:=xlValues)
If Not Suchbegriff Is Nothing Then
Addresse = Suchbegriff.Address
FindColumn = Suchbegriff.Column
Fundtext = Suchbegriff.Value
FindRow = Suchbegriff.Row
Do
Set Suchbegriff = .FindNext(Suchbegriff)
Loop While Not Suchbegriff Is Nothing And Suchbegriff.Address <> Addresse
End If
End With
Bereich.AutoFilter Field:=FindColumn, Criteria1:=Fundtext
Range(Cells(FindRow, 2), Cells(FindRow, 17)).Copy
Sheets("Lagerverwaltung").Range("C13").PasteSpecial
Application.CutCopyMode = False
End Sub


Den 2. Teil Deiner Frage habe ich nicht verstanden. Wohin soll denn die Zeile wieder geschrieben werden (Bereichsangabe)?

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 8 von dominic_kammerer

Hallo Oliver,

danke erst einmal für deine schnelle Antwort.
Die veränderte Zeile soll wieder in die gleiche Position der Tabelle eingefügt werden in der sie herauskopiert wurde.

Vieleicht hilft dir folgende Info noch.
Die Spalte H ist in der Hauptabelle durchnummeriert z.B. L0001, L0002,L0003 usw.
Da die Spalte H der Hauptabelle mit der Spalte I der Bearbeitungstabelle identisch ist, könnte man doch die Zeile in der Hauptabelle genau orten und einfügen.

Hauptabelle:

Spalte H
Artikelnr I Hersteller I Lagernummer I usw.
402 XXX L0001
501 YYY L0002
620 ZZZ L0003


Bearbeitungstabelle:

Spalte I
Artikelnr I Hersteller I Lagernummer I usw.
501 YYA L0002

In der Bearbeitungstabelle wurde die Zeile geändert und soll jetzt wieder in die gleiche position der Hauptabelle eingefügt werden. Ergebnis:

Hauptabelle:

Artikelnr I Hersteller I Lagernummer I usw.
402 XXX L0001
501 YYA L0002
620 ZZZ L0003


Gruß Dominic

Antwort 9 von coros

Hallo Dominic,

was für Daten befinden sich noch in dem Barbeitungsblatt? Nur die kopierte Zeile oder auch noch andere Daten. Ich frage nur, ob die Möglichkeit dort besteht, die Zeilennummer des gefundenen Begriffs, die ja bereits ermittelt wurde, zwischenzuspeichern? Man kann zwar eine Variable erzeugen, in der die Zeilennummer gespeichert würde, aber wenn die Datei mal geschlossen wird, ohne dass die Zeile wieder zurück übertragen wurde, ist die Zeilennummer weg.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 10 von dominic_kammerer

Hallo Oliver,

dort befindet sich nur die kopierte Zeile die bearbeitet werden soll.

Gruß Dominic

Antwort 11 von coros

Hallo Dominic,

nachfolgende Makros filtern und kopieren und geben zusätzlich im Tabellenblatt "Lagerverwaltung" in Zelle A1 die Zeilennummer der Fundzeile aus. Mit dem 2. Makro kannst Du dann die Zeile wieder zurück übertragen.
Blattnamen müssen eventuell angepasst werden.

Option Explicit

Sub Suchen_und_Filtern()
Dim Suchbegriff As Range, Addresse As String, FindColumn As Integer
Dim Bereich As Range, Fundtext As String, FindRow As Long
Application.ScreenUpdating = False
Set Bereich = Range("A3:IV65536")
Bereich.AutoFilter
With Bereich
Set Suchbegriff = .Find(What:=Range("C2"), LookIn:=xlValues)
If Not Suchbegriff Is Nothing Then
Addresse = Suchbegriff.Address
FindColumn = Suchbegriff.Column
Fundtext = Suchbegriff.Value
FindRow = Suchbegriff.Row
Do
Set Suchbegriff = .FindNext(Suchbegriff)
Loop While Not Suchbegriff Is Nothing And Suchbegriff.Address <> Addresse
End If
End With
Bereich.AutoFilter Field:=FindColumn, Criteria1:=Fundtext
Range(Cells(FindRow, 2), Cells(FindRow, 17)).Copy
Sheets("Lagerverwaltung").Range("C13").PasteSpecial
Sheets("Lagerverwaltung").Range("A1") = FindRow
Application.CutCopyMode = False
End Sub

Sub Wert_zurück()
Sheets("Lagerverwaltung").Range("C13:R13").Copy
Sheets("Tabelle1").Cells(Sheets("Lagerverwaltung").Range("A1"), 2).PasteSpecial
End Sub


MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 12 von dominic_kammerer

Hallo Oliver,

tip top gelöst, wie gewohnt. Genau so hab ich das gemeint.Vielen Dank.

Gruß Dominic

Antwort 13 von dominic_kammerer

Hallo Oliver,

nochmal ne Frage. Kann man auch nur in einer Spalte suchen, z.B. Set Bereich = Range("B4:B65536")?


Gruß Dominic

Antwort 14 von coros

Hallo Dominic,

ja, kann man. Dann solltest Du in dem Makro "" aber vor der Zeile

Bereich.AutoFilter Field:=FindColumn, Criteria1:=Fundtext


die Zeile

If Fundtext = "" Then Exit Sub


einfügen, damit es nicht zu einem Laufzeitfehler kommt.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 15 von dominic_kammerer

Hallo Oliver,

danke für deine schnelle Antwort. Es hat aber leider nicht geklappt. Es kommt die Fehlermeldung:
"Die Autofilter-Methode des Ranges-Objektes konnte nicht ausgeführt werden"

Das Makro sieht nach ein paar Veränderungen nun so aus:
Sub sucheArtkl()

ActiveWindow.ActivateNext
Sheets("Lager").Select
Dim Suchbegriff As Range, Addresse As String, FindColumn As Integer
Dim Bereich As Range, Fundtext As String, FindRow As Long
Application.ScreenUpdating = False
Set Bereich = Range("B4:B65536")
Bereich.AutoFilter
With Bereich
Set Suchbegriff = .Find(What:=Range("´Lager KAMMERERGmbH.xls´!Artikelsuch"), LookIn:=xlValues)
If Not Suchbegriff Is Nothing Then
Addresse = Suchbegriff.Address
FindColumn = Suchbegriff.Column
Fundtext = Suchbegriff.Value
FindRow = Suchbegriff.Row
Do
Set Suchbegriff = .FindNext(Suchbegriff)
Loop While Not Suchbegriff Is Nothing And Suchbegriff.Address <> Addresse
End If
End With
If Fundtext = "" Then Exit Sub
Bereich.AutoFilter Field:=FindColumn, Criteria1:=Fundtext
Range(Cells(FindRow, 2), Cells(FindRow, 15)).Copy
Sheets("Lager").Range("N1") = FindRow
ActiveWindow.ActivateNext
Sheets("Lagerverwaltung").Range("C15").PasteSpecial
Application.CutCopyMode = False
Sheets("Lagerverwaltung").Select
Range("D10").Select
Selection.ClearContents
ActiveWindow.ActivateNext
Selection.AutoFilter
ActiveWorkbook.Save
ActiveWindow.ActivateNext
End Sub

Gruß Dominic

Antwort 16 von coros

Hallo Dominic,

was soll denn das hinter "What" in der Zeile

Set Suchbegriff = .Find(What:=Range("´Lager KAMMERERGmbH.xls´!Artikelsuch"), LookIn:=xlValues)


bedeuten.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 17 von dominic_kammerer

Hallo Oliver,

wenn du das - ("´Lager KAMMERERGmbH.xls´!Artikelsuch") - meinst. Ich habe die Tabelle aufgeteilt. Einmal die Tabelle in der ich die Suche starte und die Zeile hereinkopiere die ich ändern möchte und in der Zweiten Tabelle habe ich nur die Daten. Ich wechsle von der Suchtabelle in die Datentabelle, starte die Suche wobei das Suchwort in dem - Set Suchbegriff = .Find(What:=Range - Befehl auf die Suchetabelle verweist.

("´Lager KAMMERERGmbH.xls´! - ist die Suchetabelle
Artikelsuch - ist die Zelle die ich so benannt habe

Das Makro funktioniert so lange ich den Suchebereich von B4:N65536 belasse aber sobald ich den Suchebereich verkleinere wie hier - Set Bereich = Range("B4:B65536") - geht es nicht mehr.


Ich hoffe es ist einigermaßen verständlich geschrieben.

Gruß Dominic

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: