Insérer une nouvelle ligne selon la valeur de l'optionbutton

Bonjour le forum,

Déjà merci à ceux qui pourront m'aider.

Voici mon problème :

Dans mon formulaire, j'ai une textbox (TBquantité) qui fait référence à la quantité de poisson pêché et une textbox taille (TBtaille du poisson).

Mais seulement voilà, dans ma base de données, 1 ligne = 1 poisson pêché, pour faciliter l'analyse des données.

Du coup mon problème est là : si un pêcheur (représenté par un ID) prélève 2 poissons ?!!.....c'est là que ça se complique !!

Je voudrai donc trouver un code vba qui insérerai autant de ligne dans ma base qu'il y a de quantité de poisson.

En clair, si monsieur X pêche 2 poissons => TBquantité.Value = 2

Alors insérer 1 ligne supplémentaire dans ma base de données AVEC les mêmes informations du formulaire (ID, localisation, mode de pêche...puisque c'est le même pêcheur), cependant la ligne insérée sera différenciée par les valeurs quantité et taille du poisson.

ou sinon, je remplace les textbox par des optionbutton....mais je connais toujours pas de code adapter pour ajouter une nouvelle ligne à ma base de données.

Est-ce assez compréhensible ?

Si, non, je répondrai volontiers à vos questions.

Pensez-vous que ma requête soit faisable ?

Bonjour,

j'ai essayé de m'accrocher mais c'est difficile de comprendre sans avoir un fichier sous les yeux

Si j'ai bien compris tu veux pouvoir rajouter un autre poisson pour le même pêcheur, il pourrait donc faire plusieurs entrées, sauf que sans voir ton fichier j'ai du mal à voir où est le problème, cela vient peut-être de la façon dont tu as construis ton formulaire?

Tu pourrais nous passer un fichier ?

Voici mon fichier.

J'essaye de réexpliquer, pas de soucis

Ce que je voudrai obtenir :

quand X pêche 1 poisson toutes les données récoltées sont entrées dans le formulaire et ensuite insérer dans une ligne de la base de données.

Mais si X pêche 2 poissons alors il faudrait que selon l'optionbutton choisi (ici : optionbutton 2poissons), la macro m'insère automatique l'info (taille) du 2eme poisson dans une nouvelle ligne, puisque la 1ere concernera le 1er poisson pêché.

A la fin je devrai obtenir, si X pêche 2 poisson, 2 lignes avec les mêmes infos (ID, Lieu...) mais avec taille du poisson différente.

Rebonjour,

Donc avec le fichier si je comprends bien :

tu as les volets espèce dans lesquels tu peux mettre plusieurs tailles de poisson, et ce sont ces tailles que tu veux sur une ligne différente à chaque fois c'est bien ça?

Parce que si c'est ça, lors de ton export, tu parcours toutes tes TextBox de taille, et à chaque fois qu'elle n'est pas vide, tu exportes ses données avec les données d'en tête

Mais ça m'a l'air d'être du bricolage ton programme d'export... notament le Range("A65000") qu'il vaut mieux remplacer par Range("A"&rows.count)

D'après moi il faudrait faire une sorte de boucle dans ton volet Contrôle des prises sur chaque volet du multipage qu'il y a à l'intérieur, tu fais une autre boucle qui va regarder la valeur de chacune des Textbox de taille qu'il faudra renommer d'après moi, par exemple TextBox_taille1, TextBox_taille2, ou alors y mettre dans leur Tag pour mettre "taille" par exemple, et avec un If tu testes si tu tombes bel ou bien sur une TextBox remplie ou non, si elle l'est, tu exportes sa taille avec le reste des infos, mais pour moi ce que tu devrais faire c'est plutôt mettre une colonne pour chaque numéro de prise, et rajouter une colonne si tu changes d'espèce (si celle-ci est renseignée bien sûr.

Mais pour moi tu as des doublons dans ton histoire, surtout avec les différents volets pour chaque espèce, ce serait plus propre si tu avais un onglet espèce avec la possibilité d'ajouter une espèce par un clic plutôt que de faire 6-7 onglets.

Du coup je pense que tu n'as pas qu'un seul soucis dans ton formulaire, mais il faut que tu vois par quel soucis tu veux commencer et sur quoi tu as le plus besoin d'aide, si par la suite tu me poses une question précise sur un des points que j'ai cité, je pourrai t'aider pas par pas, mais pour moi on est loin d'un formulaire propre

A bientôt en esperant que cette première réponse ne te laisse pas sur ta fin

Bonjour, Salut Ausecour !

Je ne pense pas que ce que tu veux faire soit la bonne solution. Tu as construit une base de données par pêcheur, en voulant y multiplier les enregistrements par poisson, tu ne vas qu'alourdir ton fichier (qui l'est déjà un peu par rapport à son contenu) et risques tout simplement de ne pas pouvoir utiliser correctement les données recueillies.

Si tu as besoin d'une identification de chaque poisson (NB- il y a des codifications de divers éléments, mais je n'ai pas vu de codification des tailles ?), il te faudrait scinder ta base : une base identifiant le pêcheur contrôlé en un point donné... dans laquelle tu n'indiquerais que le nombre de poissons, et renvoyer à une base poissons le produit de pêche contrôlé avec une colonne identifiant le pêcheur et comportant toutes les informations par poisson.

