Excel vba: Suchmechanismus
#11
Hallo Carsten,

stimmt, ist alles noch relativ fest.

So weit, wie Du habe ich gar nicht gedacht. Mal schauen, was Erich noch zu sagen hat.
Aus dem Sammelsurium kommt am Ende das richtige Ergebnis raus, denke ich.

Hmm.......
Gruß Atilla
Top
#12
Attila, Carsten bringt es auf den Punkt.

Es wird nicht nur nach RB gesucht.
Über ein Eingabefeld soll das Suchkriterium eingegeben werden - also z.B. "RB" oder "KL" oder "A8" usw. ....also alles ist möglich.
Die Strings sollen dann nach dieser Eingabe durchsucht werden - aber wie gesagt bewusst nur das Ende des Strings und alle Strings ab einer vorzugebenden Zeile nach unten - und bei Auffinden in der Nachbarzelle ein Eintrag gemacht werden.
Top
#13
(18.04.2017, 23:35)sharky51 schrieb: Nein ich suche natürlich nicht immer nur nach "RB" - das war nur ein Beispiel.
Ich suche in allen Strings die ich von einer Datenübertragung erhalte nur diese dritt- und viertletzten Ziffern oder Zahlen.
Also in allen Neuankömmlingen und auch in allen schon vorhandenen.


Gut, so langsam nähern wir uns der Sache.   :)

Also am besten eine Schleife ausgehend von allen Neuankömmlinge, mit Erweiterung über die vorhandenen Einträge.
Wo stehen die vorhandenen?
Wo stehen die Neuankömmlinge? Oder gibt es zur Hilfe auch ein Timestampfeld?
Wo soll die Ausgabe erfolgen?
Wie soll die Ausgabe erfolgen? - "Status1" allein wird nicht reichen, oder? Soll noch auf die Fundstellen verwiesen werden?
...


Gruß Carsten


Edit:
(18.04.2017, 23:47)sharky5 schrieb: Die Strings sollen dann nach dieser Eingabe durchsucht werden - aber wie gesagt bewusst nur das Ende des Strings und alle Strings ab einer vorzugebenden Zeile nach unten - und bei Auffinden in der Nachbarzelle ein Eintrag gemacht werden.

Das willst Du doch nicht für jede Zeile per Hand starten, oder?
Top
#14
Hallo Carsten,

Alle Strings stehen in Spalte "A"
Die Neuankömmlinge anschließend unter den vorhandenen in Spalte "A" - Kein Timestampfeld notwendig.
Die Ausgabe soll direkt in der Zelle neben der Fundstelle stehen , also in Spalte "B".
Kein Verweis auf die Fundstelle notwendig. Der Eintrag z.B. "Status1" in der Zelle daneben verweist ja auf die Fundstelle.

Hmm, ich habe keine andere Möglichkeit als das zu Suchende von Hand zu starten.
Ich könnte mir ein permanent offenes Eingabefeld vorstellen das nach der Eingabe des Suchkriteriums auf die Suche geht und anschließend wieder für eine neue Eingabe bereit ist usw....
Top
#15
Hallo Erich,

gut, dann der Einfachheit halber zuerst alles als Formel, denn das sollte ausreichen ...

Dann probiere mal bitte:
Code:
'wenn nur die Duplikate gekennzeichnet werden sollen:
=WENN(ZÄHLENWENN(A$1:A1;"*" & LINKS(RECHTS(A1;4);2) & "??")>1;"Status1";"")

'oder falls alle gekennzeichnet werden sollen (inklusive dem ersten Vorkommen)
=WENN(ZÄHLENWENN(A:A;"*" & LINKS(RECHTS(A1;4);2) & "??")>1;"Status1";"")




Gruß Carsten
Top
#16
Hallo zusammen,

da Erich auf VBA fixiert ist, wüürde ich es so lösen:

In einer Tabelle eine Zelle für die Eingabe des Suchstrings bereitstellen.(kann auch die gleiche Tabelle wie die Datentabelle sein)
Ich habe Zelle C1 für die Eingabe des Suchstrings im Programm berücksichtigt.


D1 der Datentabelle ist als Hilfszelle und Kontainer für die Zeilennummer reserviert.

Nach eingabe in Zelle C1 startet die Suche. Beim ersten Durchlauf ist Zelle D1 noch leer und es wird ab Zeile 1 gesucht.
Am Ende wird die letzte Zeile in D1 gespeichert und beim nächsten mal wird ab dieser zeile gesucht.

Zum starten des Codes über die Zelleingabe in Zelle C1, folgenden Code ins Tabellen Modul einfügen:


Code:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Address(0, 0) = "C1" Then
   On Error GoTo fehler
   Application.EnableEvents = False
   If Target <> "" Then suchen (Target)
 End If
fehler:
   Application.EnableEvents = True
 If Err Then MsgBox "Fehler: " & Err.Number & vbLf & vbLf & Err.Description
