Créer autant de lignes que la valeur d'une cellule<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Je n'ai vraiment pas comment catégoriser cette question;
J'extrais Excel les données d'un serveur SQL Server et, en tant que logique SQL, chaque fois qu'une ligne est créée. Dans ce cas, l'occasion est l'hébergement et il est mesuré par "RoomNight". Par conséquent, "RoomNight" doit avoir la valeur "1", si l'hébergement est pour 300 nuits, cela signifie que la réservation doit avoir 300 lignes;

Cependant, notre administrateur de réservation commet parfois une erreur et le résultat pour 50 nuits d'hébergement se présente comme suit:

Ce que je dois faire, c'est créer 50 lignes pour chaque cellule de 50 valeurs avec la valeur "1" pour "RoomNight" et "2" pour AdultNight ".
C'est possible?
Re: Créer autant de lignes que la valeur d'une celluleessayez ce qui suit, il est basé sur diagrammes à bulles - intervalles de temps inégaux
cela ne multipliera que les nuits supérieures à 1.
New Table ("RoomNight",
Ajouter des rangées (15),
Nouvelle colonne ("Ordre des lignes d'origine",
Numérique,
Continu,
Format ("Meilleur", 12),
Définir des valeurs ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
),
Nouvelle colonne ("RoomNight",
Numérique,
Continu,
Format ("Meilleur", 12),
Définir des valeurs ([1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70])
),
Nouvelle colonne ("AdultNight",
Numérique,
Continu,
Format ("Meilleur", 12),
Définir des valeurs ([2, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140])
)
)
// enregistre le nombre de nuits et d'adultes avant de faire quoi que ce soit
nuits totales pre = Col Sum (: RoomNight);
nombre total de nuits adultes pré = Col Sum (: AdultNight);
dt = table de données actuelle ();
rowN = N Row ();
// Pour chaque ligne d'origine, générez de nouvelles lignes autant que la durée de chaque événement.
Pour (i = 1, i <= rowN, i ++,
rowi = dt << get row (i);
Pour (z = 1, z <= (Nom: "RoomNight") - 1), z ++,
dt << add row (rowi);
dt << exécute des formules;
)
)
// Trier les observations dans leur ordre d'origine
Tableau de données ("RoomNight") << Trier (Par (: Ordre des lignes d'origine), Ordre (croissant), remplacer le tableau);
// dépasse le mauvais nombre de nuits
: RoomNight << Définissez chaque valeur (1);
: AdultNight << Définissez chaque valeur (2);
Attendre (0);
// enregistre le nombre total de nuits dans le nouveau tableau
nombre total de nuits après = Col Sum (: RoomNight);
nombre total de nuits adultes après = Col Sum (: AdultNight);
// voir que tous les totaux n'ont pas changé
Spectacle (nombre total de nuits avant, nombre total de nuits adultes avant, nombre total de nuits après, nombre total de nuits adultes);
Re: Créer autant de lignes que la valeur d'une celluleComme toute programmation, il ne s'agit en réalité que d'une série d'étapes.
Mais bien sûr, vous n’avez pas à comprendre (complètement) quelque chose pour pouvoir l’utiliser efficacement, alors j’ai fait les changements pour faire ce que je pense que vous voulez.
Faites «Fichier> Nouveau> Nouveau script» pour ouvrir une fenêtre d’éditeur, puis coupez et collez le code ci-dessous dans celui-ci. Ensuite, faites 'Edition> Exécuter le script' pour vérifier que j'ai bien compris en utilisant l'exemple fourni (qui sera différent à chaque fois que vous l'exécuterez).
Si vous voulez l'exécuter avec vos propres données, assurez-vous que cette table est active. Puis modifiez le code ci-dessous comme suit:
- Remplacez le code après '// (1):' et avant '// (2)' par la seule ligne suivante: dt1 = CurrentDataTable ();
- Modifiez le "3" et le "4" dans la ligne juste après "// (3)" pour refléter les positions des colonnes dans votre propre tableau.
Ce code ne fonctionne que si votre table ne contient que des colonnes numériques (comme le vôtre apparaît).
s'il s'agit de quelque chose que vous (ou quelqu'un d'autre) veut faire régulièrement, ce serait un peu de travail de faire un complément pour masquer cette complexité.
Et je serais très intéressé par les solutions à ce problème que d’autres pourraient proposer. Comme le dit le proverbe en anglais, "il existe de nombreuses manières de peler un chat". . .
NamesDefaultToHere ( 1 ) ;
// Étant donné un rang de ve3ctor 'inVec', forme une matrice composée en concaténant verticalement inVec avec lui-même 'inVec [1, pos]'
// fois pour donner une matrice 'outMat'. La colonne 'pos' dans 'outMat' se compose de 1. La colonne 'numPos' dans outMat contiendra
// la valeur de 'inVec [1, numPos]' répartie également entre les lignes
extrudeRow =
Une fonction ({ InVec , pos , numPos } , { Local par défaut } ,
si ( pos > 0 ,
// Est-ce que 'pos' est un emplacement valide?
fois = Rond ( InVec [ 1 , pos ] , 0 ) ;
si ( fois > 0 ,
// extrude le vecteur
outMat = J ( fois , NCol ( InVec ) , . ) ;
pour ( r = 1 , r <= fois , r ++,
outMat [ r , 0 ] = InVec ;
) ;
outMat [ 0 , pos ] = 1 ;
outMat [ 0 , numPos ] = InVec [ 1 , numPos ] / fois ,
// sinon ne fais rien
outMat = InVec ;
) ,
// sinon ne fais rien
outMat = InVec ;
) ;
// retourne le résultat
outMat ;
) ;
// Utilise 'extrudeRow ()' pour extruder une matrice entière par concaténation verticale
table d'extrusion =
Une fonction ({ inMat , pos , numPos } , { Local par défaut } ,
si ( pos > 0 ,
// Extrude la matrice
newRows = somme ( inMat [ 0 , pos ]) ;
outMat = J ( newRows , NCol ( inMat ) , . ) ;
rStart = 1 ;
pour ( 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 ] ;
) ,
// sinon ne fais rien
outMat = inMat ;
) ;
// retourne le résultat
outMat ;
) ;
// Montre l'utilisation de 'extrudeTable ()'. . .
// (1): Crée une table pour jouer avec
dt1 = NewTable ( "Les données" ,
NewColumn ( "Colonne 1" , Numérique , Ordinal , Formule ( RandomInteger ( - 5 , 5 ))) ,
NewColumn ( "Colonne 2" , Numérique , Ordinal , Formule ( RandomInteger ( - 5 , 5 ))) ,
NewColumn ( "La fréquence" , Numérique , Ordinal , Formule ( RandomInteger ( 1 , 5 ))) ,
NewColumn ( "Nombre" , Numérique , Ordinal , Formule ( RandomInteger ( 1 , 20 ))) ,
AddRows ( 5 )
) ;
// (2): Récupère les données sous forme de matrice
mat1 = dt1 << getAsMatrix ;
// (3): Extrudez cette matrice à l'aide de la colonne "Fréquence" (la troisième) et calculez la moyenne des valeurs de la colonne "Compte" (la quatrième)
mat2 = table d'extrusion ( mat1 , 3 , 4 ) ;
// (4): Crée une table à partir de mat2 et corrige les noms des colonnes afin qu'elles correspondent à dt1
dt2 = AsTable ( mat2 ) ;
dt2 << setName (( dt1 << getName ) || "Extrudé par 'Fréquence'" ) ;
cols = dt1 << getColumnNames ( "Chaîne" ) ;
pour ( c = 1 , c <= NItems ( cols ) , c ++, Colonne ( dt2 , c ) << setName ( cols [ c ])) ;
Re: Créer autant de lignes que la valeur d'une celluleMerci Ian,
Pour mes compétences de débutant c'est une science de fusée.
Re: Créer autant de lignes que la valeur d'une celluleCet ancien code fait presque ce que vous voulez et pourrait être adapté à votre cas particulier assez facilement si vous connaissez un peu JSL.
NamesDefaultToHere ( 1 ) ;
// Étant donné un rang de ve3ctor 'inVec', forme une matrice composée en concaténant verticalement inVec avec lui-même 'inVec [1, pos]'
// fois pour donner une matrice 'outMat'. La colonne 'pos' dans 'outMat' se compose de 1.
extrudeRow =
Une fonction ({ InVec , pos } , { Local par défaut } ,
si ( pos > 0 ,
// Est-ce que 'pos' est un emplacement valide?
fois = Rond ( InVec [ 1 , pos ] , 0 ) ;
si ( fois > 0 ,
// extrude le vecteur
outMat = J ( fois , NCol ( InVec ) , . ) ;
pour ( r = 1 , r <= fois , r ++,
outMat [ r , 0 ] = InVec ;
) ;
outMat [ 0 , pos ] = 1 ,
// sinon ne fais rien
outMat = InVec ;
) ,
// sinon ne fais rien
outMat = InVec ;
) ;
// retourne le résultat
outMat ;
) ;
// Utilise 'extrudeRow ()' pour extruder une matrice entière par concaténation verticale
table d'extrusion =
Une fonction ({ inMat , pos } , { Local par défaut } ,
si ( pos > 0 ,
// Extrude la matrice
newRows = somme ( inMat [ 0 , pos ]) ;
outMat = J ( newRows , NCol ( inMat ) , . ) ;
rStart = 1 ;
pour ( r = 1 , r <= NRow ( inMat ) , r ++,
outMat [ rStart :: ( rStart + inMat [ r , pos ] - 1 ) , 0 ] = extrudeRow ( inMat [ r , 0 ] , pos ) ;
rStart = rStart + inMat [ r , pos ] ;
) ,
// sinon ne fais rien
outMat = inMat ;
) ;
// retourne le résultat
outMat ;
) ;
// Montre l'utilisation de 'extrudeTable ()'. . .
// (1): Crée une table pour jouer avec
dt1 = NewTable ( "Les données" ,
NewColumn ( "Colonne 1" , Numérique , Ordinal , Formule ( RandomInteger ( - 5 , 5 ))) ,
NewColumn ( "Colonne 2" , Numérique , Ordinal , Formule ( RandomInteger ( - 5 , 5 ))) ,
NewColumn ( "La fréquence" , Numérique , Ordinal , Formule ( RandomInteger ( 1 , 5 ))) ,
AddRows ( 5 )
) ;
// (2): Récupère les données sous forme de matrice
mat1 = dt1 << getAsMatrix ;
// (3): Extrudez cette matrice en utilisant la colonne 'Fréquence' (la troisième)
mat2 = table d'extrusion ( mat1 , 3 ) ;
// (4): Crée une table à partir de mat2 et corrige les noms des colonnes afin qu'elles correspondent à dt1
dt2 = AsTable ( mat2 ) ;
dt2 << setName (( dt1 << getName ) || "Extrudé par 'Fréquence'" ) ;
cols = dt1 << getColumnNames ( "Chaîne" ) ;
pour ( c = 1 , c <= NItems ( cols ) , c ++, Colonne ( dt2 , c ) << setName ( cols [ c ])) ;