Formulaire de saisie sur feuille différente

Bonjour à tous,

Je souhaiterai insérer un formulaire de saisie dans un fichier Excel (je vous joint une version très simplifié).

J'ai deux difficultés:

- D'abord, l'incrémental se fait en fonction d'un numéro client (en cellule C7). Il faut donc que que quand on clique sur le bouton "incrémental" et qu'on remplit les cases du formulaire, les données viennent s'ajouter dans le tableau de data en face du client qui correspond au numéro client, bien sûr.

- Ensuite, le tableau de données se trouve sur autre feuille (data) mais je ne veut pas que les personnes qui rentrent l'incrémental est accès à cette feuille, car il y a des donnés confidentielles.

Pensez vous cela possible? Merci!!!!

34test-scaramp.xlsm (25.23 Ko)

PS: j'ai créé un formulaire et un bouton, mais aucun code ni macro c'est juste pour vous faire gagner un peu de temps. Si vous souhaitez procéder autrement, libre à vous de supprimer et recommencer

Bonjour,

Pas de bouton Incremental ? et ton formulaire est manifestement incomplet !

Pour la 2e question : masquer la feuille en xlSheetVeryHidden.

Cordialement.

Bonjour Mferrand,

Merci de ta réponse, oui effectivement j'ai enregistré manifestement avant de mettre le bouton ceci-dit j'avais juste insérer un bouton et appelé incrémental. Concernant le formulaire, oui je n'en ai jamais fait, c'est juste un template avec la mise en forme mais aucun code. Concernant "Very hidden" c'est effectivement ce que je fait mais je voulais juste m'assurer que l'opération puisse se faire si la feuille est "very hidden" est avec un mot de passe qui protège l'accès à la commande "visualiser le code".

Pas de problème tant que tu n'utilises pas de commandes exigeant que la feuille soit visible.

nb- commandes dont on peut très bien se passer !

Mais je ne sais pas faire le formulaire et les liaisons...

Peut-être ! Mais commence par compléter ton formulaire !

Tu as 3 données, il en manque 2... On incrémente quoi ensuite, et de quelle façon ?

Le formulaire peut servir à créer de nouveaux enregistrements ou à modifier des enregistrements existants (le même).

Si on l'utilise en modification, il faut un dispositif de recherche, par exemple une ComboBox alimentée par ta liste de clients.

Pour saisie nouveau client, on peut avoir soit une TextBox soit utiliser la même Combo...

Il faut un contrôle pour la saisie du code client, ou si c'est ce code qui est incrémentén pour l'afficher, et savoir comment on l'incrémente car tes codes sont très disparates...

Bref ! une fois complété, avec une logique d'utilisation arrêtée et des règles bien définies, on pourra passer au code...

MFerrand,

j'ai un petit peu modifié la textbox pour expliquer ce que j'attends.

J'ai effectivement 3 données que je veux avoir la possibilité de modifier, c'est tout. En ce qui concerne le client, je veux que l'incrémental ne puisse se faire QUE pour le client précédémment séléctionné par le biais de la liste déroulante de la "fiche client". Donc pas de liste de choix dans le formulaire. La recherche se fait donc par rapport au "numéro client" (fiche client.cellule C7).

Je ne sais pas si c'est clair?...

Merci beaucoup de ton aide en tout cas!


Pardon j'ai oublié le fichier

Up

Pas d'affolement ! Je ne fais pas de stakanovisme, et l'heure de l'apéro approche !

Et j'ai plusieurs fichiers au feu...

Ce n'était pas pour toi en particulier ah si c'est l'heure de l'apero je comprends j'ai le même ordre de priorités

On y vient ! J'ai commencé par toi pensant que ce serait très rapide... mais il a fallu mettre un peu d'ordre...

D'abord les formats de données, je me suis aligné sur les formats de la fiche, donc mis Data aux mêmes formats, et les modifications dans les TextBox seront formatés de la même façon (voir plus loin).

Au niveau formulaire, l'affichage client et numéro se fait dans des TextBox, mis en forme différemment des autres, dont la propriété Locked est à True (non modifiables par l'utilisateur) et mis hors circuit de tabulation (propriété TabStop à False).

Les contrôles ont été renommés.

J'ai ajouté une formule en E3 :

=SIERREUR(EQUIV(C3;Tableau1[Client_Nom];0);0)

Elle renvoie le rang dans la plage Client, soit l'index de ligne dans cette plage. Dans la mesure où ton formulaire est en quelque sorte dépendant de la fiche (et ne sert qu'à la modification des objectifs), cette valeur est utilisée par le formulaire, tant au lancement qu'à la validation.

Du coup, j'ai modifié tes formules en utilisant cette valeur en E3 avec INDEX, ce qui les simplifie du même coup.

Police mise à blanc en E3.

Une procédure (dans Module1) :