End Sub


Die Suchroutine in ein allgemeines Modul:


Code:
Sub suchen(strgText As String)

Dim i As Long
Dim lngLetzte As Long
Dim lngBeginn As Long
Dim strgAusgabeText As String

strgAusgabeText = "status1"

With Sheets("Tabelle1")
 lngLetzte = .Cells(.Rows.Count, 1).End(xlUp).Row
 
 lngBeginn = IIf(.Range("D1") = "", 1, .Range("D1"))
 .Range(.Cells(lngBeginn, 2), .Cells(lngLetzte + 1, 2)).ClearContents 'neuen Bereich zum Schreiben leeren
   For i = lngBeginn To lngLetzte
    If Mid(.Cells(i, 1), Len(.Cells(i, 1)) - 3, 2) = strgText Then .Cells(i, 2) = strgAusgabeText
   Next i
   .Range("D1") = lngLetzte + 1
 
End With

End Sub
Gruß Atilla
Top
#17
Hallo Atilla,

hhmmm, dann muss Erich aber jede Kombination per Hand in C1 einpflegen, das ist doch eher kontraproduktiv.
Der 'Merker' in D1 hat keine Funktion (, der wäre aus dieser Sicht auch kontraproduktiv).
Die Leerung des Bereiches entfernt evtl. vorhandene Statuseinträge vom vorherigen Suchlauf ...
Mir ist bewusst, dass Dein Code nur als Beispiel dient. :)

Ich habe kein VBA gebastelt, weil:
Erich hat nicht geschrieben, warum er denn 'unbedingt' eine VBA-Lösung haben möchte.
Wenn eine Formel die Aufgabe allein erledigen kann, dann ist VBA oft die zweite Wahl.

Folgende Aufgabendefinition hatte ich erkannt:
  • Suche in Spalte A nach Duplikaten der vierten und dritten Zeichen von Rechts
  • Kennzeichnung der Duplikate mit "Status1" in Spalte B
  • Die Suche soll über alle Neuankömmlinge und alle Vorhandenen durchgeführt werden
All das kann von den Formeln erledigt werden, ohne zusätzliches Anschubsen von Code.
Die Datei enthält somit keinen VBA-Code, ist also sicherer, weniger fehleranfällig und für alle problemlos nutzbar.

Ich hatte nicht erkannt, ob nur die Duplikate gekennzeichnet werden sollen oder auch zusätzlich das erste Vorkommen.
Deshalb habe ich dafür je eine Formel gepostet, die kann Erich mal testen.

Wenn Erich unbedingt VBA möchte, dann müsste man Deinen Code noch erweitern/umbauen, in C1 beispielsweise die Startzeile eintragen und ab dort eine Schleife starten. Oder, oder auch, ...


Gruß Carsten
Top
#18
(19.04.2017, 02:13)DbSam schrieb: Der 'Merker' in D1 hat keine Funktion (, der wäre aus dieser Sicht auch kontraproduktiv).

Entschuldige, da habe ich Mist geschrieben, war wohl Nachtblind.
Der hat schon eine Funktion, man kann halt nach dem Import nur einmal suchen oder muss ihn zurücksetzen.


Gruß Carsten
Top
#19
Guten Morgen Carsten,

ich bringe mal ein Paar Zitete von Erich:


Zitat:Ich könnte mir ein permanent offenes Eingabefeld vorstellen das nach der Eingabe des Suchkriteriums auf die Suche geht und anschließend wieder für eine neue Eingabe bereit ist usw....


Darauf habe ich meine Lösung aufgebaut


Code:
Deshalb soll auch der Suchbereich ab einer bestimmten Zeile eingeschränkt werden können und ab hier nur nach unten in dieser einen Spalte weitergesucht wird.
hier schreibt er: "...ab hier..."

und dann:


Zitat:Also in allen Neuankömmlingen und auch in allen schon vorhandenen.

Ist meiner Meinung nach widersprüchlich.
Aber Du hast ja selber erkannt, dass er mit meinem Vorschlag beides kann, muss gegebenenfalls D1 leeren.


Und zu Guter Letzt:

Zitat:Über ein Eingabefeld soll das Suchkriterium eingegeben werden - also z.B. "RB" oder "KL" oder "A8" usw. ....also alles ist möglich.

Das alles ist mit meinem Vorschlag abgedeckt.

Aber ich nehme mir immer noch nicht heraus das Problem mit Sicherheit richtig verstanden zu haben.
Gruß Atilla
Top
#20
Guten Morgen Atilla,

(19.04.2017, 10:28)atilla schrieb: Aber ich nehme mir immer noch nicht heraus das Problem mit Sicherheit richtig verstanden zu haben.
Willkommen im Club.   :)


Mal abwarten was Erich schreibt ...


Gruß Carsten
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste