Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Liste mit Zahlen komprimierter darstellen
#1
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.


Angehängte Dateien Thumbnail(s)
   
Antworten Top
#2
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.
[-] Folgende(r) 1 Nutzer sagt Danke an LCohen für diesen Beitrag:
  • Lynx
Antworten Top
#3
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!
Antworten Top
#4
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).
[-] Folgende(r) 1 Nutzer sagt Danke an LCohen für diesen Beitrag:
  • Lynx
Antworten Top
#5
Bitte eine Beispieldatei und schon erstellte Code.
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#6
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
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#7
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
Antworten Top
#8
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
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste