Mischen eines Tabellenblattes - Mehrdimensionale Felder
#11
Hallo Kathrin,

du hast ein paar Variablen nicht deklariert (Zeilen, s, iZ und x). Hast Du dir im Lokalfenster angeschaut, was diese Codezeile

Code:
varL(s) = Rows(s & ":" & s).Value

mit deinem Array macht?
Gruß Stefan
Win 10 / Office 2016
Top
#12
Hallo Stefan,

was die Variablen-Deklaration betrifft, so habe ich absichtlich diese unterlassen.
Der Compiler selbst übernimmt dies ja automatisch bei deren Definition. Ich meine
das dies durch aus auch in Überstimmung mit der von mir gelesen Literatur ist.
Der Code verschlankt sich dadurch ja auch.

Was die Codezeile betriffe weiß ich nicht so recht was du meinst.
Mit
varL(s) = Rows(s & ":" & s).Value
werden zeilenweise Felder eingelesen, die dann hinterher gemischt werden. Habe
den Code getestet und es wird gemischt. Das Programm erfüllt seinen Zweck

Bin an deiner Meinung aber sehr interessiert.
Top
#13
Hallo Kathrin,

(10.10.2014, 13:39)Kathrin Doppelbauer schrieb: was die Variablen-Deklaration betrifft, so habe ich absichtlich diese unterlassen.
Der Compiler selbst übernimmt dies ja automatisch bei deren Definition. Ich meine
das dies durch aus auch in Überstimmung mit der von mir gelesen Literatur ist.
Der Code verschlankt sich dadurch ja auch.

klar übernimmt der Compiler in diesem Fall die Definition. Er legt diese aber immer als Variant-Variable mit dem jeweiligen Untertyp an und Variant braucht den meisten Speicherplatz. 16 Byte anstatt wie bei einer Long-Variable von 4 Byte. Klar, bei den heutigen Arbeitsspeichergröße mag dies keine große Rolle spielen. Ich verwende die Option Explicit und muss daher jede Variable deklarieren. Dadurch vermeide ich auch Fehler, wenn ich die Variable falsch schreibe, siehe hier.

(10.10.2014, 13:39)Kathrin Doppelbauer schrieb: Was die Codezeile betriffe weiß ich nicht so recht was du meinst.
Mit
varL(s) = Rows(s & ":" & s).Value
werden zeilenweise Felder eingelesen, die dann hinterher gemischt werden. Habe
den Code getestet und es wird gemischt. Das Programm erfüllt seinen Zweck

Bin an deiner Meinung aber sehr interessiert.

ich hatte deinen Code vor meinen Beitrag nicht getestet und war irrtümlich der Meinung, das der Code weiter unten in einen Fehler laufen würde, da das Array nach der Zeile eben so
  • varL(1)(1)(1)
  • varL(1)(1)(2)
  • varL(1)(1)(3)
  • usw.

aussehen würde. Erst nach dem Test habe ich bemerkt, das es geht. Bei deiner Größe von über 65000 kam es auf meinen Laptop übrigens zu einem Laufzeitfehler (Nicht genügend Speicher).

Statt das mit dem Rows so

Code:
Rows(s & ":" & s)


zu machen, kööntest Du es so

Code:
Rows(s)

versuchen.
Gruß Stefan
Win 10 / Office 2016
Top
#14
Hallo Stefan
vielen Dank für den Hinweis mit dem Speicherplatz. So etwas hatte ich auch
mal irgendwann während meines Studiums gehört. Nur mein Rechner ist stark
genug, der muckt nicht.

Und mit Rows(s) wird auch besser formuliert.
Genau das was ich meine, Codeverbesserung!
Top
#15
Hallo zusammen,

bei mir kommt der Speicherfehler beim Einlesen nach 5950 Zeilen. Office 2013 (32), Windows 8.1 (64) und einem Laptop mit i5 und 8 GB Speicher. Also nach nicht einmal 10% der programmierten Zeilen auf einem recht gut ausgestatteten Gerät. Sad Allerdings eben kein 64er Office und wir in unserem Forum gleich wieder ein Beispiel, wo man die 64 bit braucht Wink.

Auf 10 reduziert funktioniert es nur bedingt: Die Inhalte wurden nicht über den gesamten Bereich gewürfelt, sondern immer nur in ihrer eigenen Spalte. Die Inhalte aus Spalte A standen wieder in Spalte A, die Inhalte aus Spalte B nur in Spalte B.

Ich zitiere mal aus meiner ersten Antwort:
Zitat:ich bin mir nicht sicher, ob Du mit Deiner Frage darauf abzielst, die Einträge aller Zeilen und Spalten der Excel-Tabelle zu mischen oder nur innerhalb der jeweiligen Spalte oder ...

Zudem finden sich die benachbarten Einträge der einzelnen Spalten auch jeweils in der gleichen Zeile wieder, z.B. die Einträge aus A5 und B5 dann in A2 und B2. Da die Spalten in meinem Bereich nicht vollständig bis zur letzten definierten Zeile gefüllt sind, sind Leerzeichen dazwischen.

Falls das alles so gewollt ist und Deine 16384 Spalten nicht alle gefüllt sind, könnte ich mir auch folgende Vorgehensweise vorstellen:

- füllen eines 1D-Array(65500) mit Zufallszahlen
- Ausgabe des Array in Spalte 16384
- Sortieren des gesamten Blattes nach Spalte 16384
- Leeren der Spalte 16384

Das dürfte dann deutlich schneller gehen. Auch wenn Deine Spalte 16384 gefüllt sein sollte würde mich mal ein Geschwindigkeitsvergleich der beiden Varianten interessieren - kann ich ja leider nicht selber machen wegen des fehlenden 64er Excel.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#16
Hallo André,

also ich hatte mit dem Mischen von 30 Spalten und über 65000 Zeilen keine Probleme. Das liegt aber, wie du schon sagtest
wohl an der 64 Bit Software. Wollte man alle Spalten und Zeilen füllen reicht auch meine Methode nicht aus.
Aber dem Thema entsprechend habe ich etwas mit Feldern gemacht. An das Sortieren dachte ich auch schon und glaube,
ja bin felsenfest davon überzeugt, dass dies effizienter funktioniert. Obwohl man ein derartiges Mischen kaum in Büchern finden
dürfte, ist das Einführen einer "Hilfsspalte" der wohl beste Weg. Insofern auch schön von dir als erfahrenen Programmierer
so einen Vorschlag zu hören.

Aber wer weiß, vielleicht hat im Forum ja jemand noch einen begnadeteren Einfall. Nur zu!
Top
#17
Hallo,

vielleicht doch noch mal Beitrag #7, entsprechend angepasst, probieren?

Gruß Uwe
Top


Gehe zu:


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