Numérotation de ligne automatique

Bonjour le Forum

Voici un fichier que je souhaite amélioré suivant ces 2 actions:

1- Numéroter automatiquement la nouvelle ligne insérée avec le Btn "Nouvelle Entrée de l'Userform Gestion du tableau de bord

Voici le code en place:

       'PROCEDURE AJOUT ENREGISTREMENT DANS FEUILLE "DataBase"

Private Sub BtnAjout_Click()

'Déclaration des variables

Dim lo As ListObject
Dim rCell As Range
Dim bAutoExpand As Boolean, bAutoFill As Boolean

    'options de l'application pour la correction automatique
    '(Options Excel, Vérification...)
    With Application.AutoCorrect
        'on mémorise l'état des 2 propriétés
        bAutoExpand = .AutoExpandListRange      'insertion de lignes dans les listes ou tables (tableaux)
        bAutoFill = .AutoFillFormulasInLists    'formules de remplissage colonnes calculées
        .AutoExpandListRange = True             'on autorise...
        .AutoFillFormulasInLists = True         'on autorise...
    End With
    'initialisation de la table (tableau)
    Set lo = Worksheets("DataBase").ListObjects("TDataBase")
    With lo
        'Si la table comporte des données
        If .InsertRowRange Is Nothing Then
            '1ère. cellule vide (colonne 1 de la table,nombre de lignes de la table+1)
            Set rCell = .HeaderRowRange.Cells(1).Offset(.ListRows.Count + 1)
        Else
            '1ère cellule colonne 1 de la table
            Set rCell = .InsertRowRange.Cells(1)
        End If
    End With
    'Restitution des données dans la feuille de calcul
    With rCell

        .Offset(, 1).Value = CboSecteur_Exploitation
        .Offset(, 2).Value = CboEquipement
        .Offset(, 3).Value = CboSocInt
        .Offset(, 4).Value = CboSocExt
        .Offset(, 5).Value = CboContact
        .Offset(, 6).Value = TxtNumTel
        .Offset(, 7).Value = TxtPriorite
        .Offset(, 8).Value = TxtDDO
        .Offset(, 9).Value = TxtDFO
        .Offset(, 10).Value = CboNumSemPTot
        .Offset(, 11).Value = CboNumSemPTard
        .RowHeight = Sheets("Administrateur").[W5].Value    'Mettre la ligne à la hauteur suivant valeur cel W5 Feuil Admin

    End With

    'on rétablit les valeurs des 2 propriétés de la correction automatique CDbl(txtEcritFeuille.Value)

    With Application.AutoCorrect
        .AutoExpandListRange = bAutoExpand
        .AutoFillFormulasInLists = bAutoFill
    End With

End Sub

J'ai essayé avec la fonction Ligne(A1) en A5 ds la feuille DataBase,

Si ds la feuille "Tableau de bord" je sélectionne ds "choix Semaine SDO" 11 par exemple et que je valide par le Btn Validation Extraction,

Cela ne correspond pas à la numérotation de la feuille "DataBase" puisque la formule est copiée aussi.

2- Modifier la valeur de la colonne M dans la feuille tableau de bord qui sera reporter aussi dans la feuille DataBase.

Dans la feuille "DataBase" en colonne "M", il est possible de modifier la valeur suivant une Abréviation ( voir dans la feuille "Administrateur")

Ce que j'aimerai, c'est faire la même chose en en feuille "Tableau de Bord", j'ai préparé le tableau pour cela (Voir Feuille "Administrateur"), et c'est pour cela qu'il faut un numéro de ligne pour pouvoir faire cette action ( Enfin c'est ce que je pense) .

Car si je modifie en colonne "M" de la feuille "Tableau de Bord", cela doit faire la modification aussi dans la feuille "DataBase"

Voici le code qui se trouve dans la feuille "Tableau de Bord"

Private Sub Worksheet_Change(ByVal Target As Range)
Dim datas, pl As Range, C As Range, c2 As Range, i As Long, tmp

    datas = [T_MotsCles_TDB].Value
        For i = 1 To UBound(datas)
        ' ref Plage de cellules impactées
        tmp = Split(Replace(datas(i, 2), "=", "!"), "!")
    On Error GoTo suite
        Set pl = Intersect(Target, Sheets(tmp(1)).Range(tmp(2)))
    On Error GoTo -1
        If Not pl Is Nothing Then
            ' pour chaque cellule modifiée
            For Each C In pl
                If Not C.HasFormula Then
                    If LCase(Target.Formula) = LCase(datas(i, 1)) Or LCase(Target.Formula) = LCase(datas(i, 3)) Then
                        Set c2 = [T_MotsCles_TDB].Cells(i, 3)    ' cell des formats
                        Application.EnableEvents = False
                        ' nouvelle valeur
                        Target = c2.Value
                        Application.EnableEvents = True
                        With c2
                            C.Interior.Color = IIf(.Interior.Color = 16777215, xlNone, .Interior.Color)
                            With .Font
                                C.Font.Name = .Name
                                C.Font.Size = .Size
                                C.Font.Color = .Color
                                C.Font.FontStyle = .FontStyle
                            End With
                            C.HorizontalAlignment = .HorizontalAlignment
                            C.VerticalAlignment = .VerticalAlignment
                            C.IndentLevel = .IndentLevel
                        End With

                        Exit For
                    End If
                End If

            Next C
        End If