Private Sub MaskDémaskData()
    With Worksheets("Data")
        Select Case .Visible
            Case xlSheetVisible: .Visible = xlSheetVeryHidden
            Case Else: .Visible = xlSheetVisible
        End Select
    End With
End Sub

Elle masque et démasque alternativement la feuille Data. Private pour ne pas s'afficher dans la boîte de dialogue macro. Elle n'est reliée à rien, donc en l'état tu la lances en te positionnant dessus dans l'éditeur et cliquant sur l'icône Exécuter.

A toi de voir comment tu veux t'en servir, si elle doit être déplacée, etc.

Lancement du Userform :

Sub OuvrirFormulaire()
    On Error Resume Next
    UserForm1.Show
End Sub

Gestion d'erreur car en cas de non sélection d'un client, un clic sur le bouton de lancement affichera un message et le Userform sera déchargé avant d'avoir été affichée. La méthode Show n'ayant pas été à terme alors, cela provoque une erreur...

Initialisation du Userform :

Une variable (cli) est déclarée au niveau module. La proc. Initialize lui affecte la valeur de E3 vue plus haut.

Private Sub UserForm_Initialize()
    Dim i%
    cli = ActiveSheet.Range("E3")
    If cli > 0 Then
        With [Client]
            For i = 1 To 5
                Controls("tbCli" & i).Value = .Cells(cli, i).Text
            Next i
        End With
    Else
        MsgBox "Aucun client sélectionné !", vbInformation, "Modification objectifs client"
        Unload Me
    End If
End Sub

A partir de cette valeur (ligne dans la plage Client), les TextBox sont servis directement à partir de Data. La propriété Text est utilisée au lieu de Value pour affecter directement des valeurs formatées. (Se souvenir que toute donnée dans une TextBox est du texte, donnée de type String...)

Je passe sur un second post avant d'avoir un incident et de perdre le message...

Compte tenu des formats, il se posait un problème d'ergonomie lors de la modification des objectifs dans les TextBox.

J'ai donc fait 2 choses :

D'abord fait débuter la tabulation à l'ouverture du Userform par le bouton (c'est lui qui a le focus à l'ouverture) : ainsi en tabulant tu bascules sur la première TextBox avec sélection automatique de la valeur existante que tu peux ainsi remplacer sans autre manipulation. Et si positionnement par la souris, même chose (ce qui n'auurait pas été le cas en laissant le focus sur une TextBox au démarrage).

Ensuite, l'utilisateur ne se préoccupe que de la valeur qu'il veut mettre : frappe de chiffres et utilisation du point du clavier numérique pour le séparateur décimal. Le format sera rétabli à sa sortie de la TextBox :

Private Sub tbCli3_AfterUpdate()
    Dim v
    v = Val(Replace(tbCli3.Value, ",", ".")) / 100
    tbCli3.Value = Format(v, "0.0%")
End Sub

Private Sub tbCli4_AfterUpdate()
    Dim v
    v = Val(Replace(tbCli4.Value, ",", "."))
    tbCli4.Value = Format(v, "0.00")
End Sub

Private Sub tbCli5_AfterUpdate()
    Dim v
    v = Val(Replace(tbCli5.Value, ",", "."))
    tbCli5.Value = Format(v, "0.0")
End Sub

On procède à une récupération de la valeur tapée, qui est convertie et reformatée.

Validation :

Private Sub cbValid_Click()
    Dim Obj(3 To 5), i%
    For i = 3 To 5
        Obj(i) = Controls("tbCli" & i).Value
    Next i
    [Client].Cells(cli, 3).Resize(, 3).Value = Obj
    Unload Me
End Sub

On constitue un tableau des 3 valeurs modifiées, et on l'affecte à Data (on dispose la ligne dans la variable cli...)

Comme je l'ai dit, à la sortie des TextBox, on a des données String, mais formatées en formats de nombre reconnus par Excel qui les convertira automatiquement en nombres (pas de souci avec les formats utilisés).

Les valeurs modifiées sont répercutées immédiatement sur la fiche par les formules.

Cordialement.

Whaou, ça a dû te prendre un temps fou!!! MERCI MILLE FOIS je ne pensais pas à quelque chose d'aussi poussé Malheureusement, j'ai l'impression que chez moi (at home) ça ne marche pas j'ai un mac et il ne reconnait pas les objets activeX et il n'a pas vraiment l'air de vouloir ouvrir le formulaire... Du coup j'attendrai lundi au boulot pour te faire mon retour et te remercier une fois pour toutes En tout cas vraiment merci!!


En tout cas en lisant les explications je comprends ton chemin de pensée. C'est minutieux!

Le bouton ActiveX était déjà sur la feuille... !

Tu peux lancer la macro d'ouverture par la boîte de dialogue macro, ça te permettra de voir si d'autres incompatibilités avec MAC.

Cordialement.

Je sais il n'y a aucun problème j'utilise ce fichier au travail et tout les gens qui vont le manipuler ont excel 2007 sur windows donc no souci

Hello Mferrand!

Ce que tu as fait, c'est vraiment super! Ca marche très bien, merci infiniment!!! J'ai juste une petite modif à te demander si tu as le tempsv(j'ai essayé de le faire moi même, mais sans y parvenir...) Je m'explique : Dans mon fichier original, j'ai parfois des clients qui ont le même nom (ex: "station total"). J'ai effectué une étape intermédiaire afin d'affecter un numéro à chaque client dans ma liste déroulante, mais du coup je me demandais si dans le formulaire il ne pouvait aller chercher le code dans le tableau de data au lieu du nom ?

En gros le nom du client ne serai qu'un renseignement sur le formulaire (

tbCli1 = Feuil1.Range("C3").Value

) mais la recherche ne se ferait que sur le code client. Tu penses que c'est faisable et pas trop long à modifier?

Bonjour,

Si tu as des homonymes parmi les clients, tu vas donc les distinguer lors de la sélection par le numéro de client...

Dans ces conditions, la formule en E3 ne va pas renvoyer la position du bon client, mais par contre le ListIndex de la Combo de sélection peut toujours le faire !

Donc proposition :

1) Ne toucher à rien dans le dispositif et effacer la formule en E3.

