Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1628to1632
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

Felder aus Tabelle auslesen und bearbeiten

Felder aus Tabelle auslesen und bearbeiten
01.07.2018 12:18:17
Schulz
Hallo Zusammen,
ich brauche etwas Hilfe bei folgendem Problem:
In einer Tabelle werden 5 Bauteile für einen beliebigen Zeitraum geplant (ca. 100 Zeilen) - Tabellenformat (Bauteil, Menge, Start, Ende). Die geplante Mengen übersteigt teilweise die max. Produktionsmenge. Das Makro soll dann eine zusätzliche Zeile einfügen und die geplante Mengen auf die max. Mengen aufsplitten.
Beispiel: Geplante Menge: 155; Max. Menge: 50; Aus einer Zeile würde das Makro dann 4 Zeilen bilden:
Ursprünglich: Bauteil 1; 150; 1:00; 4:06
Neu:
Bauteil 1; 50; 1:00; 2:00
Bauteil 1; 50; 2:00; 3:00
Bauteil 1; 50; 3:00; 4:00
Bauteil 1; 50; 4:00; 4:06
Danke für die Unterstützung
Gunnar

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Felder aus Tabelle auslesen und bearbeiten
01.07.2018 20:12:55
Barbaraa
Hi Gunnar,
Warum wird in Deinem Beispiel die Produktionsmenge 200 (=4*50)?
Sollte in der letzen Zeile nicht 5 stehen?
Was, wenn sich die Zeit mit 50 pro Stunde nicht ausgeht? ZB 300 Stück von 1:00 bis 4:06?
Mach doch bitte mal eine Beispieldatei mit mehreren Bauteilen und mit Lösungen, wie es dann aussehen soll, und lade sie hoch. Vielleicht bekommst Du dann eher Hilfe.
LGB
AW: Felder aus Tabelle auslesen und bearbeiten
02.07.2018 08:51:37
Schulz
Hallo Barbaraa,
die letzte Zeile ist tatsächlich falsch - hier muss der Wert 5 statt 50 stehen. Ich habe zur Erläuterung der Zielstellung die Tabelle angefügt. Mein Ansatz wäre die Originaltabelle in ein Array einzulesen und dann entsprechend zeilenweise zu prüfen; Wenn die Max. Mengen in Abhängigkeit zum Bauteil überschritten wird, wird in das Array eine zusätzliche Zeile eingefügt. Ich bin mir aber nicht sicher ob das wirklich eine elegante Lösung ist..
Vielen Dank für Kommentare
Gunnar
https://www.herber.de/bbs/user/122428.xlsx
Anzeige
AW: Felder aus Tabelle auslesen und bearbeiten
02.07.2018 09:36:13
Barbara
Habe mir Deine Datei angesehen.
Werde daraus aber nicht schlau, wie die Start- und Endzeiten errechnet werden.
Hier steht auch noch eine Max.-Menge-Tabelle ab A15.
Die Arraylösung ist eine gute Möglichkeit und macht sich durch schnelle Verarbeitung bei langen Listen, also ein paar hundert Zeilen, bemerkbar, je nach der Anzahl der Zugriffe auf die Tabelle.
Du kannst auch Zeile für Zeile vorgehen und die entsprechende Anzahl Zeilen einfügen. Diese Methode finde ich anschaulicher, weil man da gleich jeden Schritt einfach an der Tabelle nachvollziehen kann, dauert nur einen Augenblick bei der Durchführung. Die Array-Methode dauert einen halben Augenblick bis zwei Augenblicke.
Das wäre im Fall des Bauteil 1:
int(5000/900), das sind 6 Zeilen, einfügen.
Und dann machst Du Schritt für Schritt weiter, so wie Du es händisch gemacht hast.
Nun zu Deiner Frage: "ich brauche etwas Hilfe bei folgendem Problem:"
Wobei konkret brauchst Du etwas Hilfe? Wie weit bist Du gekommen? Wo stehst Du an?
LGB
Anzeige
AW: Felder aus Tabelle auslesen und bearbeiten
02.07.2018 12:51:50
Schulz
Hallo Barbara,
hier mein bisherige Quelltext - nicht besonders schön funktioniert so etwa. Als Problem bleibt noch die Berechnung der Teilmenge. D.h. wenn die Planmenge nicht ein ganzzahliges Vielfaches der Max. Menge ist darf nur die Teilmenge eingetragen werden. In meinem Code wird jedoch die gesamte Max. Mengen eingetragen.
Viele Grüße
Gunnar
Sub TabelleUmwandeln()
Dim Zeile As Long
Dim ZeileMax As Long
Dim Z As Long
Dim n As Long
Worksheets("Tabelle1").Activate
ZeileMax = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Z = 1
For Zeile = 2 To ZeileMax
'Prüfung L600
If Worksheets("Tabelle1").Cells(Zeile, 1).Value = "L600" And Worksheets("Tabelle1").Cells(Zeile, _
2).Value  900 Then
Anz = Worksheets("Tabelle1").Cells(Zeile, 2) / 900
Do While n  700 Then
Anz = Worksheets("Tabelle1").Cells(Zeile, 2) / 700
Do While n  1500 Then
Anz = Worksheets("Tabelle1").Cells(Zeile, 2) / 1500
Do While n 