Une autre solution, un peu bâtarde mais utilisable si le nombre max de poisson reste réduit de façon générale, serait de servir les colonnes relatives aux poissons en y concaténant les infos de tous les poissons dans le même ordre... mais cela compliquera un peu les utilisations ultérieures.

Hormis ce point de conception du fichier, comme l'a dit Ausecour, il y a et il y aura pas mal de choses à ajuster dans ton formulaire et ton code, car tu t'es lancé dans un gros truc...

Bon courage.

Salut MFerrand!

Tout à fait d'accord sur le fait qu'il va falloir passer du temps sur son code, d'ailleurs si je peux donner un conseil, je mettrais un minimum de code dans la formulaire et plutôt passer par des modules, c'est ce que je préfère faire pour ma part, surtout si tu dois répéter la même ligne de code à différents endroits...

Par exemple si tu veux contrôler qu'une valeur rentrée est bien un nombre ce sera mieux de copier call CtrlNb(activecontrol) que de recopier toutes les lignes...

Ce qu'il faut commencer à faire dans un tel fichier c'est structuer, se demander ce à quoi on veut arriver, limiter les doublons, bien nommer ses contrôles, faire attention qu'on en a pas oublié en arrière plan lors de la création du formulaire... ça peut paraitre long et pas intéressant à faire, mais un formulaire bien fait et bien pensé dès le départ ça aide énormément par la suite, parce que si tu dois tout modifier alors que tu as déjà fait plus de 50% de ton code, tu vas t'arracher les cheveux.

Salut Ausecour,

Je n'ai pas regardé aussi en détail que toi que code du Userform, mais je suis toujours d'avis de limiter le code d'un Userform à ce qui le concerne directement, et avec un Multipage déjà aussi bourré que celui-ci, ça va faire pas mal... Je rejoindrai donc assez volontiers ton avis sur ce point.

En tout état de cause, je ne m'y lancerais pas aujourd'hui, prenant l'avion demain... mais il y a pas mal de travail avant d'être au bout. Et prendre le temps de revoir et peaufiner la conception fera certainement gagner du temps pour la suite...

Cordialement.

Salut à vous,

Merci Ausecour et MFerrand de m'aider

J'ai oublié de précisé que je suis débutante en vba excel, depuis quelques semaines je travail sur ce projet et je me suis principalement aidée grâce à ce forum.

Bien évidemment je voudrai produire quelque chose de "propre" et c'est pour cela que je vais essayer, au mieux, de mettre en pratique vos conseils !

J'ai lu vos commentaires, à plusieurs reprises pour être sûr de comprendre...

Ausecour, quand vous écrivez : "Mais pour moi tu as des doublons dans ton histoire, surtout avec les différents volets pour chaque espèce, ce serait plus propre si tu avais un onglet espèce avec la possibilité d'ajouter une espèce par un clic plutôt que de faire 6-7 onglets.", grâce à quel contrôle j'ajoute l'espèce ?

De plus, il y aura forcément des doublons (notamment colonne ID), si la même personne pêche plusieurs individus et/ou espèces !? Est-ce dramatique pour l'analyse des données (graphiques) d'avoir des doublons ?

MFerrand : les tailles des individus sont importantes pour leur analyse, avoir les tailles exactes me semble plus correct que de les codifiées ! Mais si il fallait les codifier, alors comment m'y prendre ?

Je vais prendre du temps sur la base, d'après vos retours, mais je suis motivée pour avancée.

Du coup, pourrions-nous procéder étape par étape, ensemble ?

Si j'ai bien saisie vos infos, je dois d'abord structurer mon fichier ?! Mais comment transférer les codes dans le module ? Parce que je suppose qu'un copie/colle n'est pas la bonne méthode !?

Bonjour,

Quand je dis que tu as des doublons, ce n'est pas par rapport à l'ID, c'est très bien si tu as plusieurs fois le même ID qui apparait sur plusieurs lignes, je n'ai aucun soucis avec ça

Là où je pense que tu as des doublons c'est plutôt pour ton onglet Controle des prises, tu as 6 pages Espèce pour ajouter jusqu'à 6 espèces différentes en un clic, pour moi il faudrait que tu n'ais qu'une page Espèce (donc plus besoin d'un autre multipage Espèce, tu mets ça directement dans ton onglet Contrôle des prises. Je pense qu'il faudra mettre cette page à la toute fin, tu remplis une espèce, tu enregistres -> ça ajoute une ligne

Tu veux en ajouter une? Tu resaisis simplement de nouvelles informations et tu cliques de nouveau sur enregistrer, et ça te rajoutes une nouvelle ligne avec ton espèce et ses informations globales.

Au fait j'ai aussi remarqué que ton fichier était lourd car chargé de lignes vides... C'est parce que tu as mis en forme toutes les lignes d'une feuille (et du coup ça occupe de la place)

Je te propose une version épurée des lignes dont tu n'as pas besoin, le principe c'est de mettre sous forme de tableau ta base de donnée (Accueil -> Style -> Mettre sous forme de tableau), ces tableaux sont dynamiques, si tu ajoutes une ligne pile en dessous de la fin du tableau, il se redimensionnera automatiquement et mettra en forme les lignes qui sont remplies

Version épurée avec tableau (et oui plus que 66 Ko ) :

Version épurée avec tableau et proposition d'amélioration du formulaire :

Et oui ça me va pour y aller en pas à pas Je te laisse d'abord voir ce que je t'ai fait afin que tu y assimiles

Et également... Oui si tu copies colles ça ne marchera pas En revanche il n'y a pas grand chose à modifier je pense, le soucis vois-tu... c'est que tu programmes dans ton formulaire, il sait que tu vas chercher les contrôles (boite de saisie, listes déroulantes, multipage...) dans ce formulaire si tu n'en précises pas d'autres. Mais si tu appelles ces contrôles dans un module, lui ne sait pas dans quel formulaire tu vas vouloir aller les chercher, même si tu n'en n'as qu'un seul, il faudrait appeler ton formulaire avec un With par exemple, pour ensuite préciser que tu vas chercher tes contrôles dedans, sinon tu vas te retrouver avec un message d'erreur "objet requis" ou quelque chose dans ce genre...

Je préfère ne pas codifier la taille des poissons pour ma part, ça fait de la perte d'information.. Je garderais les vraies valeurs personnellement

N'hésite pas à demander si tu bloques, tu vas t'en sortir au fur et à mesure, mais il faut être bien organisé pour ça

Bonjour Mavric, Ausecour,

Je prendrais volontiers la discussion une fois parvenue à destination. Pour l'instant je m'apprête à m'acheminer vers l'aéroport... Je m'éloigne mais c'est sans incidence sur la communication...

Bonjour M.Ferrand,

Courage pour les temps d'attente...

Ausecour : ce que vous avez écrit m'a semblé facile à comprendre, reste la pratique !

Je garde votre version du fichier, il a l'air plus facile d'utilisation

Effectivement, mon fichier a un volume important. Ce que je vous ai transmis en exemple, ne comptait que 2 lignes "remplies", moi j'ai un fichier de 2700 lignes, que j'avait d’ailleurs intégrées dans un tableau, ce qui ma fallut l'augmentation du fichier (600ko => 2Mo )

Du coup pour la suite il me faut préalablement transférer tout mon code vers un module.....mais sa je ne sais pas faire ! et quand vous écrivez "il faudrait appeler le formulaire avec un With", là je comprends pas la démarche : il faut juste entrer with (NomDuFormulaire) mais après ?

Une fois la structuration faite, je dois trouver le "bon code" me permettant, une fois toutes les infos saisies et enregistrées, de recharger l'UF. C'est comme ci je voulais modifier les données du formulaire, sauf que là les modifications seront ajoutées à ma base dans une nouvelle ligne.

MFerrand : bon vol à vous !

Bonjour,

En te joignant un exemple ce sera peut-être plus simple à comprendre :

7explications.xlsm (24.83 Ko)

Le module 1 ne fonctionne pas, le module 2 fonctionne, reste à regarder la différence entre les codes

Je veux bien que tu ai 2700 lignes, mais là on parlait de 1 048 576 lignes qui contiennent quelque chose, soit plus de 1 000 000 que tu n'utilises pas mais qui te prennent de la place en mémoire... C'est pour ça que j'ai épuré ton fichier en changeant ta base de donnée de feuille et en renommant la nouvelle feuille pour lui donner le même nom

Sache que tu peux cliquer sur Enregistrer et garder ton Formulaire ouvert juste en vidant tes boites de saisie pour l'espèce du poisson, les tailles pêchées etc..

Bonsoir et merci à vous !

J'ai vraiment eu l'impression de voyager dans une glacière ! Ce qui n'était pas des conditions vraiment optimales... Et je n'étais visiblement pas le seul. Pendant quelques années on crevait de chaud, mais ces dernières on est revenu au froid... !

Mavric: comme te l'indique Ausecour, sachant que ton fichier est appelé à accueillir pas mal de données, il faut dès le départ éviter les grossissements superflus, notamment en préformatant des zones non encore utilisées, et faire en sorte que les zones utilisées soient limitées à celles qui contiennent des données...

Mais je vais pour l'instant me reposer un peu. @+

Bonsoir et merci à vous !

J'ai vraiment eu l'impression de voyager dans une glacière ! Ce qui n'était pas des conditions vraiment optimales... Et je n'étais visiblement pas le seul. Pendant quelques années on crevait de chaud, mais ces dernières on est revenu au froid... !

Mavric: comme te l'indique Ausecour, sachant que ton fichier est appelé à accueillir pas mal de données, il faut dès le départ éviter les grossissements superflus, notamment en préformatant des zones non encore utilisées, et faire en sorte que les zones utilisées soient limitées à celles qui contiennent des données...

Mais je vais pour l'instant me reposer un peu. @+

Bonjour M.Ferrand,

C'est ça d'abuser de la climatisation dans les avions! (enfin je pense que c'est le problème que tu as eu), personnellement je coupe la sortie d'air quand ça me fait ça

ça serait bête de prendre froid dans un transport... Reposes toi bien en tout cas, j'espère que l'auteur du sujet finira par me répondre

Bonjour à vous,

Merci pour ces infos Ausecour.

Effectivement j'ai testé ta méthode "laisser le formulaire ouvert, après enregistrement", et cela fonctionne hormis un détail : l'ID se décale d'une ligne à chaque fois. Après avoir enregistré, j'ai constaté que la 1ère cellule de la colonne A (ID) était vide mais que toutes les données saisies figuraient sur la ligne. L'ID correspondant aux données était lui, à la ligne suivante, seul.

Et cela à chaque fois que j'entre de nouvelles données !!

Comment puis-je corriger cette erreur ? Le code pour la textbox ID est le suivant :

Private Sub UserForm_Activate()

If Nouveau = True Then TextBox23 = WorksheetFunction.Max(Feuil1.Range("A:A")) + 1

End Sub

En ce qui concerne le code dans le module, j'ai compris l'exemple que vous m'aviez transmis. Maintenant pour l'appliquer à mon fichier....j'essaye encore de le faire !

J'essaye par moi-même et si je n'y arrive toujours pas, je reviendrais vers vous.

Autre question : comment enlever le "format tableau" ? Puisque comme je vous l'avez dit, j'avait intégré toutes mes données dans un tableau sauf que celui-ci englobe des cellules vides !!

J'ai essayé de le convertir en plage mais cela n'a pas diminuer la taille de mon fichier excel (1.65Mo)

Bonjour,

Pour réduire la taille du fichier, il n'y a qu'une solution que je connaisse, copier les cellules remplies dans une autre feuille, conserver le nom de la feuille source dans le presse papier (en copiant), supprimer la feuille source, renommer la nouvelle feuille, car redimensionner le tableau ne suffit malheureusement pas....

Je ne vois pas d'erreur dans le code pour ma part...

Bonjour !!

Alors du nouveau :

J'ai copié et inséré les données dans une nouvelle feuille, mon fichier fait toujours 1.62Mo, je suppose donc qu'il est bien dans son format "épuré" !?

En plus du code cité précédemment, j'ai également celui-là, en rapport avec l'ID :

For Each Ctrl In Fiche_PDPL.Controls
r = Val(Ctrl.Tag)

If r > 0 Then Sheets("Base_de_Donnees_PDPL").Cells(derligne, r) = Ctrl
Next
Sheets("Base_de_Donnees_PDPL").Cells(derligne, 1) = Val(TextBox23)

En refaisant des tests et supprimant ce code, l’ID et correctement placé, hormis un détail : 2 autres textbox ainsi que les optionbutton et checkbox des frames du formulaire ne sont pas incrémentés dans la Base, alors que je n'ai pas changé les codes !? Je ne comprends pas où est l'erreur !!

Ceci est les codes pour les optionbutton et checkbox :

If n1 = 0 Then
    Set dest = .Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0)
Else
    Set dest = .Cells(n1, 1)

End If
If OptionButton1 = True Then
    dest.Offset(0, 7).Value = OptionButton1.Caption

ElseIf OptionButton2 = True Then
    dest.Offset(0, 7).Value = OptionButton2.Caption

ElseIf OptionButton3 = True Then
    dest.Offset(0, 7).Value = OptionButton3.Caption

ElseIf OptionButton4 = True Then
    dest.Offset(0, 7).Value = OptionButton4.Caption

ElseIf OptionButton5 = True Then
    dest.Offset(0, 7).Value = OptionButton4.Caption

ElseIf OptionButton6 = True Then
    dest.Offset(0, 7).Value = OptionButton6.Caption

ElseIf OptionButton7 = True Then
    dest.Offset(0, 7).Value = OptionButton7.Caption

ElseIf OptionButton8 = True Then
    dest.Offset(0, 7).Value = OptionButton8.Caption

ElseIf OptionButton9 = True Then
    dest.Offset(0, 7).Value = OptionButton9.Caption

ElseIf OptionButton12 = True Then
    dest.Offset(0, 7).Value = OptionButton12.Caption

End If

If OptionButton10 = True Then
    dest.Offset(0, 23).Value = OptionButton10.Caption

ElseIf OptionButton11 = True Then
    dest.Offset(0, 23).Value = OptionButton11.Caption

End If

    End With

End If

If CheckBox14.Value = True Then
    dest.Offset(0, 24).Value = "AVE"

ElseIf CheckBox15.Value = True Then
    dest.Offset(0, 24).Value = "AVV"

ElseIf CheckBox16.Value = True Then
    dest.Offset(0, 24).Value = "INFO"

ElseIf CheckBox17.Value = True Then
    dest.Offset(0, 24).Value = "SENSI"

End If

Dim i As Integer
Dim Mot As String
For i = 1 To 13
    If Controls("CheckBox" & i).Value Then Mot = Mot & Controls("CheckBox" & i).Caption & ";"
Next
    dest.Offset(0, 25).Value = Mot

Du coup, j’ai remplacé

If n1 = 0 Then
    Set dest = .Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0)
