Function VBA

-
Bonjour,
J'ai une liste de personnes qui participent à des activités. chaque activité est une colonne . Si les personnes sont inscrite à l'activité dans la case correspondante est marque avec un x. il y a 3 activités. Je voudrais marquer dans une autre case "uniquement danse" si les inscrits participent que à l'activité danse.

J'ai écrit cette fonction sur VBA mais elle ne marche pas. Quelqu'un peut m'aider?
Function type_activite(danse As String, couture As String, decors As String)
Dim xdanse As Boolean
Dim xcouture As Boolean
Dim xdecors As Boolean
Dim c As String

If danse = "x" Then xdanse = True
End If
If couture = "x" Then xcouture = True
End If
If decors = "x" Then xdecors = True
End If

If xdanse = True And xcouture = False And xdecors = False Then c = "uniquement danse"
End If


type_activite = c

End Function


Merci!!


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici :ICI

Merci d'y penser dans tes prochains messages.
Afficher la suite 

7 réponses

Messages postés
25792
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 juin 2019
312
0
Merci
Bonjour,


Déjà.. pourquoi ne pas simplement le faire via une FORMULE excel ?
Un truc du genre :

=SI(ET(A1="x";B1<>"x";C1<>"x");"Dance uniquement";"")


vb95
Messages postés
1887
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
20 juin 2019
60 -
bonsoir Jordane45
Remarque très juste : j'y connais rien en VBA
On rejoint là le EDIT de la dernière réponse de ucfoutu
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209 > vb95
Messages postés
1887
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
20 juin 2019
-
Bonjour, jordane45,
Tout-à-fait.
Je me dis toutefois qu'il n'y a pas vraiment de raison utile à afficher dans une cellule ce qui l'est déjà d'une certaine manière (les "x").
Je veux alors croire que le but final est l'exploitation de ces "x" pour la rédaction d'un texte (facture ? devis ? lettre ?)
Mais on n'en sait finalement rien, après tout.
Bonjour Jordane45,

Tu as raison, j'y avais pensé aussi. En effet je voudrais faire plusieurs combinaisons en suite, "décors uniquement, couture uniquement ......" . Et ma tentative avec cette formule n'as pas marché car trop longue!

Mais en vrais je pourrais la faire sur plusieurs colonnes.. mais je voulais éviter! Merci pour ton conseil en tous cas!
Commenter la réponse de jordane45
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
Bonjour,
1) si le code que tu montres ici est le code que tu as écrit (tel quel, par copier/coller), ta formulation "elle ne marche pas" n'est pas correcte. C'est bien pire. Tu as un message d'erreur dont tu ne parles pas !
Ouvre donc s'il te plait ton aide VBA sur la syntaxe d'une expression conditionnelle (tes blocs if ...) . Car c'est là du B.A.BA et un minimum, y compris pour un tout débutant.

2) et où et comment as-tu initialisé les variable danse,couture et decors ?

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Commenter la réponse de ucfoutu
Messages postés
1887
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
20 juin 2019
60
0
Merci
bonjour
1) Les End if sont inutiles si Then est sur la même ligne que If et qu'une seule instruction suive
If danse = "x" Then xdanse = True 


2) Initialise les 3 Boolean à False
Dim xdanse As Boolean = false
Dim xcouture As Boolean = false
Dim xdecors As Boolean  = false


3)
If xdanse = True And xcouture = False And xdecors = False Then
    type_activite = "uniquement danse"
    exit function
End If 
If xdanse = False And xcouture = True And xdecors = False Then
    type_activite = "uniquement couture"
    exit function
End If 


Reste la troisième éventualité avec seulement le décor
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. 
Commenter la réponse de vb95
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
Bonjour, ami vb95,
juste pour nous amuser un peu et conduire Giu à un petit exercice vicieux :
Select Case Len(Trim(String(1, danse & " ")) & Trim(String(10, couture & " ")) & Trim(String(20, decors & " ")))
Case 31: res = "tout"
Case 30: res = "decors et couture"
Case 21: res = "decors et danse"
Case 20: res = "decors seulement"
Case 11: res = "couture et danse"
Case 10: res = "couture seulement"
Case 1: res = "danse seulement"
Case Else: res = "rien"
End Select
MsgBox res

