Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1484to1488
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Sachmerkmal Kombinationen nur bis Zeile 65536

Sachmerkmal Kombinationen nur bis Zeile 65536
06.04.2016 12:49:55
baschti007
Hallo User .
Gibt es eine Möglichkeit mehr als 65536 Kombinationen anzeigen zulassen mit diesem VBA Code ?
ZB. das wenn auf Tabelle2 die 65536 Kombinationen stehen er dann ein neues Tabellenblatt erzeugt und weiter macht.
Sub Kombi()
Dim arr_Data As Variant, arr_Desc As Variant
Dim arr_Result As Variant
Dim arrtemp As Variant
Dim i As Long, j As Long, k As Long, n As Long
Dim varCombinations As Variant
Dim lngR As Long, lngC As Long
lngC = Cells(2, Columns.Count).End(xlToLeft).Column
ReDim arr_Desc(1 To 2, 1 To lngC - 1)
For j = lngC To 2 Step -1
arr_Desc(1, j - 1) = Cells(Rows.Count, j).End(xlUp).Row - 2
If j  lngC Then
arr_Desc(2, j - 1) = arr_Desc(1, j - 1) * arr_Desc(2, j)
Else
arr_Desc(2, j - 1) = arr_Desc(1, j - 1)
End If
If arr_Desc(1, j - 1) > lngR Then
lngR = arr_Desc(1, j - 1)
End If
Next j
arr_Data = Range(Cells(3, 2), Cells(lngR + 2, lngC))
varCombinations = arr_Desc(2, 1)
If varCombinations > 65000 Then
MsgBox "Kombinationen: " & varCombinations & vbCrLf & vbCrLf _
& "Berechnung wird abgebrochen"
Exit Sub
End If
MsgBox "Kombinationen: " & varCombinations
ReDim arr_Result(1 To arr_Desc(2, UBound(arr_Desc, 2)))
For i = 1 To UBound(arr_Result)
arr_Result(i) = arr_Data(i, UBound(arr_Data, 2))
Next i
For i = UBound(arr_Desc, 2) - 1 To 1 Step -1
ReDim arrtemp(1 To arr_Desc(2, i))
For j = 1 To arr_Desc(1, i)
For k = 1 To UBound(arr_Result)
n = n + 1
arrtemp(n) = arr_Data(j, i) & "-" & arr_Result(k)
Next k
Next j
arr_Result = arrtemp
n = 0
Next i
With Sheets(2)
.Cells.Clear
.Cells(2, 7).Resize(UBound(arr_Result), 1) = _
WorksheetFunction.Transpose(arr_Result)
End With
End Sub

Hier meine Datei
https://www.herber.de/bbs/user/104797.xlsm
Gruß Basti
Danke =)

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Sachmerkmal Kombinationen nur bis Zeile 65536
06.04.2016 13:08:20
EtoPHG
Hallo Basti,
Was soll den die Frage? Es ist ja nirgends eine Begrenzung auf die 'komische' Zahl 65'536 im Code?
Ein Blatt hat 1'048'576 Zeilen und 16'384 Spalten und damit 17'179'869'184 Zellen. Genügt dir das nicht?
Gruess Hansueli

AW: Sachmerkmal Kombinationen nur bis Zeile 65536
06.04.2016 13:12:30
baschti007
Hallo EtoPHG
Die Zuordnung der vielen Kombinationen der Sachmerkmale ist auf 65000 begrenzt da ab 65536 keine Berechnung mit diesem Code möglichst ist.
Meine Frage war ja ob man dieses erweitern kann

AW: Sachmerkmal Kombinationen nur bis Zeile 65536
06.04.2016 13:19:20
Rudi
Hallo,
Meine Frage war ja ob man dieses erweitern kann
kann man.
  If varCombinations > 65000 Then
MsgBox "Kombinationen: " & varCombinations & vbCrLf & vbCrLf _
& "Berechnung wird abgebrochen"
Exit Sub
End If

löschen und anstatt per Transpose (geht nur bis 65536) das Array per Schleife drehen.
Gruß
Rudi

