Clever-Excel-Forum

Normale Version: Liste mit Zahlen komprimierter darstellen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

ich sitze schon eine ganze Weile an einer Aufgabe, bei der ich eine Liste mit Zahlen in eine komprimiertere Darstellung umwandeln muss. Dieses sollte idealerweise in VBA programmiert sein, da ich das Ganze in einen schon bestehenden VBA-Code einflechten möchte. Leider habe ich bis jetzt noch keinen Code hinbekommen, der mir das gewünschte Ergebnis liefert.

Mein VBA-Code erzeugt mir die Auswertung, wie man sie links im Bild sehen kann. Nun möchte ich meine Auswertung so komprimiert haben wie rechts im Bild: links und rechts von einer Null soll jeweils nur die höchste Zahl eingetragen werden. Die Nullen hingegen sollen immer angezeigt werden.

Ich würde mich sehr freuen, wenn mir jemand bei der Lösung dieses Problems behilflich sein könnte.
J1: =TEIL(TEXTKETTE(WENNFEHLER(1/(1/WECHSELN(" "&((A1:H1>B1:I1)+(A1:H1>0)<>1)*(A1:H1-1%)&" ";" 0 ";""))+1%;""));SPALTE(A:H);1)

mit genau Deinen Beispieleigenschaften
  • aufsteigend um Ganzzahl 1
  • einstellig (!) bleibend
  • ab Ganzzahl 1
Spalte I (bzw. allgemein: die Spalte nach der letzten Spalte) bleibt leer. Sie wird benötigt als Abschluss (siehe Formel).

Fast alle der Voraussetzungen (außer: Zwischen den Nullen aufsteigend, damit es immer um die "jeweils letzte Nichtnull" geht) fallen hier weg:

J1: =TEXTTEILEN(TEXTVERKETTEN("-";;WENNFEHLER(1/(1/WECHSELN(" "&((A1:H1>B1:I1)+(A1:H1>0)<>1)*(A1:H1-1%)&" ";" 0 ";""))+1%;""));"-")

Falls man die Nullen auch noch "packen" möchte, hätte man die Minuszahlen dafür. Ist aber von Dir nicht angefordert.
Erst mal recht herzlichen Dank für deine Mühe, aber ich bin leider auf der Suche nach einer VBA-Lösung, welchen ich in meinen schon bestehenden VBA-Code einflechten möchte. Aber trotzdem noch mal vielen Dank!
Ich antworte, weil mir das Problem Spaß macht. Du kannst also gern die Nichtverwendbarkeit bekunden.

Grundsätzlich kann man eine Formel in VBA verwenden, VBA in einer Formel aber nicht (wenn man UDF außen vor lässt).

Außerdem kann man jede Formel (so man sie denn versteht) durchaus auch "als Pseudocode" für eine native VBA-Lösung verwenden (also auch mit IF und FOR).
Bitte eine Beispieldatei und schon erstellte Code.
Hi,

da kann ich snb nur recht geben: Es ist sinnvoller den vorhanden Code zu überarbeiten, als dessen Ausgabe zu analysieren.

Was musst du tun? Statt einen Wert in eine Zelle zu schreiben, merkst du ihn dir falls er höher ist als der bisher gemerkte. Wenn eine Null kommt, geht das Spiel von vorne los.

Nehmen wir an, deine Zahl steckt in der Variable Erg. Dann könnte das so aussehen:
Code:
Dim aktSp as Long
Dim aktZeile as Long
Dim Max as Long 'oder Double
...
aktZeile = irgendwas_größer_0
...
If Erg > Max Then Max = Erg
If Erg = 0 Then
    aktSp = aktSp + 1
    Cells(aktZeile, aktSp) = Max
    Max = 0
    aktSp = aktSp + 1
    Cells(aktZeile, aktSp) = 0
End If
...
If Bedingung_für_neue_Zeile Then
    Cells(aktZeile, aktSp) = Max
    aktZeile = aktZeile + 1
    aktSp = 0
    Max = 0
End If
Hier noch der letzte Nachschlag von oben:

J1: =TEXTVERKETTEN(",";;LET(x;TEXTTEILEN(TEXTVERKETTEN(WENN(A1:H1*B1:I1+(A1:H1=B1:I1);"-";"#");;A1:H1);;"#");y;NACHZEILE(x;LAMBDA(a;LÄNGE(a)-LÄNGE(WECHSELN(a;"-";))+1));y-2*(LINKS(x)="0")*y))

Aus (A1:H3)
1 0 0 1 2 3 4 5
1 2 0 1 2 0 1 2
1 0 0 0 2 3 0 1
oder auch
1 0 0 1 1 1 1 1
1 1 0 1 1 0 1 1
1 0 0 0 1 1 0 1
wird nun komprimiert
1,-2,5
2,-1,2,-1,2
1,-3,2,-1,1
Code:
Sub M_snb()
  sn = Cells(1).CurrentRegion
 
  For j = 1 To UBound(sn)
    For jj = 1 To UBound(sn, 2) - 1
      sn(j, jj) = IIf(sn(j, jj) = 0, 0, IIf(sn(j, jj + 1) = 0, sn(j, jj), ""))
    Next
  Next
 
  Cells(10, 1).Resize(UBound(sn), UBound(sn, 2)) = sn
  Cells(10, 1).Resize(UBound(sn), UBound(sn, 2)).SpecialCells(4).Delete xlToLeft
End Sub