Numérotation selon critères multiple

55stock-test.xlsm (229.30 Ko)

Bonjour,

Je débute sur les fonction et VBA mais je n'arrive pas à numéroter des lignes selon différents critères.

Dans l'onglet "Etat des stocks" en colonne J, je souhaite numéroter de façon logique mes articles selon les critères des colonnes B, C, D, E, F, G, H, I. Si ces critères existent déjà remettre le numéro, sinon mettre le numéro qui suit.

Soit en colonne J cela devrait donner:

1

1

1

1

1

1

1

1

2

2

2

2

Je joins le fichier. Je n'ai pas trouver de réponses dans le forum.

Merci d'avance pour votre aide.

Ana

Bonjour,

=SI(A2=A1;N(J1);N(J1)+1)

En J2, et tirer sur la colonne.

Sous réserve de compréhension de ce que tu veux...

Cordialement.

Bonjour,

Je ne comprends pas comment tu passes de "1" à "2" puisque à la 3e ligne des données, c'est déjà <> des 2 précédantes...

P.

Bonjour et merci pour vos réponses.

Mais je pense que je n'arrive pas à exprimer comment je souhaite faire ma numérotation.

J'aimerais que la numérotation recommence à 1 pour chaque saison/créateur/catégorie/désignation différente et non avoir une suite.

L'objectif étant de créer ma référence avec avec concatener code article+numéro article (à créer) + code couleur

Merci d'avance,

Ana


Pour être plus clair l'idée est d'avoir pour telle saison de telle créateurj'ai:

1 référence Top 1 en taille S

La même référence Top 1 en taille M

1 référence Robe 1 en taille 36

La même référence Robe 1 en taille 38

1 autre référence Top 2 en taille 36

La même autre référence Top 2 en taille 38

La numérotation que je cherche à faire est donc 1,1, 1, 1, 2, 2

Est-ce plus clair?

Merci

MFerrand a écrit :

Bonjour,

=SI(A2=A1;N(J1);N(J1)+1)

En J2, et tirer sur la colonne.

Sous réserve de compréhension de ce que tu veux...

Cordialement.

Bonjour et merci pour vos réponses.

Mais je pense que je n'arrive pas à exprimer comment je souhaite faire ma numérotation.

J'aimerais que la numérotation recommence à 1 pour chaque saison/créateur/catégorie/désignation différente et non avoir une suite.

L'objectif étant de créer ma référence avec avec concatener code article+numéro article (à créer) + code couleur

Merci d'avance,

Ana

Pour être plus clair l'idée est d'avoir pour telle saison de telle créateurj'ai:

1 référence Top 1 en taille S

La même référence Top 1 en taille M

1 référence Robe 1 en taille 36

La même référence Robe 1 en taille 38

1 autre référence Top 2 en taille 36

La même autre référence Top 2 en taille 38

La numérotation que je cherche à faire est donc 1,1, 1, 1, 2, 2

Est-ce plus clair?

Merci

C'est sans doute très compréhensible pour toi, mais pas pour moi, et je n'ai aucune intention que ça le devienne !

Alors crée ta référence, définis comment on met des numéros à partir de ces références, simule le résultat attendu. Si les critères que tu définis pour numéroter sont identifiables dans le tableau, on y parviendra sans avoir à se préoccuper de ce que cela représente à tes yeux...

Cordialement.

MFerrand a écrit :

C'est sans doute très compréhensible pour toi, mais pas pour moi, et je n'ai aucune intention que ça le devienne !

Alors crée ta référence, définis comment on met des numéros à partir de ces références, simule le résultat attendu. Si les critères que tu définis pour numéroter sont identifiables dans le tableau, on y parviendra sans avoir à se préoccuper de ce que cela représente à tes yeux...

Cordialement.

Je me sens moins seul

Bonsoir,

Bonsoir MFerrand,

C'est l'éclipse qui te rend de mauvaise humeur ?

Cdlt.

MFerrand a écrit :

C'est sans doute très compréhensible pour toi, mais pas pour moi, et je n'ai aucune intention que ça le devienne !

Alors crée ta référence, définis comment on met des numéros à partir de ces références, simule le résultat attendu. Si les critères que tu définis pour numéroter sont identifiables dans le tableau, on y parviendra sans avoir à se préoccuper de ce que cela représente à tes yeux...

Cordialement.

Bon plus de représentation à mes yeux

j'ai fait un simul à la mano sur les premières références.

