Microsoft 365 écrire dans une cellule d'un tableau Listobject

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

thenesol

XLDnaute Junior
bonjour à tous

j'ai du mal à me dépatouiller dans la syntaxe VBA;
quand on lit la doc, c'est très clair, mais quand on y va c'est jamais bon...

j'essaie d'adresser et écrire "9999" dans une cellule d'un tableau, dont une colonne a pour nom [Ref_op]

comment écrire en passant en paramètre le nom de la colonne ?

Dim lo As ListObject, lr As ListRow, lRow As Long
Set lo = ActiveCell.ListObject
lRow = ActiveCell.row - lo.HeaderRowRange.row
Set lr = lo.ListRows(lRow)
lo.ListRow.Range(lRow, [Ref_op]) = 9999

ne marche (évidemment...) pas

pas plus que
Range(lr, [Ref_op]) = 9999

ou n'importe quoi d'autre !
🙁
 
Dernière édition:
Bonjour.
Avec ce que vous avez préparé je dirais :
VB:
Intersect(lo.ListColumns("Ref_op").Range, lr.Range).Value = 9999
Curieux, c'est un peu rare qu'on ait besoin de renseigner une seule cellule dans un tableau Excel. Renseigner toute la ligne selon un tableau VBA d'une ligne est considérablement plus simple, au point que je me demande presque si je ne préfèrerais pas charger la ligne, modifier l'élément du tableau, puis l'y renvoyer !
Pour plus d'une colonne, même seulement 2, c'est sûr, c'est comme ça que je ferais.
 
merci !
2 petites questions en retour

- pourquoi passer par cet "intersect" (que je savais même pas qu'il existait)?
une forme "range(ligne , colonne)" n'est pas possible ?

- je ne comprends pas bien le truc de charger puis renvoyer toute la ligne : comment cela s'écrirait il, et pourquoi serait ce plus simple ?

merci encore.
 
Si je connaissait le nom du tableau j'aurais plus simple pour exprimer lo.ListColums.("Ref_op").Range, mais comme je ne le connais pas … À moins de prendre Evaluate(lo.Name & "[Ref_op]") ce qui n'est guère plus court.
Sinon peut être :
Code:
lo.DatabodyRange(lRow, lo.ListColumns("Ref_op").Index) = 9999
Ou tout simplement
VB:
lo.ListColums.("Ref_op").DataBodyRange.Rows(lRow).Value = 9999
En utilisant un Tableau des Valeurs de la Ligne :
VB:
Dim TVL()
TVL = lr.Range.Value
TVL(1, lo.ListColums.("Ref_op").Index) = 9999
lr.Range.Value = TVL
 
Dernière édition:
Bonsoir thenesol, Bernard,

Cette macro fonctionne même s'il y a plusieurs tableaux structurés dans la feuille :
VB:
Sub Ecrire()
Dim entete$, valeur, LO As ListObject, col As Variant
entete = "Ref_op"
valeur = 9999 'à adapter
For Each LO In ActiveSheet.ListObjects
    With LO.Range
        If Not Intersect(ActiveCell, .Cells) Is Nothing Then
            col = Application.Match(entete, .Rows(1), 0)
            If ActiveCell.Row > .Row And IsNumeric(col) Then _
                Intersect(ActiveCell.EntireRow, .Columns(col)) = valeur
            Exit For
        End If
    End With
Next
End Sub
A+
 
ça traite une seule cellule ou toute une plage ?
J'ai répondu au post #1 qui traite la cellule active.

Mais si vous voulez traiter toute la plage sélectionnée exécutez :
VB:
Sub EcrireDansPlage()
Dim entete$, valeur, LO As ListObject, P As Range, col As Variant
entete = "Ref_op"
valeur = 9999 'à adapter
ActiveCell.Activate 'au cas où la sélection n'est pas un Range
For Each LO In ActiveSheet.ListObjects
    With LO.Range
        Set P = Intersect(Selection, .Cells)
        If Not P Is Nothing Then
            col = Application.Match(entete, .Rows(1), 0)
            If IsNumeric(col) Then
                Intersect(P.EntireRow, .Columns(col)) = valeur
                .Cells(1, col) = entete
            End If
        End If
    End With
Next
End Sub
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
3
Affichages
518
Réponses
8
Affichages
818
Retour