String verändern (VBA)

Sebastian, Dienstag, 23. Mai 2017, 13:16 (vor 367 Tagen)

Hallo liebe Community,

ich stehe vor folgendem Problem. Während einer Beschleunigung sollen Gänge beim KFZ mindestens 2 Sekunden lang genutzt warden und es darf kein Gang übersprungen werden.

Bsp.: 0,1,2,3,3,3,3,3 --> 0,1,1,2,2,3,3,3

Wichtig ist auch, dass die Gesamtzeit nicht verlängert warden darf (im Bsp. sind es 8 Sekunden. Bei der Korrektur dürfen es dann auch nur 8 Sekunden sein).

Mein Code sieht momentan wie folgt aus (die Korrektur wird in Spalte "D" geschrieben):


Private Sub Insert(ByRef Originalstring As String, Position As Integer, Insertstring As String)

 If Position = Len(Originalstring) + 1 Then
 Originalstring = Originalstring & Insertstring
 Exit Sub
 End If

 If Position > Len(Originalstring) + 1 Then
 Originalstring = Originalstring & Space(Position - Len(Originalstring) - 1) & Insertstring
 Exit Sub
 End If

 Originalstring = Mid(Originalstring, 1, Position - 1) & Insertstring & Mid(Originalstring, Position, Len(Originalstring) - Position + 1)

 End Sub

 Private Sub Mache1SekundengängeZu2SekundengängeOhneGängeZuÜberspringen(ByRef i As Integer, ByRef Gangfolge As String)

 If Mid(Gangfolge, i + 1, 1) = " " Then Exit Sub
    If Mid(Gangfolge, i, 1) > 0 And Abs(CInt(Mid(Gangfolge, i, 1)) - CInt(Mid(Gangfolge, i + 1, 1))) = 1 Then
    If i = 1 Then
    Call Insert(Gangfolge, i, Mid(Gangfolge, i, 1))
    i = i + 1
    ElseIf Mid(Gangfolge, i, 1) <> Mid(Gangfolge, i - 1, 1) Then
    Call Insert(Gangfolge, i, Mid(Gangfolge, i, 1))
    i = i + 1
    End If
    End If
    
    For i = 1 To Len(Gangfolge)
    If Mid(Gangfolge, i, 1) = " " Then Exit For
    Cells(i + 1, 4).Value = Mid(Gangfolge, i, 1)
    Next
    
    End Sub


Leider funktioniert es damit noch nicht. Kann mir jemand weiterhelfen? Danke.

Grüße

String verändern

Martin Asal @, Dienstag, 23. Mai 2017, 15:24 (vor 367 Tagen) @ Sebastian

Hallo Sebastian,

ich halte deinen Ansatz für ziemlich kompliziert. Hier einmal ein nicht ausformulierter anderer Ansatz:

Function schalte(liste) As String
Dim schaltung() As String
Dim gang
 
schaltung = Split(liste, ",")
 
For Each gang In schaltung
    '.....
Next
 
End Function


Also einfach die Liste in ein eindimensionales Array schreiben. Die Werte in der Schleife kannst du dann mit Val(gang) ansprechen. Jetzt must du nur noch die Werte innerhalb des Arrays entsprechend deiner Vorgaben vergleichen und wenn du fertig bist, fügst du sie mit Join wieder zusammen.

Martin

String verändern

Sebastian, Dienstag, 23. Mai 2017, 15:27 (vor 367 Tagen) @ Martin Asal

Hallo Martin,

vielen Dank für deinen Ansatz.
Könntest du den kompletten Code bitte mal für das Beispiel schreiben?

String verändern

Martin Asal @, Dienstag, 23. Mai 2017, 15:55 (vor 367 Tagen) @ Sebastian

Och nö, ein bischen was musst du schon noch selbst machen ;-)


Mir ist ja z.B. auch nicht klar, was passieren soll, wenn eine 2sec-Verzögerung eingebaut werden soll: Soll dann in die Zahlenliste ein Wert reingeschoben werden, und der letzte Wert fällt dafür raus? Oder wird statt dessen ein Wert mittendrin überschrieben? Oder... Du musst schon selbst wissen, was du machst.

Martin

String verändern

Sebastian, Dienstag, 23. Mai 2017, 16:36 (vor 367 Tagen) @ Martin Asal

Es darf kein Gang übersprungen warden und jeder Gang muss mindestens 2 Sekunden aktiv sein.

Beispiele:

2,2,3,4 --> 2,2,3,3

1,2,3,4 --> 1,1,2,2

1,2,2,4 --> 1,1,2,2

1,3,5 --> 1,1,2

0,0,1,2 --> 0,0,1,1

0,1,2,3 --> 0,1,1,2

Die Null steht für Leerlaufstellung. Diese muss nicht zwingend an erster Stelle auftauchen und für diese gitl die 2-Sekunden-Regel nicht.

Grüße

RSS-Feed dieser Diskussion
powered by my little forum