Valeur maximale d'une colonne dynamique

Bonjour,

J'ai une colonne A qui doit s'incrémenter de 1 à chaque fois qu'un clic sur un bouton 'Ajouter une ligne' est fait. Lorsque le clic est réalisé une nouvelle ligne à la fin du tableau (qui contient aussi une ligne totale ici ligne 11 qui va donc aussi être modifiée et s'incrémentée de 1) doit être ajoutée. Je suis nouveau en vba et en macro.

image

Pourriez-vous m'aider à réaliser cela s'il vous plaît?

Merci pour votre aide

Bonjour,

est-ce que le tableau dont tu parles est bien un tableau structuré excel ?

mets un fichier plutôt qu'une image, merci

Il s'agit d'un tableau structuré affichant des données par le biais de formules et de liste basées sur des tableaux d'autres feuilles. Ma feuille est celle où je souhaite ajouter les nouvelles lignes grâce au bouton "Add a new country"

J'ai intégré le numéro de ligne das le tableau avec une formule

Ensuite

Sub AjoutLigne()

    With ActiveSheet.ListObjects("Table6")
        ligne = .ListRows.Count + .HeaderRowRange.Row + 2
        Rows(ligne).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        .ListRows.Add
        .DataBodyRange.Cells(.ListRows.Count, 2).Select
    End With

End Sub

Merci :-)

Est-il également possible dans la fonction de pré-remplir les cellules: pour la 1ère colonne mettre 27 (valeur ligne précédente (26)+1= 27)?

C'est déjà fait !

J'ai intégré le numéro de ligne dans le tableau avec une formule

Merci beaucoup c'est parfait.

J'ai une dernière demande. Pourriez-vous m'aider à modifier cette fonction pour que dans la colonne B s'ajoute une liste déroulante avec la liste des pays d'origine (visible dans la feuille Countries) lors de l'ajout de la ligne. Je sais créer une liste déroulante via un tableau mais pas en VBA :-(

Merci d'avance

Je pense avoir trouvé la solution avec la mise à jour suivante:

    With ActiveSheet.ListObjects("Table6")
        ligne = .ListRows.Count + .HeaderRowRange.Row + 2
        Rows(ligne).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        .ListRows.Add
        .DataBodyRange.Cells(.ListRows.Count, 2).Select
    End With

    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=INDIRECT(""arrayDepartureCountries[COUNTRIES]"")"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With

Merci beaucoup c'est parfait.

J'ai une dernière demande. Pourriez-vous m'aider à modifier cette fonction pour que dans la colonne B s'ajoute une liste déroulante avec la liste des pays d'origine (visible dans la feuille Countries) lors de l'ajout de la ligne. Je sais créer une liste déroulante via un tableau mais pas en VBA :-(

Merci d'avance

justement, j'y pensais, mais tant qu'à faire, il vaudrait mieux la reconstruire non pas à partir d'une copie des en-têtes de lignes et colonnes du TCD mais à partir de la base de données; cela évite les (vide) et totaux ... je vais regarder cela ! mais cela ne remet pas en cause ta solution.

J'ai ajouté

UpdateCountries
Sub UpdateCountries()
Dim dico1 As Object, dico6 As Object

    tbl = Sheets("Travel Expenses Detail").Range("B4").CurrentRegion
    Set dico1 = CreateObject("Scripting.Dictionary")
    Set dico6 = CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(tbl)
        dico1(tbl(i, 1)) = ""
        dico6(tbl(i, 6)) = ""
    Next

    With Sheets("Countries")
        If Not .ListObjects(1).DataBodyRange Is Nothing Then .ListObjects(1).DataBodyRange.Delete
        country = dico6.keys
        QuickSort country
        .Range("A4").Resize(UBound(country), 1) = Application.Transpose(country)

        If Not .ListObjects(2).DataBodyRange Is Nothing Then .ListObjects(2).DataBodyRange.Delete
        country = dico1.keys
        QuickSort country
        .Range("C4").Resize(UBound(country), 1) = Application.Transpose(country)
    End With

End Sub

Public Sub QuickSort(vArray As Variant, _
  Optional ByVal inLow As Long = -1, _
  Optional ByVal inHi As Long = -1)
  Dim pivot   As Variant
  Dim tmpSwap As Variant
  Dim tmpLow  As Long
  Dim tmpHi   As Long
  inLow = IIf(inLow = -1, LBound(vArray), inLow)
  inHi = IIf(inHi = -1, UBound(vArray), inHi)
  tmpLow = inLow
  tmpHi = inHi
  pivot = vArray((inLow + inHi) \ 2)
  While (tmpLow <= tmpHi)
     While (vArray(tmpLow) < pivot And tmpLow < inHi)
        tmpLow = tmpLow + 1
     Wend
     While (pivot < vArray(tmpHi) And tmpHi > inLow)
        tmpHi = tmpHi - 1
     Wend
     If (tmpLow <= tmpHi) Then
        tmpSwap = vArray(tmpLow)
        vArray(tmpLow) = vArray(tmpHi)
        vArray(tmpHi) = tmpSwap
        tmpLow = tmpLow + 1
        tmpHi = tmpHi - 1
     End If
  Wend
  If (inLow < tmpHi) Then QuickSort vArray, inLow, tmpHi
  If (tmpLow < inHi) Then QuickSort vArray, tmpLow, inHi
End Sub

et ajouté après le rafraîchissement du TCD

Cette partie ci que j'ai reprise n'est pas tout à fait indispensable dès lors que toute la colonne est déclarée en validation de données à partir du tableau.

    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=INDIRECT(""arrayDepartureCountries[Departure Country]"")"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With

En effet, une nouvelle ligne hérite des propriétés des précédentes.

Rechercher des sujets similaires à "valeur maximale colonne dynamique"