récupérer données d'une depuis choix d'une combobox et listes conditionnelles

martinhic

XLDnaute Nouveau
Bonsoir,

Je suis en train de programmer un petit user form dont le but est relativement simple.

mon classeur se présente sous la forme:

A 1
A 2
A 3
A 4
A 5
A 6
B 11
B 12
B 13
B 14

et ça continue...

le but est d'avoir une boite de dialogue avec 2 listes déroulantes :

la première propose A,B,C ... la première colonne, et sans doublons ni l'en§tête.
je pense avoir réussi (en tout cas à l'affichage c'est bon) avec ce code :

Code:
Private Sub UserForm_Initialize()
        Dim i As Integer
        ComboBoxPuits.Clear
        For i = 3 To Sheets("Data").Range("A" & Cells.Rows.Count).End(xlUp).Row
        ComboBoxPuits = Sheets("Data").Range("A" & i)
        If ComboBoxPuits.ListIndex = -1 Then ComboBoxPuits.AddItem Sheets("Data").Range("A" & i)
    Next i
End Sub

Ensuite la 2e liste devrait être conditionnée par le résultat de la première. si je choisi la valeur A en premier choix elle ne doit me proposer que 1, 2 ...6 et pas au delà.

pour le moment j'ai ce code, qui m'affiche toutes les valeurs (qui vont par paire, dans mon tableau ce sont des profondeurs, entre lesquelles sont effectuées des mesures). Ce code est dans le même private sub que la première liste. J'ai mis une valeurs de 100 pour le nombre de lignes mais en fait il faut que ça s'arrête à la fin de la valeur A en première colonne.
Code:
With Sheets("Data")
        Set plg = .Range("C3:D100")
        tbl = plg
    End With
    With Me.ComboBoxProf
        .ColumnCount = 2
        .ColumnWidths = "25 pt;25 pt"
        .List = tbl
    End With

Ensuite ça se corse, pour moi en tout cas.

Les résultats des mesures de A2 par exemple se trouvent de E2 à P2
Ceux de B12 se trouvent de E8 à P8 si B12 se trouve en 8e ligne.
L'idée est de recopier toute la ligne 8, si j'ai choisi B puis 12, dans la ligne 4 de la feuille "Graphics". Cette ligne est fixe, j'applique ensuite sur la feuille quelques opérations puis une mise en forme sous forme de graph qui se met à jour tout seul quand les valeurs de la ligne 4 changent, y compris le titre.

Quand je copie à la main en tout cas ça marche super bien. sauf que j'ai 15 000 lignes de données (d'où la macro...).

Bref pour le moment à force de vagabondages sur le net j'ai fini par pondre ce code quand je clique sur "valider":

Code:
Private Sub cmdValider_Click()
    Dim ligne As Integer
    ligne = ufChoix.ComboBoxProf.ListIndex
    Sheets("Data").Select
    Rows("ligne").Select                  ' c'est ici que ça coince
    Selection.Copy
    Sheets("Graphics").Select
    Rows("4:4").Select
    ActiveSheet.Paste

End Sub

et là bien sûr c'est trop beau pour fonctionner (même si ma liste conditionnelle fonctionne pas j'aurai bien aimé que la simple copie de données fonctionne).

annéfé' ce gentil excel me dit que non c'est pas comme ça qu'on fait sans me dire comment faire.
Je ne suis pas sûr déjà de bien récupérer dans "ligne" le numéro de ligne correspondant à mon dernier choix (ComboBoxProf est la liste dans laquelle sont répertoriées et choisies les profondeurs).

je sais pas pourquoi ça bloque... je lui demande pas la lune pourtant. j'ai recopié le code de la macro enregistrée quand je le fais à la main et j'ai essayé de changer le numéro de la ligne par un entier contenu dans "ligne" et qui est censé être la valeur de ligne du choix de la dernière combobox. en théorie la première combobox doit pouvoir renvoyer elle à plusieurs lignes.

Avez-vous des pistes pour m'aider ? que ce soit dans la simple copie ou dans la liste conditionnelle ?

j'ai essayé d'être le plus clair possible sans fournir de fichier car les données sont confidentielles mais au besoin je peux copier mon fichier et le remplir de valeurs bidon, si ma description n'était pas claire.

Merci d'avance à l'âme charitable qui me sortira la tête de l'eau. j'ai l'impressione de me prendre la tête sur un truc super simple...
 
Dernière édition:

Modeste

XLDnaute Barbatruc
Re : récupérer données d'une depuis choix d'une combobox et listes conditionnelles

Bonjour martinhic et bienvenue à toi,

Dans un cas comme celui que tu exposes, un petit fichier exemple serait effectivement une bonne idée! Il permettrait de vérififer (par exemple) si tes données en colonne A sont triées (comme le laisse supposer ton petit exemple). Si c'est bien le cas, il me semble que ça simplifierait grandement le travail ... mais qu'en est-il, en réalité :confused:

Nous n'avons, par contre, nul besoin de toutes tes infos (surtout si elles sont confidentielles): une cinquantaine, voire une centaine de lignes devraient suffire et seules les colonnes de A à P nous seraient utiles (si j'ai bien compris) ... je présume que dans les mesures elle-mêmes, il n'y a rien de confidentiel!? Si c'est le cas, malgré tout, tu pourrais modifier les titres de colonnes, pour qu'on pense qu'il s'agit d'autre chose. Si ça ne suffit pas, alors tu n'as effectivement plus qu'à remplacer par des données "bidons"!

Si on pouvait répondre à tes questions, sans fichier, nul doute que quelqu'un se serait déjà proposé. Si tu n'as reçu aucun autre écho que celui-ci ... c'est sans doute qu'il manque un petit quelque chose. A toi de voir!
 

martinhic

XLDnaute Nouveau
Re : récupérer données d'une depuis choix d'une combobox et listes conditionnelles

Bonjour martinhic et bienvenue à toi,

Dans un cas comme celui que tu exposes, un petit fichier exemple serait effectivement une bonne idée! Il permettrait de vérififer (par exemple) si tes données en colonne A sont triées (comme le laisse supposer ton petit exemple). Si c'est bien le cas, il me semble que ça simplifierait grandement le travail ... mais qu'en est-il, en réalité :confused:

Bonjour et merci d'avoir lu mon sujet.

Effectivement les données sont triées en colonne A de mon classeur. je ne sais pas si ma fonction fonctionnerait si ce n'était pas le cas... mais c'est le cas et aller récupérer les noms de cette colonne j'y arrive (1/3 pour le moment).

Nous n'avons, par contre, nul besoin de toutes tes infos (surtout si elles sont confidentielles): une cinquantaine, voire une centaine de lignes devraient suffire et seules les colonnes de A à P nous seraient utiles (si j'ai bien compris) ... je présume que dans les mesures elle-mêmes, il n'y a rien de confidentiel!? Si c'est le cas, malgré tout, tu pourrais modifier les titres de colonnes, pour qu'on pense qu'il s'agit d'autre chose. Si ça ne suffit pas, alors tu n'as effectivement plus qu'à remplacer par des données "bidons"!

effectivement tout est un peu confidentiel même si c'est assez difficile à comprendre.

du coups j'ai donné aux puits des noms bidons (puits1, puits 2...) et donné des profondeurs bidons également.
pour les valeurs des mesures j'ai vidé les en-tête ça devrait suffire.

ensuite j'ai mis une page graphe vierge, dans mon fichier je fais plein de choses dessus mais cela ne me pose pas de pb pour le moment. il faut juste que ça aille recopier la ligne correspondant à la profondeur choisie dans la ligne 4 de la feuille graphics.

ce qui serait chouette, c'est la feuille graphics s'actualise, puis aille faire une copie d'elle-même dans une feuille graphics_puits x_profondeur choisie histoire de conserver ce qui a été tracé.

Petites subtilités qui ne sont pas bien graves :

- dans la liste déroulante "puits" c'est le dernier qui s'affiche alors que lorsque je ne supprimais pas les doublons ça commençait au premier.
- la liste déroulante des profondeurs affiche bien 2 colonnes qui donnent les profondeurs "bornes" des mesures mais une fois sélectionnée, il n'y en a qu'une qui s'affiche. ce n'est pas grave, elles sont sur la même ligne et au final ce que je veux récupérer de tout ça, c'est bêtement le numéro de la ligne de cette profondeur.

attention aussi, 2 puits peuvent avoir la même profondeur, il faut donc que la "recherche" de la ligne se fasse dans le champs réduits par le noms de puits et non tout le classeur.

merci beaucoup pour tout !

martin
 

Pièces jointes

  • classeur test forum.xlsm
    35.7 KB · Affichages: 74

Modeste

XLDnaute Barbatruc
Re : récupérer données d'une depuis choix d'une combobox et listes conditionnelles

Re-bonjour,

merci beaucoup pour tout !
:eek: Attends d'abord de voir si j'ai bien compris :rolleyes:

