Aide Macro pour remplir une base d'un formulaire
Bonjour tout le monde,
j'ai réalisé une macro pour remplir un tableau / base de données avec un formulaire. Sauf que ça me rajoute bien une ligne après chaque ajout, mais ça me remplace les ajouts précédents par le même enregistrement. Est ce que quelqu'un aurait une idée du problème ?
Merci d'avance.
Elfa.
Bonsoir,
reprenons depuis le début : Plus qu'une image de code, un copier/coller de ce dernier sur le site avec la balise </> serait la bienvenue.
Ensuite si le fichier anonymisé été fourni avec ce serait encore mieux !
Je ne vous parle même pas du nombre de réponses que vous allez recevoir une fois ceci fait !
Ce qui est dommage en plus dans votre approche c'est que votre code parle de b7 b8 b9 mais la photo du tableau les entêtes de colonnes et de ligne sont tronquées !
Ensuite votre macro faites par enregistreur me pique les yeux et pourtant je ne suis pas un "grand" du codage...
Aller un petit effort et vous verrez vous serez récompenser !
@ bientôt
LouReeD
Je m'améliore :
Sub Macro3()
'
' Macro3 Macro
'
'
Range("B3").Select
Selection.Copy
Range("B3,B5").Select
Range("B5").Activate
Application.CutCopyMode = False
Selection.Copy
Range("B3,B5,B7").Select
Range("B7").Activate
Application.CutCopyMode = False
Selection.Copy
Range("B3,B5,B7,B9").Select
Range("B9").Activate
Application.CutCopyMode = False
Selection.Copy
Sheets("Feuil2").Select
Range("Tableau3[Nom]").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=True
Rows("2:2").Select
Application.CutCopyMode = False
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Sheets("Saisie").Select
Range("B3").Select
Selection.ClearContents
Range("B5").Select
Selection.ClearContents
Range("B7").Select
Selection.ClearContents
Range("B9").Select
Selection.ClearContents
End SubEt du coup, si la macro faites par enregistreur pique les yeux, je n'ose imaginer ce que vous allez penser du pseudo formulaire qui va avec! :)
Bonsoir,
Proposition d'un code :
Sub Remplissage()
' on dimensionne une variable Tableau structuré
Dim MonTab As ListObject
' on dimensionne une variable Ligne de tableau structuré
Dim lRow As ListRow
' on attribue à la variable tableau le premier tableau de la deuxième feuille du classeur
Set MonTab = Sheets(2).ListObjects(1)
' avec ce tableau
With MonTab
' on attribue à la variable ligne, la ligne "nouvelle ligne" que l'on crée
Set lRow = .ListRows.Add()
' avec cette ligne
With lRow
' on crée une boucle de 1 à 4 pour remplir les 4 colonnes avec les 4 cellules de la zone de saisie
For i = 1 To 4
.Range.Cells(i) = Range("Z_Saisie").Cells(i, 1)
Next i
' on a fini de jouer avec la ligne
End With
' on a fini de jouer avec le tableau
End With
' on vide la zone de saisie
Range("Z_Saisie").ClearContents
' on active la cellule B3 pour la saisie suivante
Range("B3").Select
End SubComme votre BD est sous tableau structuré, on s'en sert.
La fonction Add sans indication de valeur indique que l'on veut ajouter une ligne en haut du tableau donc en dessous de la ligne d'entête.
J'ai supprimé les lignes entre les champs de saisie afin de créer une zone de saisie sous le nom de Z_Saisie, comme cela il suffit d'en faire référence dans le code plutôt que de désigner les cellules : un des avantages et que cette zone peut être déplacée, le code fonctionnera toujours.
Le principe de faire un formulaire de saisie sur une feuille est bien vu ! Cela évite la gestion d'un USF et ces différents contrôles, cela est plus accessibles.
D'ailleurs je vous conseille de regarder ceci. Stellson était un "GRAND" ici
Je vous fourni le fichier modifié :
Si vous avez des questions n'hésitez pas !
@ bientôt
LouReeD
Merci beaucoup pour la réponse rapide.
Je vois qu'il va falloir que je me mette au VBA si je veux aller plus loin.
Mais ma question était vraiment d'essayer de comprendre pourquoi ça ne marchait pas. J'ai réussi avec l'enregistreur de macro à en faire une qui fait ce que je lui demande. Je l'ai enregistré avant que le tableau soit crée et ensuite j'ai crée le tableau. Et là, ça marche.
Mais quand je crée le tableau avant l'enregistrement de la macro, ça ne fonctionne pas. Enfin ça fonctionne comme décrit plus haut. Je me doute qu'il y a une subtilité pour que ça ne fonctionne pas, mais ne la connaissant pas je voulais savoir si certains savaient pourquoi.
Bonne fin de journée.
Le soucis vient de cette instruction : Range("Tableau3[Nom]").Select
En fait vous demandez à VBA de sélectionner l'ensemble de la colonne Nom du tableau 3.
Comme ensuite vous collez les données, VBA comprend que le transpose doit se faire sur l'ensemble des lignes.
Votre code simplifié :
Sub Macro3()
Range("B3,B5,B7,B9").Copy
Sheets("Feuil2").Select
Range("Tableau3[Nom]").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=True
Rows("2:2").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Sheets("Saisie").Select
Range("B3,B5,B7,B9").ClearContents
End SubIl y a encore la même erreur, c'est juste pour vous montrer le côté "abusif" de l'enregistreur !
Lors de l'enregistrement, le fait de sélectionner B3, puis B5, puis B7 et enfin B9, l'enregistreur enregistre tout ce que vous faites, or vous vouliez simplement sélectionner les 4 cellules sans pour autant enregistrer l'évolution de la sélection....
@ bientôt
LouReeD
Ok,
Effectivement, ça me confirme qu'il faudra que je m'y mette... un jour!
Merci beaucoup pour la réponse rapide.
Bonne fin de soirée.
