Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Problem beim Stringvergleich
zurück: anweisung alle 10 Minuten ausführen. weiter: Beschreibung eines Laufzeitfehlers Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Feedback Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
mikey7891
Hobby Office-VBA-Programmierer


Verfasst am:
04. Feb 2009, 15:48
Rufname:

Problem beim Stringvergleich - Problem beim Stringvergleich

Nach oben
       Version: Office 2003

Hallo zusammen,

Ich habe ein Problem mit einem Stringvergleich:
Es existieren mehrere Tabellen mit vielen Strings, die sowohl Buchstaben als auch Zahlen beinhalten.
Nun soll per Skript ein neuer Wert eingefügt werden, jedoch in alphabetischer (aufsteigender) Reihenfolge. Ich brauche also die Zeilennummer des nächst kleineren Strings (oder des nächst größeren). Und da hänge ich.
Folgendes habe ich probiert:

Einfacher Vergleich:
String1 < String2 (soll rauskommen)
"APT80x10x3" > "APT210x8x3" (kommt raus)

Es wird wohl der Reihe nach Zeichen für Zeichen verglichen. In diesem Fall soll jedoch String2 nach String1 kommen also größer sein.

Umwandlung in Zahlen (Dabei werden die Zahlen in einer extra Funktion vom String extrahiert):
String1 < String2 (soll rauskommen)
"80103" > "21083" (kommt raus)

Nun habe ich noch überlegt ob ich die Länge mit einbeziehen, was aber das Gleiche Ergebnis liefert. Das Problem dabei ist, dass es keine einheitliche Form gibt, z.B.:
- DDA80
- APT210x10
- FFE 10 x 3
usw.

Es müsste im Prinzip also die erste auftauchende Zahl bis zu irgendeinem Nichtzahltzeichen zusammengesetzt und dann verglichen werden, danach dann die nächste Zahl usw. Das erscheint mir ziemlich schwierig.
Deshalb meine Frage ob es eine Möglichkeit gibt, so etwas zu implementieren, ohne die Sortierfunktion zu benutzen (das geht aus verschiedenen Gründen nicht und kann ich nur berücksichtigen, wenn es überhaupt keine andere Möglichkeit gibt).

Liebe Grüße
Michael
-Dani-
Gast


Verfasst am:
04. Feb 2009, 16:18
Rufname:


AW: Problem beim Stringvergleich - AW: Problem beim Stringvergleich

Nach oben
       Version: Office 2003

Hassu mal strcomp versucht?


msgbox strcomp(ersterstring,zweiterstring,vbBinaryCompare)

Rückgabe wert:
-1: erster wert ist kleiner als der zweite.
0 : beide Werte sind gleich
Null: einer der beiden Werte ist null, Vergleich ungültig
falkh
Im Profil kannst Du frei den Rang ändern


Verfasst am:
04. Feb 2009, 16:21
Rufname:

AW: Problem beim Stringvergleich - AW: Problem beim Stringvergleich

Nach oben
       Version: Office 2003

warum nicht den neuen string hinten ran machen und dann die spalte neu sortieren lassen?
pefeu
Im Profil kannst Du frei den Rang ändern


Verfasst am:
04. Feb 2009, 16:23
Rufname: Peter
Wohnort: Hamburg

AW: Problem beim Stringvergleich - AW: Problem beim Stringvergleich

Nach oben
       Version: Office 2003

Hallo Michael,

mir scheint das ein ziemlich unlösbares Problem zu sein.

"APT80x10x3" > "APT210x8x3" kannst du nur vergleichen, indem du beide Strings gleich machst

APT80x10x3 in ATP080x10x3 verwandelst
APT210x8x3 in ATP210x08x3 verwandelst

Du müsstest all deine Strings auf ein einheitliches Format bringen, um sie ihrer alphabetischen Größe nach zu bewerten.

Gruß Peter
mikey7891
Hobby Office-VBA-Programmierer


Verfasst am:
04. Feb 2009, 17:02
Rufname:


AW: Problem beim Stringvergleich - AW: Problem beim Stringvergleich

Nach oben
       Version: Office 2003

Vielen Dank für die Antworten.

Es scheint, als ob ich da wirklich ein Problem hätte.

strcomp funktioniert in diesem Fall auch nicht, hab es gerade getestet.

Die Umformatierung auf ein gleiches Format fällt weg, weil ich erstens dazu tausende Einträge ändern müsste und dazu die Synchronisation mit anderen Programmen (die auf die Daten zugreifen bzw. sie liefern) nicht mehr möglich wäre.

Ich werde es also doch über die Sortierfunktion versuchen müssen, auch wenn das einige Zusatzarbeit erfordern wird. Hätt ich mir nur doch mal einen Programmablauf geschrieben^^

Liebe Grüße
Michael
ransi
Für den Hausgebrauch reicht's..


Verfasst am:
04. Feb 2009, 17:39
Rufname:
Wohnort: Im schönen Weserbergland

AW: Problem beim Stringvergleich - AW: Problem beim Stringvergleich

Nach oben
       Version: Office 2003

HAllo Michael

Schau mal ob dir dieser Ansatz weiterhilft.
Diesen Code in ein Modul:
Option Explicit
Public Function NurZahlen(zelle) As Variant
Dim Regex As Object
Dim M
Dim TMP As Variant
Dim I As Integer
Set Regex = CreateObject("Vbscript.Regexp")
With Regex
    .Pattern = "[0-9]+"
    .Global = True
    Set M = .Execute(zelle.Value)
End With
Redim TMP(1 To M.Count)
For I = 1 To M.Count
    TMP(I) = M(I - 1).Value
Next
NurZahlen = TMP
Set Regex = Nothing
End Function



Der Aufruf in einer Tabelle geht dann so:
Tabelle1

 ABCD
1- DDA8080#BEZUG!#BEZUG!
2- APT210x1021010#BEZUG!
3- FFE 10 x 3103#BEZUG!
4    

Formeln der Tabelle
ZelleFormel
B1=INDEX(nurZahlen($A1);SPALTE(A1))*1


Excel Jeanie Html

Jetzt noch nach Spalte B sortieren.

ransi
mikey7891
Hobby Office-VBA-Programmierer


Verfasst am:
05. Feb 2009, 09:49
Rufname:

AW: Problem beim Stringvergleich - AW: Problem beim Stringvergleich

Nach oben
       Version: Office 2003

Hui, ich wusste gar nicht dass VBA RegExpressions unterstützt. Wieder was dazu gelernt.
Ich danke dir für das Beispiel. Ich werd es zwar nicht bei meinem obigen Problem verwenden, da ich es inzwischen über die Autosortierfunktion gelöst habe, aber mir fällt da eine Stelle ein, bei der ich das Konzept sehr gut gebrauchen kann.

Nochmals Danke an alle für die Hilfe.

Gruß
Michael
mikey7891
Hobby Office-VBA-Programmierer


Verfasst am:
09. Feb 2009, 12:43
Rufname:

AW: Problem beim Stringvergleich - AW: Problem beim Stringvergleich

Nach oben
       Version: Office 2003

So, nun zeigt sich dazu doch noch ein Problem.

Ich hab das Ganze jetzt nach ransi über RegExp gelöst, jedoch braucht er zum sortieren extrem lange (bei > 300 Zeilen). Kein Wunder, macht er doch x-Mal dasselbe.

Code:

Public Sub sortShapeTable(ByVal sFile As String)
Dim shShape As Worksheet, shTemp As Worksheet
Dim cCell As Range, cCellTemp As Range

'The unsorted table
Set shShape = ThisWorkbook.Worksheets(sFile)
'The sorted table
Set shTemp = ThisWorkbook.Worksheets.Add

shShape.Rows(1).Copy shTemp.Rows(1)