Anzeige
AW: Sachmerkmal Kombinationen nur bis Zeile 65536
06.04.2016 13:55:03
baschti007
Hallo Rudi
das mit dem Löschen hatte ich auch schon gemacht nur leider kommt dann dieses
Userbild
und das mit der schleife weis ich nicht wie ich das machen soll , verstehe das was du meinst nur mit der Umsetzung hapert es bei mir =)
gibst du mir einen Tip.
Gruß Basti

AW: Sachmerkmal Kombinationen nur bis Zeile 65536
06.04.2016 14:17:26
Rudi
Hallo,
ReDim arr_ResultA(1 To UBound(arr_Result), 1 To 1)
For i = 1 To UBound(arr_Result)
arr_ResultA(i, 1) = arr_Result(i)
Next i
With Sheets(2)
.Cells.Clear
.Cells(2, 7).Resize(UBound(arr_ResultA)) = arr_ResultA
End With
Gruß
Rudi

Anzeige
Danke =)
06.04.2016 14:40:10
baschti007

AW: Sachmerkmal Kombinationen nur bis Zeile 65536
06.04.2016 13:20:53
EtoPHG
Hallo Basti,
...und das nennst du eine Begründung?
Wieso ist ab 655536 keine Berechnung mit diesem Code möglich?
Welches Teil setzt diesen Grenzwert?
Was hat das mit dem Tabellenblatt zu tun?
Deine Anfragen und Antworten werfen zunehmend mehr Fragen auf!
Gruess Hansueli

deshalb
06.04.2016 13:29:37
Rudi
Hallo Hansueli,
  If varCombinations > 65000 Then
MsgBox "Kombinationen: " & varCombinations & vbCrLf & vbCrLf _
& "Berechnung wird abgebrochen"
Exit Sub
End If

aber das erkennt er wohl nicht.
Gruß
Rudi

Anzeige
AW: Sachmerkmal Kombinationen nur bis Zeile 65536
06.04.2016 13:49:27
UweD
Hallo
das hat nichts mit der ZEILENBegrenzung zu tun. Die 2^16 (=65536) Grenze wurde ab Excel 2007
aufgehoben.
Ich vermute das makro stammt noch aus Zeiten mit der Begrenzung
Aber!
Das Transponieren in Spalten ist aber das Problem. Max von 256 auf 16.384 erhöht, aber das reicht nicht

.Cells(2, 7).Resize(UBound(arr_Result), 1) = _
WorksheetFunction.Transpose(arr_Result)

Gerechnet werden mehr Kombinationen, aber durch das Drehen nicht mehr darstellbar.
Entweder du drehst nicht, oder baust das makro so um, dass bei 16.384 ein neues Blatt verwendet wird.
Gruß UweD

Anzeige
AW: Sachmerkmal Kombinationen nur bis Zeile 65536
06.04.2016 14:30:00
UweD
das mit den max Spalten ist Quatsch. Wird ja alles nur in eine DatenSpalte geschrieben.
Maximale Zeilenzahl ist aber 1.048.576
Darauf könntest du Begrenzen
LG UweD

Danke =)
06.04.2016 14:40:30
baschti007

AW: Sachmerkmal Kombinationen nur bis Zeile 65536
06.04.2016 14:16:45
Daniel
Hi
die Erklärungen, woran es liegt hast du ja schon erhalten
hier jetzt der Code dazu.
das Limit liegt jetzt bei 2^20 und ist darin begründet, was in Excel jetzt in eine Spalte passt.
sollten noch mehr Kombinationen berücksichtigt werden, so ließe sich das auch realisieren, wenn man das Ergebnis in mehrere Spalten schreibt.
Hier aber erstmal der Code für eine Spalte:
Sub MK2()
Dim arr_Data As Variant, arr_Desc As Variant
Dim arr_Result As Variant
Dim arr_Result2 As Variant ' lngC Then
arr_Desc(2, j - 1) = arr_Desc(1, j - 1) * arr_Desc(2, j)
Else
arr_Desc(2, j - 1) = arr_Desc(1, j - 1)
End If
If arr_Desc(1, j - 1) > lngR Then
lngR = arr_Desc(1, j - 1)
End If
Next j
arr_Data = Range(Cells(3, 2), Cells(lngR + 2, lngC))
varCombinations = arr_Desc(2, 1)
If varCombinations > (2 ^ 20 - 2) Then ' 
Gruß Daniel

Anzeige
AW: Sachmerkmal Kombinationen nur bis Zeile 65536
06.04.2016 14:44:05
baschti007
Hallo Daniel
Rudi und UweD haben mir auch schon sehr weiter geholfen . Und nu habe ich den Code so wie du .
Wie bekomme ich das nun hin , das automatisch, wenn die Spalte voll ist die nächste gefüllt wird ?
Gruß Basti
Danke

AW: Sachmerkmal Kombinationen nur bis Zeile 65536
06.04.2016 14:53:31
Daniel
Hi
im Prinzip so:

MaxZ = 100000 'Anzahl Zeilen pro Spalte
redim arr_Result2(1 to MaxZ, 1 to Worksheetfunction.RoundUp(Ubound(arr_Result) / MaxZ, 0))
for i = 1 to Ubound(arr_Result)
arr_Result2(((i - 1) Mod MaxZ) + 1, Worksheetfunction.RoundUp(i / MaxZ, 0)) = arr_Result(i)
Next
.cells(2, 7).Resize(ubound(arr_Result2, 1), Ubound(arr_result2, 2)) = arr_Result2
hab ich jetzt aber nicht auf Schreibfehler getestet.
Daher bitte nicht kopieren und einfügen, sondern lesen, verstehen und dann selber programmieren.
Gruß Daniel

Anzeige
AW: Sachmerkmal Kombinationen nur bis Zeile 65536
07.04.2016 10:10:15
baschti007
Hallo Daniel . Danke =)
Wenn ich das mit meinen kleinen Kenntnissen sagen kann.
Hier wird das Limit festgelegt für die Maximale Zeilen Anzahl und Maximale Tabellenblatt Anzahl.
redim arr_Result2(1 to MaxZ, 1 to Worksheetfunction.RoundUp(Ubound(arr_Result) / MaxZ, 0))
Nur ist meine Frage weshalb bekomme ich wenn ich mehr Kombinationen als Spalten auf einem Blatt habe dennoch ein Fehler "Nicht genügend Speicher" obwohl er ja ab MaxZ die Spalte wechselt ?
Gruß Basti

AW: Sachmerkmal Kombinationen nur bis Zeile 65536
07.04.2016 10:48:13
Daniel
HI
naja, du schreibst hier erstmal alles in ein Array mit mehreren Spalten, bevor du die Werte in die Zellen schreibst.
der Speicherplatz für Arrays ist begrenzt, da geht halt irgendwann der Speicherplatz aus.
dann müsstest du so vorgehen:
dim i as Long
dim z as long
dim s as Long
MaxZ = 100000
redim arr_Result2(1 to MaxZ, 1 to 1)
z = 1
s = 7
for i = 1 to ubound(arr_Result)
arr_Result2(z, 1) = arr_Result(i)
z = z + 1
if z > MaxZ then
.Cells(2, s).Resize(MaxZ, 1).Value = arr_Result2
z = 1
s = s + 1
Redim arr_Result2(1 to MaxZ, 1 to 1)
end if
next
.cells(2, s).Resize(MaxZ, 1).valeu = arr_Result2
das braucht jetzt weniger Speicherplatz, weil du nicht das komplette Ergebnis in ein Array ablegst, sondern immer nur den Teil der in eine Spalte passt und wenn dieses voll ist, schreibst du die Werte ins Tabellenblatt und leerst das Array um es erneut mit den Werten für die nächste Spalte zu beschreiben.
Gruß Daniel

Anzeige
Danke =)
07.04.2016 20:11:27
Bastian
Daniel Danke für deine Mühe und alle anderen die mir weiter geholfen haben =) Super Forum
Noch eine Kurze Frage ich würde gerne VBA/VB lernen wie ist der beste Ansatz dafür ?
Gruß Basti

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige