Excel-Spalte mit VBA lesen, Abfragen tätigen und Werte in andere Spalte schreiben

  • Excel

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    1. Bitte Deinen Post nachbearbeiten und Vollzitat entfernen, sonst kommt ein Moderator, macht das für Dich uns es gibt n Rüffel, da Widerspruch zu den Forenregeln (§4, 3.f).
    2. Bitte noch angeben: Eingabe + gewünschte Ausgabe
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nun, Dein Beispiel aus Post#20 0,1,2,3,3,3 wird bereits mithilfe des Codes aus Post#17 in 0,1,1,2,2,3 ungewandelt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Guten Morgen VaporiZed,

    stimmt, das ist mir gar nicht aufgefallen. Ich muss dich noch ein einziges Mal um Rat bitten.
    Ich möchte auch beispielsweise folgendes berücksichtigen.

    - Wenn nach der Neutralstellung (0) der Gang 2 folgt, soll zuvor der Gang 1 zuerst für zwei Sekunden benutzt warden, danach Gang 2 für zwei Sekunden usw.
    Bsp.: 0,2,3,3,3,3 --> 0,1,1,2,2,3

    - Momentan passiert bei nachfolgendem Bsp. noch folgendes:
    Bsp.: 0,1,1,2,3,3 --> 0,1,2,2,3,3
    Es sollte aber auch hier heißen: 0,1,1,2,3,3 --> 0,1,1,2,2,3

    Hier nach lasse ich dich in Frieden und widme mich wieder anderen Dingen.

    Danke!

    Bassi90
    Sooo ... lange hat's gedauert. Habe den gesamten Projektcode mal umgebaut und so hergerichtet, dass er besser erweiterbar ist. Der Schlüssel dazu war ein String, der erstmal die Eingangswerte der Gänge aufnimmt, diese manipuliert und ggf. erweitert. Es sind alle genannten Fälle eingebaut. Ich hoffe, dass sie Deinen Vorstellungen entsprechen. Die Excel-Datei im Anhang enthält eine Folge, die alle Fälle abdeckt. Einfach auf den Button klicken und Auswahlt treffen ...
    Oder auch nicht, da Excel-Makrodateien verboten sind. Und jene in ne Zip-Datei zu packen, macht es auch nicht legaler. Naja, dann bleibt der Code wohl mein Geheimnis.
    der Excelgesamtcode

    :P

    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub Ganganalyse()
    3. Columns("B:C").Select
    4. Selection.ClearContents
    5. Cells(1, 2).Value = "Zielwerte"
    6. Cells(1, 1).Select
    7. Dim Ganganalysewunsch As Integer
    8. Ganganalysewunsch = InputBox("Bitte Ganganalyseart auswählen." & vbCrLf & _
    9. "1 = ein Gang, der nur 1 Sekunde benutzt wird, soll neutral werden" & vbCrLf & _
    10. "2 = ein Gang, der 2 nur Sekunden benutzt wird, soll 1x neutral und 1x zum Folgegang werden" & vbCrLf & _
    11. "3 = Gänge, die nur 1 Sekunde benutzt werden, sollen gedoppelt werden (ohne Gangüberspringen)" & vbCrLf & _
    12. "4 = Schalte nach Neutral einzeln für 2 Sekunden die Gänge hoch", _
    13. "Ganganalysewahl")
    14. Dim i As Integer, Startzeile As Integer, Gangfolge As String
    15. Gangfolge = Space(255)
    16. Startzeile = 2
    17. For i = Startzeile To Cells(Rows.Count, 1).End(xlUp).Row
    18. Mid(Gangfolge, i - Startzeile + 1, 1) = Cells(i, 1).Value
    19. Next
    20. For i = 1 To Len(Gangfolge)
    21. If Mid(Gangfolge, i, 1) = " " Then Exit For
    22. Select Case Ganganalysewunsch
    23. Case 1: Call Mache1SekundengängeNeutral(i, Gangfolge)
    24. Case 2: Call Mache2SekundengängeEinmalNeutralUndEinmalZumFolgegang(i, Gangfolge)
    25. Case 3: Call Mache1SekundengängeZu2SekundengängeOhneGängeZuÜberspringen(i, Gangfolge)
    26. Case 4: Call MacheNachNeutral2SekundenGangeinzelsprünge(i, Gangfolge)
    27. End Select
    28. Next
    29. For i = 1 To Len(Gangfolge)
    30. If Mid(Gangfolge, i, 1) = " " Then Exit For
    31. Cells(i + 1, 2).Value = Mid(Gangfolge, i, 1)
    32. Next
    33. End Sub
    34. Private Sub Insert(ByRef Originalstring As String, Position As Integer, Insertstring As String)
    35. If Position = Len(Originalstring) + 1 Then
    36. Originalstring = Originalstring & Insertstring
    37. Exit Sub
    38. End If
    39. If Position > Len(Originalstring) + 1 Then
    40. Originalstring = Originalstring & Space(Position - Len(Originalstring) - 1) & Insertstring
    41. Exit Sub
    42. End If
    43. Originalstring = Mid(Originalstring, 1, Position - 1) & Insertstring & Mid(Originalstring, Position, Len(Originalstring) - Position + 1)
    44. End Sub
    45. Private Sub Mache1SekundengängeNeutral(ByRef i As Integer, ByRef Gangfolge As String)
    46. If i = 1 Then
    47. If Mid(Gangfolge, i, 1) <> Mid(Gangfolge, i + 1, 1) Then Mid(Gangfolge, i, 1) = 0
    48. ElseIf Mid(Gangfolge, i, 1) <> Mid(Gangfolge, i - 1, 1) And Mid(Gangfolge, i, 1) <> Mid(Gangfolge, i + 1, 1) Then Mid(Gangfolge, i, 1) = 0
    49. End If
    50. End Sub
    51. Private Sub Mache2SekundengängeEinmalNeutralUndEinmalZumFolgegang(ByRef i As Integer, ByRef Gangfolge As String)
    52. If i = 1 Then
    53. If Mid(Gangfolge, i, 1) = Mid(Gangfolge, i + 1, 1) And _
    54. Mid(Gangfolge, i, 1) <> Mid(Gangfolge, i + 2, 1) Then
    55. Mid(Gangfolge, i, 1) = 0
    56. Mid(Gangfolge, i + 1, 1) = Mid(Gangfolge, i + 2, 1)
    57. i = i + 1
    58. End If
    59. Exit Sub
    60. End If
    61. If Mid(Gangfolge, i, 1) <> Mid(Gangfolge, i - 1, 1) And _
    62. Mid(Gangfolge, i, 1) = Mid(Gangfolge, i + 1, 1) And _
    63. Mid(Gangfolge, i, 1) <> Mid(Gangfolge, i + 2, 1) Then
    64. Mid(Gangfolge, i, 1) = 0
    65. If Mid(Gangfolge, i + 2, 1) <> " " Then Mid(Gangfolge, i + 1, 1) = Mid(Gangfolge, i + 2, 1)
    66. i = i + 1
    67. End If
    68. End Sub
    69. Private Sub Mache1SekundengängeZu2SekundengängeOhneGängeZuÜberspringen(ByRef i As Integer, ByRef Gangfolge As String)
    70. If Mid(Gangfolge, i + 1, 1) = " " Then Exit Sub
    71. If Mid(Gangfolge, i, 1) > 0 And Abs(CInt(Mid(Gangfolge, i, 1)) - CInt(Mid(Gangfolge, i + 1, 1))) = 1 Then
    72. If i = 1 Then
    73. Call Insert(Gangfolge, i, Mid(Gangfolge, i, 1))
    74. i = i + 1
    75. ElseIf Mid(Gangfolge, i, 1) <> Mid(Gangfolge, i - 1, 1) Then
    76. Call Insert(Gangfolge, i, Mid(Gangfolge, i, 1))
    77. i = i + 1
    78. End If
    79. End If
    80. End Sub
    81. Private Sub MacheNachNeutral2SekundenGangeinzelsprünge(ByRef i As Integer, ByRef Gangfolge As String)
    82. If Mid(Gangfolge, i, 1) <> 0 Or Mid(Gangfolge, i + 1, 1) = "0" Then Exit Sub
    83. Dim Zielgang As Integer, j As Integer
    84. Zielgang = CInt(Mid(Gangfolge, i + 1, 1))
    85. For j = 1 To Zielgang - 1
    86. Call Insert(Gangfolge, i + 1, CStr(j) & CStr(j))
    87. i = i + 2
    88. Next
    89. End Sub

    Der Button ist an die Prozedur Gangwahl gekoppelt.
    Da VBA keine String.Insert-Methode kennt, hab ich schnell mal selber eine dazugeschustert.

    Bilder
    • Screenshot Analyseprogramm.png

      11,13 kB, 652×275, 80 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.