VBA (plusieurs problèmes formulaire)

Bonjour,

Tout d'abord, en fait, la double transposition n'est pas nécessaire. Cette instruction est suffisante :

Me.CONJOINT_F1.List = Array("oui", "non")

J'ai effectué cette simplification dans le nouveau code de l'UserForm1.

Cela me parait une bonne idée d'utiliser la page "Divers" qui d'ailleurs pourrait être renommée "Conjoint", sauf qu'alors la combobox "Conjoint_collectivité" devrait figurer sur la page principale tout comme pour les enfants.

Après, tout dépend où sont ajoutées les données du conjoint. Si c'est sur la même feuille que l'agent, alors le bouton "AJOUTER" n'est pas nécessaire. Si tu le souhaites, je peux te refaire une proposition dans ce sens.

remarque

Si tu as des musulmans dans tes adhérents avec donc plus d'un conjoint possible, il faudrait alors prévoir une 3ème feuille.

Bonjour à vous deux,

Pour ce qui concerne ton organisation de saisie et plus précisément le portable permanencier, une solution pourrait être :

1- mettre sur le serveur le classeur contenant mon formulaire, que l'on pourrait appeler classeur_Cédric

2- modifier le formulaire d'Henri pour qu'il accède au classeur_Cédric afin de récupérer les données de l'agent.

thev a écrit :

Bonjour à vous deux,

Pour ce qui concerne ton organisation de saisie et plus précisément le portable permanencier, une solution pourrait être :

1- mettre sur le serveur le classeur contenant mon formulaire, que l'on pourrait appeler classeur_Cédric

2- modifier le formulaire d'Henri pour qu'il accède au classeur_Cédric afin de récupérer les données de l'agent.

Bonjour Thev,

Bonjour Henri,

Certes, mais ce qui me pose problème, c'est en fait la méthodologie.

En effet, le plus simple (mais il y'a peut-être d'autres pistes que je n'ai pas envisagées, je ne suis pas un "foudre de guerre" avec Excel) me paraissait à priori un coller avec liaison.

Mais comme explicité un peu plus haut, cela donne des zéros dans le classeur d'Henri (feuille actifs et enfants).

Aucun problème me suis-je dis, j'ai caché les zéros avec la méthode que tu m'avais indiquée (via options, affichage...)

Ok, nickel, sauf qu'une fois le formulaire d'Henri lancé... tous les champs des 2 feuilles non remplis et qui ont donné des zéros se replissent de zéros aussi (le fait que ces zéros soient "cachés" ne peut rien y changer)

Malheureusement, il arrive que je n'ai pas toutes les données en une fois, et je reviens faire de temps en temps des modifications / rajouts.

Mais il y'a tout de même beaucoup de champs vides. Et là, esthétiquement, un formulaire avec des zéros partout dans les champs, non seulement ce n'est pas esthétique, mais c'est même ... très désagréable à l'usage pour la consultation.

Quant à mettre une formule ou un code, je ne saurai le faire.

Et combien même, il faut tenir compte qu'il y'a des champs qui commencent réellement par des zéros (matricules, la plupart des CP dans ma région, n° tel, portable, fax...)

Autre charmant problème, j'ai oublié, honte à moi, c'est le principal, et viens donc d'éditer mon post : les enfants !

Comment les reprendre tels que tu les as et que je suis censé les avoir pour les intégrer au formulaire d'Henri qui est linéaire en feuille 1 et n'utilise donc pas la feuille 2 enfants ??

Je sèche et je met votre sagacité à rude épreuve

thev a écrit :

Bonjour,

Tout d'abord, en fait, la double transposition n'est pas nécessaire. Cette instruction est suffisante :

Me.CONJOINT_F1.List = Array("oui", "non")

J'ai effectué cette simplification dans le nouveau code de l'UserForm1.

Cela me parait une bonne idée d'utiliser la page "Divers" qui d'ailleurs pourrait être renommée "Conjoint", sauf qu'alors la combobox "Conjoint_collectivité" devrait figurer sur la page principale tout comme pour les enfants.

Après, tout dépend où sont ajoutées les données du conjoint. Si c'est sur la même feuille que l'agent, alors le bouton "AJOUTER" n'est pas nécessaire. Si tu le souhaites, je peux te refaire une proposition dans ce sens.

remarque

Si tu as des musulmans dans tes adhérents avec donc plus d'un conjoint possible, il faudrait alors prévoir une 3ème feuille.

Bonjour Thev,

En fait j'ai simplement repris ce que tu avais déjà fait, et comme l'instruction Me.CONJOINT_F1.List apparaissait dans le code feuille actifs et au début de l'UserForm1, j'ai recopié à l'identique.

Mais je suppose qu'ils n'ont pas la même fonction ?

Le 1er pour déclarer cette colonne (dans code feuille agents actifs ou tu listes d'ailleurs tout), le 2e pour la combobox, juste pour avoir les choix possibles "oui" et "non" ?

Oui, tout à fait possible de renommer l'onglet divers, c'est d'ailleurs bien plus judicieux !

La combobox peut apparaître à côté des autres ("sft" et "enfants") avec les mêmes arguments : "oui" ou "non"

Pour le conjoint, il peut apparaître dans la feuille agents (la 1ère, actifs ttes coll 2017), moi je l'avais mis en colonne S ou T (S je crois pour la réponse combobox, et T pour le nom conjoint s'il existe en fonction du résultat de cette combobox)

J'ai effectivement des agents adhérents musulmans, mais en dix ans d'activité, ils n'ont jamais eu plusieurs de leurs épouses adhérentes aussi en même temps.

Je ne vais donc pas chercher plus de complications qu'il n'y en a déjà (Heu je veux dire pour vous deux).

Bien sur, je ne peux qu'approuver ta proposition.

Tu as déjà fait plusieurs version, par contre, s'il y'a trop de changement, pourrais-tu avoir l’extrême gentillesse de m'indiquer ou je dois replacer mon code de tri alpha que j'ai mis et me confirmer que le contenu de TRIM(AGENTS_F1.Value) devra toujours se trouver au niveau du formulaire à partir de la textbox "AGENTS_F1" dans ce code ?

Private Sub valider_Click()

    Select Case type_action_agent
        'ajout agent
       Case "C"
        If MsgBox("Etes-vous certain de vouloir insérer ce nouvel agent ?", vbYesNo, "Demande de confirmation") = vbYes Then
            Call ajout_agent
            If type_action_enfant = "C" Then Call ajout_enfant: Me.MultiPage1.Value = 0
        End If

(Au fil des versions, que ce soit pour toi ou pour Henri, j'avoue que c'est de plus en plus ardu, et bien des fois je ne sais ou modifier un code pour faire des essais)

Quoi qu'il en soit, grand merci

thev a écrit :

Bonjour,

ci-jointe nouvelle proposition

1- supprimer l'ancien UserForm1 et récupérer le nouvel UserForm1

2- nommer la colonne S en CONJOINT_COLLECTIVITÉ_F1 (voir code associé à Feuil1)

Merci Thev,

Je n'avais pas encore eu le temps de tester.

Ça fonctionne, mais un peu bizarrement.

Là, on part du principe qu'il n'y a pas de combox pour le choix "oui" ou "non" de l'éventuel conjoint.

On en met un... ou pas...

Ce n'est absolument pas gênant, cela me convient aussi.

Par contre, j'ai fait 2 essais "bidons" et il y'a des annotations sur la feuille active (feuille 1)

dernier form thev

Deux lignes dont les cellules indiquent "vides" en dessous de ton pseudo portable

(J'ai fait un essai bidon avec ton pseudo, le second avec moi. Je suis à court d'idée pour tester )

Voilà ce que cela donne après le second essai (pseudo données me concernant moi, cette fois ci)

dernier form thev 2

Il y'a des vides, normal, je n'ai mis que quelques données aléatoires, juste pour test.

Voilà, si tu identifies le problème qui risque de se reporter sur la proposition que tu m'as aimablement proposer de faire

Bien à vous deux,

Cédric

Bonsoir,

Pour le contrôle du remplissage du nom de l'agent

Private Sub valider_Click()

    Select Case type_action_agent
        '// ajout agent
        Case "C"
        ' contrôle remplissage nom
        If Trim(AGENTS_F1.Value) = "" Then MsgBox "Le nom est obligatoire": Exit Sub
        ' confirmation ajout
        If MsgBox("Etes-vous certain de vouloir insérer ce nouvel agent ?", vbYesNo, "Demande de confirmation") = vbYes Then
            Call ajout_agent
            If type_action_enfant = "C" Then Call ajout_enfant: Me.MultiPage1.Value = 0
        End If

Bonjour Cédric,

ci-jointe nouvelle proposition pour le conjoint.

Pour ce qui concerne les zéros apparaissant au niveau des liaisons pour les zones non renseignées, une solution pourrait être de les remplir automatiquement par un blanc.

Pour l'exemple, si les combobox à oui ou non ne sont pas renseignées, je les initialise à non.

Bonjour Thev,

J'ai un petit problème :

Pour le conjoint, je n'arrive pas à le mettre.

Si je remplis les renseignements concernant l'agent, le sft, et enfant (avec "oui" pour enfant), le formulaire se place directement sur l'onglet enfant (normal).

Je rentre donc l'enfant.

Si je ne valide pas, car un conjoint est aussi adhérent, que je me mets donc sur l'onglet conjoint, que je remplis et que je reviens sur l'onglet principal pour mettre la combobox à oui pour le conjoint et qu'ensuite je valide, ça ne fonctionne pas.

J'ai essayé de plusieurs façon (une bonne dizaine) et, j'y suis arrivé (mais honte à moi, je ne sais plus comment je m'y suis pris)

Sans compter qu'il m'est arrivé de bloquer le formulaire (manipulation non prévue certainement, donc de ma faute)

Donc ça fonctionne (en tout cas pour 1 enfant, je ne sais si c'est possible pour plusieurs enfants, à mon avis, après validation, il faut certainement revenir sur l'agent et, modifier et rajouter des enfants.

Quel est l'ordre exact à respecter, et à quel moment valide t-on définitivement pour créer 1 nouvel agent, 1 enfant et un conjoint ?

Oui, je sais c'est bête...

Quand je l'utiliserai tous les jours, ce sera autre chose, pour l'instant, mieux vaut demander au concepteur

Bonne fin d'après-midi Thev, et merci à toi

Ok. Je regarde.

ced02 a écrit :

Si je remplis les renseignements concernant l'agent, le sft, et enfant (avec "oui" pour enfant), le formulaire se place directement sur l'onglet enfant (normal).Je rentre donc l'enfant.Si je ne valide pas, car un conjoint est aussi adhérent, que je me mets donc sur l'onglet conjoint, que je remplis et que je reviens sur l'onglet principal pour mettre la combobox à oui pour le conjoint et qu'ensuite je valide, ça ne fonctionne pas.

C'est corrigé et ça fonctionne.

Bonjour Thev,

Hormis le fait que je n'arrive pas à placer mon code pour le tri alphabétique (pour le tri alpha dans ma feuille 1, agents actifs et pour la combobox liste agents (que voici, fait avec l’enregistreur de macro, désolé) :

tri alpha

J'ai pourtant voulu le mettre ailleurs, dans un module et de l’appeler par un Call,, mais bon, pas moyen, pas mieux, ça ne fonctionne pas non plus.

Hormis ce problème, disais-je, c'est excellentissime ! Rien d'autre à dire...

Je l'ai testé depuis plus d'une heure, je n'ai pas réussi à le mettre en défaut.

(Je n'ai eu qu'un bref souci, j'ai copié toutes les nouvelles données actifs et enfants à partir d'un de tes formulaires précédants que j'utilisais, et là mes agents du SDIS n'avaient plus de matricule (un blanc) Normalement, car j'ai fais des erreurs de saisie, le matricule est "00000000" 8 zéros par convention. De même, formulaire bogué en essayant justement de créer un nouvel adhérent SDIS avec enfant et conjoint.

Entre temps, j'ai remis toutes les colonnes CP et matricules au format texte, corrigé quelques babioles dans les recherches pour remplir les champs enfants (juste un rajout de 'sierreur...;" " pour ne pas avoir #NA)

Enfin bref, j'ai enregistré, fermé, ré ouvert, et tout est fonctionnel, y compris le SDIS.

Franchement, bravo !

Je ne parle pas que du suivi, il y'a eu un travail formidable d'effectué, des versions améliorées et affinées en fonction de mes besoins spécifiques, beaucoup de patience pour reprendre à chaque fois et pour s'adresser en termes simples à un novice.

Et qui dit novice, dit parfois questions "idiotes", mauvaise compréhension et / ou approche de la problématique.

Nul besoin de rappeler que ce n'est pas un dû, loin s'en faut.

Donc encore merci Thev, et chapeau bas car tu le mérites.

Ceci étant fait, je vais repartir sur mon cheval de bataille. Si si ...

ced02 a écrit :
thev a écrit :

Bonjour à vous deux,

Pour ce qui concerne ton organisation de saisie et plus précisément le portable permanencier, une solution pourrait être :

1- mettre sur le serveur le classeur contenant mon formulaire, que l'on pourrait appeler classeur_Cédric

2- modifier le formulaire d'Henri pour qu'il accède au classeur_Cédric afin de récupérer les données de l'agent.

Bonjour Thev,

Bonjour Henri,

Certes, mais ce qui me pose problème, c'est en fait la méthodologie.

En effet, le plus simple (mais il y'a peut-être d'autres pistes que je n'ai pas envisagées, je ne suis pas un "foudre de guerre" avec Excel) me paraissait à priori un coller avec liaison.

Mais comme explicité un peu plus haut, cela donne des zéros dans le classeur d'Henri (feuille actifs et enfants).

Aucun problème me suis-je dis, j'ai caché les zéros avec la méthode que tu m'avais indiquée (via options, affichage...)

Ok, nickel, sauf qu'une fois le formulaire d'Henri lancé... tous les champs des 2 feuilles non remplis et qui ont donné des zéros se replissent de zéros aussi (le fait que ces zéros soient "cachés" ne peut rien y changer)

Malheureusement, il arrive que je n'ai pas toutes les données en une fois, et je reviens faire de temps en temps des modifications / rajouts.

Mais il y'a tout de même beaucoup de champs vides. Et là, esthétiquement, un formulaire avec des zéros partout dans les champs, non seulement ce n'est pas esthétique, mais c'est même ... très désagréable à l'usage pour la consultation.

Quant à mettre une formule ou un code, je ne saurai le faire.

Et combien même, il faut tenir compte qu'il y'a des champs qui commencent réellement par des zéros (matricules, la plupart des CP dans ma région, n° tel, portable, fax...)

Autre charmant problème, j'ai oublié, honte à moi, c'est le principal, et viens donc d'éditer mon post : les enfants !

Comment les reprendre tels que tu les as et que je suis censé les avoir pour les intégrer au formulaire d'Henri qui est linéaire en feuille 1 et n'utilise donc pas la feuille 2 enfants ??

J'y arriverai

Bonjour,

Pour ton tri, le mieux est de le faire à l'ouverture du fichier en insérant ce code dans ThisWorkBook

Private Sub Workbook_Open()
    Dim nb_col_used As Integer

    'tri Feuil1 par agent
    nb_col_used = Range("AGENTS_liste").Worksheet.UsedRange.Columns.Count  'nombre de colonnes utilisées
    Range("AGENTS_liste").Resize(, nb_col_used).Sort key1:=Range("AGENTS_liste").Cells(1, 1), order1:=xlAscending, Header:=xlYes

End Sub

Merci Thev,

Je l insérerai à l endroit indiqué et retirerai le mien, plus long issu de l enregistreur de macro.

Je vais faire une petite pause le temps d arriver à comparer et extirper les enfants du formulaire d Henri.

J ai essayé de coder un peu mais les résultats sont erratiques.

Je reprendrai à froid avec plus de recul.

Merci beaucoup Thev et bon week-end

Bonsoir,

ced02 a écrit :

Mais il y'a tout de même beaucoup de champs vides. Et là, esthétiquement, un formulaire avec des zéros partout dans les champs, non seulement ce n'est pas esthétique, mais c'est même ... très désagréable à l'usage pour la consultation.

Une solution serait de ne pas laisser les champs vides et de mettre automatiquement un blanc (=" ") s'ils n'ont pas été remplis.

J'ai prévu cette possibilité dans le code en utilisant la valeur par défaut donnée par la propriété "Tag" de chaque contrôle. Pour les combobox "oui,non", la valeur de la propriété Tag est à "non".

Pour ce qui concerne l'enregistreur de Macro, il faut plus le voir comme un guide pour trouver les objets, propriétés et méthodes à utiliser. Il vaut mieux éviter une recopie complète car un certain nombre d'instructions est inutile et alourdit donc le code sans nécessité.

Bonjour,

S'il vous plaît, qui peut m'aider à résoudre les deux problème sur le VBA, vous trouverez l'explication dans l'onglet "problèmes" sur le classeur.

PS: Je suis débutant dans le langage VBA .

Je vous en remercié d'avance

Bonne journée

10classeur1.xlsm (36.25 Ko)
thev a écrit :

Bonsoir,

ced02 a écrit :

Mais il y'a tout de même beaucoup de champs vides. Et là, esthétiquement, un formulaire avec des zéros partout dans les champs, non seulement ce n'est pas esthétique, mais c'est même ... très désagréable à l'usage pour la consultation.

Une solution serait de ne pas laisser les champs vides et de mettre automatiquement un blanc (=" ") s'ils n'ont pas été remplis.

J'ai prévu cette possibilité dans le code en utilisant la valeur par défaut donnée par la propriété "Tag" de chaque contrôle. Pour les combobox "oui,non", la valeur de la propriété Tag est à "non".

Pour ce qui concerne l'enregistreur de Macro, il faut plus le voir comme un guide pour trouver les objets, propriétés et méthodes à utiliser. Il vaut mieux éviter une recopie complète car un certain nombre d'instructions est inutile et alourdit donc le code sans nécessité.

Oui, je suis tout à fait d'accord pour l'enregistereur de macro, et tu n'es pas le premier à me le faire remarquer.

Disons que pour des novices (je ne suis rien de plus, ne l'oublions pas), cela évite de perpétuellement déranger pour un oui ou un non, et tant pis s'il y'a plus de code. Mais bon, je suis bien content d'avoir le code "allégé"

Pour le formulaire d'Henri, il y'a effectivement ce problème de zéros à la place des champs vides, mais je me dois de le traiter comme un problème secondaire, car il me faut d'abord m'occuper des enfants. Si j'y arrive, alors, je pourrai revenir sur ce problème.

Là, c'est autrement plus complexe (enfin pour moi, et à mon avis, pas seulement pour moi).

Pour son formulaire en consultation, j'ai retiré les deux ou trois enfants qui existaient pour exemples en linéaire et j'ai remis les enfants que j'ai moi dans la feuille 2 (enfants 2017).

Feuille que n'utilise pas Henri.

Maintenant, faire le lien lorsque le formulaire s'affiche, que l'on choisit un nom sachant que l'enfant s'il existe (ou pire ; les enfants concernés dans la feuille 2 doivent s'afficher dans les textbox de son formulaire prévus à cet effet), ça c'est ... heu...

Mais j'y ai travaillé hier soir. J'ai abandonné parce les résultats étaient catastrophiques (j'ai même réussi à faire en sorte que lorsque l'on clique sur un adhérent, ce soit un autre adhérent qui s'affiche dans la textbox principale, tout était décalé, mais sans logique de décalage ! )

Finalement, c'est le pire. Je ne dis pas qe la logique va faire en sorte de résoudre le problème, mais tu peux comprendre certaines choses, les modifier, tu as au moins une base de travail sur laquelle avancer, même si le résultat n'est pas pour autant garanti, loin s'en faut.

Lorsque c'est totalement aléatoire, comme hier soir, au bout de 10 minutes tu fermes tout avant de tout claquer par terre

En plus, le formulaire d'Henri est excellent également, c'est juste le linéaire qui ne peut être utilisé, et il s'est donné également du mal tout en fournissant de nouvelles versions et en prenant le temps de m'expliquer de nombreuses choses.

Bon, pas de problème, il me suffit de retirer les quelques lignes insérées, je ne panique pas. Je vais essayer de comprendre comment il est possible, en VBA, de comparer 2 cellules dans deux pages différentes et de trouver la boucle qui me permettra en cas de résultat positif d'afficher au moins un enfant.

Voilà, je n'ai plus à m’inquiéter pour le tien, il prend en compte tous les impératifs dont nous avons besoin, et c'est avec réel plaisir que je l'utilise.

Bon dimanche à toi Thev, ainsi qu'à Henri s'il nous lit

ced02 a écrit :
thev a écrit :

Bonjour,

Pour ton tri, le mieux est de le faire à l'ouverture du fichier en insérant ce code dans ThisWorkBook

Private Sub Workbook_Open()
    Dim nb_col_used As Integer

    'tri Feuil1 par agent
    nb_col_used = Range("AGENTS_liste").Worksheet.UsedRange.Columns.Count  'nombre de colonnes utilisées
    Range("AGENTS_liste").Resize(, nb_col_used).Sort key1:=Range("AGENTS_liste").Cells(1, 1), order1:=xlAscending, Header:=xlYes

End Sub

Bonjour Thev,

Comme convenu, j'ai supprimé mon code pour le tri et ai inséré le tien dans ThisWorkBook.

Malheureusement, il ne fonctionne que si je me place en début de ton code et que j'utilise F5.

Ceci aussi bien sur ma feuille actifs qui ne se met pas dans l'ordre que dans la combobox liste agent.

Le dernier nom crée reste effectivement et en dernière ligne feuiile actifs et dernière données dans la combobox liste agents.

Je suis en Workbook / open, j'ai également essayé en Général / Déclarations.

J'ai même essayé de mettre ton code à l'endroit ou j'avais mis le mien, en attendant.

Mais ... sans effet. Je l'ai donc retiré et il se trouve donc uniquement dans Workbook / open

IMHO, je ne sais tout simplement pas ou le placer pour qu'il s'execute automatiquement

Bref, si encore une fois tu peux venir à la rescousse...

Méa-Culpa, bonne soirée à toi Thev.

bonsoir,

Pour le moment, je ne vois pas où est le problème. Si le code est placé dans ThisWorkBook, il s'exécute à l'ouverture du classeur.

Voir exemple ci-joint où j'ai inséré une instruction STOP pour bien montrer que le code s'exécute à l'ouverture du classeur.

Bonjour à tous,

Je me permet de vous exposer quelques problème qui m’empêche de finir un projet.

Sachant que je suis novice en VBA, mais comme même, j'ai arriver à adapter quelques codes, et ça grâce aux recherches que je fais.

mes problèmes son comme suit:

1- Pour le userforme1 sur le bouton "Ajouter":

--Pourrais-je rassembler les 4 boutons (sélectionner une image, télécharger l'image, selectionner une plage, et inserer l'image) dans un seul bouton.

2- Pour le userforme2 sur le bouton (Modifier):

  • - le bouton modifier ne marche pas
  • - je sais pas pourquoi le "userforme" est très lent.
3- Après l'insertion des images sur les plages de cellules sur l'onglet "images".

-- Je sais pas si il y aura un moyen qui nous permettre d’ouvrir le userforme en cliquant sur l'image et qui nous donne toutes les information attribuer à cette image.

Ci-joint mon projet.

Je vous en remercié d'avance pour votre aide.

Cordialement

Bonjour,

Personnellement, j'ai regardé, par acquis de conscience, mais le code est trop difficile pour mes humbles compétences.

Je ne peux que t'encourager à créer ton propre post, tu auras certainement des réponses, je l'espère vivement pour toi.

Désolé, j'ai répondu pour le principe, mais ...

Bon courage

Rechercher des sujets similaires à "vba problemes formulaire"