suite:
On Error GoTo -1

        Next i
End Sub

Dans le fichier ce code est en commentaire , car quand j'utilise le Btn "Validation Extraction" cela ralenti énormément l’exécution du programme.

J'espère que ma demande est suffisamment claire pour vous, et merci de votre aide

à Bientôt

Salut Ledzep

Pour commencer, pourquoi ne pas utiliser de TS (tableaux Structurés)

Ensuite pour les numéros, pourquoi ne pas utiliser de formule du genre A de la ligne précédente +1 ?

Sinon dans la sub BtnAjout_Click()

'Restitution des données dans la feuille de calcul
  With rCell
    .Value = .Offset(-1, 0).Value + 1
...

A+

Re le Forum

Bonjour BrunoM45 , merci de m'avoir lu et répondu.

pourquoi ne pas utiliser de formule du genre A de la ligne précédente +1 ?

Oui j'y ai pensée puisque j'ai essayé d'utiliser Ligne (A5) et cela fonctionne.

Pour être plus précis, La feuille "DataBase" sert de support pour l'enregistrement d'une nouvelle entrée ou pour la modification d'une ligne .

le tri se fait en fonction :

Private Sub Worksheet_Activate()
    Dim lo As ListObject

    '#Cacher UserForm
    frmGestion.Hide

    Application.ScreenUpdating = False
        Set lo = Me.ListObjects(1)
            With lo
                'On Trie du plus petit au plus grand la colonne "11=K" SDO
                .Sort.SortFields.Add .ListColumns(11).DataBodyRange, xlSortOnValues, xlAscending, DataOption:=xlSortNormal
                'On Trie du plus petit au plus grand la colonne "9=I" DDO
                .Sort.SortFields.Add .ListColumns(9).DataBodyRange, xlSortOnValues, xlAscending, DataOption:=xlSortNormal
                'On Trie du plus petit au plus grand la colonne "12=L" SFO
                .Sort.SortFields.Add .ListColumns(12).DataBodyRange, xlSortOnValues, xlAscending, DataOption:=xlSortNormal
                .Sort.Apply
                'On efface les objets définis au préalable
                .Sort.SortFields.Clear
            End With
        Set lo = Nothing

End Sub

donc la méthode que tu proposes fonctionne pour un enregistrement, mais pas si je modifie la date d'une ligne.

Cela j'ai oublié de le préciser, désolé

en fait je pense qu'il faut que je m'oriente plutôt vers :

'#  PROCEDURE CHARGEMENT DES DONNÉES DEPUIS DATABASE SUIVANT CHOIX DS "CboNsem_Fin"

    Private Sub BtnValid_ExtracSDO_Click()

    Dim Lg As Long
    Dim D1$, D2$
    Dim WsS As Worksheet

        'On efface la zone du Tbl de bord pour recevoir nouvelles données
        Lg = Range("A8").End(xlUp).Row + 1

        With Range("A" & Lg & ":A600").EntireRow
                .Delete

            'Identification de la feuille objet
            Set WsS = Worksheets("DataBase")
                With WsS.ListObjects("TDataBase")
                    'On Filtre sur SDO  CboNsem_Fin
                    .Range.AutoFilter field:=11, Criteria1:="<=" & CboNsem_Fin
                    'On Filtre sur les Cloturés
                    .Range.AutoFilter field:=13, Criteria1:=" <>Cloturé"
                    'On Copie vers Tableau de Bord a partir de A8
                    .DataBodyRange.Copy [A8]
                    'On Réinitialiser le filtre du Tableau DataBase SDO
                    .Range.AutoFilter field:=11
                    'On Réinitialiser le filtre du Tableau DataBase
                    .Range.AutoFilter field:=13
                End With

        End With

        'On sélectionne depuis la colonne A ligne 8 jusque la ligne 600
        With Range("A" & Lg & ":A600").EntireRow
            'On impose une hauteur de ligne suivant la valeur ds la cellule W3 de la feuille "ADMINISTRATEUR"
            .RowHeight = Sheets("Administrateur").[W3].Value
            'On centre verticalement les valeurs
            .VerticalAlignment = xlCenter
            'On centre Horizontalement les valeurs que sur la colonne A
            .Columns("A:A").HorizontalAlignment = xlCenter
            'On Impose une couleur de police
            .Font.Color = RGB(0, 0, 0)
            'On impose le texte en gras
            .Font.Bold = True
        End With

    End Sub

et sur ce code:

'On Copie vers Tableau de Bord a partir de A8
                    .DataBodyRange.Copy [A8]

n'autoriser que la valeur et non les formules.

Qu'en pensez-vous ?

Merci

A bientôt

Bonsoir le forum

Pas trouvé de solution, j’abandonne pour ce soir

Ma piste pour demain c’est de changer

DataBodyRange.Copy [A8]

A vous relire

Bonne soirée à tous

Bonsoir le forum

J'ai réussi à mettre un numéro de ligne merci pour le partage du code.

   Dim datas, pl As Range, C As Range, c2 As Range, c3 As Range, i As Long, tmp

' 1 # INCREMENTER UN NUMERO DE LIGNE EN COL "A"

    'On désactive les évènements
    Application.EnableEvents = False
    'Si erreur exécution -> instruction suivante ( Aucune SpecialCells )
    On Error Resume Next
    '
    With ListObjects(1).Range.Columns(1)

        For Each c3 In .SpecialCells(xlCellTypeBlanks)
            c3 = Application.Max(.Cells) + 1
        Next
    End With
    'On réactive les évènements
    Application.EnableEvents = True

Maintenant je souhaite que Si je modifie en col "M" de la feuille Tableau de bords" Alors recopie de la valeur en feuille "DataBase"

Merci pour votre aide

Bonne soirée à tous

bonsoir, dans la première partie du change-event, on cherche ce numéro dans l'autre feuille, on vérifie si les 12 cellules sont les mêmes (nécessaire ?) et puis on colle ...

     Set C1 = Intersect(Target, Me.Columns("M"))     'toutes les cellules modifiées en colonne M
     If Not C1 Is Nothing Then
          For Each c2 In C1.Cells     'boucler
               r = Application.Match(c2.Offset(, 1 - c2.Column).Value, Sheets("Database").Columns("A"), 0)     'rechercher ligne dans la feuille "database"
               If IsNumeric(r) Then     'trouvé
                    s1 = WorksheetFunction.TextJoin("|", 0, c2.Offset(, 1 - c2.Column).Resize(, 12))     'joindre les 12 cellules de "tableau de bord"
                    s2 = WorksheetFunction.TextJoin("|", 0, Sheets("Database").Cells(r, 1).Resize(, 12))     'joindre les 12 cellules de "database"
                    If StrComp(s1, s2, 1) = 0 Then
                         Sheets("Database").Cells(r, 13).Value = c2.Value     's'ils sont egal, coller la valeur
                    Else
                         MsgBox "il y a une différence" & vbLf & s1 & vbLf & s2, vbExclamation 'avertissement
                    End If
               Else
                    MsgBox "erreur copie colonne M", vbExclamation, c2.Offset(, 1 - c2.Column)
               End If
          Next
     End If

Bonsoir le forum

Bonsoir BsAlv

Merci pour ta proposition, je viens de l'essayer.

quand je fais une validation extraction, j'ai un bug , cela me bloque le PC, je suis obligé de faire fin de tache sur excel pour en sortir.

 MsgBox "erreur copie colonne M", vbExclamation, c2.Offset(, 1 - c2.Column)

J'ai donc essayé en mettant des points d'arrêt sur les lignes de ton code pour identifier la source.

et donc sur ton code:

Set C1 = Intersect(Target, Me.Columns("M"))     'toutes les cellules modifiées en colonne M
     If Not C1 Is Nothing Then
          For Each c2 In C1.Cells     'boucler
               r = Application.Match(c2.Offset(, 1 - c2.Column).Value, Sheets("Database").Columns("A"), 0)     'rechercher ligne dans la feuille "database"
               If IsNumeric(r) Then     'trouvé
                    s1 = WorksheetFunction.TextJoin("|", 0, c2.Offset(, 1 - c2.Column).Resize(, 12))     'joindre les 12 cellules de "tableau de bord"
                    s2 = WorksheetFunction.TextJoin("|", 0, Sheets("Database").Cells(r, 1).Resize(, 12))     'joindre les 12 cellules de "database"
                    If StrComp(s1, s2, 1) = 0 Then
                         Sheets("Database").Cells(r, 13).Value = c2.Value     's'ils sont egal, coller la valeur
                   ' Else
                        ' MsgBox "il y a une différence" & vbLf & s1 & vbLf & s2, vbExclamation 'avertissement
                    End If
              'Else
                   ' MsgBox "erreur copie colonne M", vbExclamation, c2.Offset(, 1 - c2.Column)
               End If
          Next
     End If

j'ai désactivé:

' Else
                        ' MsgBox "il y a une différence" & vbLf & s1 & vbLf & s2, vbExclamation 'avertissement
                    End If
              'Else
                   ' MsgBox "erreur copie colonne M", vbExclamation, c2.Offset(, 1 - c2.Column)

cela fonctionne mieux.

Je n'ai pas assez de temps pour aller plus loin ce soir.

Laisse moi stp essayer de le résoudre , et si je suis dans la mouise j'espère que tu suivras mon post pour m'aider

Merci

Bonne soiré à tous

re, okay !

Bonjour le forum

Bonjour BsAlv

voilà ce que j'ai fait:

Set C1 = Intersect(Target, Me.Columns("M"))     'toutes les cellules modifiées en colonne M
     If Not C1 Is Nothing Then
          For Each c2 In C1.Cells     'boucler
               r = Application.Match(c2.Offset(, 1 - c2.Column).Value, Sheets("Database").Columns("A"), 0)     'rechercher ligne dans la feuille "database"
               If IsNumeric(r) Then     'trouvé
                    s1 = WorksheetFunction.TextJoin("|", 0, c2.Offset(, 1 - c2.Column).Resize(, 12))                          'joindre les 12 cellules de "tableau de bord"
                    s2 = WorksheetFunction.TextJoin("|", 0, Sheets("Database").Cells(r, 1).Resize(, 12))     'joindre les 12 cellules de "database"

                        'On fait une comparaison  sur les 2 feuilles
                        If StrComp(s1, s2, 1) = 0 Then

                         'S'ils sont egal, coller la valeur
                         Sheets("Database").Cells(r, 13).Value = c2.Value
                    Else
                         MsgBox "il y a une différence" & vbLf & s1 & vbLf & s2, vbExclamation 'avertissement
                    End If

                    Else
                         If c2.Offset(, 1 - c2.Column).Value <> c2.Value Then
                             MsgBox "erreur copie colonne M", vbExclamation, c2.Offset(, 1 - c2.Column).Value <> c2.Value
                             Exit Sub
                        End If
                  End If
          Next
     End If

Qu'en pensez-vous ?

A bientôt sur le forum

re,

c2 est la cellule ou une de ces cellules modifiée en colonne M.

c2.Offset(, 1 - c2.Column) est la cellule de la colonne A dans la même ligne et c'est le contenu de cette cellule qu'on rechercher dans la colonne A de la feuille "Database".

If c2.Offset(, 1 - c2.Column).value <> c2.value Then
      MsgBox "erreur copie colonne M", vbExclamation, c2.Offset(, 1 - c2.Column).value <> c2.value
      Exit Sub
End If

Cela est l' "else" de l' "If IsNumeric(r) Then ...", donc on n'a pas trouvé une cellule en "Database". Qu'est-ce qu'on fait, on compare la cellule de la colonne A (numéro ligne) avec la cellule de la colonne M (état), à mon avis une comparaison inutile, qui finira toujours avec ce msgbox.

Re le forum

Re BsAlv, oui je suis d'accord avec toi pour supprimer ces lignes

Else
                         MsgBox "il y a une différence" & vbLf & s1 & vbLf & s2, vbExclamation 'avertissement
                    End If

                    Else
                         If c2.Offset(, 1 - c2.Column).Value <> c2.Value Then
                             MsgBox "erreur copie colonne M", vbExclamation, c2.Offset(, 1 - c2.Column).Value <> c2.Value
                             Exit Sub

j'ai continué mon fichier sans ces lignes de code, et tous fonctionne comme je le désire.

De toute façon:

1- Chaque nouvelles entrées dans DataBase à un numéro de ligne unique.

2 - avec ton code:

 'On fait une comparaison  sur les 2 feuilles
                        If StrComp(s1, s2, 1) = 0 Then

                         'S'ils sont egal, coller la valeur
                         Sheets("Database").Cells(r, 13).Value = c2.Value

je pense que cela est bien cerné

Merci de ta précieuse aide.

Bonne soirée à tous

Bonsoir le Forum

Bonsoir BsAlv

Merci pour ton aide, cela fonctionne comme je voulais

Je passe le post en résolu

A bientôt sur le forum

Rechercher des sujets similaires à "numerotation ligne automatique"