gesuchten Teil aus Zellen in String schreiben

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: gesuchten Teil aus Zellen in String schreiben
von: Alex
Geschrieben am: 24.11.2015 16:15:46

Hallo liebes Forum,
Ich habe mal wieder ein Problem mit dem ich nicht weiterkomme.
Ich habe einen Text in dem in bestimmten Zellen Parameter vorkommen z.B. par7.
Jetzt möchte ich all diese Zellen durchgehen und prüfen ob dort ein Parameter vorkommt. Wenn dieser vorkommt will ich diesen in einem String ablegen.
Dann sollte ich ja einen String haben in dem z.b. "Par7" steht. Damit kann ich dann die jeweilige Beschreibung aus einer anderen Tabelle suchen, das bekomme ich soweit hin.
Meine Idee war es jetzt den Text der Zellen in einen String zu schreiben und dann herauszufinden an welcher stelle par steht damit ich dann die anderen Teile mid left/right etc. wegschneiden kann. Nun funktioniert das aber gar nicht weil lStelleParameter immer als 0 rausgegeben wird.
Ich bin mir auch sicher, dass es einen besseren Weg geben sollte, aber mit dem like Befehl kann ich nur rausfinden ob ein Parameter vorhanden ist. Auch bei der find funktion habe ich noch nicht ganz verstanden ob und wie ich den gesuchten Teil in einen String schreiben kann.

lZeileDerBeschreibung = 24
While lZeileDerBeschreibung < lLetzteZeile
sDaKönnteParameterSein = Sheets(1).Cells(lZeileDerBeschreibung, "C")
lStelleParameter = InStr(sDaKönnteParameterSein, "par")
lZeileDerBeschreibung = lZeileDerBeschreibung + 3
Wend

Ich bedanke mich schonmal bei allen, die soweit gelesen haben! Ich hoffe es ist klar geworden was ich machen möchte.
Über jegliche Hilfe würde ich mich sehr freuen!
Gruß
Alex

Bild

Betrifft: AW: gesuchten Teil aus Zellen in String schreiben
von: Michael
Geschrieben am: 24.11.2015 16:32:05
Hi Alex,
das wundert mich nicht...
... denn wenn im Text Par7 steht und Du nach par suchst, wird es wegen der Großschreibung nicht gefunden.
Hier eine Sitzung aus dem "Direktfenster" (das öffnest Du im VB mit Strg+g):

debug.print instr("Dein Parameter","par")
 0 
debug.print instr(1,"Dein Parameter","par",vbTextCompare)
 6 

Soll heißen, mit vbTextCompare wird die Schreibweise ignoriert.
Ansonsten finde ich Deine Frage etwas verwirrend; lad doch ne Beispieldatei hoch, aus der hervorgeht, was Du hast und was Du haben willst.
Schöne Grüße,
Michael

Bild

Betrifft: AW: gesuchten Teil aus Zellen in String schreiben
von: Michael (migre)
Geschrieben am: 24.11.2015 16:58:18
Hallo Alex!
Schließe mich allen Ausführungen meines Namensvetters (@ Michael: Servus!) vollinhaltlich an.
Evtl. für Dich zur Überlegung/Klärung, damit Dir entsprechend geholfen werden kann - Du lässt nämlich einige Infos aus; möglicherweise aber hast Du diese Infos für Dich selbst noch nicht, was bereits ein erster Teil einer Lösung sein kann:
Ich habe einen Text in dem in bestimmten Zellen Parameter vorkommen z.B. par7.
Einerseits: in welchen Zellen, wo befinden sich diese (in einer Spalte,... ). Andererseits: kommt da immer "par7" genauso vor, oder auch "PAR7" oder "Par07". Wie hebt sich das jeweilige "Par#" vom restlichen Fließtext ab? Kommt da danach zB immer ein Leerzeichen (s. Bsp. unten)?
Jetzt möchte ich all diese Zellen durchgehen
Von wievielen Zellen sprechen wir hier? Das kann uU die Herangehensweise an das Isolieren von "Par" aus den jeweiligen Texten massiv beeinflussen.
Schau Dir mal dieses Beispiel an (Kommentare im Code):

