Creare tante righe quante il valore di una cella<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Non ho davvero capito come categorizzare questa domanda;
Estraggo i dati da un server SQL da Excel, e come logica di SQL per ogni occasione viene creata una riga. In questo caso l'occasione è la sistemazione e viene misurata da "RoomNight". Quindi lo shoul "RoomNight" consiste nel valore di "1", se la sistemazione è di 300 notti significa che la prenotazione dovrebbe avere 300 file;

Tuttavia, il nostro amministratore delle prenotazioni a volte commette un errore e il risultato per la sistemazione di 50 notti è il seguente;

Quello che devo fare è creare 50 righe per ogni cella di 50 valori con il valore di "1" per "RoomNight" e "2" per AdultNight ".
È possibile?
Ri: Creazione di un numero di righe pari al valore di una cellaprova il seguente, è basato su grafici a bolle - intervalli di tempo diseguali
questo moltiplicherà solo le notti che sono più alte di 1.
Nuova tabella ("RoomNight",
Aggiungi righe (15),
Nuova colonna ("Ordine di riga originale",
Numerico,
Continuo,
Formato ("Migliore", 12),
Imposta valori ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
),
Nuova colonna ("RoomNight",
Numerico,
Continuo,
Formato ("Migliore", 12),
Imposta valori ([1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70])
),
Nuova colonna ("AdultNight",
Numerico,
Continuo,
Formato ("Migliore", 12),
Imposta valori ([2, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140])
)
);
// registra il numero di notti e adulti prima di fare qualsiasi cosa
notti totali pre = Col Sum (: RoomNight);
notti totali per adulti pre = Col Sum (: AdultNight);
dt = Current Data Table ();
rowN = N Row ();
// Per ogni riga originale, produce nuove righe tante quante la durata di ciascun evento.
Per (i = 1, i <= rowN, i ++,
rowi = dt << get row (i);
For (z = 1, z <= (: Name ("RoomNight") - 1), z ++,
dt << aggiungi riga (rowi);
dt << esegui le formule;
);
);
// Ordina le osservazioni nel loro ordine originale
Tabella dati ("RoomNight") << Ordina (Per (: Ordine riga originale), Ordine (crescente), sostituisci tabella);
// supera il numero sbagliato di notti
: RoomNight << Imposta ciascun valore (1);
: AdultNight << Imposta ogni valore (2);
Attendi (0);
// registra il numero totale di notti nella nuova tabella
notti totali post = Col Sum (: RoomNight);
pernottamenti per adulti totali = Col Sum (: AdultNight);
// vedi che tutti i totali non sono cambiati
Mostra (notti totali pre, notti totali per adulti pre, post notti totali, post notti totali per adulti);
Ri: Creazione di un numero di righe pari al valore di una cellaCome tutta la programmazione, in realtà è solo una serie di passaggi.
Ma ovviamente non devi (pienamente) capire qualcosa per essere in grado di usarlo efficacemente, quindi ho fatto le modifiche per fare ciò che penso che tu voglia.
Fai 'File> Nuovo> Nuovo script' per aprire una finestra dell'editor e taglia e incolla il codice qui sotto in questo. Quindi fai 'Modifica> Esegui script' per verificare che ho capito bene usando il semplice esempio fornito (che sarà diverso ogni volta che lo esegui) ..
Se vuoi eseguirlo con i tuoi dati, assicurati che questa tabella sia attiva. Quindi modificare il codice di seguito come segue:
- Sostituisci il codice dopo '// (1):' e prima di '// (2)' con la singola riga: dt1 = CurrentDataTable ();
- Cambia il '3' e il '4' nella riga immediatamente dopo '// (3)' per riflettere le posizioni delle colonne nella tua tabella.
Questo codice funziona solo se la tabella contiene solo colonne numeriche (come sembra il tuo).
se questo è qualcosa che tu (o qualcun altro) vuoi fare di routine, sarebbe solo un po 'di lavoro fare un add-in per nascondere questa complessità.
E sarei molto interessato a soluzioni a ciò che altri potrebbero offrire. Come dice il proverbio in inglese, "ci sono molti modi per scuoiare un gatto". . .
NamesDefaultToHere ( 1 ) ;
// Data una riga ve3ctor 'inVec', forma una matrice composta da concatenazione verticale inVec con se stesso 'inVec [1, pos]'
// volte per dare una matrice 'outMat'. La colonna 'pos' in 'outMat' è composta da 1. La colonna 'numPos' in outMat conterrà
// il valore di 'inVec [1, numPos]' si divide equamente tra le righe
extrudeRow =
Funzione ({ inVec , pos , numPos } , { Locale predefinito } ,
Se ( pos > 0 ,
// "pos" è un percorso valido?
volte = Il giro ( inVec [ 1 , pos ] , 0 ) ;
Se ( volte > 0 ,
// Estrai il vettore
outMat = J ( volte , NCol ( inVec ) , . ) ;
per ( r = 1 , r <= volte , r ++,
outMat [ r , 0 ] = inVec ;
) ;
outMat [ 0 , pos ] = 1 ;
outMat [ 0 , numPos ] = inVec [ 1 , numPos ] / volte ,
// Altrimenti non fare nulla
outMat = inVec ;
) ,
// Altrimenti non fare nulla
outMat = inVec ;
) ;
// Restituisce il risultato
outMat ;
) ;
// Usa 'extrudeRow ()' per estrudere un'intera matrice mediante concatenazione verticale
extrudeTable =
Funzione ({ inMat , pos , numPos } , { Locale predefinito } ,
Se ( pos > 0 ,
// Estrude la matrice
newRows = somma ( inMat [ 0 , pos ]) ;
outMat = J ( newRows , NCol ( inMat ) , . ) ;
RSTART = 1 ;
per ( 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 ] ;
) ,
// Altrimenti non fare nulla
outMat = inMat ;
) ;
// Restituisce il risultato
outMat ;
) ;
// Mostra l'uso di 'extrudeTable ()'. . .
// (1): crea un tavolo con cui giocare
dt1 = nuovatabella ( "Dati" ,
newColumn ( "Colonna 1" , Numerico , Ordinale , Formula ( RandomInteger ( - 5 , 5 ))) ,
newColumn ( "Colonna 2" , Numerico , Ordinale , Formula ( RandomInteger ( - 5 , 5 ))) ,
newColumn ( "Frequenza" , Numerico , Ordinale , Formula ( RandomInteger ( 1 , 5 ))) ,
newColumn ( "Numero" , Numerico , Ordinale , Formula ( RandomInteger ( 1 , 20 ))) ,
AddRows ( 5 )
) ;
// (2): ottieni i dati come matrice
mat1 = dt1 << getAsMatrix ;
// (3): Estrudi questa matrice usando la colonna 'Frequenza' (la terza) e media i valori della colonna 'Conteggio' (la quarta)
mat2 = extrudeTable ( mat1 , 3 , 4 ) ;
// (4): crea una tabella da mat2 e correggi i nomi delle colonne in modo che corrispondano a dt1
dt2 = astable ( mat2 ) ;
dt2 << imposta nome (( dt1 << getName ) || "Estruso da 'Frequenza'" ) ;
Cols = dt1 << getColumnNames ( "Stringa" ) ;
per ( c = 1 , c <= NItems ( Cols ) , c ++, Colonna ( dt2 , c ) << imposta nome ( Cols [ c ])) ;
Ri: Creazione di un numero di righe pari al valore di una cellaGrazie Ian,
Per le mie abilità da principiante è una scienza missilistica.
Ri: Creazione di un numero di righe pari al valore di una cellaQuesto vecchio codice fa quasi ciò che vuoi, e potrebbe essere adattato al tuo caso particolare abbastanza facilmente se conosci un po 'di JSL.
NamesDefaultToHere ( 1 ) ;
// Data una riga ve3ctor 'inVec', forma una matrice composta da concatenazione verticale inVec con se stesso 'inVec [1, pos]'
// volte per dare una matrice 'outMat'. La colonna 'pos' in 'outMat' è composta da 1.
extrudeRow =
Funzione ({ inVec , pos } , { Locale predefinito } ,
Se ( pos > 0 ,
// "pos" è un percorso valido?
volte = Il giro ( inVec [ 1 , pos ] , 0 ) ;
Se ( volte > 0 ,
// Estrai il vettore
outMat = J ( volte , NCol ( inVec ) , . ) ;
per ( r = 1 , r <= volte , r ++,
outMat [ r , 0 ] = inVec ;
) ;
outMat [ 0 , pos ] = 1 ,
// Altrimenti non fare nulla
outMat = inVec ;
) ,
// Altrimenti non fare nulla
outMat = inVec ;
) ;
// Restituisce il risultato
outMat ;
) ;
// Usa 'extrudeRow ()' per estrudere un'intera matrice mediante concatenazione verticale
extrudeTable =
Funzione ({ inMat , pos } , { Locale predefinito } ,
Se ( pos > 0 ,
// Estrude la matrice
newRows = somma ( inMat [ 0 , pos ]) ;
outMat = J ( newRows , NCol ( inMat ) , . ) ;
RSTART = 1 ;
per ( r = 1 , r <= nRow ( inMat ) , r ++,
outMat [ RSTART :: ( RSTART + inMat [ r , pos ] - 1 ) , 0 ] = extrudeRow ( inMat [ r , 0 ] , pos ) ;
RSTART = RSTART + inMat [ r , pos ] ;
) ,
// Altrimenti non fare nulla
outMat = inMat ;
) ;
// Restituisce il risultato
outMat ;
) ;
// Mostra l'uso di 'extrudeTable ()'. . .
// (1): crea un tavolo con cui giocare
dt1 = nuovatabella ( "Dati" ,
newColumn ( "Colonna 1" , Numerico , Ordinale , Formula ( RandomInteger ( - 5 , 5 ))) ,
newColumn ( "Colonna 2" , Numerico , Ordinale , Formula ( RandomInteger ( - 5 , 5 ))) ,
newColumn ( "Frequenza" , Numerico , Ordinale , Formula ( RandomInteger ( 1 , 5 ))) ,
AddRows ( 5 )
) ;
// (2): ottieni i dati come matrice
mat1 = dt1 << getAsMatrix ;
// (3): Estrudi questa matrice usando la colonna 'Frequenza' (la terza)
mat2 = extrudeTable ( mat1 , 3 ) ;
// (4): crea una tabella da mat2 e correggi i nomi delle colonne in modo che corrispondano a dt1
dt2 = astable ( mat2 ) ;
dt2 << imposta nome (( dt1 << getName ) || "Estruso da 'Frequenza'" ) ;
Cols = dt1 << getColumnNames ( "Stringa" ) ;
per ( c = 1 , c <= NItems ( Cols ) , c ++, Colonna ( dt2 , c ) << imposta nome ( Cols [ c ])) ;