En pièce jointe, quelques modifs apportées à ton code:
- modifié la "Sub UserForm_Initialize()", de manière à ne "garnir" que la liste des puits. Utilisation d'un objet "Dictionary", simple et rapide dans la gestion des doublons.
- la liste des profondeurs se garnit à chaque modification du choix du puits "ComboBoxPuits_afterUpdate()". Puisque la colonne A est triée, on repère la première ligne où est renseigné le puits cherché et on "étend" la plage au nombre d'occurences du même puits en colonne A.
- la ligne à copier est donc la première où figure ledit puits, à laquelle on ajoute la position de la profondeur choisie dans la liste déroulante
... le tout, si j'ai bien compris la demande (oui, je sais, je me répète, mais je parle d'expérience :p)

Teste déjà pour voir jusque là si c'est OK ... on verra ensuite pour ton graphique, auquel je ne me suis pas intéressé encore.
 

Pièces jointes

  • De profundis (martinhic).xlsm
    36.8 KB · Affichages: 77

martinhic

XLDnaute Nouveau
Re : récupérer données d'une depuis choix d'une combobox et listes conditionnelles

Salut,

je ne sais pas comment te remercier c'est EXACTEMENT ce qu'il me fallait (smiley gros pouce merci)

j'ai copié mon bouton pour le mettre sur la feuille graphics, finalement la feuille data c'est une base de données et ce sera lourd de naviguer de l'une à l'autre sans arrêt. j'ai fait quelques tests, l'endroit où se trouve le bouton n'a pas l'air d'influencer son comportement puisqu'il renvoie à la macro qui s'exécute sur "Data".

Si tu n'as pas le temps de regarder pour la copie de la feuille ce n'est pas grave. je pense que je trouverai, je n'ai pas cherché pour ça encore.

par contre je pense qu'il pourra m'être utile d'ajouter un timer avant la recopie, histoire d'être sûr que le graph s'est bien actualisé avant de le copier. et ça je sais pas faire, autant dans la formule à utiliser que de la syntaxe et de l'endroit où je dois le placer...