Anzeige
AW: Felder aus Tabelle auslesen und bearbeiten
02.07.2018 19:39:39
Barbaraa
Mach eine eigene Variable für die Restmenge.
Das ist zu Beginn die Menge und ziehe jedes Mal davon die Max.Menge ab. Dann weisst Du, was Dir übrig bleibt.
In Deinem Code ist einiges zu korrigieren:
Kein Bauteil hat die Bezeichnung "L700", sondern 1,2,3.
Ich beziehe mich da auf die von Dir hochgeladene Datei, andere Dateien habe ich nicht.
Da ist auch keine Tabelle 1 und Tabelle 2.
Willst Du mit mehreren Worksheets arbeiten, mach dazu Variable. So:
set ws1 = Worksheets("Tabelle1")
set ws2 = Worksheets("Tabelle2")
und verwende dann diese statt der Langform. Macht das Ganze übersichtlicher.
Deklariere jede Variable, die Du verwendest.
Anz ist nicht deklariert.
Mach Dich im Netz über "Option Explicit" schlau. Das sollte zu Beginn stehen.
Rücke Zeilen ein, wenn sie in einer Schleife stehen. Das hast Du zwischen
For Zeile = 2 To ZeileMax
und
Next Zeile
nicht gemacht.
Ist ein gewisser Aufwand, spart aber Zeit beim Experimentieren, weil die Schleifen optiscj erkennbar sind.
Im Nachhinein Zeilen Einrücken:
Betreffende Zeilen markieren, dann die Tab-Taste.
Ausrücken geht mit Umschalt + Tab-Taste.
LGB
Anzeige
Lösung m.(UDF-)Fmln - Basis 3/4-Tensor
04.07.2018 21:46:37
Luc:-?
Hallo, Gunnar (& all);
man kann auch in einer gleichgroßen HilfsTabelle einen positionsgerechten 3Tensor bilden, also quasi eine 3dimensionale Tabelle, indem man die AufteilungsErgebnisse als MatrixKonstanten (Vektor) in Textform bildet und auswertbar einträgt. Das ist ein Hilfs­mit­tel, das ich in anderem Zusammenhang (zB DatenObfuskation und Kronecker-Produkt-Bildung) schon des Öfteren benutzt und dann dafür auch eine UDF geschrieben hatte, die diesen Quasi-3-Tensor auswertet und die Elemente der primären Matrix dann reihen­folgegerecht (wie beim Kronecker-Produkt) anordnet. Das fktioniert auch mit unterschiedlich langen Element-Vektoren und das Ergebnis sähe hier dann so aus:
 ABCDEFGHIJKLMN
1
Original 3-Tensor-Hilfszellen (aus MxElement-Vektoren) ErgebnisBauteilMengeStartEnde VxBauteilVxMengeVxStartVxEnde BauteilMengeStartEnde150001.7.18 0:006.7.18 13:20 VxBauteilVxMengeVxStartVxEnde 190001.07.18 00:0002.07.18 00:0019006.7.18 13:207.7.18 13:20 VxBauteilVxMengeVxStartVxEnde 190002.07.18 00:0003.07.18 00:0027007.7.18 13:208.7.18 13:20 VxBauteilVxMengeVxStartVxEnde 190003.07.18 00:0004.07.18 00:00221008.7.18 13:2011.7.18 13:20 VxBauteilVxMengeVxStartVxEnde 190004.07.18 00:0005.07.18 00:003150011.7.18 13:2013.7.18 1:20 VxBauteilVxMengeVxStartVxEnde 190005.07.18 00:0006.07.18 00:003450013.7.18 1:2017.7.18 13:20 VxBauteilVxMengeVxStartVxEnde 150006.07.18 00:0006.07.18 13:203300017.7.18 13:2020.7.18 13:20 VxBauteilVxMengeVxStartVxEnde 190006.07.18 13:2007.07.18 13:20    Das Hilfszellenformat dient nur der Spaltenbreiteminimierung!270007.07.18 13:2008.07.18 13:20  Hilfszellen:   Format (F3:F9): ;;;"VxBauteil"Zellformeln:270008.07.18 13:2009.07.18 13:20      Format (G3:G9): ;;;"VxMenge"F3:F9:=VxBauteilH3:H9:=VxStart270009.07.18 13:2010.07.18 13:20      Format (H3:H9): ;;;"VxStart"G3:G9:=VxMengeI3:I9:=VxEnde270010.07.18 13:2011.07.18 13:20Hilfsdaten   Format (I3:I9): ;;;"VxEnde"K3:N19: {=TensEx(F3:I9)}31 50011.07.18 13:2013.07.18 01:20BauteilMaxMengeMaxProdZeit Benannte Formeln: 31 50013.07.18 01:2014.07.18 13:20190024:00:00 MaxDauer:=SVERWEIS($A3;$A$16:$C$18;3;0) 31 50014.07.18 13:2016.07.18 01:20270024:00:00 MaxDläufe:=AUFRUNDEN($B3/MaxMenge;0) 31 50016.07.18 01:2017.07.18 13:203150036:00:00 MaxMenge:=SVERWEIS($A3;$A$16:$C$18;2) 31 50017.07.18 13:2019.07.18 01:20    VollDläufe:=ABRUNDEN($B3/MaxMenge;0) 31 50019.07.18 01:2020.07.18 13:20  VxBauteil:=WECHSELN(WIEDERHOLEN(";"&$A3;MaxDläufe);";";"{";1)&"}"  VxMenge:=WECHSELN(WIEDERHOLEN(";"&MaxMenge;VollDläufe)&WENN(VollDläufe*MaxMenge<$B3;";"&$B3-VollDläufe*MaxMenge;"");";";"{";1)&"}"  VxStart:=VJoin(RUNDEN($C3+(ZEILE(INDIREKT("1:"&MaxDläufe))-1)*MaxDauer;5);"";2)  VxEnde:=VJoin(RUNDEN(WENN(ZEILE(INDIREKT("1:"&MaxDläufe))<MaxDläufe;$C3+ZEILE(INDIREKT("1:"&VollDläufe))*MaxDauer;$D3);5);"";2)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Dabei folgt die Transformation natürlich exakt der Vorgabe des Originals. Will man, wie von dir in der BspDatei gezeigt, eine zusammenfassende Darstellung, muss das im Vorfeld dieser Operation erledigt wdn.
Verwendete UDFs:
TensEx (Vs1.0-1): https://www.herber.de/forum/archiv/1608to1612/t1611005.htm#1613173 (u. #1613876)*
VJoin (Vs1.4): https://www.herber.de/bbs/user/99024.xlsm (UDF in BspDatei enthalten)
* Vs1.2 erforderlich! Durch Austausch einer Konstanten am PgmAnfang aktualisierbar.
Dazu später mehr…
Feedback nicht unerwünscht! Gruß, Luc :-?
„Die Intelligenzmenge ist auf diesem Planeten eine Konstante, die Bevölkerung nimmt aber zu!“ Auch deshalb informieren mit …
Anzeige
Fortsetzung (Basis 3/4-Tensor)
05.07.2018 04:02:55
Luc:-?
Zur Expansion/Extension der erzeugten Text-MatrixKonstanten reicht die Version 1.0 von TensEx im Prinzip aus, wenn man die Origi­nal­Daten zuvor verdichtet und sich dann keine skalaren Tensoren (MatrixKonstanten mit nur einem Element) mehr ergeben (dazu unten). Im gezeigten Bsp ist das aber der Fall, weshalb hier der der Constanten txVgl zugewiesene Text durch "{*?*}" ersetzt wdn müsste. Das im gleichen Thread gezeigte Upgrade auf Version 1.1 wäre nicht unbedingt erforderlich, weil dadurch auch eine hier nicht sinnvolle andere Darstellungsweise erreicht wdn kann, die aber gleiche Vektor-Längen erforderte. (Dazu findet man im Archiv außer dem ver­link­ten Thread noch etliche Vorgänger, deren meiste im Betreff ebenfalls das Stichwort 3/4-Tensor enthalten, so dass man sie über die Betreff-RECHERCHE - 3.RechercheMöglichkeit, die 1. fktioniert schon seit Monaten nicht mehr - suchen kann.)
Falls unbedingt das in der BspDatei gezeigte Ergebnis erzielt wdn soll, müssen die OriginalDaten zuerst wie folgt verdichtet wdn:
A27[:A29]:=A16
B27[:B29]:=SUMMEWENN(A$3:A$9;A16;B$3:B$9)
C27[:C29]:=SVERWEIS(A16;A$3:D$9;3;0)
D27[:D29]:=VERWEIS(A16;A$3:A$9;D$3:D$9)
Anschließend müssen die im 1.Beitrag genannten Hilfstabellen-Fmln so geändert wdn, dass sie sich auf den Standort der so erzeugten Tabelle beziehen, hier A27:D29, wodurch sich folgendes Ergebnis ergibt (nur zum Vgl, so weder direkt auf Zellbereiche ausdehnbar noch als TensEx-Argument benutzbar!):
{{1;1;1;1;1;1;1}.{900;900;900;900;900;900;500}.{43282;43283;43284;43285;43286;43287;43288}.{43283;43284;43285;43286;43287;43288;43288.55556};{2;2;2;2}.{700;700;700;700}.{43288.55556;43289.55556;43290.55556;43291.55556}.{43289.55556;43290.55556;43291.55556;43292.55556};{3;3;3;3;3;3}.{1500;1500;1500;1500;1500;1500}.{43292.55556;43294.05556;43295.55556;43297.05556;43298.55556;43300.05556}.{43294.05556;43295.55556;43297.05556;43298.55556;43300.05556;43301.55556}}
Falls Spalte A keine Zahlen, sondern Texte enthält, muss die entsprd Hilfsspalten-Fml das berück­sich­ti­gen (hier für das unbehandelte Original):
VxBauteil:=WECHSELN(WIEDERHOLEN(""";"""&$A3;MaxDläufe);""";";"{";1)&"""}"
Statt der benannten Fml können natürlich auch nur die entsprd komplettierten ZellFmln in der Hilfstabelle verwendet wdn. Auch kann ihre spezielle Formatierung entfallen, die hier nur diese Spalten der HTML-Tabelle schmal halten sollte (Browser brechen ZellInhalte nicht einfach ab, sondern verbreitern die Spalten oder brechen ihren Inhalt ggf um!).
Morrn, Luc :-?
Anzeige

309 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige