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.

macro

Et voici ce que fait cette macro si j'enregistre une nouvelle ligne. Il change les précédentes et rajoute une nouvelle ligne.

macro 2

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 Sub

Et 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! :)

18formulaire.xlsm (19.47 Ko)

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 Sub

Comme 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é :

13formulaire-lrd.xlsm (21.69 Ko)

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 Sub

Il 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.

Rechercher des sujets similaires à "aide macro remplir base formulaire"