Sub Parameter()
''' Beispieltexte in A1:A6
''' Lorem ipsum dolor par8 sit amet
''' Par7 quod consectetuer
''' adipiscing elit par9 quod libet
''' Lala par20 sum sum
''' blablablabl PAR200 blablub
''' Fred jagt im komplett Par23 verwahrlosten Taxi
    Dim Pos As Integer
    Dim Ende As Integer
    Dim Parameter As String
    Dim Text As String
    Dim i As Integer
    
    ''' Zelltexte in Spalte A durchgehen und die "Parameter" isolieren
    ''' unter der Annahme, dass nach dem relevanten "Par" ein Leerzeichen
    ''' folgt, die Ziffer aber direkt auf "Par" folgt (zB " aaa Par8 bbb ")
    
    For i = 1 To Tabelle1.Cells(Tabelle1.Rows.Count, 1).End(xlUp).Row
        Text = Cells(i, 1).Value 'Zelltext wird in Variable eingelesen
        Pos = InStr(1, Text, "Par", vbTextCompare) 'Position von Par im Text bestimmen
        Ende = InStr(Pos, Text, " ") 'Position des auf Par nächstfolgenden Leerzeichens  _
bestimmen
        
        Parameter = UCase(Mid(Text, Pos, Ende - Pos)) 'Textteil von Pos bis Ende in Groß _
buchstaben
        Debug.Print Parameter 'Parameter ausgeben
    Next
End Sub
LG und schönen Abend
Michael

Bild

Betrifft: genau.
von: Michael
Geschrieben am: 24.11.2015 17:55:37
Hi zusammen,
(sei gegrüßt, Michael, long time no see)
weil mir Michaels Blindtext so gefallen hat, habe ich noch ein bißchen herumgespielt:

Option Explicit
Sub ParSuchen()
Dim c As Range
Dim ausgabe As String, erster As String, Text As String
Dim ende As Long, posi As Long
Const suchbegriff = "par"
Set c = Cells.Find(suchbegriff, LookIn:=xlValues)
If Not c Is Nothing Then
  erster = c.Address
  Do
    Text = c.Text
    posi = InStr(1, Text, suchbegriff, vbTextCompare)
      'Position von Par im Text bestimmen
    ende = InStr(posi, Text, " ")
      'Position des auf Par nächstfolgenden Leerzeichens
    ausgabe = ausgabe & Mid(Text, posi, ende - posi) & ", "
    Set c = Cells.FindNext(c)
  Loop While Not c Is Nothing And c.Address <> erster
End If
MsgBox ausgabe
End Sub

(in Pascal war pos ein Schlüsselwort, deshalb habe ich mir posi angewöhnt)
Falls es vorkommen kannt, daß "par" mehrfach in einer Zelle vorkommt, müßte man "innen" noch eine weitere Schleife verwenden.
Macht's gut, Gruß,
Michael

Bild

Betrifft: AW: Autsch... (OT)
von: Michael (migre)
Geschrieben am: 24.11.2015 18:18:15
Michael,
in Pascal war pos ein Schlüsselwort
... das kann ja dann mal richtig in die Hose gehen ;-).
long time no see
Stimmt. Bin aktuell zwar hier unterwegs, versuche auch die eine oder andere Frage zu beantworten, aber ich hab sonst einiges zu tun. Wie geht's bei Dir? Hast Du Deine Krypto-Schulung gut rüber gebracht?
weil mir Michaels Blindtext so gefallen hat
Apropos Blindtext: Du kennst doch sicher Bob Ross? Bob Ross + Blindtext = http://www.bobrosslipsum.com/
Schönen Abend,
Michael

Bild

Betrifft: AW: Autsch... (OT)
von: Michael
Geschrieben am: 24.11.2015 19:30:39
Hi Michael,
tja, vielleicht sollten wir zur OT-Kommunikation echt mal auf mail ausweichen.
Ja, pos war das Gegenstück zu instr., aber egal - ganz wohl ist mir bei "Text" auch nicht, aber es funzt ja klaglos.
Die Kryptogeschichte ist leider mangels TN-Interesse ausgefallen; hätte ich nicht erwartet, weil ja ein Buch nach dem anderen zum Thema erscheint.
Jetzt weiß ich auch nicht: auf der Platte vergammeln lassen, irgendwo hochladen, bewerben? Aber es ist kein fertiges Produkt, und das würde ich auch gar nicht anbieten wollen.
Mal sehen, vielleicht extrahiere ich bis morgen mal was...
Lg,
Michael

Bild

