5.6k Aufrufe
Gefragt in Tabellenkalkulation von fedjo Experte (2.2k Punkte)
Hallo,
wie kann man die zwei Bereiche zu einem varBereich verbinden.

Gruß
fedjo

varBereich = Range("C3", Range("C3").End(xlDown))
Range("K3", Range("K3").End(xlDown))

20 Antworten

0 Punkte
Beantwortet von theblackbird_ Mitglied (605 Punkte)
Moin,

Ein Beispiel, wie es denn genau aussehen sollte, hast Du damit aber immer noch nicht gegeben. Oder siehst Du das anders? Ich kann nach wie vor nur mutmassen. Du vermisst wohl Artikel 07700077 in der Combobox nehme ich an?!?

Dann aendere in Rainer's (rainberg) Code aus #5 die For-Schleife NUN einmal wie folgt:
For loZaehler = LBound(varBereich) To UBound(varBereich)
objDictionary(varBereich(loZaehler, 1)) = 0
objDictionary(varBereich(loZaehler, 9)) = 0
Next loZaehler


Dann koennt das evtl. fuer Dich passen. (zumindest bei der Kombo-Box)
Ob die Ergebnisse in der Listbox dann allerdings so ausfallen wie vorgesehen, das weisst auch nur Du. Mir zumindest kommt es bspw. bei Artikel 01100011 schon komisch vor, dass nur ein Abgang (-) in der Listbox auftaucht.

Cu
TheBlackBird ®
0 Punkte
Beantwortet von fedjo Experte (2.2k Punkte)
Hallo TheBlackBird,
ich habe jetzt den Code von Rainer angepasst, die ComboBox funktioniert jetzt super. Für die Ausgabe der Ergebnisse habe ich mich für eine andere ListBox entschieden. Aber auch bei dieser werden die Ergebnisse vom Auslagern (02100021) nicht richtig angezeigt.
Vielleicht könntest Du dir noch mal die Musterdatei ansehen.

Gruß
fedjo

Musterdatei
0 Punkte
Beantwortet von theblackbird_ Mitglied (605 Punkte)
Moin,

SO kann das ja auch nicht funktionieren. ;-)
Auf den ersten Blick fallen mir da mal zwei gravierende LogikFehler auf:

- Du durchlaeufst Deine Tabelle von Zeile 2 bis zu der letzten beschriebenen Zelle in SpalteC. Was passiert wenn Du mehr Auslagerungen als Einlagerungen in der Tabelle hast? Richtig, alle "ueberzaehligen" Auslagerungen werden ueberhaupt nicht beruecksichtigt.

- Zum fuellen des Arrays pruefst Du nur die Spalte C auf Gleichheit mit der ausgewaehlten Artikelnummer. Und aus der Zeile (in der Artikelnummer in C=Einlagern stimmt) holst Du nun Einlagerungs- UND Aulagerungsmenge. Um bei Deinem Beispiel zu bleiben (02100021) uebernimmst Du SO die Auslagerungsmenge von 06300063 am 28.01.2012. Was ja nun wohl falsch sein duerfte. (siehe Zeile9)
(Der erste Auslagerungswert stimmt so nur zufaellig, da in Zeile3 der selbe Artikel zur Ein- und Auslagerung steht.)

Fuer Dich evtl. einfacher zu Programmieren waere es wohl, wenn Du fuer Ein- und Auslagerungsvorgaenge JE eine Listbox anlegst.

In eine einzige Listbox zu schreiben ist durchaus moeglich. Muss dann aber vom "Aufsammeln" her etwas umgebaut werden.

Traust Du Dir das anhand meiner Anmerkungen selbst zu? Oder hast sogar Spass daran dies selbst auszutueffteln? Oder soll ich malSchauen wie das im Einzelnen bei mir aussehen wuerde, und das Ergebnis hier zum Besten geben?

bis hierhin einmal
TheBlackBird ®
0 Punkte
Beantwortet von fedjo Experte (2.2k Punkte)
Hallo TheBlackBird,
das übersteigt meine Kenntnisse in VBA doch um einiges.
Vielleicht könntest Du ja mal ein Muster Programmieren.

Danke schon mal im Voraus.

Gruß
fedjo
0 Punkte
Beantwortet von theblackbird_ Mitglied (605 Punkte)
Moin,

Nachfolgend einmal ein Denkansatz, wie Dein ComboBox1_Click() umgebaut werden koennte:
Private Sub ComboBox1_Click()
Dim lngI As Long
ReDim varArrIn(3, 1000) As Variant
Dim lngAus As Long 'Zeilen Einlagern... nicht Spalten
Dim lngEin As Long 'Zeilen Auslagern
Dim lngAnzEin As Long, lngAnzAus

