Function VBA

Giu - Modifié par jordane45 le 22/01/2016 à 17:38
 Giu - 25 janv. 2016 à 12:31
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.

7 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
22 janv. 2016 à 17:41
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";"")


0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
23 janv. 2016 à 00:53
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
23 janv. 2016 à 01:10
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.
0
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!
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 22/01/2016 à 17:42
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.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié par vb95 le 22/01/2016 à 18:11
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. 
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 22/01/2016 à 19:08
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
22 janv. 2016 à 20:00
Bonsoir ucfoutu
Si tous les "vicelards" et "tordus" étaient aussi performants que toi ces termes seraient des qualités et non des défauts !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 23/01/2016 à 00:50
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 23/01/2016 à 10:49
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.
0
Bonjour ucfoutu,

Merci pour tous tes messages! je vais prendre quelque mois pour te répondre!
0
Rejoignez-nous