Ok ... je suis un "tordu" et "vicelard" ===>> je sors (avec mes manies arithmétiques "immondes")

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Commenter la réponse de ucfoutu
Messages postés
1887
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
20 juin 2019
60
0
Merci
Bonsoir ucfoutu
Si tous les "vicelards" et "tordus" étaient aussi performants que toi ces termes seraient des qualités et non des défauts !
Commenter la réponse de vb95
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
Merci, vb95.
Mais je disais "tordu" et "vicelard" parce que je faisais tout pour éveiller Giu. En choisissant l'arithmétique, je l'obligeais à analyser du plus "vicieux"
Allez ! on va faire un autre "coup du père François", en un peu moins vicieux (sans arithmétique) :
Select Case UCase(Format(danse & "?", "@@") & Format(couture & "?", "@@") & Format(decors & "?", "@@"))
Case "X?X?X?": res = "tout"
Case "X?X? ?": res = "danse et couture"
Case "X? ?X?": res = "danse et decors"
Case "X? ? ?": res = "danse seulement"
Case " ?X?X?": res = "couture et decors"
Case " ?X? ?": res = "couture seulement"
Case " ? ?X?": res = "decors seulement"
Case Else: res = "rien"
End Select
MsgBox res


et une autre pour la route (on va ici utiliser la valeur de la concaténation de résultats booléens)
Select Case Val((Len(danse) = 1) ^ 2 & (Len(couture) = 1) ^ 2 & (Len(decors) = 1) ^ 2)
Case 111: res = "tout"
Case 110: res = "danse et couture"
Case 101: res = "danse et decors"
Case 100: res = "danse seulement"
Case 11: res = "couture et decors"
Case 10: res = "couture seulement"
Case 1: res = "decors seulement"
Case Else: res = "rien"
End Select
MsgBox res


On en fera d'autres lorsqu'il aura ingurgité ce qu'il a déjà ainsi.
Il a déjà là de quoi analyser et apprendre. Ce sera déjà bien.
Juste pour à la fois rigoler tout en faisant de la gymnastique d'entraînement (cela permet de garder les muscles en forme).
Amlitiés

EDIT : en précisant que je n'utiliserais personnellement rien de tout cela. En lieu et place, je me servirais de la propriété comments de chaque cellule, que je remplirais au worksheet_Change. Il me suffirait ensuite de concaténer (clin d'oeil)
ou encore : pas de comments et en lieu et place : des titres de colonne

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
Giu n'est plus là ...
Dommage, car il aurait commencé son samedi en goutant à celle-ci (arithmétique, encore(hé oui) + booléens + array) et =====>>>
Dim toto As Integer, titi
toto = ((danse = "x") ^ 2) + (((couture = "x") ^ 2) * 2) + (((decors = "x") ^ 2) * 4)
titi = Array("rien", "danse seulement", "couture seulement", "danse et couture", "decors seulement", "danse et decors", "couture et decors", "tout")
MsgBox titi(toto)

Je ne lui recommande aucune de toutes ces méthodes (relire ce que j'en ai dit plus haut), mais l'encourage très vivement à toutes les "décortiquer" (surtout cette dernière). S'il y parvient, il en aura appris beaucoup au passage.

EDIT : un peu d'aide à la compréhension, quand même
True = -1 et False = 0
le carré de True est donc égal à 1 tandis que celui de False est égal à 0
Le reste (mes multiplications par rien pour le 1er, par 2 pour le second et par 4 pour le 3ème ont une justification arithmétique (les plus malins la découvriront)
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Bonjour ucfoutu,

Merci pour tous tes messages! je vais prendre quelque mois pour te répondre!
Commenter la réponse de ucfoutu