For Each cCell In shShape.UsedRange.Columns(1).Cells
    For Each cCellTemp In shTemp.UsedRange.Columns(1).Cells
        'Insert a new row if the current value is lower than the previous one
        If isGreaterThan(cCell.Value, cCellTemp.Value) = -1 Then
            shTemp.Rows(cCellTemp.Row).Insert xlShiftDown
            shShape.Rows(cCell.Row).Copy shTemp.Rows(cCellTemp.Row - 1)
            Exit For
        End If
       
        'If this is the end of the rows we have no item that is higher than the current
        'so we have to copy it to the end of the temp table
        If cCellTemp.Row >= shTemp.UsedRange.Rows.Count Then
            shShape.Rows(cCell.Row).Copy shTemp.Rows(cCellTemp.Row + 1)
            Exit For
        End If
       
    Next cCellTemp
Next cCell

Set shTemp = Nothing
Set shShape = Nothing
Set cCell = Nothing
Set cCellTemp = Nothing
End Sub


Die Funktion isGreaterThan() vergleicht auf Basis von ransis Beispiel zuerst die erste Zahl der beiden Strings, falls gleich die nächste usw.. Sie ist also auch nicht gerade die schnellste Lösung.
Im Schnitt muss Excel diese Funktion pro Zeile ca 150-200 mal aufrufen (bei einer Testtabelle mit einer Größe von fast 400 Zeilen).

Da ich keine andere Lösung sehe, die Frage, ob es vielleicht auch mit der internen Sortiermethode von Excel möglich ist, die Tabelle zu sortieren. Ich hab es schon ausprobiert, jedoch sortiert er völlig anders. Aber vielleicht gibts da einen Trick über die Einstellungen/Parameter, die man der Sortierfunktion mitgibt?

Gruß
Michael
ransi
Für den Hausgebrauch reicht's..


Verfasst am:
09. Feb 2009, 18:00
Rufname:
Wohnort: Im schönen Weserbergland

AW: Problem beim Stringvergleich - AW: Problem beim Stringvergleich

Nach oben
       Version: Office 2003

HAllo Michael

Wieviel numerische Teilstrings können denn maximal in so einem String auftauchen ??

Weil bis zu 3 wird einfach..;-)
Das sind dein Ursprungsdaten:
Tabelle1

 A
1C7YBI5Y295D8GIQBFQ7Z6AUZL
2GX2U67BHJ0XL9JV5FAGENIIHL
3NVHOA96MZQ5RFUJ5E72UNPZXN
4608BR1VPSI9TWYO1DMEYI9F45
56O5IQ61SLP99F6P1R5KJFAV70
61J5X985OZ9LXG0N36HCO3M5NT
7MKK9008XZEVVSFX0EGMCEW701
88TC919ZLH5P7NUH7D0OPFB4Z6
95V9NEMCCN15USCTJNWG774NG5
1042P4EXFL2QKUJTEQPC8LFW08Y
11HF98K5VS8DW6J8GJ6443GLT97
12QOLIMCKRVBPII66B4XJWB8JRC
130NZF89COIV77WVLSQT8948ZGQ
14UWLEQ847ZL4XRQIX4X70VMUYC
156EVTDMJNV0TTBRO6C79R1T56A
1668A3W0RY30RL2FRFSQ3R25466
175ESR9B04OYMT4QSOUW0O15MI2
18AN380Y2VTF1V8FISF5I3BVKD2
19JBH8E8HIOUIB3XEZ31XW4J610
20KFAUERNY5Y0QGNW3O33GZ167W
21usw. bis A10000


Excel Jeanie Html


Jetzt mal diesen Code:
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit


Public Sub machs()
Dim Zelle As Range
Dim Arr
Dim M
Dim Regex
Dim L As Long
Dim I As Integer
Dim ws_Tmp As Worksheet
Dim Bereich As Range
Set Regex = CreateObject("Vbscript.Regexp")
Set Bereich = Sheets("Tabelle1").Range("A1:A10000")
Redim Arr(1 To Bereich.Count, 1 To 20)
With Regex
    .Pattern = "[0-9]+"
    .Global = True
    For L = 1 To Bereich.Count
        Set M = .Execute(Bereich(L).Value)
        Arr(L, 1) = Bereich(L).Value
        For I = 1 To M.Count
            Arr(L, I + 1) = M(I - 1).Value
        Next
    Next