2) Supprimer la première ligne d'Initialize :

    cli = ActiveSheet.Range("E3")

et la remplacer par :

    cli = Feuil1.ComboBox1.ListIndex + 1

et tout fonctionnera...

NB- Cette dernière ligne utilise le nom de code (CodeName) de la feuille Fiche Client : vérifier dans ton fichier que le CodeName de la feuille est Feuil1, sinon le modifier dans le code...

Dans l'éditeur, les objets Excel sont listés sous la forme : CodeName (Name) :

Feuil1 (Fiche Client)

Il faut prendre le nom hors parenthèses (CodeName) dans la ligne de code.

Cordialement.

Cela marche toujours très bien et effectivement, cette méthode évite d'avoir une répétition d'un code dans le cas d'homonymie! Cependant, je viens de me rendre compte de quelque chose qui clochait, non pas dans ce que vous avez fait, mais dans la manière dont je vais l'utiliser.

Je vais vous expliquer pourquoi j'ai besoin que le formulaire soit exclusivement rattaché au code client. Il y a une étape intermédiaire de filtrage. Je ne vous l'ai pas dit auparavant, car dans ma candeur excelienne, j'ignorais que les formulaires fonctionnaient de cette manière. Je m'excuse donc de ne pas vous en avoir averti auparavant.

Pour accéder à la fiche client, l'utilisateur passe par une phase intermédiaire, un onglet "Menu" dans lequel il sélectionne, par trois listes déroulantes successives, la région, le chef des ventes puis le vendeur.

menu

Une fois le vendeur choisi, la liste des client du vendeur sélectionné s'affiche automatiquement (voir fichier joint). La liste déroulante dans la fiche client ne comporte donc QUE les clients du vendeur choisi. Voilà donc le souci... Le formulaire ne doit pas fonctionner en fonction de l'ordre des clients dans la table de data, mais faire une recherche du code dans cette table. Mais je ne sais pas si c'est possible. Peut-être n'est ce pas clair... Si nécessaire je peux vous envoyer mon fichier original en mp. Mais je vous joint en attendant une version light mais qui reflète la réalité de mon fichier. Il faut comprendre qu'en réalité il n'y a pas 4 clients, mais 18 000, d'où la nécéssité de filtrer les clients par vendeurs au préalable.

Par ailleurs, j'ai deux dernières questions, qui concerne plus la prise en main du code vba.

1) Comment agrandir le nombre de lignes (clients) dans le code?

2) Si j'ajoute des colonnes supplémentaires dans le tableau entre la plage "clients" et les colonnes "incrémentales" (augmentation du CA, ...) comment prendre en compte cette modif dans le code?

Je ne sais pas comment vous remercier, sinon vous faire part de ma gratitude! Merci!

Je ne crois pas avoir tout assimilé...

Que contient Data ? Tout ?

D'où vient la liste de la Combo Fiche ?

On a travaillé sur la base qu'elle était la colonne Client du tableau sur Data... Si ce n'en est qu'une extraction, cela ne change rien au fait que tu vas chercher tes données en E9, E11 et E13 sur Data !

Si c'est bien le cas, on revient à la version précédente (avec formule en E3 (ou ailleurs...) qui récupère la ligne, mais à faire sur la colonne code Client au lieu du nom.

Cordialement.

Salut MFerrand,

Génialissime ça marche

Une dernière question: comment faire pour décaler les colonnes ou je mets l'incrémental dans le tableau? Disons que ma colonne "code" est en B, ma colonne "augmentation CA" en F et les deux autres en G et H? Après je te laisse tranquille

Rechercher des sujets similaires à "formulaire saisie feuille differente"