Automatiser le remplissage d'un tableau d'un autre onglet
Bonjour,
Je gère l'attribution de N° pour des réunions.
J'essaye de m'autoformer au Vba mais j'avoue patauger sévère dans la réalisation de mon projet entre les "La méthode Copy de la classe Range a échoué" lorsque je demande la copie sur les cases de la première ligne vide en bas de mon tableau ou pour comprendre les liens entre le nom des fonctions et l'action qu'elles déclenchent.
Je me suis créer un fichier Excel, voir fichier joint, de création du N° et de suivi (Annulation et réception des états de présence).
Je souhaite pouvoir saisir les infos dans l'onglet "Dernier N° attribué" dans les cases B7:B16 et cliquer sur le bouton "Générer le N° de réunion" pour que les données soient copiées (avec transposition ? puisque les données sont stockées en lignes) dans l'Onglet "Tableau création N°" dans les bonnes cases évidemment ;-) ce qui permet l'apparition du N° dans la case de la colonne "C" dans "Tableau création N°" et dans la case "B1" de l'onglet "Dernier N° attribué".
Pour ce faire j'ai créer une macro (DemandeNuméroRéunion) avec la recherche au préalable de la première ligne "Non vide" afin que cette insertion se fasse à chaque fois sur la dernière ligne de mon tableau d'où le "Rows.Count" si j'ai bien compris mais je suis pas sur...et dans laquelle je souhaitais insérer une ligne par case à copier qui aurait eu la syntaxe suivante :
"Sheets("Derniers N° attribués").Range("b7").Copy Sheets("Tableau création N°").Range("A" & Rows.Count).End(xlUp).Row + 1"
mais je me retrouve avec une MsgBox qui, lorsque j'appuie sur F5 pour actualiser/exécuter la macro, me dit :
"Erreur d'exécution '1004': La méthode Copy de la classe Range a échoué".
Sachant que je teste la macro avec une seule ligne pour le moment justement pour voir si ma saisie est bonne et si je peux la dupliquer pour les autres cases ensuite, j'ai vraiment le sentiment de ne pas être très doué et de ne pas savoir quand je sortirai de cette auberge !
Quelqu'un peut il m'aider à rédiger la macro s'il vous plait car ça fait 2 jours que je suis dessus avec différentes rédaction et aucune ne marche ?
D'avance merci du temps que vous voudrez bien y passer
Bonjour et
Vous devriez commencer par vous documenter un peu et lire ceci
https://forum.excel-pratique.com/astuces/tableau-structure-instructions-vba-specifiques-a-cet-objet-...
A+
Merci pour l'info, je viens de regarder tout ça.
mais je n'arrive pas à en déduire comment rédiger pour que les données saisies s'incrémentent toujours sur la première ligne vide en fin de tableau, ce qui augmentera la taille du tableau de facto.
@+
Bonjour KylPax, BrunoM45
A tester...
Code du bouton:
Private Sub CommandButton1_Click()
Dim sh As Worksheet, ws As Worksheet, last_Row As Integer
Set sh = Sheets("Tableau création N°") 'définit sh
Set ws = Sheets("Derniers N° attribués") 'définit ws
'agit sur le tableau "Tableau1" de la feuille sh
With sh.ListObjects("Tableau1")
'définit la dernière ligne
If .ListRows.Count = 0 Then 'si aucune donnée dans le tableau
.ListRows.Add: last_Row = 1 'insérer à la première ligne
Else: 'sinon
.ListRows.Add: last_Row = .ListRows.Count 'insérer à la dernière ligne
End If
'écrit sur les données dans le tableau
With .DataBodyRange
.Item(last_Row, 1) = ws.Range("B7") 'date
.Item(last_Row, 3) = ws.Range("B1") 'n°
.Item(last_Row, 4) = ws.Range("B8") 'type
.Item(last_Row, 5) = ws.Range("B9") 'service déconcentré
.Item(last_Row, 6) = ws.Range("B10") 'service organisateur
.Item(last_Row, 7) = ws.Range("B11") 'demandeur
.Item(last_Row, 8) = ws.Range("B12") 'objet de la réunion
.Item(last_Row, 9) = ws.Range("B13") 'date
.Item(last_Row, 10) = ws.Range("B14") 'horaires
.Item(last_Row, 11) = ws.Range("B15") 'lieu
.Item(last_Row, 12) = ws.Range("B16") 'nb participants
End With
End With
MsgBox "Réunion enregistrée", vbInformation
ws.Range("B7:B16").ClearContents 'efface le formulaire
End SubCordialement,
Merci beaucoup, je teste ça !
Parfait merci beaucoup tout s'insère à la fin comme il faut.
Il me reste plus qu'à trouver pourquoi la formule de la colonne B ne se réplique pas automatiquement et je serai bon.
Encore merci !