Récupérer et utiliser le texte d'une combox

Bonjour,

Je suis actuellement en Licence et dans le cadre de cette formation je dois réaliser un logiciel Excel d'automatisation. Le cœur de ce logiciel consiste à insérer des informations dans des feuilles différentes à partir d'un Userform. Seulement, n'ayant que quelques bases en VBA j'arrive uniquement à saisir les informations dans une même feuille. Le but serait de sélectionner le nom de la feuille dans la combobox afin que la saisie se fasse automatiquement dans la feuille choisie.

Pour envoyer les informations dans une feuille j'utilise le code suivant:

Sheets("Base").Select

N'y aurait-il pas une formule capable de récupérer le texte d'une combobox pour l'utiliser dans sheets. Select?

Par avance merci de votre aide.

Bonjour,

essaie ceci

Sheets(Me.ComboBox1.Text).Select

Merci de votre réponse rapide.

Je viens d'essayer et excel m'indique une erreur 9 en me disant que l'indice n'appartient pas à la sélection.

Rémy ESA a écrit :

Merci de votre réponse rapide.

Je viens d'essayer et excel m'indique une erreur 9 en me disant que l'indice n'appartient pas à la sélection.

il convient naturellement que combobox1 contienne le nom d'une feuille qui existe.

Bonjour,

Le but serait de sélectionner le nom de la feuille dans la combobox afin que la saisie se fasse automatiquement dans la feuille choisie.

Comme tu le dis ! Il te suffit de choisir la feuille dans une liste pour pouvoir ensuite envoyer ton info dans la feuille choisie !

Tu n'as donc qu'à mettre en place la Combo concernée et l'utiliser...

Sheets("Base").Select

NON ! Je ne m'appesantirai jamais assez sur la nécessité d'éviter absolument ce type de commande (dès lors bien sûr que c'est pour agir sur l'objet sélectionné...)

En manuel on ne dispose que d'un clavier et d'une souris, et on sélectionne l'objet avant d'agir sur une commande destinée à produire un résultat qu'on attend sur l'objet sélectionné.

En VBA, on programme, on indique ce qui doit être fait, pas plus.

Soit quelque chose comme : Worksheets("x").Range("z") = "info"

Toute sélection ne peut constituer qu'une opération supplémentaire parasite dont le seul effet n'est que de ralentir l'exécution !

Comme tu n'illustres pas ton problème, que tu ne parles pas de l'emplacement dans la feuille où placer l'info, ni de façon générale des modalités de ton opération... on ne peut rien ajouter de plus, sinon qu'il pourra peut-être s'avérer judicieux de recueillir les différents éléments (nom de feuille), emplacement dans la feuille (réf de cellule ?), info) dans des variables qui faciliteront l'écriture, et éventuellement les vérifications à opérer avant de donner cours...

Cordialement.

Je joins dans ce message le fichier excel afin de mieux me faire comprendre, la combobox est déjà créée.

Par avance merci de votre aide.

Ouais ! Si tu indiquais ce que tu veux faire, ainsi que la finalité de l'opération, et la raison de la duplication de ta base en 5 exemplaires supplémentaires... ?

On pourra rectifier ce que tu fais en fonction de ce que tu veux obtenir... mais en en vérifiant la rationnalité.

Cordialement.

Oui, ça manque de clarté..

Au fait je souhaitais avoir toutes les données relatives aux machines (les machines sont désignées par leur nom: classic 1, classic 2,...) puis, un calendrier spécifique à chaque machine qui viendrait pomper dans la feuille "Base" les informations concernant la machine. Seulement je n'arrive pas à reprendre à partir de la feuille base les informations que je souhaite donc je me suis dis qu'il devait être possible d'insérer directement à partir du userform les informations dans chacune des feuilles des machines sans passer pas la feuille base. Quitte à supprimer cette feuille si elle n'a plus d'utilité.

Bonjour

voila une combobox pour les onglets

Private Sub UserForm_Initialize()
'paramétrage de la combobox
Dim ws As Worksheet
    For Each ws In ActiveWorkbook.Sheets
      If Feuil1.Name <> ws.Name And Feuil2.Name <> ws.Name And Feuil5.Name <> ws.Name Then
          ComboBox1.AddItem ws.Name
      End If
    Next
End Sub

Private Sub ComboBox1_Change()
   If ComboBox1.ListIndex = -1 Then Exit Sub
   Sheets(ComboBox1.Value).Select
End Sub

A+

Maurice

Bonjour Maurice, merci de votre réponse.

Je suis novice en VBA et je ne voudrais pas faire un bête copier-coller de votre code sans comprendre, pouvez vous m'expliquer votre code, notamment les deux boucles si?

Par avance merci.

Je ne sais rien de l'utilisation ultérieure qui devra être faite... mais dupliquer des informations de façon systématique n'est pas en général une bonne méthode.

Dans le cas où il apparaît nécessaire de travailler sur plusieurs "Tables", une clé primaire doit servir à opérer la jonction entre les tables, sans avoir à dupliquer les informations. Par exemple le Code peut constituer une telle clé permettant d'accéder aux informations de la Base sans avoir à les reproduire ailleurs, seul le champ Code est reproduit et permet d'aller selon besoins chercher les infos dans la base.

Par ailleurs, à première vue de ton Userform, tu as l'air de monter un fichier clients. Sauf l'intitulé "Insérer une date" qui fait se poser la question de quelle occasion en fait génère ce fichier... ?

Si le nombre de machines est ainsi limité et définitif, on peut se contenter de la référence : Info!A1:A5, à placer comme RowSource de la Combo. Mais cela doit être fait au niveau conception lors de la fixation de propriétés par défaut (dans la fenêtre de propriétés) de façon à réserver l'initialisation pour les éléments qui doivent être présents à l'ouverture mais sont susceptibles de varier entre deux ouvertures.

Si le nombre (et les noms) de machines peuvent varier, il conviendra de nommer la plage de façon dynamique (nom qui recouvrira les variations, au moyen d'une formule utilisant la fonction DECALER...), de façon à mettre le nom en RowSource (pour ne plus avoir à modifier).

Renommer tes TextBox est une bonne chose mais le faire sans les mettre dans l'ordre de tes colonnes, cela perd beaucoup de son utilité (permettre l'utilisation aisée de boucles). Il convient donc de faire passer tb3 en tb6 (et rajuster les 4 à 6 en 3 à 5) de façon à les avoir dans l'ordre de tes colonnes.