Betrifft: AW: Das ist ein guter Vorschlag...
von: Michael (migre)
Geschrieben am: 24.11.2015 21:18:52
Michael,
tja, vielleicht sollten wir zur OT-Kommunikation echt mal auf mail ausweichen.
...sonst müllen wir hier die Fäden voll. Werde entsprechende Info noch (vermutlich in diesem Faden) nachreichen.
Tut mir leid wegen der Kryptogeschichte - ist immer schade, wenn soviel Vorbereitung und Arbeit dann unverrichteter Dinge liegen bleibt. Aber wer weiß, "vergammeln" muss es nicht - Dir fällt schon was ein!
Und Aber es ist kein fertiges Produkt, und das würde ich auch gar nicht anbieten wollen.
...kann ich zwar nachvollziehen, aber glaub mir - den Ethos haben nicht viele. Möchte nicht anfangen zu zählen wieviele unfertige Produkte ständig angeboten werden. Das Nachbessern von unfertigen Produkten nennt sich dann auch bisweilen "Geschäftsmodell" ;-).
Ich schau jetzt mal, ob ich mit den Angaben vom Alex irgendwas (?!) produzieren kann - wir lesen uns morgen vermutlich hier!
Schönen Abend
Michael

Bild

Betrifft: AW: OT: You've got Mail ;-)! LG Michael (owT)
von: Michael (migre)
Geschrieben am: 25.11.2015 12:50:07


Bild

Betrifft: OT: Pidgin-English kannst du schon gut! ;-) orT
von: Luc:-?
Geschrieben am: 24.11.2015 18:24:21
Gruß, Luc :-?

Besser informiert mit …

Bild

Betrifft: AW: OT: Pidgin-English kannst du schon gut! ;-) orT
von: Michael
Geschrieben am: 24.11.2015 19:33:08
Hi zusammen,
wenn wir uns schon in die Pidgin-Welt begeben, dann aber gleich mit wiki:
long time no see (= lange nicht gesehen)
kommt vom chinesischen „好久不见 hao jiu bu jian“ (sehr – lange – nicht – treffen)
(es macht mich total fertig, daß die chin. Zeichen so im Quelltext stehen und ohne irgendwas [also z.B. &chin3557;] angezeigt werden)
@Michael: Der Bob Ross ist klasse! Mein Lieblings-Schlafmittel. Wenn er die schönen Bilder nicht immer mit Bäumen verstellen würde!!!
Schöne Grüße rundrum,
M.

Bild

Betrifft: AW: Pidgin hin oder her, Hauptsache Tauben :-) oT
von: Michael (migre)
Geschrieben am: 24.11.2015 21:20:02


Bild

Betrifft: Beispieldatei mit bei
von: Alex
Geschrieben am: 24.11.2015 19:11:28
Hallo Michael und Michael :)
Ich glaube mit einem von euch beiden schonmal wegen dem selben Projekt hier geschrieben zu haben.. oder es gibt noch mehr Michaels. Naja mal sehen ob es wem bekannt vorkommt.
https://www.herber.de/bbs/user/101777.xlsx
So wie in der Datei soll es am Ende aussehen.
In dem Beispiel sind alle Probleme enthalten die ich momentan sehe.. Par1 kommt in beiden Fällen vor, sollte aber nur 1 mal unten im grünen Bereich auftauchen. Im 2. Beispiel sind 2 Parameter in einem Text.
und es handelt sich einmal um einen einstelligen und einmal um einen 2 Stelligen Parameter.
Wenn ich es schaffe aus allen Zellen "par1" oder was auch immer in einen String zu bekommen, dann denke ich, dass ich die Abfrage mit der anderen Seite hinbekomme. Aber ich wusste nicht genau wie ich das hinbekomme.
Ich habe die bisherigen Vorschläge nur kurz angesehen und nicht direkt verstanden. Aber werde gleich versuchen ob ich damit weiterkomme. Da das aber etwas Zeit in Anspruch nimmt wollte ich schonmal eine Beispieldatei hochladen.
Gruß Alex

Bild

Betrifft: weiß nicht...
von: Michael
Geschrieben am: 24.11.2015 19:41:40
Hi Alex,
habe mal drübergesehen und kenne es, glaube ich, nicht.
Egal. Ich muß aus dem Haus, also hätte ich gesagt, wenn der liebe Michael es bis morgen nicht erledigt hat (was sehr *un*wahrscheinlich ist), versuche ich mich evtl. morgen dran.
(immer diese Sprach-Logik; I ain't gonna stay at home no mo')
(hait trink i ka bier nimma)
Schönen Abend,
M.

Bild

Betrifft: AW: Mein lieber Schwan...
von: Michael (migre)
Geschrieben am: 24.11.2015 21:13:32
Alex,
...ausgehend von Deinem Eröffnungsbeitrag sind wir jetzt schnell in einer ganz anderen Umgebung gelandet. Evtl. lade beim nächsten Mal gleich ein Beispiel mit hoch; ist nicht böse gemeint, aber dieses "Formular" ist keine leichte Spielwiese. Nichtsdestotrotz (@ Michael und Luc: Wie geht da die Pidgin-Variante? "Nothingbutinspite"? ;-) )...
Ich glaube mit einem von euch beiden schonmal wegen dem selben Projekt hier geschrieben zu haben..
Also ich war's nicht, sorry.
er es gibt noch mehr Michaels.
Das ist fast schon eine universelle Wahrheit. Heißt ja fast jeder zweite so (glaub ich manchmal)...
So wie in der Datei soll es am Ende aussehen.
Mein lieber Alex - was jetzt? In der Datei sind zwei befüllte Tabellenblätter, eines davon zeigt das "Formular", das andere eine Parameterliste. Worum geht's jetzt im Endeffekt? Soll dann automatisch die Parameterliste aus dem Formular heraus erstellt werden?
Was ich beim Formular verstanden habe: Ab Zelle C24 steht alle drei Zeilen (also dann wieder C27, C30...) der auszulesende Text - in dem kann aber "Par###" auch mehr als einmal vorkommen. Dazu ergeben sich abermals Fragen:
- Was hat es dann mit dem "grünen" Bereich auf sich? Ist das nur im Beispiel so, oder ist auch dieser "Block" fest bzw. soll von dort "Par###" ausgelesen werden? Ich versteh's noch nicht, sorry.
- Oder soll sich der "grüne" Bereich eben erstellen lassen, nachdem aus dem darüber liegenden Bereich die jeweiligen Parameter isoliert wurden?
- Wenn in einem Text in Spalte C (also etwa C27 im Beispiel) zweimal "Par###" vorkommt - wonach entscheidet sich dann, welcher davon ausgelesen werden soll? Oder ist gar geplant, dass über alle bereits isolierten "Par###" eine Liste geführt wird, damit diese Werte nicht doppelt ausgelesen werden?
- Woran kann erkannt werden, dass es keine zu überprüfenden Zellen mehr gibt? Soll heißen: Wenn ich, wie im Beispiel in C24 starte und dann weiter jede 3. Zelle nach "Par###" durchsuche - gibt es dann einen festen Punkt wo ich mit dem Suchen aufhören kann?
- Und in der Parameterliste findet sich zB "Par1 -- Ofentemperatur"... Soll das "Ofentemperatur" auch ausgelesen werden? Das steht so nämlich nirgends...
Insgesamt sehr konfus; ist wieder nicht böse gemeint, ich weiß wie oft man selbst im Detail ist, und vergisst, dass andere weder von der Branche, der Firma, dem Formular und der Problemstellung eine Ahnung oder auch nur Idee haben - aber ohne uns darüber im Klaren zu sein, ist es schwierig Lösungen zu produzieren.
Ich bin heute nicht mehr ewig online, d.h. ich werde evtl., so ich irgendeine Idee davon habe a) was Du willst und b) wie das umsetzbar ist, heute noch eine "Lösung" hochladen, ansonsten dann morgen - evtl. hast Du dann ja noch ein paar klärende Infos nachgereicht.
LG
Michael

Bild

Betrifft: AW: Mein lieber Schwan...
von: Alex
Geschrieben am: 25.11.2015 00:37:21
Ja es tut mir leid, wenn das ganze nicht eindeutig ist. Manchmal ist es schwer wieder von einem "neutralen" Punkt auf das Problem zu sehen, weil ich mich schon so reingedacht habe.
Also das Formular soll ausgefüllt werden.
Die Parameterliste ist als 2. Tabellenblatt schon da und soll auch einfach ergänzt/erweitert werden können.
Der grüne Bereich soll von dem Programm jetzt ausgefüllt werden.
Die Texte aus dem die Parameter ausgelesen werden sind Funktionen die aus einer anderen Datenbank dort eingetragen werden.
Nun sollen unten die verwendeten Parameter aufgeführt werden, damit jeder der das ausgedruckte 1. Formular direkt nachvollziehen kann was dahinter steht bzw. wie der Startwert ist.
Die zu prüfenden Zellen werden durch das selbe Programm einen Schritt vorher geschrieben, da habe ich einen Counter der mir sagt in welcher Zeile ich jetzt bin (lFunktionsZeile).
Also jeder Parameter der in den Texten soll genau 1 mal unten aufgelistet werden mit: Nr. Beschreibung und Startwert.
Ich hoffe das konnte ein wenig Licht in die Sache bringen
Gruß

Bild

Betrifft: AW: Okay, ich schau mir das morgen an...
von: Michael (migre)
Geschrieben am: 25.11.2015 00:57:02
Alex,
...denn bisher bin ich noch auf keine zündende Idee gekommen, und jetzt ist es mir zu spät, mir das mit Deiner Ergänzung anzuschauen.
Ich schau morgen drüber, versprochen!
LG und gute Nacht
Michael

Bild

Betrifft: AW: So...
von: Michael (migre)
Geschrieben am: 25.11.2015 12:36:31
Hallo Alex!
Wie man bei uns sagen würde: Zache G'schicht! Hier mal ein Ansatz: https://www.herber.de/bbs/user/101797.xlsm
Schau Dir die Tabelle1 an (ist Deine Bsp-Tabelle) und klicke dann auf die Schaltfläche "Par" - und schau was im grünen Bereich passiert. Erklärungen stehen neben der Tabelle.
Es ist nur ein Makro in der Mappe vorhanden (ExtPar) - in dem hab ich (auskommentiert) auch noch eine Möglichkeit vorgesehen, Dir die Par-Nr in einer Message-Box auszugeben; kannst das ja evtl probieren.
Ich hab zwar jetzt was produziert, aber ob das auch ist, was Du Dir vorstellst, kann ich beim besten Willen nicht sagen.
Schau einfach mal rein, und gib dann Bescheid!
LG
Michael

Bild

Betrifft: AW: So...
von: Alex
Geschrieben am: 25.11.2015 13:13:13
Hallo,
Super vielen Dank! Damit kann ich aufjedenfall weiter arbeiten. Zwei Fragen hätte ich aber noch:

If Not objSammlung.exists(CStr(Replace(strParam, "Par", "", 1, , vbTextCompare))) Then
                objSammlung.Add CStr(Replace(strParam, "Par", "", 1, , vbTextCompare)),  _
strParam
End If
Diesen Teil des Codes verstehe ich nicht so recht, aber soweit ich das verstehe wird überprüft ob der Parameter schonmal vorgekommen ist und wenn nicht, dann wird er in die Sammlung geschrieben.
Mit welchem Befehl kann ich diese Sammlung wieder leeren?
strText = Mid(strText, CLng(intTextEnde), Len(strText))
            
            intTextStart = InStr(1, strText, "Par", vbTextCompare)
            
            If intTextStart > 0 Then
Das hier dürfte der Teil sein der nach dem 2. Parameter im Text sucht.. auch hier kann ich schwer nachvollziehen wie es geht. Ich würde gerne einen Alarm oder sowas auslösen wenn mehr als 2 Parameter in einem Text enthalten sind.. Ich weiß aber nicht wie die If Bedingung dafür aussehen müsste.
Danke nochmal für alles :)

Bild

Betrifft: AW: So...
von: Michael (migre)
Geschrieben am: 25.11.2015 13:56:13
Hallo Alex!
Super vielen Dank! Damit kann ich aufjedenfall weiter arbeiten
Freut mich wirklich zu hören!
aber soweit ich das verstehe wird überprüft ob der Parameter schonmal vorgekommen ist und wenn nicht, dann wird er in die Sammlung geschrieben.
Das verstehst Du vollkommen richtig. Ich benutze hier ein Dictionary-Objekt. Im Grunde funktioniert das wirklich wie ein Wörterbuch - es speichert Werte-Paare (je ein eindeutiger Schlüssel erhält einen beliebigen Wert - jeder Wert ist über seinen eindeutigen Schlüssel identifzierbar).
Was ich mache ist Folgendes: die "Par"s im Text werden ja immer mit ihrer zugehörigen Ziffernfolge extrahiert, also wir suchen zwar "Par", finden aber "Par25", weil die Ziffern direkt folgen und wir erst mit dem auf die Ziffern folgenden " " den Textteil beenden. Für unser Dictionary mache ich jetzt Folgendes: Ich trenne vom Wert "Par25" die Zeichenfolge "Par", damit bleibt "25" über. Diese 25 setze ich nun als Schlüssel im Dictionary und weise diesem Schlüssel den Wert "Par25" zu.
Stoßen wir also bei der nächsten "Par"-Folge wieder auf "Par25" passiert das Gleiche, nur dass wir prüfen ob der Schlüssel "25" schon existiert - ist das der Fall, wird eben kein neues Wertepaar in das Dictionary geschrieben.
Mit welchem Befehl kann ich diese Sammlung wieder leeren?
Zum leeren des Dictionary gibt es grds. zwei Möglichkeiten:
Du kannst ALLE Einträge löschen, da reicht dann (bezogen auf diesen Code):

