Microsoft 365 Ajouter dans TS en fonction valeur de cellule

eric72

XLDnaute Accro
Bonjour à tous,
Je rencontre un problème pour ajouter une ligne dans un TS dont le nom est dans une cellule, je m'explique:
- J'ai un onglet base, en a1 une valeur, exemple "Production"
- On retrouve cette valeur dans l'onglet "Données" avec une correspondance "Abrégé"
- J'aimerais ajouter les infos Nom Prénom de "Base" dans le tableau dont le nom est l'abrégé de "A1" Production, mais je ne parviens pas à déterminer le nom du tableau à partir de ma cellule A1
Je m'en remets donc une nouvelle fois à votre savoir.
Merci beaucoup pour votre aide.
Eric
 

Pièces jointes

  • test.xlsm
    27.6 KB · Affichages: 4
Solution
bonjour

essaie ceci
VB:
Sub test()
    Dim NomTab, Nom, Prénom As String
    Dim SheetsName As String
    Dim LastLine As Long
    
    With Sheets("Base") 'on récupère les infos
        NomTab = .Range("A1") 'c'est aussi le nom de la feuille qui contient le tableau du meme nom
        Nom = .Range("A4")
        Prénom = .Range("B4")
    End With
    
    
    NomTabAbrégé = Application.WorksheetFunction.XLookup(Feuil1.Range("A1"), Feuil4.Range("TbService[Service]"), Feuil4.Range("TbService[Abrégé]"))
    With Sheets(NomTabAbrégé).listobjects(1)
        .ListRows.Add
        LastLine = .ListRows.Count
        .DataBodyRange(LastLine, 1) = Nom
        .DataBodyRange(LastLine, 2) = Prénom
    End With
End Sub

vgendron

XLDnaute Barbatruc
bonjour

essaie ceci
VB:
Sub test()
    Dim NomTab, Nom, Prénom As String
    Dim SheetsName As String
    Dim LastLine As Long
    
    With Sheets("Base") 'on récupère les infos
        NomTab = .Range("A1") 'c'est aussi le nom de la feuille qui contient le tableau du meme nom
        Nom = .Range("A4")
        Prénom = .Range("B4")
    End With
    
    
    NomTabAbrégé = Application.WorksheetFunction.XLookup(Feuil1.Range("A1"), Feuil4.Range("TbService[Service]"), Feuil4.Range("TbService[Abrégé]"))
    With Sheets(NomTabAbrégé).listobjects(1)
        .ListRows.Add
        LastLine = .ListRows.Count
        .DataBodyRange(LastLine, 1) = Nom
        .DataBodyRange(LastLine, 2) = Prénom
    End With
End Sub
 

eric72

XLDnaute Accro
bonjour

essaie ceci
VB:
Sub test()
    Dim NomTab, Nom, Prénom As String
    Dim SheetsName As String
    Dim LastLine As Long
   
    With Sheets("Base") 'on récupère les infos
        NomTab = .Range("A1") 'c'est aussi le nom de la feuille qui contient le tableau du meme nom
        Nom = .Range("A4")
        Prénom = .Range("B4")
    End With
   
   
    NomTabAbrégé = Application.WorksheetFunction.XLookup(Feuil1.Range("A1"), Feuil4.Range("TbService[Service]"), Feuil4.Range("TbService[Abrégé]"))
    With Sheets(NomTabAbrégé).listobjects(1)
        .ListRows.Add
        LastLine = .ListRows.Count
        .DataBodyRange(LastLine, 1) = Nom
        .DataBodyRange(LastLine, 2) = Prénom
    End With
End Sub
Bonjour vgendron,
Merci pour ta réponse, je vois que tu tiens compte du nom de la feuille, alors que moi j'essayais avec le nom du tableau, ça fonctionne et c'est bien le principal.
Merci beaucoup encore une fois.
 

vgendron

XLDnaute Barbatruc
pour tenir compte du nom du tableau,
il suffit de remplacer "ListObjects(1)" par "ListObjects(NomTabAbrégé")
mais.. j'ai pas essayé.. je crois que dans ce cas, il faut aussi préciser le nom de la feuille qui contient le tableau
j'aurais pu écrire directement
Sheets(NomTabAbrégé).listobjects(NomTabAbrégé)

ListbObjects(1) prend le 1er tableau de la feuille....donc..s'il y en a plusieurs...
 

eric72

XLDnaute Accro
pour tenir compte du nom du tableau,
il suffit de remplacer "ListObjects(1)" par "ListObjects(NomTabAbrégé")
mais.. j'ai pas essayé.. je crois que dans ce cas, il faut aussi préciser le nom de la feuille qui contient le tableau
j'aurais pu écrire directement
Sheets(NomTabAbrégé).listobjects(NomTabAbrégé)

ListbObjects(1) prend le 1er tableau de la feuille....donc..s'il y en a plusieurs...
Le seul petit hic est que quand le tableau est vide ça ajoute à la deuxième ligne plutôt que la 1ère!!!
Désolé
 

vgendron

XLDnaute Barbatruc
Le seul petit hic est que quand le tableau est vide ça ajoute à la deuxième ligne plutôt que la 1ère!!!
Désolé
il faut le vider avant..
sélectionnes toutes les lignes du tableau SAUF la ligne d'entete
clic droit
supprimer les lignes

==>visuellement tu vas "voir" une ligne de données vide, mais dans les faits.. VBA voit une table SANS ligne de données
==> listrows.count=0
Listrows.add ajoute une ligne==> visuellement, tu vois la meme chose que toute à l'heure, mais maintenant VBA voit une ligne de données vide
 

eric72

XLDnaute Accro
il faut le vider avant..
sélectionnes toutes les lignes du tableau SAUF la ligne d'entete
clic droit
supprimer les lignes

==>visuellement tu vas "voir" une ligne de données vide, mais dans les faits.. VBA voit une table SANS ligne de données
==> listrows.count=0
Listrows.add ajoute une ligne==> visuellement, tu vois la meme chose que toute à l'heure, mais maintenant VBA voit une ligne de données vide
Re bonjour vgendron,
Sans vouloir abuser , j'aimerais éviter que si le nom existe déjà, on ajoute une ligne, j'ai donc mis ce code mais bien évidemment cela ne fonctionne pas:

VB:
Sub test()
    Dim NomTab, Nom, Prénom As String
    Dim SheetsName As String
    Dim LastLine As Long
    
    With Sheets("Base") 'on récupère les infos
        NomTab = .Range("A1") 'c'est aussi le nom de la feuille qui contient le tableau du meme nom
        Nom = .Range("A4")
        Prénom = .Range("B4")
    End With
    
    
    
    NomTabAbrégé = Application.WorksheetFunction.XLookup(Feuil1.Range("A1"), Feuil4.Range("TbService[Service]"), Feuil4.Range("TbService[Abrégé]"))
  [B]  Dim i As Variant
         i = Application.Match(Nom, Sheets(NomTabAbrégé).listobjects(1), 0)
        If IsError(i) Then Exit Sub[/B]

    
    With Sheets(NomTabAbrégé).listobjects(1)
        .ListRows.Add
        LastLine = .ListRows.Count
        .DataBodyRange(LastLine, 1) = Nom
        .DataBodyRange(LastLine, 2) = Prénom
    End With
End Sub
Je suppose qu'il faut préciser la colonne mais je ne vois pas comment faire!!!
Désolé et merci encore.
 

eric72

XLDnaute Accro
il faut le vider avant..
sélectionnes toutes les lignes du tableau SAUF la ligne d'entete
clic droit
supprimer les lignes

==>visuellement tu vas "voir" une ligne de données vide, mais dans les faits.. VBA voit une table SANS ligne de données
==> listrows.count=0
Listrows.add ajoute une ligne==> visuellement, tu vois la meme chose que toute à l'heure, mais maintenant VBA voit une ligne de données vide
Je peux aussi faire comme ça, pas l'idéal mais ça marche
VB:
 i = Application.Match(Nom, Sheets(NomTabAbrégé).Range("a:a"), 0)
;)
 

vgendron

XLDnaute Barbatruc
essaie avec ca:
i = Application.Match(Nom, Sheets(NomTabAbrégé).listobjects(1).listcolumns(1), 0)

et un peu de lecture qui peut aider
 

Discussions similaires

Réponses
14
Affichages
341

Statistiques des forums

Discussions
314 422
Messages
2 109 447
Membres
110 482
dernier inscrit
ilyxxxh