LISTVIEW récupérer le numéro de colonne après un clic dans une cellule

Jackfly

XLDnaute Nouveau
Bonjour,

J'ai créé un listview de plusieurs lignes et colonnes (ex: 10 lignes et 4 colonnes).
Je souhaiterais pouvoir modifier des valeurs dans ce tableau en cliquant directement sur la cellule choisie.

Ainsi, si je clique sur la cellule de la 3ème ligne et 2ème colonne, j'arrive à récupérer le numéro de la ligne, mais pas celui de la colonne... ?

pour connaître le numéro de la ligne sur laquelle j'ai fait un clic :
ligne = ListView1.SelectedItem.Index
mais comment fait-on pour connaître le numéro de la colonne :
colonne = ???

et puis, je vais modifier la valeur de la cellule (ligne = 3, colonne = 2 ) :
With ListView1
.ListItems(ligne).ListSubItems(colonne).Text = nouvelle valeur de la cellule
End With

Comment obtenir ce numéro de colonne ?

Merci pour votre aide
 
Dernière édition:

jp14

XLDnaute Barbatruc
Re : LISTVIEW récupérer le numéro de colonne après un clic dans une cellule

Bonjour

Dans une listview on peut modifier uniquement les données de la première colonne.
Pour modifier les données des colonnes, il faut les transférer dans des textbox.

Ce problème à déjà été évoqué dans le forum

JP
 

CHALET53

XLDnaute Barbatruc
Re : LISTVIEW récupérer le numéro de colonne après un clic dans une cellule

Bonjour,

je pense que pour avoir l'info d'une colonne (sachant que la première est 0 :

.SelectedItem.ListSubItems(2).Text : en réalité donnera l'info de la colonne 3

Maintenant pour modifier, je ne sais pas si ça peut marcher : jp14 affirme que non

a+
 

Jackfly

XLDnaute Nouveau
Re : LISTVIEW récupérer le numéro de colonne après un clic dans une cellule

Bonjour

Dans une listview on peut modifier uniquement les données de la première colonne.
Pour modifier les données des colonnes, il faut les transférer dans des textbox.

Ce problème à déjà été évoqué dans le forum

JP

Euh... Je suis d'accord que pour modifier la 1ère colonne, il suffit de cliquer dessus et de taper le texte directement dans la cellule.
Maintenant, si je veux modifier une autre colonne, je peux sans problème aller modifier n'importe quelle donnée, mais à partir du moment où je connais la ligne et la colonne.
Cette modification est faite par :
ListItems(ligne).ListSubItems(colonne).Text = nouvelle valeur de la cellule
j'aurais aimé pouvoir modifier une cellule en cliquant dessus et en ayant un inputbox qui me demande la nouvelle valeur (sans que je sois obligé de mentionner le n° de la colonne)...

Pourquoi est-ce possible de récupérer le n° de la ligne sur laquelle on a cliqué et pas la colonne ?
Bizarre...

Personne ne voit comment faire ?
 
Dernière édition:

CHALET53

XLDnaute Barbatruc
Re : LISTVIEW récupérer le numéro de colonne après un clic dans une cellule

Peut-être : en cliquant sur l'entête de colonne (parce que si on clique sur la ligne, c'est toute la ligne qui est sélectionnée)
Début d'un programme que j'utilise : j'ai rajouté la variable a pour voir (par contre la 1ère colonne ne semble pas être 0 mais 1)

Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)

ListView1.Sorted = False
Stop
a = ColumnHeader.Index
 

Jackfly

XLDnaute Nouveau
Re : LISTVIEW récupérer le numéro de colonne après un clic dans une cellule

merci pour la piste... je vais expérimenter cela dans mon code...
Maintenant cela reviendrait à dire qu'il faut d'abord cliquer sur la colonne dans laquelle se trouve la cellule à modifier et puis sur la ligne.

A suivre...
 
G

Guest

Guest
Re : LISTVIEW récupérer le numéro de colonne après un clic dans une cellule

Bonjour à tous,

Voici un moyen de connaître le n° de colonne cliqué. (rajouter un label 'Label1' pour afficher le n° pendant les tests):

