Erstellen Sie so viele Zeilen wie der Wert einer Zelle<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich konnte diese Frage wirklich nicht kategorisieren.
Ich ziehe die Daten von einem SQL Server per Excel herunter, und als SQL-Logik wird für jede Gelegenheit eine Zeile erstellt. In diesem Fall handelt es sich bei dem Anlass um eine Unterkunft, die anhand von "RoomNight" gemessen wird. Daher besteht "RoomNight" aus dem Wert "1". Wenn die Unterkunft 300 Nächte hat, bedeutet dies, dass die Reservierung 300 Zeilen haben sollte.

Unser Reservierungsadministrator macht jedoch manchmal einen Fehler und das Ergebnis für 50 Übernachtungen sieht folgendermaßen aus:

Was ich tun muss, ist das Erstellen von 50 Zeilen für jede 50-Wertezelle mit dem Wert "1" für "RoomNight" und "2" für AdultNight.
Ist es möglich?
Betreff: Erstellen Sie so viele Zeilen wie der Wert einer ZelleVersuchen Sie folgendes, es basiert auf Blasendiagramme - ungleiche Zeitintervalle
Dadurch werden nur die Nächte multipliziert, die höher als 1 sind.
Neuer Tisch ("RoomNight",
Zeilen hinzufügen (15),
Neue Spalte ("Originalreihenfolge")
Numerisch,
Kontinuierlich,
Format ("Best", 12),
Einstellwerte ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
)
Neue Spalte ("RoomNight")
Numerisch,
Kontinuierlich,
Format ("Best", 12),
Einstellwerte ([1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70])
)
Neue Spalte ("AdultNight",
Numerisch,
Kontinuierlich,
Format ("Best", 12),
Einstellwerte ([2, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140])
)
);
// Notiere die Anzahl der Nächte und der Erwachsenen, bevor du etwas tust
Gesamtnächte vor = Col-Summe (: RoomNight);
Gesamtnächte für Erwachsene vor = Col-Summe (: AdultNight);
dt = Aktuelle Datentabelle ();
rowN = N Row ();
// Produziere für jede ursprüngliche Zeile so viele Zeilen wie die Dauer jedes Ereignisses.
Für (i = 1, i <= ReiheN, i ++,
rowi = dt << get row (i);
Für (z = 1, z <= (: Name ("RoomNight")) - 1), z ++,
dt << Zeile hinzufügen (rowi);
dt << Laufformeln;
);
);
// Sortiere die Beobachtungen in ihre ursprüngliche Reihenfolge
Datentabelle ("RoomNight") << Sortieren (nach (Reihenfolge der ursprünglichen Zeilen), Reihenfolge (aufsteigend), Tabelle ersetzen);
// über die falsche Anzahl von Nächten fahren
: RoomNight << Set Each Value (1);
: AdultNight << Set Each Value (2);
Warten (0);
// Notiere die Gesamtzahl der Nächte in der neuen Tabelle
Gesamtnächte post = Col-Summe (: RoomNight);
Gesamtzahl der Nächte für Erwachsene = Col Sum (: AdultNight);
// Sieh zu, dass sich alle Summen nicht geändert haben
Show (Gesamtnächte vor, Gesamtnächte für Erwachsene vor, Gesamtnächte nach, Gesamtnächte für Erwachsene);
Betreff: Erstellen Sie so viele Zeilen wie der Wert einer ZelleWie bei jeder Programmierung, sind es eigentlich nur eine Reihe von Schritten.
Aber natürlich müssen Sie nicht etwas (vollständig) verstehen, um es effektiv nutzen zu können. Deshalb habe ich die Änderungen vorgenommen, um das zu tun, was Sie meiner Meinung nach wollen.
Führen Sie 'Datei> Neu> Neues Skript' aus, um ein Editorfenster zu öffnen, und schneiden Sie den folgenden Code aus. Führen Sie dann "Bearbeiten> Skript ausführen" aus, um anhand des einfachen Beispiels zu überprüfen, ob ich es richtig verstanden habe (das jedes Mal anders ist, wenn Sie es ausführen).
Wenn Sie es mit Ihren eigenen Daten ausführen möchten, stellen Sie sicher, dass diese Tabelle aktiv ist. Dann ändern Sie den Code wie folgt:
- Ersetzen Sie den Code nach '// (1):' und vor '// (2)' durch die einzelne Zeile: dt1 = CurrentDataTable ();
- Ändern Sie die '3' und die '4' in der Zeile unmittelbar nach '// (3)', um die Position der Spalten in Ihrer eigenen Tabelle wiederzugeben.
Dieser Code funktioniert nur, wenn Ihre Tabelle nur numerische Spalten enthält (wie es Ihnen scheint).
Wenn Sie (oder jemand anderes) dies routinemäßig tun möchten, wäre es nur ein bisschen Arbeit, ein Add-In zu erstellen, um diese Komplexität zu verbergen.
Und ich würde mich sehr für Lösungen interessieren, die andere anbieten könnten. Das englische Sprichwort besagt: "Es gibt viele Möglichkeiten, eine Katze zu häuten". . .
NamesDefaultToHere ( 1 ) ;
// Gegeben eine Zeile ve3ctor 'inVec', bildet eine Matrix, die durch vertikales Verketten von inVec mit sich selbst 'inVec [1, pos]' gebildet wird.
// mal eine Matrix 'outMat' angeben. Die Spalte 'pos' in 'outMat' besteht aus Einsen. Die Spalte 'numPos' in outMat enthält
// Der Wert von 'inVec [1, numPos]' wird gleichmäßig zwischen den Zeilen aufgeteilt
extrudeRow =
Funktion ({ inVec . pos . numPos } . { Default Local } .
ob ( pos > 0 .
// Ist 'pos' ein gültiger Ort?
mal = Runden ( inVec [ 1 . pos ] . 0 ) ;
ob ( mal > 0 .
// Extrudiere den Vektor
outMat = J ( mal . NCol ( inVec ) . . ) ;
zum ( r = 1 . r <= mal . r ++
outMat [ r . 0 ] = inVec ;
) ;
outMat [ 0 . pos ] = 1 ;
outMat [ 0 . numPos ] = inVec [ 1 . numPos ] / mal .
// Sonst nichts tun
outMat = inVec ;
) .
// Sonst nichts tun
outMat = inVec ;
) ;
// Das Ergebnis zurückgeben
outMat ;
) ;
// Verwendet 'extrudeRow ()', um eine ganze Matrix durch vertikale Verkettung zu extrudieren
extrudeTable =
Funktion ({ inMat . pos . numPos } . { Default Local } .
ob ( pos > 0 .
// Die Matrix extrudieren
newRows = Summe ( inMat [ 0 . pos ]) ;
outMat = J ( newRows . NCol ( inMat ) . . ) ;
rStart = 1 ;
zum ( r = 1 . r <= NRow ( inMat ) . r ++
outMat [ rStart :: ( rStart + inMat [ r . pos ] - 1 ) . 0 ] = extrudeRow ( inMat [ r . 0 ] . pos . numPos ) ;
rStart = rStart + inMat [ r . pos ] ;
) .
// Sonst nichts tun
outMat = inMat ;
) ;
// Das Ergebnis zurückgeben
outMat ;
) ;
// Zeige die Verwendung von 'extrudeTable ()'. . .
// (1): Mache einen Tisch zum Spielen
dt1 = NewTable ( "Daten" .
NewColumn ( "Spalte 1" . Numerisch . Ordinal . Formel ( RandomInteger ( - 5 . 5 ))) .
NewColumn ( "Spalte 2" . Numerisch . Ordinal . Formel ( RandomInteger ( - 5 . 5 ))) .
NewColumn ( "Frequenz" . Numerisch . Ordinal . Formel ( RandomInteger ( 1 . 5 ))) .
NewColumn ( "Nummer" . Numerisch . Ordinal . Formel ( RandomInteger ( 1 . 20 ))) .
Zeilen hinzufügen ( 5 )
) ;
// (2): Liefert die Daten als Matrix
mat1 = dt1 << getAsMatrix ;
// (3): Extrudiere diese Matrix mithilfe der Spalte "Frequenz" (die dritte) und mittle die Werte der Spalte "Anzahl" (die vierte)
mat2 = extrudeTable ( mat1 . 3 . 4 ) ;
// (4): Erstellen Sie aus mat2 eine Tabelle und stellen Sie die Spaltennamen so ein, dass sie mit dt1 übereinstimmen
dt2 = AsTable ( mat2 ) ;
dt2 << Name einsetzen (( dt1 << getName ) || "Durch 'Frequenz' extrudiert" " ) ;
Cols = dt1 << getColumnNames ( "String" ) ;
zum ( c = 1 . c <= NItems ( Cols ) . c ++ Säule ( dt2 . c ) << Name einsetzen ( Cols [ c ])) ;
Betreff: Erstellen Sie so viele Zeilen wie der Wert einer ZelleDanke Ian,
Für meine Anfängerfähigkeiten ist es eine Raketenwissenschaft.
Betreff: Erstellen Sie so viele Zeilen wie der Wert einer ZelleDieser alte Code macht fast das, was Sie wollen, und könnte leicht an Ihren speziellen Fall angepasst werden, wenn Sie ein wenig JSL kennen.
NamesDefaultToHere ( 1 ) ;
// Gegeben eine Zeile ve3ctor 'inVec', bildet eine Matrix, die durch vertikales Verketten von inVec mit sich selbst 'inVec [1, pos]' gebildet wird.
// mal eine Matrix 'outMat' angeben. Die Spalte 'pos' in 'outMat' besteht aus Einsen.
extrudeRow =
Funktion ({ inVec . pos } . { Default Local } .
ob ( pos > 0 .
// Ist 'pos' ein gültiger Ort?
mal = Runden ( inVec [ 1 . pos ] . 0 ) ;
ob ( mal > 0 .
// Extrudiere den Vektor
outMat = J ( mal . NCol ( inVec ) . . ) ;
zum ( r = 1 . r <= mal . r ++
outMat [ r . 0 ] = inVec ;
) ;
outMat [ 0 . pos ] = 1 .
// Sonst nichts tun
outMat = inVec ;
) .
// Sonst nichts tun
outMat = inVec ;
) ;
// Das Ergebnis zurückgeben
outMat ;
) ;
// Verwendet 'extrudeRow ()', um eine ganze Matrix durch vertikale Verkettung zu extrudieren
extrudeTable =
Funktion ({ inMat . pos } . { Default Local } .
ob ( pos > 0 .
// Die Matrix extrudieren
newRows = Summe ( inMat [ 0 . pos ]) ;
outMat = J ( newRows . NCol ( inMat ) . . ) ;
rStart = 1 ;
zum ( r = 1 . r <= NRow ( inMat ) . r ++
outMat [ rStart :: ( rStart + inMat [ r . pos ] - 1 ) . 0 ] = extrudeRow ( inMat [ r . 0 ] . pos ) ;
rStart = rStart + inMat [ r . pos ] ;
) .
// Sonst nichts tun
outMat = inMat ;
) ;
// Das Ergebnis zurückgeben
outMat ;
) ;
// Zeige die Verwendung von 'extrudeTable ()'. . .
// (1): Mache einen Tisch zum Spielen
dt1 = NewTable ( "Daten" .
NewColumn ( "Spalte 1" . Numerisch . Ordinal . Formel ( RandomInteger ( - 5 . 5 ))) .
NewColumn ( "Spalte 2" . Numerisch . Ordinal . Formel ( RandomInteger ( - 5 . 5 ))) .
NewColumn ( "Frequenz" . Numerisch . Ordinal . Formel ( RandomInteger ( 1 . 5 ))) .
Zeilen hinzufügen ( 5 )
) ;
// (2): Liefert die Daten als Matrix
mat1 = dt1 << getAsMatrix ;
// (3): Extrudieren Sie diese Matrix mithilfe der Spalte "Frequenz" (der dritten)
mat2 = extrudeTable ( mat1 . 3 ) ;
// (4): Erstellen Sie aus mat2 eine Tabelle und stellen Sie die Spaltennamen so ein, dass sie mit dt1 übereinstimmen
dt2 = AsTable ( mat2 ) ;
dt2 << Name einsetzen (( dt1 << getName ) || "Durch 'Frequenz' extrudiert" " ) ;
Cols = dt1 << getColumnNames ( "String" ) ;
zum ( c = 1 . c <= NItems ( Cols ) . c ++ Säule ( dt2 . c ) << Name einsetzen ( Cols [ c ])) ;