Me.ListBox1.Clear
With Me.ComboBox1 'Auslagern Artikelnummer blau
.SelStart = 0
.SelLength = Len(.Text)
End With

lngAus = Sheets("Ein-Auslagern").Range("K65536").End(xlUp).Row 'letzte Zeile Auslagerungen
lngEin = Sheets("Ein-Auslagern").Range("C65536").End(xlUp).Row 'letzte Zeile Einlagerungen


'Einlagerungen sammeln
For lngI = 2 To lngEin
If Sheets("Ein-Auslagern").Cells(lngI, 3).Value _
= ComboBox1.Value Then
If lngAnzEin >= UBound(varArrIn, 2) Then
ReDim Preserve varArrIn(3, UBound(varArrIn, 2) + 1000) 'Array zur Not vergroessern
End If
varArrIn(0, lngAnzEin) = Sheets("Ein-Auslagern").Range("F" & lngI).Value
varArrIn(1, lngAnzEin) = Sheets("Ein-Auslagern").Range("E" & lngI).Value
lngAnzEin = lngAnzEin + 1
End If
Next
'Auslagerungen sammeln
For lngI = 2 To lngAus
If Sheets("Ein-Auslagern").Cells(lngI, 11).Value _
= ComboBox1.Value Then
If lngAnzAus >= UBound(varArrIn, 2) Then
ReDim Preserve varArrIn(3, UBound(varArrIn, 2) + 1000) 'Array zur Not vergroessern
End If
varArrIn(2, lngAnzAus) = Sheets("Ein-Auslagern").Range("N" & lngI).Value
varArrIn(3, lngAnzAus) = Sheets("Ein-Auslagern").Range("P" & lngI).Value
lngAnzAus = lngAnzAus + 1
End If
Next
'Array auf gezaehlte Groesse verkleinern
If lngAnzAus > lngAnzEin Then
ReDim Preserve varArrIn(0 To 3, 0 To lngAnzAus)
Else
ReDim Preserve varArrIn(0 To 3, 0 To lngAnzEin)
End If

ListBox1.ColumnWidths = "2 cm;2,5 cm;2 cm;2,5 cm"
ListBox1.List = Application.WorksheetFunction.Transpose(varArrIn) 'Array "gedreht" in ListBox
End Sub


Ich war mir nun unsicher, ob ich dies komplett auf meine Art und Weise schreiben sollt, oder ob ich versuchen sollte, mich an Deine Art anzulehnen, um Dir die weitere Anpassung zu erleichtern. Ich habe mich dabei fuer Letzteres entschieden. So hoffe ich, dass der Ablauf von Dir einfach nachvollzogen werden kann.
Allerdings glaube ich, dass ich die Geschichte mit dem Array etwas naeher beleuchten muss.
Die Werte werden "quer" gesammelt und dann gedreht in die Listbox geschrieben. Ich habe dies hier im SN schon einmal versucht zu erlaeutern, Warum, Weshalb und Wie...

bis hierhin einmal
TheBlackBird ®
0 Punkte
Beantwortet von fedjo Experte (2.2k Punkte)
Hallo TheBlackBird ,
ich habe erstmal aus AW13 deinen Denkanstoß, für Ein- und Auslagerungen je eine Listbox angelegt, funktioniert auch, aber schon beim ersten Click auf die ComboBox wird schon die Bildlaufleiste in der ListBox angezeigt.

Deinen Code aus AW15 habe ich jetzt auch getestet, der funktioniert einfach super.
Eine kleine Frage noch dazu: Was muss im Code noch verändert werden wenn je eine Spalte Ein-Auslagerung hinzugefügt werden soll?

varArrIn(0, lngAnzEin) = Sheets("Ein-Auslagern").Range("F" & lngI).Value
varArrIn(1, lngAnzEin) = Sheets("Ein-Auslagern").Range("E" & lngI).Value
varArrIn(2, lngAnzEin) = Sheets("Ein-Auslagern").Range("E" & lngI).Value

varArrIn(3, lngAnzAus) = Sheets("Ein-Auslagern").Range("N" & lngI).Value
varArrIn(4, lngAnzAus) = Sheets("Ein-Auslagern").Range("P" & lngI).Value
varArrIn(5, lngAnzAus) = Sheets("Ein-Auslagern").Range("O" & lngI).Value

Gruß
fedjo
0 Punkte
Beantwortet von theblackbird_ Mitglied (605 Punkte)
Moin,

Dass Du bei Deiner alten (fehlerhaften) Version und auch bei der Version mit zwei Listboxen selbst bei nur einem einzigen Treffer gleich einen Scollbalken in der Listbox hast, liegt einfach daran, dass Du ein fest dimensioniertes Array uebergibst. (siehe Deine Beispielmappe aus #12)

iirc hattest Du dort Dim Arr(100, 3) As Variant geschrieben.
Von diesem Array fuellst Du nun ein paar Zeilen und uebergibst es dann der Listbox.

Stellst Du Dir das 2dimensionale Array nun als Tabelle vor, hast Du in den ersten beiden Zeilen Werte stehen.
Die Tabelle ist aber bei Uebergabe an die Listbox immernoch 101 Zeilen lang. Daher der Scrollbalken. Ticker die Listbox einmal mit der DownArrow-Taste durch... Du solltest dabei dann immer genau auf die 101Zeilen kommen.

Daher verkleinere ich in #15 das Array mittels ReDim Preserve auf die zuvor mitgezaehlte Groesse. Allerdings kann man damit immer nur die letzte Dimension eines Arrays veraendern. Um bei dem Bild mit der Tabelle zu bleiben (erste Dimension= Zeilen, zweite Dimension= Spalten), kann man so leider nur die Anzahl der Spalten aendern, wenn man die zuvor ins Array geschriebenen Daten behalten moechte.
Zum Zeitpunkt der Dimensionierung weisst Du nun aber noch nicht, wie viele Zeilen es denn genau werden. Aendern kannst Du sie aber nicht mehr, sondern nur die Anzahl der Spalten.

Stell Dir nun weiterhin vor, dass Du die Tabelle um 90° nach links kippst. So "quer" befuellst Du nun das Array, welches Du zuvor nun mit Dim Arr(3, 100) As Variant dimensioniert hast. Du hast so nun also 4"Zeilen" und erstmal 101"Spalten". So kannst Du die Spalten mitzaehlen und nach Befuellung die ueberfluessigen "Spalten" mit ReDim Preserve "abschneiden". (Du kannst aber auch weitere "Spalten" hinzufuegen, wenn doch einmal mehr benoetigt werden. siehe #15)

Dafuer das Zeilen und Spalten dann die Plaetze tauschen, sorgt dann bei der Uebergabe Application.WorksheetFunction.Transpose. Das ist eigtl. nichts anderes als die Option "Transponieren" von Excel.

Alles in allem ergibt sich daraus fuer Deine Frage aus #16 also folgendes:
ListBox soll nun 6Spalten haben und eine ungewisse Anzahl Zeilen. Fuer das "Quer"-Befuellen brauchen wir also 6"Zeilen". ==>ReDim varArrIn(5, 1000) As Variant fuer ein 0-basiertes Array. Alle Zeilen in denen daraufhin ein ReDim Preserve steht, muessen dann in der ersten Dimension ebenfalls auf 5 geaendert werden (ReDim Preserve varArrIn(0 To 5, 0 To lngAnzAus).
Selbstredend solltest Du die Listbox dann zuvor via "Eigenschaften" oder mittels Code auch auf 6Spalten bringen. Und die Spaltenbreite der Listbox anzupassen, solltest Du auch nicht vergessen. ;-)

Cu
TheBlackBird ®
0 Punkte
Beantwortet von fedjo Experte (2.2k Punkte)
Hallo TheBlackBird,
ich möchte mich erstmal für deine Hilfe, Geduld und Ausdauer herzlich bedanken.
Mit deiner Hilfe benötige ich jetzt nur eine ListeBox für das Ein und Auslagern.
Eine kleine Frage hätte ich noch, wenn es nicht zu viel Mühe macht:
Kann für das Einlagern und Auslagern in der ListBox je eine eigene BackColor Farbe verwenden?

Schönen Sonntag
Gruß

fedjo
0 Punkte
Beantwortet von theblackbird_ Mitglied (605 Punkte)
Moin,

Meiner Meinung nach ist es nicht moeglich die einzelnen Spalten einer einzigen Listbox mit unterschiedichen Farben zu versorgen. Alle "Farbeigenschaften" beziehen sich wohl auf die gesamte Listbox. (BorderColor, BackColor, ForeColor) Da wirst Du wohl oder uebel auf die Loesung mit zwei separaten ListBoxes zurueckgreifen muessen.

Cu
TheBlackBird ®
0 Punkte
Beantwortet von fedjo Experte (2.2k Punkte)
Hallo TheBlackBird ,
habe mich jetzt für zwei ListBoxen entschieden.

Danke noch mal für deine Hilfe.

Gruß
fedjo
...