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.

Varianten erstellen
#1
Hallo Zusammen

Ich sehe wohl den Wald voller Bäume nicht mehr :)
Und zwar habe ich in der beiliegenden Excel File eine Art Varianten Generator.

Wenn man die Prozedur ausführt  generiert er aufgrund meiner Daten in Tabelle 1 alle Varianten in Tabelle 2.
Nun habe ich jedoch das Problem, dass es nur zehn Zeilen A8-A17 generiert obwohl  ich das gerne bis zur letzte Zelle mit Inhalt wünsche (indem Fall bis A100)

Was mache ich falsch? :)

Code:
Option Explicit

Sub varianten()
 Dim varColor As Variant, varVariante As Variant, varSizes As Variant, varOutput() As Variant
 Dim lngC As Long, lngV As Long, lngI As Long, lngS As Long, lngN As Long

 With Sheets("Sheet1")
   varColor = .Range("_color")
   varVariante = .Range("_var")
   varSizes = .Range("_size")
   lngC = Application.Sum(.Range("_var")) * Application.CountA(.Range("_size"))
   If UBound(varColor, 1) <> UBound(varVariante, 1) Then Exit Sub
   ReDim varOutput(1 To lngC, 1 To 3)
 
   lngI = 1
 
   For lngV = 1 To UBound(varVariante, 1)
     varOutput(lngI, 1) = varColor(lngV, 1)
     varOutput(lngI, 2) = varVariante(lngV, 1)
     For lngS = 1 To UBound(varSizes, 1)
       For lngN = 1 To varVariante(lngV, 1)
         varOutput(lngI, 3) = varSizes(lngS, 1)
         lngI = lngI + 1
       Next
     Next
   Next
 
   Worksheets("Sheet2").Range("A2").CurrentRegion = ""
   Worksheets("Sheet2").Range("A2").Resize(UBound(varOutput, 1), 3) = varOutput
 End With
 
End Sub
Tausend Dank für die Hilfe im voraus
Inspektor


Angehängte Dateien
.xlsm   GrösseZellenEinfügen.xlsm (Größe: 46,29 KB / Downloads: 3)
Antworten Top
#2
Hallöchen,

Deine benannten Bereiche gehen nur bis Zeile 17 !?
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#3
Hi Schauam

Genau, nur bis Zeile 17, wie kann ich das ändern das es bis zur letzten Zeile geht oder zumindest bis zum Beispiel Zeile 1000 ?

Danke und Gruss

Inspi
Antworten Top
#4
Hallo

eine Lösung auf die schnelle, die aber ausreichen könnte, ist den Code wie unten mit Resize zu erweitern.
Ob hier auch mit Resize gearbeitet werden muss bitte selbst testen:    Application.Sum(.Range("_var").Resize(lzA, 1))

ich hoffe diese kleine Erweiterung wird helfen die Aufgabe zu lösen

mfg  Gast 123

Code:
  With Sheets("Sheet1")
   'LastZell in Spalte A nach unten suchen
   lzA = .Range("A8").End(xlDown).Row
   varColor = .Range("_color").Resize(lzA, 1)
   varVariante = .Range("_var").Resize(lzA, 1)
   varSizes = .Range("_size").Address
   lngC = Application.Sum(.Range("_var")) * Application.CountA(.Range("_size"))
Antworten Top
#5
Hi Gast123

Ich erhalte ständig einen Unverträglichkeitsfehler in der Zeile

Code:
For lngS = 1 To UBound(varSizes, 1)

hmm, alles korrekt deklariert aber da macht mir der VBA Teufel ein Strich durch die Rechnung :)

Woran könnte das liegen??

Gruss
Antworten Top
#6
Hallo

ich habe mir mal eine Referenzliste der Workbook Namen erstellt und dabei was interessantes festestellt.

Diese Namen beinhalten nicht nur den bereich sondern auch "Index" und "CountA" für diesen Bereich!  Dann dürfte mein Vorschlag zur Erweiterung nicht klappen.  Wir sind aber nicht dumm, Bereiche lassen sich per Vba umschreiben!!  Der Bereich wurde von mir mit mindestens 17 und max. 1000 Zeilen begrenzt  Ggf. bitte selbst aendern.  Bitte mal testen ob es damit klappt.  

Ganz unten ist ein Makro mit den Originalwerten, damit man jederzeit den Urzustand wiederherstellen knn.  
Würde mich freuen wenn es so klappt.

mfg  Gast 123

Code:
Option Explicit

Sub varianten()
 Dim varColor As Variant, varVariante As Variant, varSizes As Variant, varOutput() As Variant
 Dim lngC As Long, lngV As Long, lngI As Long, lngS As Long, lngN As Long, lzA As Long

 With Sheets("Sheet1")
   'LastZell in Spalte A nach unten suchen
   lzA = .Range("A8").End(xlDown).Row
   İf lzA < 17 Then lzA = 17       'Mindestens 17 Zeilen
   If lzA > 1000 then lzA = 1000   'auf Max. 1000 begrenzen
   
  'Zeile 17 in Namen Bereich durch lzA auswechseln
  ThisWorkbook.Names("_color").RefersTo = "=Sheet1!$A$8:INDEX(Sheet1!$A$8:$A$" & lzA & ",COUNTA(Sheet1!$A$8:$A$" & lzA & "))"
  ThisWorkbook.Names("_size").RefersTo = "=Sheet1!$I$8:INDEX(Sheet1!$I$8:$I$" & lzA & ",COUNTA(Sheet1!$I$8:$I$" & lzA & "))"
  ThisWorkbook.Names("_var").RefersTo = "=Sheet1!$B$8:INDEX(Sheet1!$B$8:$B$" & lzA & ",COUNTA(Sheet1!$B$8:$B$" & lzA & "))"
   
   varColor = .Range("_color")
   varVariante = .Range("_var")
   varSizes = .Range("_size")
   lngC = Application.Sum(.Range("_var")) * Application.CountA(.Range("_size"))
   
   If UBound(varColor, 1) <> UBound(varVariante, 1) Then Exit Sub
   ReDim varOutput(1 To lngC, 1 To 3)
 
   lngI = 1

   For lngV = 1 To UBound(varVariante, 1)
     varOutput(lngI, 1) = varColor(lngV, 1)
     varOutput(lngI, 2) = varVariante(lngV, 1)
     For lngS = 1 To UBound(varSizes, 1)
       For lngN = 1 To varVariante(lngV, 1)
         varOutput(lngI, 3) = varSizes(lngS, 1)
         lngI = lngI + 1
       Next
     Next
   Next
 
   Worksheets("Sheet2").Range("A2").CurrentRegion = ""
   Worksheets("Sheet2").Range("A2").Resize(UBound(varOutput, 1), 3) = varOutput
 End With
 
End Sub


'alten Originalzustand der Workbook Namen wiederherstellen

Sub Originalformel_einsetzen()
ThisWorkbook.Names("_color").RefersTo = "=Sheet1!$A$8:INDEX(Sheet1!$A$8:$A$17,COUNTA(Sheet1!$A$8:$A$17))"
ThisWorkbook.Names("_size").RefersTo = "=Sheet1!$I$8:INDEX(Sheet1!$I$8:$I$17,COUNTA(Sheet1!$I$8:$I$17))"
ThisWorkbook.Names("_var").RefersTo = "=Sheet1!$B$8:INDEX(Sheet1!$B$8:$B$17,COUNTA(Sheet1!$B$8:$B$17))"
End Sub
Antworten Top
#7
Was soll ich sagen, du bist der KING!!!
Nach einer Woche habe ich endlich exakt das gewünschte Resultat.
Und dann geht's auch noch derart brutal schnell, die Prozedur.

TAUSEND Dank Gast123!!!!!
Antworten Top


Gehe zu:


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