objSammlung.RemoveAll
Du kannst bestimmte Elemente löschen:
arrSammlungListe = objSammlung.keys
objSammlung.Remove (arrSammlungListe(0))
Hier lesen wir zuerst ALLE vorhandenen Schlüssel in ein Datenfeld ein und entfernen dann genau das Element aus der Sammlung das dem 0ten, 1sten... Schlüssel im Schlüssel-Datenfeld entspricht.
Das hier dürfte der Teil sein der nach dem 2. Parameter im Text sucht
Ja, das siehst Du richtig. Was ich hier mache ist, dass ich nicht nochmal den gesamten Zelltext nach "Par" durchsuche, weil das ja wieder nur das erste Auftreten liefern würde - das kennen wir aber schon. Was wir aber auch kennen nach dem ersten Auftreten ist die Position des nachfolgenden " ". Also verändere ich den Suchtext (= Originalzelltext) und sage dieser beginnt erst bei der Position des " " und geht bis ans Ende des Originaltextest. Damit fällt das erste "Par" raus und wenn danach noch eins kommt, finden wir es.
würde gerne einen Alarm oder sowas auslösen wenn mehr als 2 Parameter in einem Text enthalten sind
Das ist jetzt eben der Fall, bei dem evtl. ein bisschen anders vorgegangen werden muss. Darüber muss ich noch nachdenken, wird aber auf eine Art Schleife rauslaufen. Ich meld mich diesbzgl. nochmal!
LG
Michael

Bild

Betrifft: AW: So...
von: Alex
Geschrieben am: 25.11.2015 14:44:28
Hmm... Also ich weiß nicht ob eine Schleife nötig ist. Bisher sind maximal 2 Parameter pro Text vorhanden.. Ich habe jetzt einfach


'Suche nach einem 2. Parameter in der selben Zelle
            
strText = Mid(strText, CLng(intTextEnde), Len(strText))     'Setzt den Text nach dem 1. Par als  _
neue Textvariable
            
intTextStart = InStr(1, strText, "Par", vbTextCompare)
            
If intTextStart > 0 Then 'Wenn 2. Par vorhanden ist
            
      intTextEnde = InStr(intTextStart, strText, " ", vbTextCompare)
      strParam = Mid(strText, intTextStart, intTextEnde - intTextStart)
                
         If Not objSammlung.exists(CStr(Replace(strParam, "Par", "", 1, , vbTextCompare))) Then
                    objSammlung.Add CStr(Replace(strParam, "Par", "", 1, , vbTextCompare)),  _
strParam
         End If
            
End If
strText = Mid(strText, CLng(intTextEnde), Len(strText))     'Setzt den Text nach dem 2. Par als  _
neue Textvariable
            
intTextStart = InStr(1, strText, "Par", vbTextCompare)
            
If intTextStart > 0 Then 'Wenn 3. Par vorhanden ist
            
   intTextEnde = InStr(intTextStart, strText, " ", vbTextCompare)
   strParam = Mid(strText, intTextStart, intTextEnde - intTextStart)
                
    If Not objSammlung.exists(CStr(Replace(strParam, "Par", "", 1, , vbTextCompare))) Then
                    objSammlung.Add CStr(Replace(strParam, "Par", "", 1, , vbTextCompare)),  _
strParam
    End If
            
End If
nochmal hinzugefüg, damit müsste ich 3 Parameter pro Text raus schreiben können. Eventuell würde ich noch eine Abfrage machen und falls ein 4. Par gefunden wird Alarm schalten.
Also sowas wie
If intTextStart > 0 Then msgbox("4. Parameter in Zelle " & i & ":3 gefunden!"  
Oder kann ich den Codeteil nicht einfach mehrfach nutzen?

Bild

Betrifft: AW: Letztversion
von: Michael (migre)
Geschrieben am: 25.11.2015 15:56:30
Hallo Alex!
Also ich weiß nicht ob eine Schleife nötig ist. Bisher sind maximal 2 Parameter pro Text vorhanden..
Aber ich ;-) - ich hab jetzt auch die Sache mit dem "Alarm, wenn mehr als 2" ignoriert - wenn wir schon herausfinden können, ob es mehr als 2 gibt, dann können wir die auch gleich rausschreiben, oder? Ein Alarm bringt uns da weniger.
Oder kann ich den Codeteil nicht einfach mehrfach nutzen?
Nein, das würde ich nicht - deswegen gleich die Schleifen-Idee bzw. wie oben beschrieben: vergiss den Alarm und hol Dir gleich alle Werte raus!
Hier die überarbeitete Version: https://www.herber.de/bbs/user/101802.xlsm
Jetzt werden ALLE "Par"s einer Zelle ausgelesen (auch 4, 5, ... ) und dann entsprechend aufgelistet.
Würde mich freuen, wenn Du dazu noch kurz Bescheid gibst! Viel Erfolg mit dem Projekt!
Michael

Bild

Betrifft: AW: Letztversion
von: Alex
Geschrieben am: 27.11.2015 09:52:45
Ich hatte gestern leider keine Zeit mehr... funktioniert natürlich super :)
Allerdings habe ich noch etwas Probleme beim nachvollziehen...

strText = Mid(strText, lngTextEnde, Len(strText))  'Schneidet von dem Text in der Zelle den  _
Teil bis hinter dem 1. par ab. 
Damit in der Schleife weiter nach Par gesucht werden kann ohne den 1. Par zu finden.

Hab ich das so richtig verstanden? Falls ja.. ist das len nicht überflüssig? Da man ja den ganzen restlichen Text haben will?

Select Case InStr(lngTextStart, strText, " ", vbTextCompare) 'Sucht das nächste Leerzeichen  _
nach "Par"
Case Is > 0
lngTextEnde = InStr(lngTextStart, strText, " ", vbTextCompare) 'Wenn es eins gibt, dann hört  _
der Parameter dort auf.
Case Else
lngTextEnde = Len(strText) 'Wenn es keines mehr gibt ist der Parameter der Rest des Texts
End Select
Und habe ich die Caseabfrage richtig verstanden?
Danke vielmals :)

Bild

Betrifft: AW: Letztversion
von: Alex
Geschrieben am: 27.11.2015 09:58:21
Oh und was ich vergessen habe.. Kann ich am Ende die Pars nach Nummer sortieren? Momentan kommen sind sie ja nach vorkommen im Text sortiert..
Also so das am Ende Par1, Par2, Par3, etc da steht statt Par2, Par3, Par1

Bild

Betrifft: AW: Letztversion
von: Michael (migre)
Geschrieben am: 27.11.2015 13:52:50
Hallo Alex!
Schneidet von dem Text in der Zelle den Teil bis hinter dem 1. par ab.
Im Grunde ja. Wir definieren den Text der Zelle ab der Position des Leerzeichens nach dem zuvor gefundenen "Par". Da wir ja nun nicht nur nach 2 "Par" suchen, sondern nach allen Vorkommen, wird der durchsuchte Text durch jedes gefundene "Par" kürzer - der neue durchsuchte Text beginnt immer erst hinter dem vorher gefundenen "Par", das damit nicht nochmal gefunden wird.
Und habe ich die Caseabfrage richtig verstanden?
Fast ;-). Nachdem wir nun ja mit einem immer kürzer werdenden Text zu tun haben (s.o.) könnte theoretisch der Fall auftreten, dass der Originaltext mit "... Par50" aufhört. Dann kommt also nach dem "Par" kein " " mehr, auf das wir uns bisher aber als Begrenzung des "Par"-Wertes verlassen haben. D.h. wenn kein " " mehr kommt, dann setzen wir das Ende einfach auf die verbliebene Textlänge.
Kann ich am Ende die Pars nach Nummer sortieren?
Da hast Du meine Anmerkung in der Tabelle wohl nicht gelesen? Sortieren ist aktuell nicht berücksichtigt. Das Sortieren des Dictionary ist noch etwas aufwändiger; die Dictionary-Inhalte müssen in ein Array exportiert werden, dann im Array sortiert und dann in die Tabelle geschrieben werden - das war mir bis jetzt einfach zu viel Aufwand. Evtl. komm ich über's Wochenende bzw. am Montag noch dazu, aber nicht versprochen...
LG
Michael

Bild

Betrifft: AW: Na gut, vorm Wochenende...
von: Michael (migre)
Geschrieben am: 27.11.2015 14:48:05
Alex,
...noch ein kleiner Pfusch. Hier die neue Version mit Sortierung: https://www.herber.de/bbs/user/101850.xlsm
Das ist allerdings jetzt ganz schnell zusammengeschustert für Deinen Anwendungsfall - ist so keinesfalls auf- und ausbaufähig, die Sortierung hab ich mir schnell mal aus dem Microsoft Developer Network geklaut. Aber für Deinen Zweck sollte es reichen!
LG und schönes Wochenende
Michael

Bild

Betrifft: noch ein Ansatz
von: Michael
Geschrieben am: 27.11.2015 15:10:25
Hi zusammen,
ich habe auch noch a bissl dran herumgebastelt: https://www.herber.de/bbs/user/101851.xlsm
Insbesondere werden bei Bedarf weitere Zeilen eingefügt und eine Liste nicht gefundener Parameter (gelb markiert) ausgegeben.
LG und schönes Wochenende,
Michael
P.S. @Michael: jetzt hammer uns doch doppelte Arbeit gemacht; ich hoffe, Du bist nicht stinkig, aber es hat mich einfach interessiert, wie das hinzubekommen ist.
Blöd, daß die ganzen Dinger (array, dic) nicht "direkt" sortieren können. Das einzubauen würde MS ein müdes Lächeln kosten und unsereins einen Haufen Arbeit sparen...

Bild

Betrifft: AW: Na bumm...
von: Michael (migre)
Geschrieben am: 27.11.2015 15:43:35
Alex,
...das sind Geschenke von uns vorm Wochenende, was? Muss an der vorweihnachtlichen Stimmung liegen ;-)
@ Michael:
Hab ich ja gewusst, dass Dich das nicht in Ruhe lässt :-). Wieso sollt ich böse sein? Erstens bin ich auch der Meinung, dass uns Vielfalt nirgendwo schadet, schon gar nicht bei Lösungsansätzen. Zweitens sehen vier Augen immer mehr und programmieren zwei Hirne immer besser. Drittens ist das ja auch der Sinn vom Forum, oder? und Viertens) bin ich ein fauler Hund, und wenn ich grad selber viel zu tun hab, dann interessierts mich oft einfach nicht, Dinge für spezielle Anwendungsfälle noch besser als nur "working" hinzubiegen.
Stimmt, das diese Funktionalität nicht integriert ist, ist eigentlich arm, wenn man bedenkt, WAS eben schon alles funktioniert und geht... naja...
Rundherum ein schönes WE, @ Michl: wir lesen uns wieder!
LG
Michael

Bild

Betrifft: AW: Na bumm...
von: Alex
Geschrieben am: 27.11.2015 17:35:18
Wow super vielen Dank.. hmm das ist ja ätzend, dass es so aufwendig ist das dic zu sortieren..
Die letzte Version kann sogar die Parameter ausfüllen.. ich habe das inzwischen mit einer If-Schleife die jeden Zelle in "Parameter" durchgeht und guckt ob das gerade der Parameter ist den ich eintragen will.. ist wahrscheinlich von der Perfomance nicht perfekt.. Wenn ich gewusst hätte das noch was kommt hätte ich wohl gewartet.. aber es ist ja auch doof alles machen zu lassen :D
Ich muss ja noch kleine Abhandlung zu dem Projekt schreiben und dafür muss ich den Code ja auch selbst verstehen :D
Ich wünsche euch beiden eine Frohe Weihnacht :)
und allen anderen die dies lesen natürlich auch^^

Bild

Betrifft: OT @Michael
von: Michael
Geschrieben am: 27.11.2015 17:39:24
variatio delectat,
ja, aber unnütze Arbeit eigentlich nicht. Trotzdem: wenn mich was reizt, dann bleib ich dabei.
Ich bin mir schon wie bei einem Programmierwettbewerb vorgekommen, und das motiviert natürlich auch.
Aber das wäre ja vielleicht insgesamt mal ne Sache: sich irgendein nettes Problem ausdenken und drauflosgehen - da kann man sein Handwerkszeug mal auspacken und sich hinterher die "elegantesten" Lösungen (ich hab mal ein paar Semester Mathe studiert, da kriegt man den Hau weg, ach was, den Hau muß man haben, damit man sich für so ein Zeug überhaupt interessiert) ...
die elegantesten Lösungen in die Werkzeugkiste packen.
Mensch, ich mou fodd,
LG,
Michael

 Bild

Beiträge aus den Excel-Beispielen zum Thema "gesuchten Teil aus Zellen in String schreiben"