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

Teilstring wird nicht gefunden

Teilstring wird nicht gefunden
03.11.2016 12:10:54
Oisse
Hallo Zusammen,
mir stellt sich folgendes Problem:
In drei Tabellenspalten könnten Inventarnummern vorhanden sein.
Also lasse ich diese drei Spalten nach "Inv" durchsuchen.
Hat mitunter soweit ganz gut geklappt, bis folgender Eintrag vorhanden war:
Maschinen-Inventarnummer: 123
Warum findet er hier das "Inv" nicht?
Auszugsweise der Code:

strFind = "Inv"
Set wsSearch = ThisWorkbook.Sheets(Tbl2)
'Suche in der Mappe in Spalte W (Wert der Zelle muss in diesem Fall komplett ü _
bereinstimmen, wenn das nicht gewünscht ist LookAt:= auf xlPart ändern)
With wsSearch.Range("G:I")
Set c = .Find(strFind, LookIn:=xlValues, LookAt:=xlPart)
If Not c Is Nothing Then
firstAddress = c.Address
Range(c.Address).Select      'Die Zeile in der der zu suchende Wert ist  _
markieren
Do
Range(c.Address).Select     'alle Zeilen in denen der zu suchende Wert  _
vorkommt markieren
If Range("C" & c.Row)  "" Then
'Finde den nächsten passenden Eintrag
Set c = .FindNext(c)
Else
MsgBox "In Zeile " & c.Row & " ist wahrscheinlich eine Inventarnummer zu  _
finden" & Chr(10) & _
"Lies dir diesen Eintrag durch:" & Chr(10) & _
c & Chr(10) & _
"Wenn eine Inventarnummer vorhanden ist, dann trage sie unbedingt ein"
Exit Sub
End If
Loop While Not c Is Nothing And c.Address  firstAddress
End If
End With

was bitte muss ich ändern?
Gruß Oisse

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Änderung diese Zeile...?
03.11.2016 13:51:57
robert
Set c = .Find("*" & strFind & "*", LookIn:=xlValues, LookAt:=xlPart)
Gruß
robert
AW: Änderung diese Zeile...?
03.11.2016 18:00:16
Oisse
Hallo Robert,
danke für die Antwort.
Leider funktioniert es immer noch nicht.
Noch eine Idee?
Gruß Oisse
Datei hier hochladen ? ging bei mir... Gruß
03.11.2016 18:50:27
robert
owT
AW: Zum Testen, auch für robert :-)
03.11.2016 19:36:07
Gerd
Hallo Oisse!
Set c = .Find(strFind, LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False)
Gruß Gerd
bei mir gehts ohne MatchCase:=False
03.11.2016 19:51:48
robert
Sub tt()
With Tabelle1.Range("G:I")
Set c = .Find("Inv", LookIn:=xlValues, LookAt:=xlPart)
If Not c Is Nothing Then
firstAddress = c.Address
Range(c.Address).Select
End If
End With
Gruß
robert
AW: bei mir gehts ohne MatchCase:=False
03.11.2016 20:51:38
Oisse
Hallo Robert,
ich hab nun deinen Code genommen und reinkopiert.
Funktioniert aber auch nicht.
Leider
Gruß Oisse
Anzeige
AW: bei mir gehts ohne MatchCase:=False
03.11.2016 20:51:45
Oisse
Hallo Robert,
ich hab nun deinen Code genommen und reinkopiert.
Funktioniert aber auch nicht.
Leider
Gruß Oisse
AW: Zum Testen, auch für robert :-)
03.11.2016 20:13:05
Oisse
Hallo Gerd,
danke auch dir für den Vorschlag. Funktioniert leider auch nicht.
Vielleicht sollte ich noch folgende Anmerkung machen.
Das Ereignis löst aus bei Worksheet_Change.
Es geht darum: Sobald ich neue Datensätze einfüge, (die bekomme ich aus einer anderen Tabelle), soll untersucht werden, ob in den Spalten G-I "Inv" vorkommt. Dann soll die MsgBox kommen.
Noch eine Lösung, woran das liegen könnte?
AW: Zum Testen hochladen
04.11.2016 07:24:56
Gerd
Hallo Oisse!
Da unsere Vorschläge in deiner Datei nicht ankommen, sollte dann doch besser deine Datei
hier im Forum ankommen, weil die Sache offenbar an Konstellationen liegt, die sich nur
daraus ersehen lassen. Es muss nicht unbedingt deine Originaldatei (Dummydaten) sein, sollte aber mit
dieser insofern übereinstimmen, dass das selbe Problem auftritt.
Gruß Gerd
Anzeige
AW: Zum Testen hochladen
04.11.2016 16:36:54
Oisse
Danke für die Rückmeldung.
Ich hänge eine Testtabelle an.
Wenn ich die Zeile 3 kopiere und darunter neu einfüge müsste der Hinweis kommen.
Es kommt aber keiner, auch dann nicht, wenn "Inv" für sich alleine steht.

