1 votes

Mise à jour automatique des colonnes dans Excel

J'ai les deux colonnes Excel suivantes. Elles ont une relation parent-enfant. Par exemple, si la valeur de la cellule D de la ligne 1 est 1000000000, elle peut être le parent d'une autre ligne.

Ce que j'essaie de faire est d'avoir une feuille Excel avec 1000 lignes. La structure d'identification que j'ai reçue est incorrecte. J'essaie de faire partir le nouvel ID de 1 et de l'incrémenter jusqu'à 10, de sorte que le prochain ID soit 10. Avec ce modèle, je veux donc remplacer les nouveaux ID existants en commençant par 1, puis mettre à jour la colonne New ParentID avec le nouvel ID mis à jour.

J'ai essayé d'écrire une formule pour y parvenir, mais je suis très novice dans Excel. Faudrait-il le faire avec une macro ? Avez-vous des suggestions ?

Exemple de données actuelles

 D           E
New ID      New Parent ID
1000000000  0
1100000000  1000000000
1100000001  1100000000
1100000002  1100000000
1100000003  1100000000
1100000004  1100000000
1100000005  1100000000
1100000006  1100000000
1100000007  1100000000
1200000000  1000000000
1200000001  1200000000
1200000002  1200000000
1200000003  1200000000
1200000004  1200000000
1200000005  1200000000
1200000006  1200000000
1200000007  1200000000
1200000008  1200000000
1200000009  1200000000
1200000010  1200000000
1200000011  1200000000
1200000012  1200000000
2000000000  0
2000000001  2000000000
2000000002  2000000000
3000000000  0
3100000000  3000000000
3100000001  3100000000
3100000002  3100000000
3100000003  3100000000
3100000004  3100000000

Exemple de nouvelles données Remarquez le nouveau modèle. Ainsi, le nouvel ID 1000000000 a été remplacé par 1 et lorsque 1000000000 était utilisé dans la colonne NewParentID, il a également été remplacé par 1. Et ainsi de suite Donc, essentiellement, je pourrais facilement créer les valeurs incrémentielles dans le NewID, mais je ne sais pas comment mettre à jour la deuxième colonne avec le bon ID.

   New ID   New Parent ID
    1             0
    10            1
    1100000001    10
    1100000002    10
    1100000003    10
    1100000004    10
    1100000005    10
    1100000006    10
    1100000007    10

0 votes

Eh bien, peut-être que je suis trop bête. Mais je ne comprends pas. A quoi ressemblent vos données actuelles et à quoi devraient-elles ressembler après ? Peut-être qu'un exemple de classeur serait un bon moyen de le montrer.

0 votes

Je suis désolé, j'ai mis à jour la question avec les données de sortie souhaitées. Je vais également poster l'exemple de classeur.

2voto

raph82 Points 116

Pour un nouvel utilisateur d'Excel, je me tiendrais à l'écart de VBA, sauf en cas de nécessité. Si je comprends bien votre question, vous pouvez la résoudre uniquement avec des formules. J'ai essayé de les rendre aussi simples que possible.

Tout d'abord, je préserverais l'ensemble des données originales en travaillant sur une image des données sources. C'est utile à des fins d'audit et cela peut vous aider à mieux comprendre comment cela fonctionne. Les colonnes ressembleraient à ceci :

ID         | Parent ID  | New ID     | New Parent ID
----------------------------------------------------
1000000000 | 0          |            |
1100000000 | 1000000000 |            |
1100000001 | 1100000000 |            |
1200000000 | 1000000000 |            |
1200000001 | 1200000000 |            |
1200000002 | 1200000000 |            |

(Pour tous les exemples, j'utiliserai le même ensemble de données d'exemple réduit. La première colonne est la colonne A, les en-têtes de colonne sont sur la ligne 1).

Nous allons donner un Nouvel ID à l'élément enfant dans la colonne Nouvel ID et son ID parent sera automatiquement évalué dans la colonne Nouvel ID parent.

Identités dactylographiées

Pour l'instant, il suffit de copier-coller les valeurs d'ID dans la colonne Nouvel ID :

ID         | Parent ID  | New ID     | New Parent ID
1000000000 | 0          | 1000000000 |
1100000000 | 1000000000 | 1100000000 |
1100000001 | 1100000000 | 1100000001 |
1200000000 | 1000000000 | 1200000000 |
1200000001 | 1200000000 | 1200000001 |
1200000002 | 1200000000 | 1200000002 |

Ensuite, dans la première cellule de l'ID du nouveau parent, entrez la formule suivante : =VLOOKUP($B2,$A:$C,3,FALSE) . Cette formule permet à Excel de regarder vers le haut verticalement. Elle se lit comme suit : "recherchez la valeur de la cellule B2 (ID parent) dans la colonne A (colonne ID) et lorsque vous trouvez une correspondance exacte, renvoyez la valeur dans la troisième colonne (colonne C, Nouveaux ID)".

Compte tenu de la structure de nos données, cela signifie en réalité "recherchez l'ID du parent dans la colonne ID et lorsque vous trouvez une correspondance exacte, renvoyez son nouvel ID". Pour l'instant, les nouveaux ID sont identiques aux ID d'origine, nous nous en occuperons plus tard. Si vous avez besoin de plus d'explications sur l'utilisation des fonctions (telles que VLOOKUP ) dans les formules, cliquez sur le bouton fx juste à côté de la barre de formule et ensuite le lien d'aide "plus d'aide sur cette fonction".

Dès que vous tapez Entrée, la formule sera remplacée par son résultat et dans ce cas, la valeur d'erreur #N/A . Cela est dû au fait que le premier ID du parent ne peut être trouvé dans la colonne ID. Ceci est logique puisque le parent le plus haut n'a par définition aucun parent.

Pour faire face à ce cas de figure, nous allons modifier notre formule en =IF($B2=0,0,VLOOKUP($B2,$A:$C,3,FALSE)) . Il se lit comme suit : "si la valeur de la cellule B2 est 0, alors retournez 0, sinon cherchez [...]" ou "si l'ID du parent est 0, alors retournez 0, sinon cherchez son nouvel ID".

Il est temps d'appliquer cette formule à l'ensemble de la colonne, ce que vous pouvez faire par un simple copier-coller :

ID         | Parent ID  | New ID     | New Parent ID
1000000000 | 0          | 1000000000 | 0
1100000000 | 1000000000 | 1100000000 | 1000000000
1100000001 | 1100000000 | 1100000001 | 1100000000
1200000000 | 1000000000 | 1200000000 | 1000000000
1200000001 | 1200000000 | 1200000001 | 1200000000
1200000002 | 1200000000 | 1200000002 | 1200000000

C'est là que la magie opère

Maintenant, écrasez un nouvel ID. Comme dans votre exemple, remplacez 1000000000 avec 1 . Vous verrez que l'ID du nouveau parent se met immédiatement à jour avec le nouvel ID. Jouez à nouveau et remplacez 1100000000 avec 10 :

ID         | Parent ID  | New ID     | New Parent ID
1000000000 | 0          | 1          | 0
1100000000 | 1000000000 | 10         | 1
1100000001 | 1100000000 | 1100000001 | 10
1200000000 | 1000000000 | 1200000000 | 1
1200000001 | 1200000000 | 1200000001 | 1200000000
1200000002 | 1200000000 | 1200000002 | 1200000000

C'était amusant ! Mais le faire un millier de fois, non merci, pas vrai ?

Identités auto-valorisées

C'est là qu'Excel excelle, car une fois que vous avez fait le gros du travail, il s'occupe de tout. Dans la cellule C4, tapez cette formule : =C3+10 . Celle-ci ajoute dix à la valeur de la cellule C3, la cellule juste au-dessus, ce qui incrémente effectivement le Nouvel ID de dix. Copiez-collez-le jusqu'à la fin de la colonne et vous êtes prêt :

ID         | Parent ID  | New ID     | New Parent ID
1000000000  0             1            0
1100000000  1000000000  | 10         | 1
1100000001  1100000000  | 20         | 10
1200000000  1000000000  | 30         | 1
1200000001  1200000000  | 40         | 30
1200000002  1200000000  | 50         | 30

Copier-coller de formules

Un dernier mot d'avertissement. Je suppose que vous utiliserez les nouveaux ID et les nouveaux ID parent, peut-être dans d'autres classeurs. Dans ce cas, vous voudrez probablement faire un spécial collage, pour ne retenir que la valeur, et non la formule.

Disons qu'une fois que vous avez terminé, vous souhaitez supprimer les colonnes ID et ID parent d'origine. Avant de le faire, copiez les colonnes New ID et New Parent ID comme vous le faites habituellement. Ensuite, au lieu de coller, utilisez la fonction special paste et choisissez Valeurs, puis cliquez sur OK. Le site special paste est disponible, entre autres, par un clic droit sur la destination.

0voto

Doltknuckle Points 6003

Vous pouvez le faire avec une macro si tout ce que vous voulez est de construire un grand tableau de données répétitives. Personnellement, j'évite les macros et je fais la plupart de ma génération de texte dans Powershell.

Maintenant, si vous voulez prendre des données et faire des calculs dessus, nous pouvons le faire avec des formules. Voici celles dont je pense que vous avez besoin :

  • \=IF(condition, valeur vraie, valeur fausse) - Tests logiques pour prendre des décisions.
  • \=MOD(Data Cell,Divisor) - Renvoie le reste après une division.
  • \=MROUND(Data Cell, Multiple) - Arrondit au multiple défini le plus proche d'un nombre.

Lorsque nous travaillons avec des formules, nous devons définir notre logique pour les actions que nous voulons entreprendre dans l'ordre. Toutes les formules sont de nature procédurale, ce qui permet de déterminer ce que nous devons faire en premier. Je suppose que toutes les entrées sont dans la colonne "New ID" et que toutes les sorties (alias retours) sont dans la colonne "Parent ID". En regardant votre exemple de données, voici ce que je pense que vous voulez.

  1. Trouver les ID qui sont des facteurs de "1000000000" (10^9) et retourner un 0.
  2. Trouvez les ID qui sont des facteurs de "100000000" (10^8) et arrondissez à un nombre entier inférieur qui est un facteur de "1000000000" (10^9).
  3. Arrondir les identifiants restants à un nombre entier qui est un facteur de "100000000" (10^8)

Il y a beaucoup de chiffres à calculer, voici donc un exemple de ce que fait chaque étape.

  • Étape 1 : 700000000 renvoie 0
  • Étape 2 : 770000000 renvoie 700000000
  • Étape 3 : 770000007 donne 770000000

Si c'est correct, alors nous allons configurer vos fonctions :

Étape 1

La première équation que nous utilisons est l'équation "MOD". Si nous divisons chaque nombre par "1000000000" (10^9), nous pouvons rechercher tout nombre dont le reste est égal à zéro. Chaque nombre que nous trouvons est un nombre avec lequel nous voulons retourner un zéro. Pour ce faire, nous devons utiliser la formule "IF". Voici à quoi ressemblerait votre formule dans la cellule E2 :

=IF(MOD(D2,1000000000)=0,0,"false")

Ce premier paramètre IF teste pour voir si le nombre en D2 a un reste lorsqu'il est divisé par 10^9. Si c'est le cas, il renvoie un zéro, sinon il renvoie le texte "false".

Étape 2

Maintenant que nous avons traité notre premier groupe de chiffres, nous pouvons ajouter une instruction IF au mélange pour enchaîner la logique. Nous avons maintenant besoin de l'équation "FLOOR" pour arrondir un nombre à un nombre de chiffres significatifs. Dans ce cas, il s'agit de huit chiffres. Voici à quoi ressemblerait la formule seule :

=IF(MOD(D2,10000000)=0,MROUND(D2,1000000000),"false")

Nous devons ensuite l'enchaîner dans la formule de l'étape 1. Remplacez le "faux" de l'étape 1 par la formule de l'étape 2.

Étape 3

Enfin, il nous suffit d'arrondir les chiffres restants. Nous pouvons le faire avec un autre MROUND. Voici la formule seule :

=MROUND(D2,100000000)

Et maintenant, tout s'enchaîne :

=IF(MOD(D2,1000000000)=0,0,IF(MOD(D2,10000000)=0,MROUND(D2,1000000000),MROUND(D2,100000000)))

Faites-en l'essai et j'espère que cela fonctionnera. Lorsque j'applique cette formule à vos données de la colonne D, j'obtiens les mêmes chiffres que vous avez dans la colonne E.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X