Else
    Set dest = .Cells(n1, 1)

End If

Par, Set dest = .Cells(Application.Rows.Count, 1).End(xlUp).Offset(0, 0)

Tout fonctionne correctement, bien placé, mais je voulais savoir si ce changement me posera problème par la suite ?

Bonjour,

je ne saurais pas dire pour l'ID avec seulement des codes

En revanche pour la modification du dest il y aura tout de suite un problème pour moi, tu vas écrires sur ta dernière ligne remplie, et du coup tu vas te retrouver à l'écraser au fur et à mesure non?

Pour gérer le cas où la première ligne du tableau est vide il vaut mieux faire un test sur la valeur d'une de ses colonnes et voir ensuite si on peut écrire ou non sur cette ligne, si oui, on reste avec dest, sinon on décale dest, en clair:

If not dest = "" then
    set dest = dest.offset(1)
end if

Bonjour !

Pour ma part, il n'y a pas de données écrasées. Tout s'insère bien à la dernière ligne vide de la feuille.

Malgré tout, une erreur s'est produite, à l'initialisation du formulaire, l'ID ne se met pas à jour.

En faite, en regardant bien dans la base de données, l'ID inséré précédemment est au format texte, donc quand j'ouvre le formulaire, la textbox_ID ne reconnait pas cette cellule comme étant la dernière auquel il doit rajouter +1 pour former le nouvel ID.

Et à chaque fois que je text le formulaire, la textbox_ID est inséré dans la base sous le format texte, bien que ce soit des nombres qui sont saisies. J'ai fait une validations de données sur la colonne ID : format nombre entier, mais toujours pas de modification !!

J'espère tout de même arrivé au bout, un jour !

Rechercher des sujets similaires à "inserer nouvelle ligne valeur optionbutton"