Code:
Private Sub ListView1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As stdole.OLE_XPOS_PIXELS, ByVal y As stdole.OLE_YPOS_PIXELS)
    Dim h As Integer
    With ListView1.ColumnHeaders
        For h = 1 To .Count
            If x >= .Item(h).Left Then
                If h < .Count Then
                    If x <= .Item(h + 1).Left Then
                        Label1 = "Colonne " & h
                        Exit For 'Pas la peine de continuer
                    Else
                        Label1 = "Colonne " & .Count
                        Exit For ' Idem
                    End If
                End If
            End If
        Next
    End With
End Sub

A+
 
Dernière modification par un modérateur:
G

Guest

Guest
Re : LISTVIEW récupérer le numéro de colonne après un clic dans une cellule

Re bonjour à tous,

Puisque j'ai un peu de temps voici une deuxième solution, un peu différente de celle donnée précédement:

Elle repose sur la création d'un tableau des positions des colonne dans la Sub Initialize du userFom.

Code:
Option Explicit
Dim TblPos() As Single ' A déclarer en tête de module
 
Private Sub ListView1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As stdole.OLE_XPOS_PIXELS, ByVal y As stdole.OLE_YPOS_PIXELS)
    Dim pos As Variant
    pos = Application.Match(x, TblPos, 1)
    If Not IsError(pos) Then Label1 = "colonne :" & pos
End Sub
 
Private Sub UserForm_Initialize()
    Dim c As Range
    ReDim TblPos(1 To 3)
    With ListView1
        .ColumnHeaders.Add 1, , "Texte": TblPos(1) = 0
        .ColumnHeaders.Add 2, , "Valeur": TblPos(2) = .ColumnHeaders(2).Left
        .ColumnHeaders.Add 3, , "Couleur": TblPos(3) = .ColumnHeaders(3).Left
        For Each c In Range("D3:D7")
            With .ListItems.Add(, c.Address, c.Text)
                .SubItems(1) = CStr(c.Offset(, 2))
                .SubItems(2) = CStr(c.Offset(, 3))
            End With
        Next c
    End With
End Sub

A+
 

Jackfly

XLDnaute Nouveau
Re : LISTVIEW récupérer le numéro de colonne après un clic dans une cellule

Oulllààà... !!!

Bonjour Hasco,

euh... waouw... ça c'est du code !. Bon, je ne comprends pas toutes les subtilités... je vais essayer de le mettre en place dans mon code... ouille, ouille, c'est la migraine assurée pour la journée, ça... ;o)

Merci pour ton temps et ta collaboration... Je te tiens au courant... dans qques jours ;o)
 

YANN-56

XLDnaute Barbatruc
Re : LISTVIEW récupérer le numéro de colonne après un clic dans une cellule

Bonjour Jackfly, jp14,CHALET, Hasco :), et à ceux qui passeront par ici,

Pour ce qui est de l'aide de Hasco, garde bien ses codes dans tes archives,
car même si tu ne piges pas tout en l'instant; c'est de sa part toujours de la taille "Au-dessus"
(C'est ce que je fais par étant certain qu'en étant plus grand, ces derniers me seront certainement très précieux!)

De mon coté, j'ai bidouillé un truc qui pourrait peut-être te servir.

Je suis passé outre moult simplifications pour éviter les codes abscons
Il n'y a donc là qu'une base d'étude à peaufiner, si cela te tente.

Amicalement.

Yann
 

Pièces jointes

  • COL_LISTVIEW.xls
    38 KB · Affichages: 299
  • COL_LISTVIEW.xls
    38 KB · Affichages: 304
  • COL_LISTVIEW.xls
    38 KB · Affichages: 317

Jackfly

XLDnaute Nouveau
Re : LISTVIEW récupérer le numéro de colonne après un clic dans une cellule

Bonjour Yann-56,

N'aies crainte, je garde bien précieusement le code de HASCO... dès fois que j'aurais envie de me taper une petite migraine ;o)
... non... blague à part, je garde tout ça bien au chaud et j'espère qu'un jour je serai assez "grand" pour comprendre tout ça ;o)

Sinon, ton "truc" me plaît bien... Je pense que je vais aller vers ce genre de code pour modifier mon listview... cela sera plus simple dans un premier temps. Je ne désespère pas d'y inclure le code d'Hasco ...plus tard...

Encore merci pour l'aide.

Jackfly
 

YANN-56

XLDnaute Barbatruc
Re : LISTVIEW récupérer le numéro de colonne après un clic dans une cellule

Bonjour Jackfly, et à ceux qui passeront par ici,

Je suis heureux que tu aies trouvé une réponse avec mon exemple.
De même; d'avoir écouté mon conseil relatif aux codes de Hasco.

