Incrémentation dans un tableau

Bonjour,

1er Post!

J'ai créé un Tableau dans Excel et j'aimerai qu'à chaque nouvel enregistrement (ligne), un nombre entier s'incrément de +1 automatiquement sans intervention de l'utilisateur. En fait j'essaie d'avoir un ID unique pour chaque enregistrement.

Ex.

ID Prénom

1 Toto

2 Titi

3 etc...

Merci pour vos réponses,

Bonjour et bienvenue,

Avec la fonction LIGNE (LIGNE, fonction) - Support Microsoft, vous pouvez donner un indice unique à chaque ligne de votre tableau.

=LIGNE()

Sinon vous pouvez aussi utiliser, en A3 avec, supposons, la première ligne du tableau en A2,

=A2+1

Et en étirant vers le bas vous incrémentez la valeur précédente.

Si vous voulez des valeurs statiques, càd sans formule, alors il faudra passer par VBA.

Bonjour,

Convertissez votre tableau en tableau structuré, puis sur la première ligne du tableau (la ligne2), saisissez la formule: =Ligne() - 1

la formule se répètera automatiquement à chaque nouvelle ligne ajoutée.

Cdlt

Edit: Trop tard sabohest déjà passé par là.

Merci pour vos réponses mais l'inconvénient c'est que cette fonction Ligne() va être modifiée si l'utilisateur décide d'insérer une ligne au dessus du Tableau.

Qui plus est cet ID donnera une valeur différente si on met un ordre de tri différent dans le tableau.

Je désire travailler dans une logique plus base de donnée avec une ID est unique et non modifiable.

@Arturo83

Qu'est-ce que tu appelles un "tableau structuré"?

Merci,

un peu de lecture ici:

https://excel-pratique.com/fr/astuces/tableau-structure

Si vous aviez mis un fichier, je vous l'aurai fait

Oui pardon c'est ni plus ni moins ce que j'utilise.

Merci beaucoup,

Pour écrire des "ID" uniques et statiques, il faut passer par une macro VBA ou PowerQuery. Pour le VBA ce serait utile d'avoir la structure de vos données via un fichier d'exemple. Et pour PQ aussi j'imagine.

Voici un fichier correspondant,.

Merci,

38exemple.xlsx (13.01 Ko)

Bonjour,

Je vous ai écrit un petit Sub générique, qui met à jour les indexes d'un tableau structuré. Le fonctionnement est le suivant :

Si la table contient déjà des indexes, ils sont gardés. Sauf les doublons qui sont remplacés, si présents. Les valeurs vides ou les doublons sont remplacés par des nouveaux indexes, en se basant sur le dernier index de la liste + 1.

Comme je n'ai pas bien compris comment vous vouliez lancer la macro : je vous joins votre fichier avec 2 solutions :

  • Sur la feuille ACHATS, la macro se lance automatiquement quand vous modifiez une valeur dans le tableau.
  • Sur la feuille PRODUITS, il faut cliquer sur le bouton.

Ci-après le Sub générique en question. L'argument optionnel est le numéro de colonne des indexes, si différent de 1. Et ci-joint le fichier.

29exemple.xlsm (26.13 Ko)
Public Sub CreateIDsIn(tbl As ListObject, Optional ByVal colID As Long = 1)
  Dim myIDs As Variant
  myIDs = WorksheetFunction.Transpose(tbl.DataBodyRange.Columns(colID).Value2)

  Dim uniqIDs As Object: Set uniqIDs = CreateObject("System.Collections.ArrayList")
  Dim i As Long, j As Long
  For i = LBound(myIDs) To UBound(myIDs)
    If uniqIDs.contains(myIDs(i)) Or myIDs(i) = vbNullString Then
      j = i - 1
      Do
        j = j + 1
      Loop While uniqIDs.contains(j)
      uniqIDs.Add j
    Else
      uniqIDs.Add myIDs(i)
    End If
  Next i

  If uniqIDs.Count <> (UBound(myIDs) - LBound(myIDs) + 1) Then
    MsgBox "Une erreur est survenue"
  Else
    tbl.DataBodyRange.Columns(colID).Value2 = WorksheetFunction.Transpose(uniqIDs.toArray)
  End If

End Sub

Merci,

C'est super gentil. Je verrai celà à tête reposée ce soir.

Bonne journée,

Bonsoir;

Maintenant que je vois le fichier, en D6 saisissez la formule:

=LIGNE()-5

Ainsi, lorsque vous entrerez un nouveau produit dans la première cellule vide de la colonne E, l'ID CDE s'incrémentera automatiquement.

Cdlt

@Sabo

J'obtiens un message "Erreur d'exécution <<429>> : Un composant ActiveX ne peut pas créer d'objet."

Est-ce parceque je suis sur Mac?

Le problème ne vient sûrement pas de la formule, le fichier réel doit contenir quelque chose d'autre qui n'est pas conforme à son utilisation.

En attendant, voici le fichier avec la modification, est-ce que chez vous , il fonctionne correctement?

@Arturo83

Merci mais la fonction LIGNE() ne correspond pas à mes besoins d'une ID pourn un enregistrement. Si par exemple je fais un tri sur une colonne comme Qté ou Designation les IDs ne correspondent plus à l'enregistrement.