End With
Set ws_Tmp = Worksheets.Add
With ws_Tmp
    .Range("A1").Resize(UBound(Arr), UBound(Arr, 2)) = Arr
    .Range("A1").CurrentRegion.Sort _
        Key1:=.Range("B1"), Order1:=xlAscending, DataOption1:=xlSortNormal, _
        Key2:=.Range("C1"), Order2:=xlAscending, DataOption2:=xlSortNormal, _
        Key3:=.Range("D1"), Order3:=xlAscending, DataOption3:=xlSortNormal, _
        Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With
End Sub



Der Code fügt ein Temporäres Blatt ein und sortiert darin nach der 2.-4. Spalte mit der Excelsortierfunktion.
Tabelle13

 ABCDEFGHIJ
1HDP0B0CMPROKOK0W6NC330K3P00063303   
2JVVN0NP0S0SP6ZU24L7Q9Z2K40006247924
30W0MH0QPZ2SCR16G2ZJ3IK0180002162318 
4I0IZWW0NS1WMTA4HK9OG33N6W00149336  
5WJ0E0GY1NBF539BLRQU6ITVOU0015396    
60GPGMFPPP0IA01GSZR40VM7K20014072   
70D0RI1M30D037QQBNAJ2VWBY1001303721  
8CGOYG0J0FKY1Q2QAZ50YGC73Q00125073   
90JCXB0CDZLIU2C7R6J9864Z9A0027698649  
10usw. bis A1:AT100000023211    


Excel Jeanie Html




Da das Einlesen zuerst in einem Array geschieht ist das Ding also richtig schnell.

ransi
Edit weil Datentabellen und Code vergessen...


Zuletzt bearbeitet von ransi am 09. Feb 2009, 18:22, insgesamt einmal bearbeitet
Phelan XLPH
Fortgeschritten


Verfasst am:
09. Feb 2009, 18:09
Rufname: Phelan

AW: Problem beim Stringvergleich - AW: Problem beim Stringvergleich

Nach oben
       Version: Office 2003

Warum wird das einfach: schafft Regexp nicht mehr?
_________________
Was vorstellbar ist, ist auch machbar. - Albert Einstein
ransi
Für den Hausgebrauch reicht's..


Verfasst am:
09. Feb 2009, 18:12
Rufname:
Wohnort: Im schönen Weserbergland

AW: Problem beim Stringvergleich - AW: Problem beim Stringvergleich

Nach oben
       Version: Office 2003

HAllo

RegEx schafft sogar vielmehr.
Ich habe noch keine Möglichkeit gefunden die Exceleigenesortierfunktion nach mehr als 3 Spalten sortieren zu lassen.

ransi
mikey7891
Hobby Office-VBA-Programmierer


Verfasst am:
10. Feb 2009, 12:51
Rufname:


AW: Problem beim Stringvergleich - AW: Problem beim Stringvergleich

Nach oben
       Version: Office 2003

Perfekt!!

Nach ein wenig Anpassung an meine Bedürfnisse sieht man die Sortierung fast nicht mehr ;)

Ich danke dir vielmals für Deine Hilfe!

Gruß
Michael

Hier noch der Code:
Code:
'* Sorts the shapes in alphabetical order
'* IN: Worksheetname (String)
'* OUT: -
'*********************

Public Sub sortShapeTable(ByVal sFile As String)
Dim Arr
Dim M
Dim Regex
Dim L As Long
Dim I As Integer, iCountCols As Integer
Dim rgBereich As Range
Dim cCell As Range
Dim shShape As Worksheet, shTemp As Worksheet

Set shShape = ThisWorkbook.Worksheets(sFile)
Set shTemp = ThisWorkbook.Worksheets.Add

Set Regex = CreateObject("Vbscript.Regexp")
Set rgBereich = shShape.UsedRange.Columns(1).Cells
iCountCols = shShape.UsedRange.Columns.Count
ReDim Arr(1 To rgBereich.Count, 1 To iCountCols + 3)