merci merci (je peux mettre qu'un like au post)


Edit : pour le graphique je pense que je vais faire différemment : rajouter un bouton "enregistrer" sur la page de graphique, qui ouvrira une petite fenêtre proposant un nom "graphic_nom du puits_prof" que l'on pourra modifier si on le souhaite, et si on clique sur valider ça créera une page avec ce nom (par défaut ou modifié).
et puis si j'y arrive pas, bah je ferait clic droit copier, clic droit collé et je changerai le noim à la main :D
 
Dernière édition:

Modeste

XLDnaute Barbatruc
Re : récupérer données d'une depuis choix d'une combobox et listes conditionnelles

Re²,

En fait (et si tu en as besoin uniquement!) il vaudrait mieux que tu reprécises ce que tu veux faire concernant le graphique ... d'autant plus qu'il ne me semble pas en avoir vu dans ton exemple :confused:
Pas bien compris ton histoire de timer: si on continue les manipulations à la suite du code ... la mise à jour aura forcément eu lieu, non? ... ou alors il n'y a pas de lien entre les deux?
 

martinhic

XLDnaute Nouveau
Re : récupérer données d'une depuis choix d'une combobox et listes conditionnelles

Re,

effectivement timer = inutile.

je n'ai pas mis le graphique car il est trop explicite. il trace les données en fonction de l'entête (lui recopié à l'avance et fixe) en semi-log.

l'idée et de rajouter un bouton qui "enregistre" la feuille en la recopiant dans une nouvelle (ça j'en ai besoin et je pense pouvoir trouver facilement).
là où j'ai besoin d'aide c'est par rapport au nom qu'aura cette feuille. il faudrait aller récupérer en A4 le nom du puits à la suite duquel on ajouterai de le contenu de C4 puis D4.

le nom de la feuille serait "Graphic_A4_de_C4_à_D4_m"
mais je suis pas certain que cette syntaxe suffise.

de plus, mais là c'est optionnel, j'aimerais que pouvoir changer ce nom. au lieu de faire tout en transparence au clic, il y aurait un nouveau userform avec juste une TextBox, dedans le nom donné précédemment, valider/annuler. et je pourrais via la textbox changer le nom si j'ai une raison de lui en donner un autre.

je vais essayer de mon côté et je posterai mon classeur en pj.

que la feuille ne contienne pas de graphique n'a aucune importance si ma macro copie la feuille entière je pense...
 

martinhic

XLDnaute Nouveau
Re : récupérer données d'une depuis choix d'une combobox et listes conditionnelles

alors j'ai créé un bouton pour enregistrer la feuille (cmdSave) associé au userform ufSave

j'ai 3 choses dedans :

une textbox
un bouton valider
un bouton annuler (aucune difficulté là).

Le problème c'est que :
-je ne sais pas comment fonctionne la textbox (ça je suis en train de chercher)
-même sans rien dans la text box, je devrais pouvoir valider et enregistrer avec un nom dépendant du contenu de ma feuille mais ce que j'ai pu trouver comme code est invalide d'après le débogueur :

Code:
Private Sub cmdAnnuler_Click()
    Unload ufSave
End Sub

Private Sub cmdValider_Click()
ActiveWorkbook.Sheets("Graphics").Cells.Copy Destination:=ThisWorkbook.Sheets("copie").Range("A1")   'cette ligne il aime pas
Sheets("copie").Title = TextBox1.Value
End Sub

Private Sub TextBox1_Change()

End Sub

ici la feuille s'appellerait pour le moment 'copie', avant que je trouve comment changer ce nom...
 

Modeste

XLDnaute Barbatruc
Re : récupérer données d'une depuis choix d'une combobox et listes conditionnelles

Re³,

Prends le temps de réfléchir et de tester à ton aise, entre 2 messages, sinon on ne va plus en sortir :rolleyes:

Les lignes suivantes, ajoutées à la fin de la "Sub cmdValider_Click()" permettent de faire une copie de ta feuille "Graphics", de la placer en dernière position et de la renommer comme tu le souhaites:
VB:
With Sheets("Graphics")
        .Copy after:=Sheets(Sheets.Count)
        ActiveSheet.Name = "Graphic_" & .[A4] & "_de_" & .[C4] & "_à_" & .[D4] & "_m"
End With

Attention cependant: ce code ne teste pas l'existence préalable d'une feuille du même nom dans le classeur, ni l'utilisation de caractères interdits dans les noms de feuilles, ni l'utilisation d'un nombre de caractères au-delà de la limite.
Si tu utilises un second UserForm, il faudra adapter, bien sûr!
 

martinhic

XLDnaute Nouveau
Re : récupérer données d'une depuis choix d'une combobox et listes conditionnelles

Re,

j'ai testé un peu et cherché avant de reposter ;)

ça fonctionne très bien, pas trop grave pour le pb de redondance ou de longueur de caratères j'espère, tout est alphanumérique et relativement court normalement...

j'ai essayé d'adapter le code pour qu'à la place des valeurs de la page active le nom se modifie en fonction de la valeur de la textbox. je suis pas sûr que ça fonctionne puisque dans le code, le nom de la page se modifiait en fonction de la nouvelle et non de l'ancienne.

cependant mon pb est ailleurs : je n'arrive pas à récupérer dans la textbox les infos du "valider". la syntaxe contient une erreur dans la première ligne
Me.TextBox1
en effet ".[A4]" n'est pas une référence correcte pour lui... est-ce que je dois tout mettre entre crochets/parenthèses/guillemets ?

VB:
Private Sub UserForm_Initialize()
Me.TextBox1 = "Graphic_" & .[A4] & "_de_" & .[C4] & "_à_" & .[D4] & "_m"
End Sub
Private Sub cmdAnnuler_Click()
    Unload ufSave
End Sub

Private Sub cmdValider_Click()
    With Sheets("Graphics")
        .Copy after:=Sheets(Sheets.Count)
        'ActiveSheet.Name = "Graphic_" & .[A4] & "_de_" & .[C4] & "_à_" & .[D4] & "_m"
        ActiveSheet.Name = TextBox1
    End With
End Sub

Private Sub TextBox1_Change()

End Sub

question subsidiaire : y a-t-il moyen de ne pas recopier les boutons ou sont-ils forcément attachés à la feuille ? si pas possible c'est pas très grave.
 

Modeste

XLDnaute Barbatruc
Re : récupérer données d'une depuis choix d'une combobox et listes conditionnelles

Re et re,

Pour autant que je sache, le maximum est fixé à 31 caractères pour le nom des feuilles.
"Graphic_puits 2_de_393_à_396_m" en représente déjà 30 ... on n'est donc plus très éloignés de la limite!!

Tu ne peux écrire quelque chose comme ".[A4]" que si cette référence est précédée d'un With sheets("Graphics") par exemple ... ce que tu n'as pas recopié dans ton dernier code.

Une fois la feuille copiée, si tu n'as qu'un seul bouton qui est copié en même temps, essaie
Code:
ActiveSheet.Shapes("le_nom_du_bouton").Delete

L'ensemble deviendrait:
VB:
Private Sub UserForm_Initialize()
    With Sheets("Graphics")
        Me.TextBox1 = "Graphic_" & .[A4] & "_de_" & .[C4] & "_à_" & .[D4] & "_m"
    End With
End Sub
Private Sub cmdAnnuler_Click()
     Unload ufSave
End Sub
 
Private Sub cmdValider_Click()
    Sheets("Graphics").Copy after:=Sheets(Sheets.Count)
    ActiveSheet.Name = Me.TextBox1.Text
    ActiveSheet.Shapes("Bouton 1").Delete
End Sub
 

martinhic

XLDnaute Nouveau
Re : récupérer données d'une depuis choix d'une combobox et listes conditionnelles

Re^5

Effectivement avec mes noms de puits à rallonge ça dépassait 31 caractères donc j'ai revu un peu mon "texte".

j'ai ajouté une commande pour fermer la fenêtre une fois enregistrée, ainsi qu'un retour à la feuille "graphics".

parfait pour la suppression du bouton, comme ça j'ai supprimé aussi mon bouton 2 (graphiques) que j'avais intégré à cette feuille.

mon code final est :

VB:
Private Sub UserForm_Initialize()
    With Sheets("Graphics")
        Me.TextBox1 = .[A4] & .[C4] & "-" & .[D4]
    End With
End Sub
Private Sub cmdAnnuler_Click()
    Unload ufSave
End Sub

Private Sub cmdValider_Click()
   Sheets("Graphics").Copy after:=Sheets(Sheets.Count)
    ActiveSheet.Name = Me.TextBox1.Text
    ActiveSheet.Shapes("Bouton 1").Delete
    ActiveSheet.Shapes("Bouton 2").Delete
    Sheets("Graphics").Select
    Unload ufSave
End Sub

par contre je sais pas pourquoi toutes les 5 minutes excel plante ("excel a cessé de fonctionner").
le plus souvent quand je clique sur la disquette pour enregistrer (et là ça a le don de m'énerver quand j'ai réussi à faire quelque chose qui fonctionne et qu'il plante...) et des fois comme ça sans raison...

bon quand je touche pas au code et que je teste mon classeur pas de pb c'est le principal...

encore merci !

il y a d'autres petites choses pour lesquelles j'aurai besoin d'aide dans ma partie "calculs" mais je rouvrirai un sujet quand j'y travaillerai.

merci merci ;)

bonne continuation.
 

martinhic

XLDnaute Nouveau
Re : récupérer données d'une depuis choix d'une combobox et listes conditionnelles

Re bonjour,

je voulais supprimer ce petit pb en cas d'existence de la feuille, soit en affichant une petite textbox "cette feuille existe déjà" soit en réécrivant une feuille par dessus (supprimer l'ancienne et recréer).

comme je savait pas trop pour la textbox je me suis essayé à la deuxième méthode mais j'ai une erreur et je ne sais pas où (c'est la ligne private sub qui est en jaune).

Si quelqu'un voit où est mon erreur cela m'aiderait beaucoup ... merci !

VB:
Private Sub cmdValider_Click()
    Dim fl As Sheets
    For Each fl In ActiveWorkbook
        If fl.Name = Me.TextBox1.Text Then
            fl.Delete
        Else
            Sheets("Graphics").Copy after:=Sheets(Sheets.Count)
            ActiveSheet.Name = Me.TextBox1.Text
            ActiveSheet.Shapes("Bouton 1").Delete
            ActiveSheet.Shapes("Bouton 2").Delete
            Sheets("Graphics").Select
            Unload ufSave
        End If
    Next fl
End Sub

le code fonctionnait à merveille avant.

j'ai rajouté le for each pour parcourir toutes les feuilles
puis le if pour éliminer la feuille si elle existe déjà

par contre la création de feuille devrait être en dehors du if je pense sinon il la supprimera sans rien créer mais le pb ne vient pas de là...
 
Dernière édition:

martinhic

XLDnaute Nouveau
Re : récupérer données d'une depuis choix d'une combobox et listes conditionnelles

Je viens de trouver donc je poste si jamais quelqu'un rencontre le pb :

il fallait rajouter que l'on se trouvait dans les feuilles du document, donc :

VB:
For Each fl In ActiveWorkbook.Worksheets

au lieu de

VB:
For Each fl In ActiveWorkbook

j'ai remplacé le "Sheets" du Dim par "Worksheet" mais je sais pas si ça change grand chose...
 

Discussions similaires

Statistiques des forums

Discussions
311 733
Messages
2 082 015
Membres
101 867
dernier inscrit
XFPRO