Reihen Probleme
Guten Abend,
ich bin wiedermal an meine Grenzen gestossen. Und wende mich daher an euch Experten.
ich habe bestimmte Artikel, die zum Beispiel lauten:
Artikel Reihe
A 310
B 311,312
C 313
D 314-316
E 319
F 319,320
Nun möchte ich, daß die Freien Reihen ausgegeben werden. In diesem Beispiel wäre es die Reihe 317 und 318.
Ich hoffe Ihr könnt mir weiterhelfen.
Gruß
manzur
Antwort schreiben
Antwort 1 von Marie vom 02.11.2019, 20:00 Options
Mal steht nur eine Zahl in einer Reihe, mal zwei Zahlen durch Komma getrennt, mal von bis mit Bindestrich, vermutlich gibt es dann noch solche, die nach dem Komma eine Leerspalte haben oder mit Semikolon getrennt sind und nun soll da einer einen Code drumherumbosseln, der alle Möglichkeiten zulässt? Krass, eigentlich wollte ich gerade mal probieren mit Wert () die erste Zahl auslesen und dann vergleichen, ob der Wert identisch mit dem ganzen Feldinhalt ist. Wenn das in Access so gestanden hätte, dann wäre das auch so gegngen, aber leider schneidet Excel mit Wert () nicht die Ziffern ab bis zu dem folgenden Zeichen. Und da manche Ziffern sogar mit Komma getrennt sind, wird das als Kommazahl ausgelesen: Da wo ein Bindestrich ist wird sogar eine fehlermeldung ausgegeben, da excel offensichtlich nicht von einem String den Wert abschneiden kann, also deshalb.... nö, tut mir leid, so kann man nicht mit Dateien umgehen und dann noch was mit anfangen. :-((((
Gruß Marie
Antwort 2 von Marie vom 02.11.2019, 22:42 Options
Also, ich hab Dir einen Code geschrieben, der Dir die fehlenden Zahlen in Tabelle 3 in Spalte E, F, G usw einträgt, wenn Du die "Reihe" in Tabelle 3 Spalte 1 einfügst. Dabei bin ich davon ausgegangen, dass in allen Zellen, in denen mehr als eine Zahl steht, nicht in der Mitte eine Zahl fehlt, also wie in Deinem Beispiel nicht ein Artikel Reihe 312, 315 steht, also hier eine Zahl fehlt, sonst habe ich diese fehlenden nicht abgedeckt. Ferner bin ich davon ausgegangen, dass in einer neuen Zeile immmer größere Zahlen stehen als in der Zeile darüber.
Schau Dir den Code an, vielleicht kapierst Du ihn ja und kannst ihn auch entsprechend abändern, wenn das nötig ist.
Sub trennen()
Dim zeile As Integer
Dim Spalte As Integer
Dim ZahlString As String
Dim intFehlzahl As Integer
Dim Rechtsstring As String
Dim intLaenge As Integer
zeile = 1
' solange Spalte1 nicht leer neue Zeile auslesen
ZahlString = ""
While (Tabelle3.Cells(zeile, 1) <> "")
ZahlString = Tabelle3.Cells(zeile, 1)
'Zuerst in Spalte 2 die erste Zahl eintragen
If Val(ZahlString) > 0 Then Tabelle3.Cells(zeile, 2) = Val(ZahlString)
If Tabelle3.Cells(zeile, 1) = Tabelle3.Cells(zeile, 2) Then
Tabelle3.Cells(zeile, 3) = "" ' Wenn nur eine Zahl in Spalte 1 steht bleibt Spalte 3 leer
Else ' Wenn mehr als eine Zahl in einer Zelle stehen
intLaenge = Len(Tabelle3.Cells(zeile, 2))
Rechtsstring = Trim$(Right$(ZahlString, Len(ZahlString) - intLaenge))
Do While Val(Rechtsstring) < 1
'Solange ein Zeichen links abschneiden, bis der String mit einer Ziffer beginnt
Rechtsstring = Trim$(Right$(Rechtsstring, Len(Rechtsstring) - 1))
If Len(Rechtsstring) = 1 Then Exit Do ' Fehler vermeiden, falls hinten gar keine Zahl mehr folgt
Loop
'Tabelle3.Cells(zeile, 3)
Tabelle3.Cells(zeile, 3) = Rechtsstring ' zweite Zahl in Spalte 3 eingetragen
End If
zeile = zeile + 1
ZahlString = ""
Wend
' Fehlende Zahlen in Spalten 5,6,7 usw eintragen
zeile = 1
While (Tabelle3.Cells(zeile, 1) <> "")
If Tabelle3.Cells(zeile, 3) = "" Then ' wenn Spalte 3 leer
If Val(Tabelle3.Cells(zeile, 2)) + 1 <> Val(Tabelle3.Cells(zeile + 1, 2)) Then
If Val(Tabelle3.Cells(zeile, 2)) > Val(Tabelle3.Cells(zeile + 1, 2)) Then
'MsgBox "Fehler, die Zahl in Zeile " & Str$(zeile) & " ist größer als die darunterliegende."
Else ' es fehlt eine oder mehrere Zahlen
intFehlzahl = Val(Tabelle3.Cells(zeile, 2)) + 1
Tabelle3.Cells(zeile, 4) = "Es fehlt:"
Spalte = 5
While intFehlzahl < Val(Tabelle3.Cells(zeile + 1, 2))
Tabelle3.Cells(zeile, Spalte) = intFehlzahl
intFehlzahl = intFehlzahl + 1
Spalte = Spalte + 1
Wend
End If
End If
Else ' wenn Spalte 3 nicht leer
If Val(Tabelle3.Cells(zeile, 3)) + 1 <> Val(Tabelle3.Cells(zeile + 1, 2)) Then
If Val(Tabelle3.Cells(zeile, 3)) > Val(Tabelle3.Cells(zeile + 1, 2)) Then
'MsgBox "Fehler, die Zahl in Zeile " & Str$(zeile) & " ist größer als die darunterliegende."
Else ' es fehlt eine oder mehrere Zahlen
intFehlzahl = Val(Tabelle3.Cells(zeile, 3)) + 1
Tabelle3.Cells(zeile, 4) = "Es fehlt:"
Spalte = 5
While intFehlzahl < Val(Tabelle3.Cells(zeile + 1, 2))
Tabelle3.Cells(zeile, Spalte) = intFehlzahl
intFehlzahl = intFehlzahl + 1
Spalte = Spalte + 1
Wend
End If
End If
End If
zeile = zeile + 1
Wend
End Sub
Antwort 3 von manzur vom 02.11.2019, 23:50 Options
Danke nochmals,
also es stehen als Zeichen nur komma oder minus. Auch die Reihenfolge ist nicht aufsteigend.
Vielleicht hilft dies euch weiter auf mein Problem.
Gruß
manzur
Antwort 4 von Marie vom 03.11.2019, 01:25 Options
wie vielleicht hilft Euch das?? Glaubst Du ernsthaft hier setzt sich nochmal einer stundenlang hin und schreibt Dir neuen Code?
Du kannst den Code oben in zwei teile teilen und benutzen. Der tut alles was Du brauchst, es fehlt dann nur das Sortieren.
Deine Spalte namens reihe kopierst Du in tabelle 3 Spalte 1, dann lässt Du den obigen Code durchlaufen bis zu der Stelle, wo steht
' Fehlende Zahlen in Spalten 5,6,7 usw eintragen.
bis dorthin habe ich folgendes gemacht aus Deiner verwurschtelten Spalte 1
Deine Spalte./2. Spalte 3. Spalte
310..........................310
311,312...................311.........312
316-318...................316.........318
320...........................320
322-330...................322..........330
333............................333
So, wenn jetzt entgegen Deinem Beispiel diese Zahlen nicht sortiert sind, dann musst Du halt jetzt an der Stelle diese 3 Spalten sortieren nach den Zahlen in der 2ten Spalte aufsteigend, sonst funktioniert mein Code nicht.
ich vergleiche dann von oben nach unten jeweils entweder die Zahl in Spalte 3, oder -falls da keine Ist die in Spalte 2 - mit der Zahl in der Zeile darunter in Spalte 2. Wenn die Zahl darunter nicht um genau 1 größer ist, dann wird die fehlende zahl in Spalte 5 geschrieben, fehlen mehr als eine zahl, dann wird so lange in die nächste Spalte geschrieben, bis die untere Zahl erreicht ist.
Du siehst, das geht nur, wenn die Zahlen in der richtigen Reihenfolge untereinanderstehen. wie anders willst Du herausfinden, dass wenn 322-330 dasteht, die dazwischenliegenden Zahlen nicht fehlen??
Mach Dir ein Makro, das die drei Spalten nach Spalte 2 sortiert und füge es über der Zeile:
' Fehlende Zahlen in Spalten 5,6,7 usw eintragen.
ein.
Oder teile den Code in zwei teile und sortiere nach dem ersten teil händisch bevor Du den zweiten teillaufen lässt.
Gruß marie
Antwort 5 von Marie vom 03.11.2019, 01:39 Options
das Ergebnis, falls die Zahlen sortiert sind, sieht also so aus:
Deine Spalte./2.Spalte/3.Spalte/4.Spalte/5.Spalte/6.Spalte/7.
310.......................310
311,312...............311.........312...Es fehlt:....313.......314.........315
316-318...............316.........318...Es fehlt:....319
320.......................320...................Es fehlt:....321
322-330...............322.........330...Es fehlt:....331.......332
333.......................333
Antwort 6 von Marie vom 03.11.2019, 12:49 Options
Habe festgestellt, dass Du auch doppelte zahlen hast. Also falls Du dich da nicht verschrieben hast musst Du die auch noch ausschalten:
If Val(Tabelle3.Cells(zeile, 3)) > Val(Tabelle3.Cells(zeile + 1, 2)) Then
Das hier muss dann > oder gleich heissen
Gruß Marie
Antwort 7 von Marie vom 03.11.2019, 12:52 Options
If Val(Tabelle3.Cells(zeile, 2)) > Val(Tabelle3.Cells(zeile + 1, 2)) Then
Hier auch >oder =