[VBA] Userform et fonctions conditionnelles

crashoverall

XLDnaute Nouveau
Bonjour le forum !

Je fais un travail sur excel avec des macros en VBA, n'étant pas informaticien je calle sur certaines fonctions.

J'ai appris sur le tas le VBA depuis qq semaines (le soir à la fin mon boulot). En gros j'ai un projet professionnel, je crée un outil de contrôle et de création de rapport automatique mais j'avoue que je calle sur une fonction qui est sans doute pas compliquée, mais là je ne trouve pas tout seule (désolé j'apprend petit à petit ).

La macro qui me pose problème est la suivante :

J'utilise un userform à deux variables :

- la première une compobox à 5 variables
- la deuxième une case saisissable
Un bouton OK pour valider.

En gros ce que je veux faire c'est lorsque l'on choisi dans la combobox la variable 1, 2... ou 5 il effectue une fonction bête de copie (que je sais faire hein !), mon problème c'est que je ne comprends pas comment géré les conditions dans un userform/combobox (avec les variables if ou autre cela doit marcher, mais je ne sais pas comment appeler les variables de la combobox :/).

Comment puis-je les appeler ?

Pour ma deuxième cellule : pareille je veux que l'utilisateur saisisse une date, puis que cette date ce copie dans une cellule spécifique (elle sert pour ma page de garde de mon rapport, que j'appel dans une autre macro).

Bien entendu le choix de la compobox et la saisie de la date sont validés par un bouton OK (et là encore je ne sais pas comment faire pour que ce bouton exécute le code).

Désolé ci la question a déjà été posée, mais j'ai effectué des recherches à plusieurs jours d'intervalles et je n'ai rien trouvé.

Si vous pouvez m'aider, cela sera très pratique !

Merci d'avance.


PS: J'ai mis un fichier ci-joint :

J'aimerai quand on ouvre le fichier, on clic sur test.

Là un userform apparait avec une première combobox (au choix : Bretagne, Est...).

J'aimerai quand tu choisi "Est" et que tu clic sur le bouton ok, copier les cellules D322 de la feuil2 dans les cellules A2:A21 de la feuil3.

Si tu choisi "Bretagne", cela copie les cellules B3:B22 de la feuil2 dans les cellules A2:A21 de la feuil3. Etc pour les autres régions...

Pour la date saisie elle va ce copier (quand tu clic sur le bouton ok) dans la cellules H18 de la feuil1.

Merci d'avance
 

Pièces jointes

  • Test userform.xlsm
    21 KB · Affichages: 208
  • Test userform.xlsm
    21 KB · Affichages: 213
  • Test userform.xlsm
    21 KB · Affichages: 215

JNP

XLDnaute Barbatruc
Re : [VBA] Userform et fonctions conditionnelles

Bonsoir Crashoverall :),
Code:
Private Sub CommandButton1_Click()
 
End Sub
exécutera le code entre Sub et End Sub après pression de ton OK.
Ton ComboBox s'appelle ComboBox1 (Fenêtre Propriétés, propriété Name que tu peux changer. Si elle n'est pas affichée F4), donc un test en Select Case par exemple devrait faire l'affaire
Code:
Select Case ComboBox1.Value
Case "Est"
'...
Case "Ouest"
'...
End Select
Les ... sont a remplacer par la copie que tu as dit que tu savais faire. Tu peux mettre autant de Case que tu souhaites.
Il te suffit pour la date de mettre un
Code:
Sheets("Feuil1").Range("H18") = TextBox1.Value
en espérant que la date est bien saisie...
Bon courage :cool:
 

crashoverall

XLDnaute Nouveau
Re : [VBA] Userform et fonctions conditionnelles

Salut JNP !

Ah ben voilà une réponse qui me paraît niquel !

Merci pour la réponse, je test cela demain au boulot et je te confirme si cela fonctionne !

Mais a priori la piste me paraît bonne ! C'est vrai que pour la date saisie il faudrait un contrôle de cohérente du genre JJ//MM/AAAA pour valider que la saisie est bien une date, c'est possible je suppose ?
 

JNP

XLDnaute Barbatruc
Re : [VBA] Userform et fonctions conditionnelles

Re :),
C'est vrai que pour la date saisie il faudrait un contrôle de cohérente du genre JJ//MM/AAAA pour valider que la saisie est bien une date, c'est possible je suppose ?
Oui et non, en tout cas, pas en natif... Il n'y a pas de masque de saisie type Acces sous Excel.
2 solutions :
1) Utiliser les événementielles du TextBox (Change pour contrôler la saisie, ajouter les / par exemple, et Exit pour vérifier que la date saisie est valide)
2) Utiliser un contrôle type DTPicker (petit calendrier) mais pour cela, il faut ouvrir le bon outil (Microsoft MonthView Control 6.0 (SP6) par exemple) et avoir la bonne référence (Microsoft Windows Common Controls-2 6.0 (SP6)) ouverte (pas sûr qu'elles figure bien dans toutes les versions...). Exemple joint.
Bon courage :cool:
 

Pièces jointes

  • Exemple DT Picker.xls
    32.5 KB · Affichages: 223

crashoverall

XLDnaute Nouveau
Re : [VBA] Userform et fonctions conditionnelles

Pour le userform je test ça aujourd'hui. Pour ton fichier : impossible de charger l'application car elle n'est pas installé sur la machine.

Je pense que c'est règlé... Par contre SP6 t'es sous windows 2000 ?

En fait chez nous toutes les machines sont pré-installé avec exactement la même config. Des choses sont activées inutilement et vice versa... Oui je sais les pré-install pourrissent les machines, mais on est dans un groupe et on a pas le choix :/

Mais au moins l'avantage c'est que ce qui tourne chez moi, tournera sur l'ensemble des machines !
 

crashoverall

XLDnaute Nouveau
Re : [VBA] Userform et fonctions conditionnelles

Ok j'ai testé avec "case" et effectivement cela marche plutôt bien ! Pour la date également.

J'ai compris le focntionnement a priori. Par contre dernière question, j'aimerai quand on clic sur ok a la fin du traitement que le userform ce ferme. J'ai essayer avec NomDuUserform.Exit ou shutdown ou notshow cela fonctionne pas.

Je sais que dans BVA il y a un outil d'aide à la création de code pré-saisie mais il ne s'affiche pas quand je saisi mon code : Comment qu'on fait ?

Merci beaucoup pour ton aide très utile !
 

JNP

XLDnaute Barbatruc
Re : [VBA] Userform et fonctions conditionnelles

Re :),
SP6 : non, je ne suis pas sous Windows 2000 (XP ou Seven), par contre, le DT Picker date peut-être de cette époque ;)
Groupe = configs identiques : une belle c... sachant que rien les MàJ automatique vont faire la différence, et si on les bloque, bonjour les dégats aussi... Malheureusement, je te comprends, je suis dans une politique similaire (mais je me bats :D), mais pour l'instant, tous les postes ne sont pas encore bloqués :rolleyes:. Le DT Picker peut être installé avec un OCX, mais bon... Et pour l'avantage que tout tournera comme chez toi, excuses-moi de rester septique :p... mais c'est l'expérience qui parle...
De plus, si c'est pour rester en XP et Office 2003, bonjour le progrès...
Saisie automatique : Dans l'éditeur VBA, Outils -> Options cocher "Complément automatique des instructions".
Gestion de l'USF : Au lieu du nom de l'USF, tu peux utiliser "Me". Les instructions peuvent être dans 2 sens suivant les cas
Code:
Unload Me 'ferme l'USF en vidant les données
Me.Hide 'cache l'USF sans le fermer
Me.Show 'réaffiche l'USF
sont les principales.
Bon courage :cool:
 

crashoverall

XLDnaute Nouveau
Re : [VBA] Userform et fonctions conditionnelles

Ok merci pour les aides c'était parfait !

Ne m'en parle pas, chez nous toutes les bécanne sont encore sous XP et office 2007... Avec évidement des drivers et des softs que le 3/4 des personnes n'utilise même pas ! Je pense le but est de nous ralentir nos laptop :)

Par contre pour en revenir à mon fichier Excel, j'ai imaginé encore un autre userform mais cette fois-ci gérant des filtres auto.

En gros, moi dans mon fichier excel j'importe des données a partir d'un Application.GetOpenFilename je place les données sur un onglet qui est utilisés par d'autres macros et des tas de formules (tableaux, graphiques...).

Sur l'onglet où j'ai placé mes données j'ai mis des filtres auto. Mais vu le nombre de colonnes (150 environs), j'ai imaginé utiliser un userform qui puisse gérer les filtres à distances pour 5 ou 6 colonnes.

En gros, j'aimerai récupérer les résultats du filtre auto pour certaines colonnes sous forme de comboBox. Le problème moi j'arrive a récupérer que l'ensemble des données de la colonnes (sans considération pour les doublons) = immonde :D

C'est possible de filtrer les colonnes d'un sheet à travers un userform ?

La deuxième partie des colonnes j'aimerai pouvoir les filtrer à travers une listbox fixe.


Mes deux soucis :

- comment récupérer les résultats d'un filtre auto ?
- comment faire pour filtrer une colonne à partir d'une listebox fixe (voir d'un text box) ?

Du moins, merci déjà pour tous les tips fournis !
 

JNP

XLDnaute Barbatruc
Re : [VBA] Userform et fonctions conditionnelles

Re :),
Pour le filtre auto, tu peux t'inspirer de ça
Code:
Dim I As Integer
I = 2
While Cells(I, 1) <> ""
If Cells(I, 1).EntireRow.Hidden = False Then MsgBox Cells(I, 1)
I = I + 1
Wend
Pour la liste sans doublon et triée, tu peux t'inspirer des excellents codes de JB
Code:
Private Sub UserForm_Initialize()
  Set MonDico = CreateObject("Scripting.Dictionary")
  For Each c In Range([b2], [B65000].End(xlUp))
    MonDico.Item(c.Value) = c.Value
  Next c 
  temp = MonDico.items
  '--
  Call tri(temp, LBound(temp), UBound(temp))
  Me.ComboBox1.List = temp
End Sub
 
Sub tri(a, gauc, droi) ' Quick sort
  ref = a((gauc + droi) \ 2)
  g = gauc: d = droi
  Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      g = g + 1: d = d - 1
    End If
  Loop While g <= d
  If g < droi Then Call tri(a, g, droi)
  If gauc < d Then Call tri(a, gauc, d)
End Sub
Bon courage :cool:
 

crashoverall

XLDnaute Nouveau
Re : [VBA] Userform et fonctions conditionnelles

Merci, j'ai regardé rapidement le code de JB, je vois bien le principe je comprend bien la première partie, la deuxième c'est plus technique mais je vois ou il veut en venir, mais je vois pas comment le mettre dans la comboBox pour récupérer ma colonne sans doublons triée dans ma liste.

Par contre pour la partie "filtre auto" j'ai pas compris ! :)

Je regarderai plus en détail demain soir et je ferai des tests, car demain en journée j'aurai malheureusement pas le temps (clientèle).
 

JNP

XLDnaute Barbatruc
Re : [VBA] Userform et fonctions conditionnelles

Re :),
Ma réponse concernait uniquement cette partie
En gros, j'aimerai récupérer les résultats du filtre auto pour certaines colonnes sous forme de comboBox. Le problème moi j'arrive a récupérer que l'ensemble des données de la colonnes (sans considération pour les doublons) = immonde :D
- comment récupérer les résultats d'un filtre auto ?
La propriété Cells(I, 1).EntireRow.Hidden te dit si la ligne est masquée ou non (ce qui est le cas des lignes filtrées). Le While Wend te permet de faire une boucle tant que tu trouve une valeur dans la cellule en incrémentant la ligne I (c'est un exemple de boucle qui peux remplacer un For Next). Du fait, au niveau du dico, il suffit de modifier avec un test
Code:
For Each c In Range([b2], [B65000].End(xlUp))
[COLOR=red]If c.EntireRow.Hidden = False Then [/COLOR]MonDico.Item(c.Value) = c.Value
Next c
pour que les valeurs prises ne soient que celles qui sont filtrées. Me.ComboBox1.List = temp te permet de charger à la fin les valeurs dans ton ComboBox.
Maintenant pour mettre des filtres automatiques
Code:
Sheets("Feuil1").Range("A1").AutoFilter
qui fonctionne en bascule (je mets, j'enlève). La même instruction en lecture te permet de savoir si le filtre est activé ou non.
Enfin, pour filtrer depuis une TextBox
Code:
Sheets("[COLOR=red]Feuil1[/COLOR]").Range("[COLOR=red]$A$1:$B$7[/COLOR]").AutoFilter Field:=[COLOR=red]1[/COLOR], Criteria1:="[COLOR=red]Toto[/COLOR]"
a besoin dans l'ordre de la feuille et de la plage, du N) de colonne de la plage et de la valeur à filtrer (donc remplacer "Toto" par TextBox1.Value). Si tu veux du multicritère, il faut que tu envoie un tableau
Code:
Criteria1:=Array("[COLOR=red]Toto[/COLOR]", _
        "[COLOR=red]Titi[/COLOR]", "[COLOR=red]Tata[/COLOR]"), Operator:=xlFilterValues
Bon courage :cool:
 

Discussions similaires

Réponses
9
Affichages
136
Réponses
2
Affichages
312

Statistiques des forums

Discussions
312 193
Messages
2 086 058
Membres
103 110
dernier inscrit
Privé