Code pour alimenter tableau avec userform
Bonjour à tous,
Je suis nouvelle sur le site et je suis en train de me former au VBA. Je souhaite mettre en application ce que j'ai pu déjà voir mais je suis déjà face à un problème.
J'ai crée un formulaire (une userform) pour faire plusieurs choses et je bute sur la première qui me paraissait facile pourtant. En cliquant sur le bouton "Nouvelle action" je voudrais (entre autres) alimenter un tableau dans une feuille. J'ai essayé plusieurs choses :
Private Sub CommandButton1_Click()
BdD.Range("B" & LigneDispo("B", BdD)).Value = BdD.Range("B" & LigneDispo("B", BdD) - 1).Value + 1
BdD.Range("C" & LigneDispo("C", BdD)).Value = Combo_Themes
BdD.Range("d" & LigneDispo("d", BdD)).Value = TB_Sources
BdD.Range("f" & LigneDispo("f", BdD)).Value = Combo_Unites
BdD.Range("g" & LigneDispo("g", BdD)).Value = Combo_Risques
BdD.Range("h" & LigneDispo("h", BdD)).Value = TB_Problematiques
BdD.Range("i" & LigneDispo("i", BdD)).Value = TB_Actions
BdD.Range("l" & LigneDispo("l", BdD)).Value = Combo_Pilotes
End Subet ça
Private Sub CommandButton1_Click()
Dim numero_a_incrementer As Integer
numero_a_incrementer = BdD.Range("B" & LigneDispo("B", BdD)).Value
numero_a_incrementer = numero_a_incrementer + 1
BdD.Range("b" & LigneDispo("b", BdD)).Value = numero_a_incrementer
BdD.Range("C" & LigneDispo("C", BdD)).Value = Combo_Themes
BdD.Range("d" & LigneDispo("d", BdD)).Value = TB_Sources
BdD.Range("f" & LigneDispo("f", BdD)).Value = Combo_Unites
BdD.Range("g" & LigneDispo("g", BdD)).Value = Combo_Risques
BdD.Range("h" & LigneDispo("h", BdD)).Value = TB_Problematiques
BdD.Range("i" & LigneDispo("i", BdD)).Value = TB_Actions
BdD.Range("l" & LigneDispo("l", BdD)).Value = Combo_Pilotes
End SubLe but est de créer sur la colonne B un numéro qui s'incrémente automatiquement et de renseigner tout le reste dans les autres colonnes. Mais j'ai toujours le même résultat. Il y a une ligne vide et ensuite une ligne avec un nouveau numéro pour chaque donnée
J'avoue que je ne sais plus
Merci d'avance pour votre aide
Edit modo : placé codes entre balises
Bonjour et bienvenue sur le forum,
Si vous pouviez partager le fichier en question ce serait pratique. Notamment parce qu'on ne sait pas ce que fait votre code fonction "LigneDispo" qui semble être la source du problème justement.
En attendant, un conseil, vous pouvez insérer la ligne en 1 étape en utilisant un objet "Array".
Quelque chose comme :
Sub Exemple()
Dim BDD As ListObject
Set BDD = ActiveSheet.ListObjects(1)
With BDD.ListRows.Add
.Range.Value = Array(1, 2, 3)
End With
End SubBonjour et bienvenue
Pensez à utiliser les balises de code lorsque vous postez un code sur le forum en utilisant l'icone </> disponible dans la barre de menu et en collant votre code dans la fenêtre.
J'ai corrigé pour que vous voyiez.
Pour votre demande, sans fichier ce n'est pas facile. Vu que votre tableau semble être au format structuré, voyez déjà des explications dans ce fil réalisé par Thev ->https://forum.excel-pratique.com/s/goto/1096785 et le lien proposé par Pedro22 --> https://www.excel-pratique.com/fr/astuces/tableau-structure
Crdlt
edit : oups désolé Saboh, nos courriers se sont croisés
bonjour K_Rine
Private Sub CommandButton1_Click()
'en supposant que la colonne A est aussi dans le TS !!!!
With BdD.ListRows.Add.Range 'vous ajoutez une ligne au TS "BdD" et vous prenez cette plage
If .ListRows.Count >= 2 Then 'au min 2 listrows
With .range("B1")
.Value = .Offset(-1).Value + 1 'ajouter 1 au précédent
End With
End If
.Range("C1").Resize(, 2).Value = Array(Combo_Themes, TB_Sources) 'vous ajoutez ces 2 valeurs
.Range("G1").Resize(, 4).Value = Array(Combo_Unites, Combo_Risques, TB_Problematiques, TB_Actions, Combo_Pilotes) 'vous ajoutez ces 4 valeurs
End With
End SubEDIT : je n'avais pas vu les postes de Dan et de Saboh12617
Waouh, je ne pensais pas que les réponses seraient si rapides
Merci beaucoup,
Merci pour l'astuce pour les lignes de code, je vais tâcher de m'en souvenir
Je vais regarder tout ça après la pause dej et si je vois que je n'y arrive pas, je préparerai le fichier à envoyer (il faut que je le nettoie un peu des données actuelles)
Bon appétit, à tout à l'heure
Me revoilà !
Alors en voulant préparer mon fichier j'ai compris quelques petites choses.
Tout d'abord, il faut dire que je suis partie d'un fichier existant avec un tableau structuré (effectivement) déjà renseigné. J'avais mis ce format tableau pour pouvoir faire un TCD et des indicateurs ensuite. En voulant enlever toutes les lignes déjà renseignées, et en réessayant ma macro avec des données "test", j'ai vu que ça fonctionnait très bien. En fait, ça renseigne une "plage" en dessous de mon tableau. J'ai compris en allant sur les liens des réponses, qu'il y a la notion d'Array qui est un peu trop poussée pour moi.
Alors je réfléchis encore ; soit je reste simple : je reste avec mon code simple qui remplit une plage et j'oublie le tableau structuré et le TCD qui va avec, soit je garde le tableau structuré et ça complique un peu mon code que je ne maîtrise pas. Je vais prendre le temps de lire les liens, de creuser un peu mais dans un premier temps je vais essayer de faire simple
Je vous joins donc le fichier "test" en question.
Est-ce que ma réflexion est juste déjà ?
Bonjour,
Ci-après votre code en utilisant le tableau structuré (listobject en VBA).
Alors tout d'abord pour répondre à vos questions vous avez vu juste, votre code n'utilisait pas le tableau structuré.
Mais pour répondre à vos interrogations, ne prenez pas peur : L'Array et le ListObject ne sont pas compliqués et sont vraiment là pour vous aider en réalité. Voyons comment :
Array c'est simplement le nom d'un "tableau" ou d'une "liste" en VBA. C'est comme une boite dans laquelle on va lister nos valeurs. Ca permet d'écrire sur toute une plage de cellules d'un coup, au lieu des cellules 1 par 1. C'est donc très utile pour remplir une ligne de notre tableau. Il n'y a pas grand-chose à comprendre, simplement dans le cas présent on sépare chaque valeur (chaque "colonne" de la nouvelle ligne) par une virgule ",".
Ensuite le tableau structuré est très utile car il a une fonction pour insérer une nouvelle ligne (et écrire des choses dedans). Comme ça on n'a pas besoin de se préoccuper de numéro de ligne, de offset etc. On ajoute une ligne dans le tableau et Excel va s'occuper de décaler les cellules pour nous. L'ajout de ligne se fait avec ListObject.ListRows.Add, et on utilise un With car Add renvoie la nouvelle ligne créée, et donc on peut récupérer sa plage (.Range) et écrire ses valeurs (.Value) d'un coup, avec l'array donc.
Et dans l'array, on met simplement les informations de l'userform comme vous le faisiez.
Private Sub CommandButton1_Click()
With BdD.ListObjects(1).ListRows.Add
.Range.Value = Array( _
.Index, _
Combo_Themes.Value, _
TB_Sources.Value, _
Combo_Unites.Value, _
Combo_Risques.Value, _
TB_Problematiques.Value, _
TB_Actions.Value, _
Combo_Pilotes.Value _
)
End With
Billet_Action.Range("c8").Value = Combo_Pilotes.Value
Billet_Action.Range("B12").Value = TB_Actions.Value
End SubRemarquez : j'ai utilisé ListRow.Index property (Excel) | Microsoft Learn pour définir l'ID. En fait ça renvoie le numéro de ligne (dans le tableau, pas la feuille) tout simplement. Si vous préférez, vous pouvez changer pour reprendre votre calcul.
re,
voici votre fichier
Je pense que vos2 premières lignes étaient hors du tableau structuré, voire votre cellule Z6, ce symbole à droit&en bas montre la dernière cellule du TS
EDIT : salut Saboh12617, je l'ai fait sans "array"
Merci à tous pour vos réponses
Merci à @saboh12617 pour les explications sur les Array. J'ai un peu mieux compris le principe, sur le papier. Maintenant dans la pratique, il faut que je creuse un peu plus.
Du coup, la solution de @BsAlv marche parfaitement bien.
En fait, si je résume, tout vient du mix entre tableau structuré et VBA et il faut donc que je creuse le lien entre les deux dont le listobject, array....
Merci pour tout
Bonjour,
Non pas que je ne voulais plus vous répondre mais vu que d'autres se sont chargés, je ne suis pas intervenu sur votre fichier.
Regardez les liens que je vous ai donnés, cela vous aidera dans la compréhension.
Vous pouvez utiliser aussi la recherche sur le forum en tapant par exemple Listobject. Vous trouverez pas mal de sujets et codes qui vous permettront de voir comment cela fonctionne
Cordialement
Merci Dan, effectivement j'ai parcouru les liens et c'était très intéressant.
Je vais poursuivre dans ce sens
Merci pour votre retour, content d'aider. Bonne fin de journée
Salut @Dan, @BsAlv, au plaisir