With Regex
    .Pattern = "[0-9]+"
    .Global = True
    For L = 1 To rgBereich.Count
        Set M = .Execute(rgBereich(L).Value)
        For Each cCell In shShape.UsedRange.Rows(L).Cells
                Arr(L, cCell.Column) = cCell.Value
        Next cCell
        For I = 1 To M.Count
            If I > 3 Then Exit For
            Arr(L, I + iCountCols) = M(I - 1).Value
        Next
    Next
End With
For I = 1 To 3
    Arr(1, iCountCols + I) = "Sort"
Next I

With shTemp
    .Range("A1").Resize(UBound(Arr), UBound(Arr, 2)) = Arr
    .UsedRange.Sort _
        Key1:=.Cells(1, iCountCols + 1), Order1:=xlAscending, DataOption1:=xlSortNormal, _
        Key2:=.Cells(1, iCountCols + 2), Order2:=xlAscending, DataOption2:=xlSortNormal, _
        Key3:=.Cells(1, iCountCols + 3), Order3:=xlAscending, DataOption3:=xlSortNormal, _
        Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With

For I = 1 To 3
    shTemp.Columns(iCountCols + 1).Delete xlShiftLeft
Next I
shShape.Cells.Clear
shTemp.Cells.Copy shShape.Range("A1")
Application.DisplayAlerts = False
shTemp.Delete
Application.DisplayAlerts = True

Set shTemp = Nothing
Set shShape = Nothing
Set cCell = Nothing
Set rgBereich = Nothing
End Sub
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Excel VBA (Makros): Operator für Stringvergleich 2 Sebastian345 99 06. Dez 2013, 15:47
Sebastian345 Operator für Stringvergleich
Keine neuen Beiträge Excel VBA (Makros): String-Vergleich mit nur 90%iger Übereinstimmung 7 dreamar 138 19. Jul 2013, 22:33
DerHoepp String-Vergleich mit nur 90%iger Übereinstimmung
Keine neuen Beiträge Excel Formeln: Zählenwenn mit exaktem String-Vergleich 2 Daniel000 70 08. Feb 2013, 13:03
Gast Zählenwenn mit exaktem String-Vergleich
Keine neuen Beiträge Excel Formeln: Stringvergleich in WENN Funktion 2 testwurst01 2650 20. Jan 2011, 11:41
Gast Stringvergleich in WENN Funktion
Keine neuen Beiträge Excel VBA (Makros): Suche / StringVergleich 3 Gast84 278 11. Mai 2010, 08:39
Gast84 Suche / StringVergleich
Keine neuen Beiträge Excel Formeln: Sumif in Kombination mit einem String-Vergleich 3 Hilfe für Lux 1466 16. März 2009, 13:51
Gast Sumif in Kombination mit einem String-Vergleich
Keine neuen Beiträge Excel VBA (Makros): Excel-VBA: String-Vergleich mal anders = phonetisch 4 duoklein 7632 03. Jan 2009, 21:35
duoklein Excel-VBA: String-Vergleich mal anders = phonetisch
Keine neuen Beiträge Excel VBA (Makros): Stringvergleich klappt nicht bei identischen Strings 5 Flowing 3034 05. März 2008, 14:14
bst Stringvergleich klappt nicht bei identischen Strings
Keine neuen Beiträge Excel VBA (Makros): Stringvergleich 3 mäthesacker 666 26. Nov 2007, 20:44
steven_j Stringvergleich
Keine neuen Beiträge Excel VBA (Makros): Stringvergleich 18 mäthesacker 6155 13. Aug 2007, 16:05
c0bRa Stringvergleich
Keine neuen Beiträge Excel Formeln: SVerweis mit Stringvergleich verknüpft 1 MeisterLampe 1578 16. Nov 2004, 20:23
Arnim SVerweis mit Stringvergleich verknüpft
Keine neuen Beiträge Excel VBA (Makros): Stringvergleich 3 Gerry 588 27. Aug 2004, 17:55
Robsl Stringvergleich
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: HTML CSS