Die Datei https://www.herber.de/bbs/user/109209.xlsm wurde aus Datenschutzgründen gelöscht


AW: Zum Testen hochladen
04.11.2016 16:37:27
Oisse
Danke für die Rückmeldung.
Ich hänge eine Testtabelle an.
Wenn ich die Zeile 3 kopiere und darunter neu einfüge müsste der Hinweis kommen.
Es kommt aber keiner, auch dann nicht, wenn "Inv" für sich alleine steht.

Die Datei https://www.herber.de/bbs/user/109209.xlsm wurde aus Datenschutzgründen gelöscht


Anzeige
AW: Zum Testen hochladen
04.11.2016 20:10:14
Michael
Hi,
entkommentiere doch mal das stop und gehe den Code mit F8 zeilenweise durch.
Dann wird Dir auffallen, das das Makro NIE an die Stelle kommt, wo das .find steht: wenn Du eine ZEILE kopierst, wird weder die allererste Bedingung erfüllt (target.column=23) noch die nachfolgenden, weil die alle daran gebunden sind, daß selection.count=1 ist - ist es aber nicht, bei einer kompletten Zeile.
Wenn man die Bedingungen auskommentiert, funktioniert das .find sehr wohl, zumindest, sobald man die Fehlermeldung in der Zeile 133:
If Target = Range("A" & Target.Row) Then

beseitigt hat: Target HAT mehrere Zellen, also schreibst Du für den ersten Wert Target(1), dann geht's.
Schöne Grüße,
Michael
P.S.: die ganze Geschichte ist ziemlich unaufgeräumt:
- Variablendeklarationen (Dim) gehören immer an den Anfang
- nicht alle Variablen sind geDimt (z.B. Tbl2); mache ein Option Explicit in die erste Zeile des Moduls, dann wirst Du darauf aufmerksam gemacht
- mache ALLE Abfragen, die zu einem Verlassen des Makros führen, am Anfang und verlasse es so bald wie möglich
- nachdem Du max. ganze ZEILEN (im Gegensatz zu SPALTEN) markierst, kannst Du Dir das .countlarge schenken - die Spalten sind nur max. ca. 16.000
- schalte vor jedem Schreiben ins Blatt die Events aus, sonst ruft sich das Makro laufend selbst auf, z.B. Zeile 35: Range("V" & Target.Row) = VKM
usw., ich mag nicht mehr
Anzeige
AW: Zum Testen hochladen
04.11.2016 21:54:26
Oisse
Hallo Michael,
danke für deine Hilfe. Du hast völlig recht, es ist absolut unaufgeräumt.
Wie du erkennen kannst, habe ich kaum Excel/vba Kenntnisse. Der ganze Code ist mehr oder weniger aus Codeschnipseln entstanden und per Copy and Paste irgendwie zum Laufen (mehr oder weniger gut) gebracht.
Dann kamen nach und nach immer mehr Wünsche hinzu usw.
Wenn du schreibst: ich mag nicht mehr, kann ich´s verstehen. Mir geht´s nicht anders. Aber ich muss es halt irgendwie zum Laufen bringen.
Also Danke für die Hinweise und dein Auseinandersetzen mit dem Durcheinander.
Schönes WE
Gruß Oisse
Anzeige
gedankliche Vorarbeiten
05.11.2016 12:13:30
Michael
Hi Oisse,
das Aufräumen des Codes ist eigentlich keine große Sache (naja, man sitzt schon ne Weile dran); eine effektive Hilfe scheitert eher an gewissen, logischen Unstimmigkeiten im Makro.
Überlege Dir mal (auf einem Blatt Papier), wie die Tabelle gemeinhin bedient wird und wie das Makro darauf reagieren soll, also:
- händische Eingabe in einer bestimmten Zelle (was soll in welcher Spalte passieren?)
- welche Aktionen werden durchgeführt, die mehrere Zellen betreffen (z.B. Zeile kopieren)?
- wie ist das benutzerfreundlich bedienbar? Hier meine ich insbesondere die Schleife mit dem .find: es wird nach "Inv" gesucht, dann wird die Zelle selektiert, aber der Anwender kann während des Makrolaufs dort keine Änderungen vornehmen, und sptätestens nach dem 5., selektierten "Inv" hat er vergessen, wo das 1. war. Vielleicht wäre eine extra Spalte für Inv-Nummern sinnvoll?
Wenn das mal logisch steht, kannst Du das z.B. rein informativ in eine Tabelle schreiben und hochladen, dann läßt sich das Makro evtl. "richtig" strukturieren.
Je gründlicher Du nachdenkst, desto besser wird dann das Makro...
Schöne Grüße,
Michael
Anzeige
AW: gedankliche Vorarbeiten
05.11.2016 20:36:31
Oisse
Hallo Michael und Danke für Deine Anregungen.
Ich habe mich also hingesetzt und Deinen wohlgemeinten Rat befolgt.
Hier also die Datei mit den Überlegungen zum Programmablauf:
https://www.herber.de/bbs/user/109228.xlsx
Übrigens habe ich die ominöse Fehlerzeile ersetzt durch:
 If Target(1)  "" Then 