La façon que j'ai montrée pour l'initialisation de la ListView n'est pas
la meilleure qu'il soit.
(Nous n'avons ici que 4 colonnes, mais arrivé à plus d'une dizaine; cela deviendrait fastidieux)

Il y aurait donc à revoir cette méthode, ainsi qu'une création dynamique des Labels et TextBoxes dans l'USF2... Sinon Bonjour le boulot en cas de modifications de la base de données.

Parallèlement il s'avèrerait nécessaire de paramétrer la saisie dans ces derniers.
(Format, caractères interdits... Et c.) en les mettant dans un groupe.

Je ne connais pas ton niveau, mais ceci pourrait te paraître beaucoup.

Qu'importe, dès que j'en trouve le temps, je construirais un autre exemple.
Ne serais-ce que pour rafraichir ma propre mémoire.
(Vu mon âge; c'est comme un contrôle technique! :))

Amicalement

Yann
 
G

Guest

Guest
Re : LISTVIEW récupérer le numéro de colonne après un clic dans une cellule

Bonjour,

Question initiale du demandeur à propos des numéros de colonne de listview:
Comment obtenir ce numéro de colonne ?

Je t'ai donné une solution qui est beaucoup plus simple qu'il n'y parait.
Elle met (dans userform initialize) la position des colonnes dans un tableau. Pour retrouver cette position au moment où la souris est relachée.

Si tu as des questions je suis tout disposé à y répondre.

A+
 

Jackfly

XLDnaute Nouveau
Re : LISTVIEW récupérer le numéro de colonne après un clic dans une cellule

Bonjour Hasco (et les autres qui liront ce post),

Je joins à ce message un fichier reprenant ton code... mais malgré tous mes "efforts" pour essayer d'y parvenir, je n'ai pas d'entête de colonne dans le listview et le "clic" reste sans effet... !?

J'essaie de comprendre ton code :

Dans l'initialisation du Userform (qui n'a pas l'air de se faire chez moi), tu crées 3 colonnes dans le listview et tu définis un tableau à 3 données (TBlpos) reprenant en valeur les entêtes des colonnes et tu déclales ces valeurs par le ".left" ??? -> là j'ai pas compris l'astuce ?
et je ne comprends pas non plus pq tu donnes "0" comme valeur à Tblpos(1) ?
Ensuite, tu remplis le listview avec les données contenues dans les cellules D3 à D7 + les 2 colonnes à droite de ces cellules.
Mais pour la valeur de pos... là ???... Tu utilises "stdole.OLE_XPOS_PIXELS" pour récupérer la valeur X de la souris après le clic ? C'est une "fonction" qui permet de récupérer la coordonnées "X" de la souris à un moment donné ?
Que veut dire le "1" dans Application.Match(x, TblPos, 1) ?

Maintenant, pourquoi mon listview ne se complète pas dans mon fichier ? (voir fichier joint).

Merci de bien vouloir éclairer un pauvre "ignare"... :confused: ;)
 

Pièces jointes

  • listview.xlsm
    25.7 KB · Affichages: 183
  • listview.xlsm
    25.7 KB · Affichages: 185
  • listview.xlsm
    25.7 KB · Affichages: 203
Dernière édition:

Bebere

XLDnaute Barbatruc
Re : LISTVIEW récupérer le numéro de colonne après un clic dans une cellule

bonjour Yann,Hasco,Jacky
lire lignes avec commentaires changer,ajouter

Private Sub UserForm_initialize()'changer
Dim c As Range
ReDim TblPos(1 To 3)
With ListView1
.ColumnHeaders.Clear
.ColumnHeaders.Add 1, , "Texte": TblPos(1) = 0
.ColumnHeaders.Add 2, , "Valeur": TblPos(2) = .ColumnHeaders(2).Left
.ColumnHeaders.Add 3, , "Couleur": TblPos(3) = .ColumnHeaders(3).Left
For Each c In Range("D3:D7")
With .ListItems.Add(, c.Address, c.Text)
.SubItems(1) = CStr(c.Offset(, 2))
.SubItems(2) = CStr(c.Offset(, 3))
End With
Next c

.View = lvwReport'ajouter
End With
End Sub

à bientôt
 

Discussions similaires

Statistiques des forums

Discussions
312 329
Messages
2 087 325
Membres
103 516
dernier inscrit
René Rivoli Monin