Peut-être est-ce plus clair?

Merci,

102stock-test.xlsm (222.69 Ko)

Salut Patrick ! J'avais un doute qui s'est confirmé !

Salut Jean-Eric ! Tu fais erreur, je ne suis nullement de mauvaise humeur ! Je suis même encore un peu endormi...

C'était juste une mise au point naturelle... Excel ça fait déjà pas mal de connaissance à emmagasiner, on ne peut décemment ajouter les connaissances des arcanes des multiples métiers des intervenants et demandeurs ! Il faut traduire en éléments Excel communs.

Bonne soirée (je vois que la journée commence à tirer à sa fin).


Si tu n'explicites pas pourquoi 1 (critère), pourquoi 2 (critère) ? je ne vois pas sur quoi on doit s'appuyer !

Il semble que tu renumérotes à partir de 1 pour chaque créateur ?

Mais sans critères précis...

MFerrand a écrit :

Salut Patrick ! J'avais un doute qui s'est confirmé !

Salut Jean-Eric ! Tu fais erreur, je ne suis nullement de mauvaise humeur ! Je suis même encore un peu endormi...

C'était juste une mise au point naturelle... Excel ça fait déjà pas mal de connaissance à emmagasiner, on ne peut décemment ajouter les connaissances des arcanes des multiples métiers des intervenants et demandeurs ! Il faut traduire en éléments Excel communs.

Bonne soirée (je vois que la journée commence à tirer à sa fin).


Si tu n'explicites pas pourquoi 1 (critère), pourquoi 2 (critère) ? je ne vois pas sur quoi on doit s'appuyer !

Il semble que tu renumérotes à partir de 1 pour chaque créateur ?

Mais sans critères précis...

Bonjour,

Les critères sont si B2 existe sur la conne B, C2 existe sur la colonne C et si D2 existe sur la colonne D et si E2 existe sur la colonne E et si F2 existe sur la colonne F alors je recherche en colonne J le numéro existant et je le copie. Si seulement B2, C2, et F2 sont vérifiés je recherche en colonne J la valeur et j'ajoute 1. Et sinon je recommence la numérotation à 1.

Est-ce plus compréhensible?

Merci

Bonjour,

C'est interprétable !

Formules ? A base de fonctions classiques, comme de fonctions personnalisées, cela risque de générer des recalculs fréquents qui affecteraient l'utilisation du classeur...

Je vois deux possibilités à tenter :

  • soit macro, exécutable sur demande, qui recalculerait les numéros d'articles de la feuille...
  • soit fonction personnalisée, mais qui ne recalculerait pas la feuille à chaque fois, et consulterait un tableau (à stocker sur une feuille éventuellement masquée) pour générer le numéro ; si le numéro ne peut être généré (références nouvelles), une procédure d'appoint complèterait le tableau avec les nouvelles références, qui permettront à la fonction de générer le numéro.

Choix à faire... ? Je ne vais de toute façon pas me lancer tout de suite dans l'écriture.

Cordialement.

Bon ! En colonne J lignes 10 à 13 tu as noté la valeur 2.

Or, pour ces 4 lignes B, C et F sont bien identiques, mais si la valeur est aussi identique pour la colonne D, ce n'est plus le cas pour la colonne E, donc les lignes 12 et 13 auraient dû prendre la valeur 3, selon tes indications :

Les critères sont si B2 existe sur la conne B, C2 existe sur la colonne C et si D2 existe sur la colonne D et si E2 existe sur la colonne E et si F2 existe sur la colonne F alors je recherche en colonne J le numéro existant et je le copie. Si seulement B2, C2, et F2 sont vérifiés je recherche en colonne J la valeur et j'ajoute 1. Et sinon je recommence la numérotation à 1.

Je me fie donc aux indications qui conduisent à faire du libellé résultant B C F une série numérotable de 1 à x, la numérotion dans la série étant réalisée sur la base d'un libellé résultant D E.

Je termine et je livre mon duo Proc. d'initialisation - Fonction.

Ça m'a l'air de fonctionner comme prévu !

Tu vérifieras.

