IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Appliquer à une Textbox une formule d'une cellule [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 140
    Par défaut Appliquer à une Textbox une formule d'une cellule
    Bonjour,

    J'ai une petite problème que je n'arrive à résoudre mais je vais d'abord présenter le projet :

    J'ai deux fichiers Excel :
    - "Bdd.xls" contenant les données dans une feuille. La première ligne contient les champs des données. Chaque ligne suivante est une fiche avec les données.
    - "Formulaire.xls" contenant un Userform, le programme VBA et une feuille "parametres" qui contient aussi des champs (les mêmes que la Bdd normalement) mais avec des informations de paramétrage comme par exemple
    * le contenu des listes déroulantes, (de la ligne 6 à 24)
    * le texte à afficher dans une bulle d'aide qui explique comment remplir le champs, (ligne 26)
    * la formule de calcul (ligne 25)

    L'Userform contient des Textbox et des Listbox lié à la Bdd via le ControlSource. Les Listbox sont alimentées via un code VBA qui reprend le contenu des listes dans la feuille Parametres.
    En fait, les Textbox et Listbox ont le même nom que les champs.

    Parmi les Textbox, certaines sont des chiffres à saisir. Par exemple : Chiffre1 et Chiffre2

    Parmi les Textbox, j'ai aussi certaines dans lesquelles je souhaite afficher le total d'autres Textbox via la formule indiquée dans la feuille Parametres du champs correspondant. Par exemple la Textbox "Total" serait égale à Chiffre1 + Chiffre2.

    Pour cela :
    - via un code VBA, j'ai donné un nom à chaque colonne de la BDD (le nom de la colonne = le nom du champs)
    - j'ai créé dans la Bdd les champs de totaux et via un code VBA les colonnes de ces champs se remplissent avec les formules indiquées dans la feuille Parametre. En effet, à la base le Bdd ne contient pas les formules. Les formules reprennent les nom de colonne pour pouvoir additionner. Jusque là çà va, les totaux se font correctement.

    Le hic est lorsque j'ai lié les Textbox de totaux à ces champs totaux de la bdd via le ControlSource des Textbox. En effet, ce lien efface les formules des cellules liées par le résultat en dur. Donc forcément lorsque je change un chiffre, le total ne se met pas à jour puisqu'il n'y a plus de formule dans la cellule liée au Textbox. Une chose que j'ai compris puisqu'il y a interactivité dans les deux sens entre une Textbox et sa cellule.

    Mais donc comment faire pour que mes Textbox de totaux fassent bien les totaux selon les formules indiquées dans la feuille Paramètres ? Je pourrais mettre en dure dans le code VBA chaque formule (du genre TextboxTotaux.value = TextboxChiffre1 + TextboxChiffre2) mais je veux éviter cela pour pouvoir ajouter des champs facilement via la feuille Parametres et donc sans retourner dans le VBA à chaque fois. De plus, mettre les formules en dures dans VBA c'est faire autant de ligne de code qu'il y a de textbox servant à un résultat d'un total.

    J'avais essayé aussi de mettre TextboxChiffre1 + TextboxChiffre2 dans les options de la TextboxTotaux mais çà ne fonctionne pas.

    Je ne sais plus comment faire, je bloque. Auriez vous une piste s'il vous plait ?

    Bien à vous.

  2. #2
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour,

    Tu devrait pourvoir faire cela avec l'instruction Evaluate

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextBox3.Text = Evaluate(TextBox1.Text & "+" & TextBox2.Text)
    Le "+" pouvant être une variable correspondant à l'opération choisi par l'utilisateur

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 140
    Par défaut
    Bonjour Jfontaine,

    Peux tu me dire STP où je dois écrire cette formule ?

    En effet, j'ai parlé à la fois du ControlSource des Textbox, de formule dans les cellules d'une feuille et de code à mettre dans chaque Textbox objet d'un calcul

    A bientôt

  4. #4
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Voici une solution qui utilise l’événement Worksheet.Change.

    Feuille "Paramètres"
    Les 2 champs de données de la feuille "Paramètres" sont liées à la feuille "Bdd".
    Le Total est calculé à partir de la formule contenue dans le champ "Formule".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim MaPlage As Range
        Set MaPlage = Application.Intersect(Target, Application.Union(Range("A2:B2"), Range("D2")))
        If Not MaPlage Is Nothing Then
            'La valeur du total est copiée dans l'userform
            UserForm1.TextBox3.Value = Range("C2")
        End If
    End Sub
    Feuille " Bdd "
    Le Total est lié à la feuille "Paramètres".

    Userform1
    Les 2 TextBox sont liées aux cellules de la feuille "Paramètres" par le ControlSource.
    A l’ouverture du formulaire, la formule de la feuille "Paramètres" est copiée dans la cellule Total.
    Le total est évalué.
    Lors de la modification d’une des 2 données dans le formulaire (TextBox1 ou TextBox2), la cellule correspondante de la feuille "Paramètres" est automatiquement modifiée. Ce changement provoque l’événement Worksheet.Change. La procédure associée à l’événement permet de copier le Total dans le formulaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub UserForm_Initialize()
        TextBox1.ControlSource = "A2"
        TextBox2.ControlSource = "B2"
        With Worksheets("parametres")
            .Range("C2").Formula = .Range("D2")
            .Range("C2").Value = .Range("C2").Value
        End With
        TextBox3.Value = Range("C2")
    End Sub
    Tu dois pouvoir adapter cela à ton projet .
    Cordialement.
    Fichiers attachés Fichiers attachés

  5. #5
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Ce code est a mettre dans la CommandButton qui exécutera l'opération

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 140
    Par défaut
    Merci gFZT82 et JFontaine

    La solution de gFZT82 correspond plus à la finalisation que je souhaite.

    C'est excellent comment gFZT82, tu as réussi à contourner la contrainte (ou le manque) de VBA. Je vais voir comment d'adapter à mon projet et voir aussi le fait que dans ton programme les champs 1 et 2 de la bdd ne se mettent pas à jour.

    Je reviendrais pour vous tenir au courant, et, si çà fonctionne je mettrais "Résolu".


  7. #7
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Oups !

    Effectivement, pour assurer la mise à jour des données de la feuille "Bdd", il a fallu que je modifie les procédures :

    Feuille "parametres"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim MaPlage As Range
        Set MaPlage = Application.Intersect(Target, Range("C2:D2"))
        If Not MaPlage Is Nothing Then
            'La valeur du total est copiée dans l'userform
            UserForm1.TextBox3.Value = Range("C2")
            'Les données de la feuille "Bdd" sont mises à jour
            With Worksheets("Bdd")
                .Range("A2") = Range("A2")
                .Range("B2") = Range("B2")
            End With
        End If
    End Sub
    Userform1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Private Sub TextBox1_Change()
    With Worksheets("Bdd")
        .Range("A2") = TextBox1.Value
        TextBox3.Value = .Range("C2")
    End With
    End Sub
    Private Sub TextBox2_Change()
    With Worksheets("Bdd")
        .Range("B2") = TextBox2.Value
        TextBox3.Value = .Range("C2")
    End With
    End Sub
    Private Sub UserForm_Initialize()
        With Worksheets("parametres")
            TextBox1.Value = .Range("A2")
            TextBox2.Value = .Range("B2")
            .Range("C2").Formula = .Range("D2")
            .Range("C2").Value = .Range("C2").Value
            TextBox3.Value = .Range("C2")
        End With
    End Sub
    A toi le plaisir de tester .

    Cordialement.
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Insérer Formule dans une TextBox
    Par Kaya_VB_13 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 12/07/2013, 13h57
  2. mise a jour d'une listbox en fonction d'une textbox
    Par goredo dans le forum Windows Forms
    Réponses: 35
    Dernier message: 02/03/2010, 12h32
  3. [XL-2003] faire un affichage dans une textbox en fonction d'une date
    Par revemane dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/06/2009, 17h16
  4. [MySQL] Apparition d'une textbox en fonction d'une valeur de liste recupérée
    Par jeremay dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 18/06/2009, 11h59
  5. Mettre une date par defaut dans une textBox.
    Par yaumme dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 01/12/2005, 22h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo