Autor
|
Thema: VBA Text nach Zeichen durchsuchen (21517 mal gelesen)
|
HKXVZBi Ehrenmitglied Konstruktion Elektroplanung
Beiträge: 1502 Registriert: 27.01.2010
|
erstellt am: 01. Mrz. 2010 09:01 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe folgendes Problem: In einem Text ist ein zeichen ("-") mehrmals vorhanden, mich interessiert jetzt aber nur der text hinter dem ersten "-" von links. Bsp.: TEXT_a+TEXT_b-TEXT_c-TEXT_d --> mich interessiert hier nur "-Text_c" Zum auffinden des ersten zeichens habe ich folgende funktion verwendet: InStr([Start], Zeichenfolge1, Zeichenfolge2[, Vergleich]) pos3 = InStr(1, zelleninhalt, "-") wenn das zeichen nur zweimal vorkommt konnte ich den mittleren Text noch mit dieser funktion herruasfiltern: InStrRev(zelleninhalt, "-", -1, vbTextCompare) pos4 = InStrRev(zelleninhalt, "-", -1, vbTextCompare) mein Problem liegt jetzt im auffinden des dritten "-", dafür fehlt mir jedoch eine geeignete Funktion, da ich bei der Funktion InStr(...) für [Start] anscheinend keine variable verwenden darf denn die suche sollte ja erst nach pos3 beginnen, die texte haben jedoch unterschiedliche längen und auch das/die gesuchten Zeichen ("-") befinden sich nicht immer an der selben stelle Gruß und Dank schon mal vorweg Marco
------------------ „Wenn man sagt, daß man einer Sache grundsätzlich zustimmt, so bedeutet es, daß man nicht die geringste Absicht hat, sie in der Praxis durchzuführen.“ Otto von Bismarck Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 01. Mrz. 2010 09:18 <-- editieren / zitieren --> Unities abgeben: Nur für HKXVZBi
Moin, >> da ich bei der Funktion InStr(...) für [Start] anscheinend keine variable verwenden darf hmm, darfst Du nicht? Warum nicht? Ich darf ;-) Mal als Beispiel:
Code: Sub test() Dim a%, pos3%, b% Dim strText$ strText = "TEXT_a + TEXT_b - TEXT_c - TEXT_d_TEXT_e + TEXT_f - TEXT_g - TEXT_h" pos3 = InStr(1, strText, "-") a = InStr(InStr(InStr(1, strText, "-") + 1, strText, "-") + 1, strText, "-") b = InStr(pos3 + 1, strText, "-") End Sub
Man beachte die +1 beim Startargument.Ich weiß aber noch nicht wirklich, was Du überhaupt vor hast.... Hoffe dennoch was Sinniges beigetragen zu haben. ------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... System-Info | Dateianhänge | FAQ-ACAD | CAD.de-Hilfe | Sei eine Antilope Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HKXVZBi Ehrenmitglied Konstruktion Elektroplanung
Beiträge: 1502 Registriert: 27.01.2010
|
erstellt am: 01. Mrz. 2010 09:28 <-- editieren / zitieren --> Unities abgeben:
danke für die schnelle antwort ich werd das gleich mal ausprobieren, ich hätte aber gleich noch eine frage undzwar würde mich interessieren was ein $ oder % hinter der variablen deklaration bewirkt? EDIT es geht darum ein BMK aufzuteilen Bsp.: ==AD=R811+11W611-11ST01-X230 ich möchte hier jetzt nur -11ST01 ausgegeben haben ------------------ „Wenn man sagt, daß man einer Sache grundsätzlich zustimmt, so bedeutet es, daß man nicht die geringste Absicht hat, sie in der Praxis durchzuführen.“ Otto von Bismarck [Diese Nachricht wurde von HKXVZBi am 01. Mrz. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 01. Mrz. 2010 09:40 <-- editieren / zitieren --> Unities abgeben: Nur für HKXVZBi
>> würde mich interessieren was ein $ oder % hinter der variablen deklaration bewirkt?Sorry, an der Stelle ich kürze gerne mit den Typkennzeichen ab: $ = String, % = Integer usw. Ein Dim strText$ ist also dasselbe wie ein Dim strText As String Eine Übersicht findest Du z.B. HIER ungefähr in der Mitte (auch wenn's ACAD-VBA ist, die Typanweisungen sind für uns alle gleich ) Oder mühsam einzeln in der Excelhilfe beim jeweiligen Datentyp. ------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße...
System-Info | Dateianhänge | FAQ-ACAD | CAD.de-Hilfe | Sei eine Antilope Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HKXVZBi Ehrenmitglied Konstruktion Elektroplanung
Beiträge: 1502 Registriert: 27.01.2010
|
erstellt am: 01. Mrz. 2010 09:54 <-- editieren / zitieren --> Unities abgeben:
achso danke, ich bin noch recht neu bei der vba programmierung und kenne mich daher noch nicht so gut aus ich hab mal meine bisherigen ansätze mal mit angefügt, aber leider funktioniert das mit dem auffinden des zweiten "-" noch nicht!!?? Public Function anlage() ' Variablen deklaration Dim i, a, b Dim zeile Dim spalte Dim LZA% ' anzahl zeilen Dim zelleninhalt ' rückgabewert Zelleninhalt Dim laenge ' länge zelleninhalt Dim pos1 ' position des zu suchenden strings (==) Dim pos2 ' position des zu suchenden strings (+) Dim pos3 ' position des zu suchenden strngs (-) von links Dim pos4 Dim start Dim ende
Worksheets(1).Activate
LZA = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row 'letzte beschriebene Zelle in Spalte A finden For zeile = 800 To 810 zelleninhalt = ActiveSheet.Cells(zeile, 1).Text ' Inhalt der Zelle laenge = Len(zelleninhalt) ' Länge des Inhaltes pos1 = InStr(1, zelleninhalt, "==") ' Anfangsposition der Zeichenfolge "==" pos2 = InStr(1, zelleninhalt, "+") ' Anfangsposition der Zeichenfolge "+" pos3 = InStr(1, zelleninhalt, "-") ' Anfangsposition der Zeichenfolge "-" 'pos4 = InStrRev(zelleninhalt, "-", -1, vbTextCompare) ' Anfangsposition der Zeichenfolge "-" von rechts '--------------------------------------------------------------------------------------------------- ' Nach einem weiteren "-" wird nur gesucht wenn es bereits 1x gefunden wurde If pos3 > 0 Then pos4 = InStr(pos3, zelleninhalt, "-") ' Anfangsposition der Zeichenfolge "-", ab der Position 3 End If '--------------------------------------------------------------------------------------------------- If pos1 > 0 Then start = pos1 + 2 ' Startposition für Ausgabe l1 = pos2 - pos1 - 2 ' Endposition für Ausgabe a = Mid(zelleninhalt, start, l1) ' Anlage ActiveSheet.Cells(zeile, 2).Value = a ' Wert in Zelle schreiben Else a = "ohne AKZ" ' kein Anlagenkennzeichen verfügbar ActiveSheet.Cells(zeile, 2).Value = a ' Wert in Zelle B schreiben End If '--------------------------------------------------------------------------------------------------- If pos3 > 0 Then If pos3 <> pos4 Then ' es befinden sich mehrere "-" im String start = pos3 ende = pos4 - pos3 a = Mid(zelleninhalt, start, ende) ' BMK ActiveSheet.Cells(zeile, 3).Value = a ' Wert in Zelle C schreiben ElseIf pos3 = pos4 Then start = pos3 a = Mid(zelleninhalt, start, laenge) ' BMK ActiveSheet.Cells(zeile, 3).Value = a ' Wert in Zelle C schreiben End If Else a = "ohne BMK" ' kein BMK verfügbar ActiveSheet.Cells(zeile, 3).Value = a ' Wert in Zelle C schreiben End If '--------------------------------------------------------------------------------------------------- Next zeile End Function das was noch nicht so funktioniert wie ich es mir vorgestellt habe ist FETTgekennzeichnet *hier sind noch einige fehler enthalten wie z.B. variablen deklariert die nicht genutzt werden
------------------ „Wenn man sagt, daß man einer Sache grundsätzlich zustimmt, so bedeutet es, daß man nicht die geringste Absicht hat, sie in der Praxis durchzuführen.“ Otto von Bismarck Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 01. Mrz. 2010 10:08 <-- editieren / zitieren --> Unities abgeben: Nur für HKXVZBi
>> If pos3 > 0 Then pos4 = InStr(pos3, zelleninhalt, "-") ' Anfangsposition der Zeichenfolge "-", ab der Position 3 End If"funktioniert nicht" Zitat: Man beachte die +1 beim Startargument.
>> es geht darum ein BMK aufzuteilen Bsp.: ==AD=R811+11W611-11ST01-X230 ich möchte hier jetzt nur -11ST01 ausgegeben haben in diesem Fall: Code: Sub test() Dim a%, pos3%, b% Dim strText$, strT2$strText = "==AD=R811+11W611-11ST01-X230" pos3 = InStr(1, strText, "-") b = InStr(pos3 + 1, strText, "-") strT2 = Mid(strText, pos3, b - pos3) End Sub
Tüftel mal bisserl rum ;-) Du deklarierst derzeit alle Vars As Variant... aber sagst ja selbst: Da willst Du noch dran ------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... System-Info | Dateianhänge | FAQ-ACAD | CAD.de-Hilfe | Sei eine Antilope Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HKXVZBi Ehrenmitglied Konstruktion Elektroplanung
Beiträge: 1502 Registriert: 27.01.2010
|
erstellt am: 01. Mrz. 2010 11:00 <-- editieren / zitieren --> Unities abgeben:
danke für die hilfe ich hab es jetzt aber durch probieren doch noch selbst hinbekommen ------------------ „Wenn man sagt, daß man einer Sache grundsätzlich zustimmt, so bedeutet es, daß man nicht die geringste Absicht hat, sie in der Praxis durchzuführen.“ Otto von Bismarck Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Samson53 Mitglied Nur noch selten simulierend
Beiträge: 119 Registriert: 18.02.2010 Plant Simulation 11 Office 2013
|
erstellt am: 23. Mrz. 2010 12:29 <-- editieren / zitieren --> Unities abgeben: Nur für HKXVZBi
Hallo, schau mal nach der function "split" dim ergebnis as variant ergebnis = split(ausgangstext,"-"(trennzeichen)) => ergebnis(0)= teil des ausgangstextes vor "-" => ergebnis(1)= teil nach dem ersten aber vor dem zeiten "-" => ergebnis(n)= teil nach dem nten aber vor dem n+1ten "-" Gruß Samson ------------------ Operative Hektik ersetzt geistige Windstille. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|