Fonction que j'ai tout bêtement appelée NUMART :
Function NUMART()
    Dim SCrCat$, rFcc$, iC%, i%, k%
    'Application.Volatile
    iC = Application.ThisCell.Row
    With ActiveSheet
        For k = 2 To 6
            If .Cells(iC, k) = "" Then
                NUMART = ""
                Exit Function
            End If
        Next k
        SCrCat = .Cells(iC, 2) & .Cells(iC, 3) & .Cells(iC, 6)
        rFcc = .Cells(iC, 4) & .Cells(iC, 5)
    End With
    On Error GoTo init
    With [_SCC]
        For k = 1 To .Columns.Count
            If .Cells(1, k) = SCrCat Then Exit For
        Next k
        If k <= .Columns.Count Then
            With .Cells(1, k)
                Do While .Offset(i + 1) <> ""
                    i = i + 1
                    If .Offset(i) = rFcc Then
                        NUMART = i
                        Exit Function
                    End If
                Loop
            End With
        End If
    End With
init:
    NUMART = CVErr(xlErrNA)
End Function

Il suffit donc de mettre =NUMART() en colonne J...

Le résultat est soit un numéro : les références BCF et DE ont été trouvées,

soit N/A : les références n'ont pas été trouvées, il faut donc les réinitialiser pour qu'elles soient mises à jour (voir ci-après),

soit rien : c'est que au moins une des colonnes B C D E F n'est pas servie (et dans ce cas les références ne sont pas créées lors de l'initialisation) [NB-il y a quelques cas]

La fonction va chercher les références dans une feuille masquée nommée SCC-FC (que j'ai introduite).

Elle utilise une plage nommée de cette feuille : _SCC (voir dans le Gestionnaire de noms).

Lorsqu'il y a des N/A dans les résultats, il convient de lancer la procédure de réinitialisation ci-dessous :

Sub RéinitNumArt()
    Dim dscc As Object, dfc As Object, SCrCat, rFcc, n%, i%, k%
    Set dscc = CreateObject("Scripting.Dictionary")
    With Worksheets("Etat des stocks")
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 2 To n
            For k = 2 To 6
                If .Cells(i, k) = "" Then Exit For
            Next k
            If k > 6 Then
                SCrCat = .Cells(i, 2) & .Cells(i, 3) & .Cells(i, 6)
                rFcc = .Cells(i, 4) & .Cells(i, 5)
                If dscc.exists(SCrCat) Then
                    dscc(SCrCat) = dscc(SCrCat) & "|" & rFcc
                Else
                    dscc(SCrCat) = "|" & rFcc
                End If
            End If
        Next i
    End With
    Set dfc = CreateObject("Scripting.Dictionary")
    k = 0
    With Worksheets("SCC-FC")
        .UsedRange.ClearContents
        For Each SCrCat In dscc.keys
            rFcc = Split(dscc(SCrCat), "|")
            For i = 1 To UBound(rFcc)
                dfc(rFcc(i)) = ""
            Next i
            k = k + 1: n = 1
            .Cells(1, k) = SCrCat
            For Each rFcc In dfc.keys
                n = n + 1
                .Cells(n, k) = rFcc
            Next rFcc
            dfc.RemoveAll
        Next SCrCat
    End With
    Worksheets("Etat des stocks").Calculate
End Sub

Cette procédure efface la feuille SCC-FC et y reconstruit toutes les références : sur la première ligne les différentes réf. BCF, et sur les lignes suivantes, pour chaque BCF les réf. DE rattachées.

La fonction NUMART n'est pas volatile (cela m'a paru préférable) mais la proc. se termine par un recalcul de la feuille Etat des stocks, ce qui devrait faire disparaître les N/A au profit d'un numéro (et éventuellement produire de nouveaux numéros si les changements ont modifié l'ordre d'inscription des références).

Dernier point : Ton fichier m'a l'air d'avoir été affecté par un problème de codage (noms de modules incorporant un "Ê"), ce pourquoi j'ai placé mon code dans un nouveau module.

Je conseillerais cependant de tout regrouper dans un seul module. Rien ne justifie l'existence de plusieurs modules standard !

Je conseillerais aussi d'épurer le code qui y figure, au moins pour en chasser tous les "Select" , tu y gagneras en volume de code, en lisibilité et en efficacité (rapidité d'exécution).

Cordialement.


MFerrand a écrit :

Ça m'a l'air de fonctionner comme prévu !

Tu vérifieras.

Fonction que j'ai tout bêtement appelée NUMART :
Function NUMART()
    Dim SCrCat$, rFcc$, iC%, i%, k%
    'Application.Volatile
    iC = Application.ThisCell.Row
    With ActiveSheet
        For k = 2 To 6
            If .Cells(iC, k) = "" Then
                NUMART = ""
                Exit Function
            End If
        Next k
        SCrCat = .Cells(iC, 2) & .Cells(iC, 3) & .Cells(iC, 6)
        rFcc = .Cells(iC, 4) & .Cells(iC, 5)
    End With
    On Error GoTo init
    With [_SCC]
        For k = 1 To .Columns.Count
            If .Cells(1, k) = SCrCat Then Exit For
        Next k
        If k <= .Columns.Count Then
            With .Cells(1, k)
                Do While .Offset(i + 1) <> ""
                    i = i + 1
                    If .Offset(i) = rFcc Then
                        NUMART = i
                        Exit Function
                    End If
                Loop
            End With
        End If
    End With
init:
    NUMART = CVErr(xlErrNA)
End Function

Il suffit donc de mettre =NUMART() en colonne J...

Le résultat est soit un numéro : les références BCF et DE ont été trouvées,

soit N/A : les références n'ont pas été trouvées, il faut donc les réinitialiser pour qu'elles soient mises à jour (voir ci-après),

soit rien : c'est que au moins une des colonnes B C D E F n'est pas servie (et dans ce cas les références ne sont pas créées lors de l'initialisation) [NB-il y a quelques cas]

La fonction va chercher les références dans une feuille masquée nommée SCC-FC (que j'ai introduite).

Elle utilise une plage nommée de cette feuille : _SCC (voir dans le Gestionnaire de noms).

Lorsqu'il y a des N/A dans les résultats, il convient de lancer la procédure de réinitialisation ci-dessous :

Sub RéinitNumArt()
    Dim dscc As Object, dfc As Object, SCrCat, rFcc, n%, i%, k%
    Set dscc = CreateObject("Scripting.Dictionary")
    With Worksheets("Etat des stocks")
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 2 To n
            For k = 2 To 6
                If .Cells(i, k) = "" Then Exit For
            Next k
            If k > 6 Then
                SCrCat = .Cells(i, 2) & .Cells(i, 3) & .Cells(i, 6)
                rFcc = .Cells(i, 4) & .Cells(i, 5)
                If dscc.exists(SCrCat) Then
                    dscc(SCrCat) = dscc(SCrCat) & "|" & rFcc
                Else
                    dscc(SCrCat) = "|" & rFcc
                End If
            End If
        Next i
    End With
    Set dfc = CreateObject("Scripting.Dictionary")
    k = 0
    With Worksheets("SCC-FC")
        .UsedRange.ClearContents
        For Each SCrCat In dscc.keys
            rFcc = Split(dscc(SCrCat), "|")
            For i = 1 To UBound(rFcc)
                dfc(rFcc(i)) = ""
            Next i
            k = k + 1: n = 1
            .Cells(1, k) = SCrCat
            For Each rFcc In dfc.keys
                n = n + 1
                .Cells(n, k) = rFcc
            Next rFcc
            dfc.RemoveAll
        Next SCrCat
    End With
    Worksheets("Etat des stocks").Calculate
End Sub

Cette procédure efface la feuille SCC-FC et y reconstruit toutes les références : sur la première ligne les différentes réf. BCF, et sur les lignes suivantes, pour chaque BCF les réf. DE rattachées.

La fonction NUMART n'est pas volatile (cela m'a paru préférable) mais la proc. se termine par un recalcul de la feuille Etat des stocks, ce qui devrait faire disparaître les N/A au profit d'un numéro (et éventuellement produire de nouveaux numéros si les changements ont modifié l'ordre d'inscription des références).

Dernier point : Ton fichier m'a l'air d'avoir été affecté par un problème de codage (noms de modules incorporant un "Ê"), ce pourquoi j'ai placé mon code dans un nouveau module.

Je conseillerais cependant de tout regrouper dans un seul module. Rien ne justifie l'existence de plusieurs modules standard !

Je conseillerais aussi d'épurer le code qui y figure, au moins pour en chasser tous les "Select" , tu y gagneras en volume de code, en lisibilité et en efficacité (rapidité d'exécution).

Cordialement.


Merci beaucoup, je vais essayer cela et surtout prendre un peu de temps pour comprendre

MFerrand a écrit :

Ça m'a l'air de fonctionner comme prévu !

Tu vérifieras.

Fonction que j'ai tout bêtement appelée NUMART :
Function NUMART()
    Dim SCrCat$, rFcc$, iC%, i%, k%
    'Application.Volatile
    iC = Application.ThisCell.Row
    With ActiveSheet
        For k = 2 To 6
            If .Cells(iC, k) = "" Then
                NUMART = ""
                Exit Function
            End If
        Next k
        SCrCat = .Cells(iC, 2) & .Cells(iC, 3) & .Cells(iC, 6)
        rFcc = .Cells(iC, 4) & .Cells(iC, 5)
    End With
    On Error GoTo init
    With [_SCC]
        For k = 1 To .Columns.Count
            If .Cells(1, k) = SCrCat Then Exit For
        Next k
        If k <= .Columns.Count Then
            With .Cells(1, k)
                Do While .Offset(i + 1) <> ""
                    i = i + 1
                    If .Offset(i) = rFcc Then
                        NUMART = i
                        Exit Function
                    End If
                Loop
            End With
        End If
    End With
init:
    NUMART = CVErr(xlErrNA)
End Function

Il suffit donc de mettre =NUMART() en colonne J...

Le résultat est soit un numéro : les références BCF et DE ont été trouvées,

soit N/A : les références n'ont pas été trouvées, il faut donc les réinitialiser pour qu'elles soient mises à jour (voir ci-après),

soit rien : c'est que au moins une des colonnes B C D E F n'est pas servie (et dans ce cas les références ne sont pas créées lors de l'initialisation) [NB-il y a quelques cas]

La fonction va chercher les références dans une feuille masquée nommée SCC-FC (que j'ai introduite).

Elle utilise une plage nommée de cette feuille : _SCC (voir dans le Gestionnaire de noms).

Lorsqu'il y a des N/A dans les résultats, il convient de lancer la procédure de réinitialisation ci-dessous :

Sub RéinitNumArt()
    Dim dscc As Object, dfc As Object, SCrCat, rFcc, n%, i%, k%
    Set dscc = CreateObject("Scripting.Dictionary")
    With Worksheets("Etat des stocks")
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 2 To n
            For k = 2 To 6
                If .Cells(i, k) = "" Then Exit For
            Next k
            If k > 6 Then
                SCrCat = .Cells(i, 2) & .Cells(i, 3) & .Cells(i, 6)
                rFcc = .Cells(i, 4) & .Cells(i, 5)
                If dscc.exists(SCrCat) Then
                    dscc(SCrCat) = dscc(SCrCat) & "|" & rFcc
                Else
                    dscc(SCrCat) = "|" & rFcc
                End If
            End If
        Next i
    End With
    Set dfc = CreateObject("Scripting.Dictionary")
    k = 0
    With Worksheets("SCC-FC")
        .UsedRange.ClearContents
        For Each SCrCat In dscc.keys
            rFcc = Split(dscc(SCrCat), "|")
            For i = 1 To UBound(rFcc)
                dfc(rFcc(i)) = ""
            Next i
            k = k + 1: n = 1
            .Cells(1, k) = SCrCat
            For Each rFcc In dfc.keys
                n = n + 1
                .Cells(n, k) = rFcc
            Next rFcc
            dfc.RemoveAll
        Next SCrCat
    End With
    Worksheets("Etat des stocks").Calculate
End Sub

Cette procédure efface la feuille SCC-FC et y reconstruit toutes les références : sur la première ligne les différentes réf. BCF, et sur les lignes suivantes, pour chaque BCF les réf. DE rattachées.

La fonction NUMART n'est pas volatile (cela m'a paru préférable) mais la proc. se termine par un recalcul de la feuille Etat des stocks, ce qui devrait faire disparaître les N/A au profit d'un numéro (et éventuellement produire de nouveaux numéros si les changements ont modifié l'ordre d'inscription des références).

Dernier point : Ton fichier m'a l'air d'avoir été affecté par un problème de codage (noms de modules incorporant un "Ê"), ce pourquoi j'ai placé mon code dans un nouveau module.

Je conseillerais cependant de tout regrouper dans un seul module. Rien ne justifie l'existence de plusieurs modules standard !

Je conseillerais aussi d'épurer le code qui y figure, au moins pour en chasser tous les "Select" , tu y gagneras en volume de code, en lisibilité et en efficacité (rapidité d'exécution).

Cordialement.


Merci beaucoup c'est super Je suis très admirative du boulot de codage, je trouve cela vraiment intéressant!

Rechercher des sujets similaires à "numerotation criteres multiple"