screenshot 2024 12 16 at 20 19 12 screenshot 2024 12 16 at 20 19 34

On voit par exemple que l'ID des Bananes est passé de "3" à "1"

L'ID doit correspondre à une ligne de la table, être unique et ne jamais changer.

Bonsoir à tous !

En effet pour un ID la donnée doit être entrée "en dur" afin que cette dernière suive les données auxquels il se réfère.
Donc point de formule, si ce n'est une formule d'incrémentation en VBA suite à une surveillance évènementielle.

Ce que vous a proposé saboh12617. Son code provoque une erreur, je pense à cause de ceci : CreateObject("System.Collections.ArrayList").
Après recherche sur le net le FramWork 3.5 doit être installé, même si vous avez une version 4.X.

A voir donc...

@ bientôt

LouReeD

Bonjour à tous,

Comme indiqué par @LooReed c'est bien parce que vous etes sur MAC. N'hésitez pas à l'ajouter sur votre profil ("MAC 365 FR") c'est vraiment important pour tout ce qui regarde les macros notamment.

La MAJ de la macro vers ceci devrait fonctionner, en supposant que l'arraylist de la bibliothèque .NET était bien l'unique problème.

Public Sub CreateIDsIn(tbl As ListObject, Optional ByVal colID As Long = 1)
  Dim myIDs As Variant
  myIDs = WorksheetFunction.Transpose(tbl.DataBodyRange.Columns(colID).Value2)

  Dim uniqIDs() As Variant
  ReDim uniqIDs(LBound(myIDs) To UBound(myIDs))

  Dim i As Long, j As Long
  For i = LBound(myIDs) To UBound(myIDs)
    If ArrContains(uniqIDs, myIDs(i)) Or myIDs(i) = vbNullString Then
      j = i - 1
      Do
        j = j + 1
      Loop While ArrContains(uniqIDs, j)
      uniqIDs(i) = j
    Else
      uniqIDs(i) = myIDs(i)
    End If
  Next i

  tbl.DataBodyRange.Columns(colID).Value2 = WorksheetFunction.Transpose(uniqIDs)

End Sub

Private Function ArrContains(arr As Variant, val As Variant) As Boolean
  ArrContains = False
  If Not IsArray(arr) Or IsEmpty(val) Then Exit Function

  Dim i As Long
  For i = LBound(arr) To UBound(arr)
    If arr(i) = val Then
      ArrContains = True
      Exit Function
    End If
  Next i
End Function
27exemple.xlsm (28.86 Ko)

Bonjour "POXO", bonjour tout le monde,

Test fait dans la feuille "PRODUITS".

Tu enregistres ton classeur Excel en xlsm (il prend en charge les macros)

En sélectionnant l'après dernière cellule de la colonne "D", la cellule voisine de la colonne "C" s’incrémente de 1.

Avant d'ajouter dans une cellule de la colonne"D",

il faut trier le tableau de A à Z ; parce que la nouvelle "ID_PRODUIT" prend la valeur de sa

Précédente et ajoute 1.

************************************************************************

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i, DerLin As Long, KeyCells As Range
DerLin = Cells(Rows.Count, 4).End(xlUp).Row
For i = 6 To DerLin
'If Target.Address = Range("D" & i).Address Then
If Not Intersect(Target, Range("D" & i)) Is Nothing Then
Range("D" & i).Select
Range("C" & i) = Range("C" & (i - 1)) + 1
End If
Next
End Sub

**************************************************************************

30exempleab.xlsm (18.65 Ko)

Bonjour POXO

j'ai modifie la macro par une autre meilleure;

Quand tu cliques juste après la dernière cellule colonne "E" une nouvelle ligne vide s'ajoute au tableau + nouvelle cellule colonne "D" qui s'incremente.

Pour la question du desordre lors du tri ,verifies.

28exempleab.xlsm (22.21 Ko)
27exempleab.xlsm (22.21 Ko)

Bonsoir,

en reprenant l'idée d'abdu, en utilisant "un peu" le fait que vous soyez en tableau structuré et en utilisant la WorksheetFunction MAX, et comme intitulé de colonne pour les ID : "N° ID" je vous propose ce code :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim DerLigTab As Long
    ' on récupère le numéro de la première ligne sous le tableau
    DerLigTab = Range("COMMANDES_TBL").Row + Range("COMMANDES_TBL").Rows.Count
    ' si la cellule sélectionnée se trouve sur cette ligne et entre les colonne D à H
    If Not Intersect(Target, Range("D" & DerLigTab & ":H" & DerLigTab)) Is Nothing Then
        ' on inscrit en colonne D l'ID correspondant au Max de la colonne +1
        Range("D" & DerLigTab).Value = WorksheetFunction.Max(Range("COMMANDES_TBL[N° ID]")) + 1
    End If
End Sub

Le tableau peut être déplacé en "hauteur" le code fonctionnera, mais pas pour un déplacement vers la gauche ou la droite du fait que "D" et "H" sont inscrit en dur...
Je pense que cela peut être modifié...

@ bientôt

LouReeD

Rechercher des sujets similaires à "incrementation tableau"