Il convient aussi que l'ordre de tabulation soit ajusté, de façon que le passage d'une TextBox à la suivante s'opére dans l'ordre de ton Userform (clic droit dans le Userform > Ordre de tabulation, et on réordonne ceux qui constituent des points d'arrêt).

Enfin sur le même thème : si on opte pour un code (qui n'est qu'un numéro d'ordre), tes Labels afférents me semblent cafouilleux : une étiquette doit indiquer que cette information est le code, et une TextBox est plus utile pour la recueillir. Cette dernière n'a pas à être saisie, donc on la verrouille (Locked = True) et on la sort en tant que point d'arrêt lors de la tabulation (TabStop = False). Ce qui se fait dans la fenêtre de propriétés, et pour faire bonne mesure, on la renomme tb0, de façon à pouvoir la placer à son rang.

Ton Initialize se réduit à récupérer la valeur du Code...

Private Sub UserForm_Initialize()
    Dim Lig As Long
    Lig = Sheets("Base").Cells(Rows.Count, 1).End(xlUp).Row
    tb0.Text = Lig
End Sub

Et pour la validation, en faisant l'impasse sur les vérifications qui pourraient s'avérer nécessaires (et pourront alors se partager entre contrôles lors de la saisie, au niveau de chaque contrôle, et contrôle que la saisie a bien eu lieu lors de la validation, avant de donner cours).

On pourra récupérer les contenus des tb 0 à 6 dans un tableau (en veillant s'il s'agit d'une date à la convertir en date !), y ajouter la valeur de la Combo, puis on disposera de la ligne à servir (le Code+1), et on la sert en y affectant le tableau.

Dans la perspective de répercuter le Code sur la feuille Machine, on dispose du nom de feuille, on récupère la ligne d'insertion et on insère le Code...

Private Sub bt1_Click()
    Dim Lgn(7), Lig&, i%
    For i = 0 To 6
        If i <> 1 Then
            Lgn(i) = Controls("tb" & i).Text
        Else
            Lgn(i) = CDate(tb1.Text)
        End If
    Next i
    Lgn(7) = ComboBox1.Value
    Lig = CLng(tb0.Text) + 1
    Sheets("Base").Cells(Lig, 1).Resize(, 8).Value = Lgn
    With Sheets(Lgn(7))
        Lig = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
        .Cells(Lig, 1) = Lgn(0)
    End With
    Unload Me
End Sub

Cordialement.

Merci de votre réponse.

Le userform sert à rentrer une date et toutes les informations relatives au déplacement d'une machine puisque le but recherché du fichier excel est d'établir un planning automatique pour chaque machine.

J'ai vu que vous avez modifié le fichier excel, je vous en remercie seulement lorsque l'on clic sur le bouton "valider" du userform excel nous indique une erreur de type 9....

Tu as peut-être téléchargé le fichier avant que j'en substitue un nouveau après rectif d'une petite erreur...

Elimine-le et retélécharge : je viens de télécharger le dernier que j'ai mis, et pas d'erreur, c'est donc bien celui rectifié.

Cordialement.

Le code fonctionne maintenant.

Seulement seul le champs "code" se rempli dans la feuille de la machine concernée, que dois-je modifier afin que toutes les colonnes se remplissent?

Cordialement.

Je n'ai pas rempli d'autres champs, en conformité avec la "philosophie" exposée en préambule : ne pas reproduire les infos déjà enregistrées dans Base, et en ce qui concerne ce que tu veux mettre d'autre, ce n'était pas l'objet du Userform et tu n'en as pas fait état, donc j'ignore... !

J'ai enregistré le Code pour montrer comment on pouvait le faire, et en tant qu'élément de jonction entre deux tables...

Oui mais au final si on peut rentrer les infos directement dans les machines comme pour le champs "code" il n'y a plus besoin de la feuille "base" et donc il n'y a pas de doublons d'informations.

J'utilisais cette feuille car je ne suis pas capable de saisir directement les données dans la machine concernée...

A ce moment là, tu affectes comme sur la feuille Base ! Si tu comprends le mécanisme, il n'y a pas de difficulté.

Mais par contre il convient de régler au préalable si tu supprimes la feuille Base :

  • le Code n'a plus d'utilité, ou alors laquelle ?
  • on avait un Code unique pour tout enregistrement dans la Base, il disparaît donc, il était récupérer à l'initialisation du Userform, cette récupération ne peut plus se faire et entraînera une erreur...
Comme l'initialisation n'avait rien d'autre à faire, Initialize est à supprimer.

- si le Code disparaît, la colonne aussi, si elle disparaît, il faut en tenir compte dans le reste du code et le modifier...

Normalement, l'architecture générale du projet et toutes les fonctionnalités qu'on en attend, auraient dû être arrêtées lors de la conception (avant même d'ouvrir Excel pour entamer la réalisation !)

Cordialement.

Bonjour

si tu a un excel 32bits avec msconctl.ocx

voila un nouveau projet

A+

Maurice

Bonjour, merci de votre aide.

Je ne dois pas avoir la bonne version excel car je ne vois rien dans le fichier.

En revanche le projet de M Ferrand fonctionne. Seulement même en regardant le code je ne comprend pas toutes les boucles et les variables présentent, il m'est donc difficile de le modifier afin de supprimer cette feuille base...

par avance merci de votre réponse.

Cordialement.

Je veux bien te guider dans cette suppression mais il faudrait répondre à la question relative au Code !

Ton "Code" était un numéro d'ordre incrémenté à chaque ajout, et donc calculé sur la feuille Base. Si celle-ci disparaît, le Code disparaît dans sa version actuelle !

Soit tu supprimes, soit tu redéfinis un "Code"... à calculer automatiquement, qui remplacera le précédent (et si possible m'expliquer à quoi il servira car son utilité n'est plus apparente dès lors que Base est supprimée...)

Cordialement.

Rechercher des sujets similaires à "recuperer utiliser texte combox"