und jetzt findet er auch das "Inv".
Danke für die Hilfe.
Schönen Gruß
Oisse
AW: gedankliche Vorarbeiten
07.11.2016 19:41:14
Michael
Hi Oisse,
anbei mal neue Datei zum Testen:

Die Datei https://www.herber.de/bbs/user/109259.xlsm wurde aus Datenschutzgründen gelöscht


Schöne Grüße,
Michael
Anzeige
AW: gedankliche Vorarbeiten
07.11.2016 22:02:16
Oisse
Servus Michael und
ich bin absolut begeistert. Da merke ich erst, wie weit weg ich bin von sauberem Code-schreiben und v.a. vom Verständnis wie was funktioniert.
Es funktioniert (fast) alles perfekt. Bis auf: Wenn eine kleinere Menge verkauft wird, als noch vorhanden ist, soll eine neue Zeile eingefügt werden und die restliche Menge aktualisiert werden.
Es kommt jedoch gleich die Fehlermeldung, dass die Ware bereits verkauft worden ist und ich hier keine Änderungen mehr vornehmen darf. Dann wird die verkaufte Stückzahl erhöht auf die vorhandene Stückzahl.
Aber, wie bereits erwähnt bin ich auch so absolut begeistert und möchte mich herzlich bei dir bedanken.
Das hat dich ja unglaublich Zeit und Mühe gekostet meinen verkorksten Code so umzuschreiben.
Herzliche Grüße
Oisse
Anzeige
Korrektur meiner vorherigen Nachricht
07.11.2016 22:20:49
Oisse
Sorry Michael,
der Code funktioniert einwandfrei, es war lediglich in der Detailnummer kein Wert eingetragen und deshalb hat es mit der letzten Zeile nicht funktioniert.
Allerdings ist die Formel in Spalte T (Angebotspreis) weg.
Wie bereits erwähnt. Absolut begeistert.
Gruß Oisse
Korrektur meiner vorherigen Nachricht
08.11.2016 17:55:17
Michael
Hi Oisse,
dann bin ich ja beruhigt - wirklich ausgiebig getestet hatte ich das natürlich nicht...
Ich denke, das liegt an dem Code-Teil:
        Range("V" & Target.Row) = VKM
Application.EnableEvents = False
Rows(tr + 1).Insert Shift:=xlDown
Rows(tr).Copy Rows(tr + 1)
Application.CutCopyMode = False
Stop
Range("E" & tr + 1) = Ur - Ver
Cells(tr + 1, 14).Resize(, 11) = ""  'xxx
'        Target.Offset(1, 0) = ""
'        Target.Offset(1, 1) = ""
'        Target.Offset(1, -1) = ""
'        Target.Offset(1, -2) = ""
' "Loch" ***
'        Target.Offset(1, -4) = ""
'        Target.Offset(1, -5) = ""
'        Target.Offset(1, -6) = ""
'        Target.Offset(1, -7) = ""
'        Target.Offset(1, -8) = ""
'        Target.Offset(1, -9) = "" ' 23-9=14, bis 24, also 14 mit resize(,11)
Range("M" & tr) = ""
' Target.Offset(0, -10) = ""
Application.EnableEvents = True

Oh sch... da hatte ich glatt das "Loch zwischen (1,-2) und (1,-4) übersehen, das Du wegen T ausgelassen hattest.
Wenn ich mich jetzt nicht verzählt habe, kannst Du die mit 'xxx markierte Anweisung durch diese beiden ersetzen:
        Cells(tr + 1, 14).Resize(, 6) = ""  ' also Spalten 14 bis +(6-1)=19
Cells(tr + 1, 21).Resize(, 3) = ""       ' also Spalten 21 bis 23

Also gut: optimieren läßt sich immer, auch mein Vorschlag, aber ich wollte nicht noch mehr Zeit reinstecken.
Ich hoffe, mit dem aufgehübschten Grundgerüst ist es einfacher für Dich, weitere Features einzubauen...
Happy Exceling,
Michael
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige