Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

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:

Dranreb

XLDnaute Barbatruc
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.
 

thenesol

XLDnaute Junior
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.
 

Dranreb

XLDnaute Barbatruc
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:

job75

XLDnaute Barbatruc
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+
 

job75

XLDnaute Barbatruc
ç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
 

Discussions similaires

Réponses
1
Affichages
259
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…