× Aidez la recherche contre le COVID-19 avec votre ordi ! Rejoignez l'équipe PC Astuces Folding@home
 > Tous les forums > Forum Bureautique
 A la manière de... la fonction MsgBox !Sujet résolu
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
galopin01
  Posté le 16/12/2007 @ 14:25 
Aller en bas de la page 
Astucien

bonjour,

A la manière de.. la fonction MsgBox, on souhaite identifier chaque jour de la semaine :
Lundi, Mardi...
par un nombre permettant d'identifier toutes les sélections possibles
Lundi = 1
mardi = 2
mercredi = 4
jeudi = 8
vendredi = 16
samedi = 32
Dimanche = 64

ainsi si l'on coche :
lundi + mardi = 3
lundi + mardi + mercredi = 7
samedi + dimanche = 96
tous les jours = 127
La problématique est de réaliser une fonction qui décode la "valeur_somme" d'une manière ou d'une autre (la plus simple possible)

Par exemple 101 identifie de manière certaine :
Lundi + Mercredi + Samedi + Dimanche

Cette fonction renvoie un résultat satisfaisant car nous ne travaillons que sur 7 éléments :

Function DECSUM(i As Byte)
Dim Arr(1 To 7)
Arr(7) = i > 63: If Arr(7) Then i = i - 64
Arr(6) = i > 31: If Arr(6) Then i = i - 32
Arr(5) = i > 15: If Arr(5) Then i = i - 16
Arr(4) = i > 7: If Arr(4) Then i = i - 8
Arr(3) = i > 3: If Arr(3) Then i = i - 4
Arr(2) = i > 1: If Arr(2) Then i = i - 2
Arr(1) = i = 1
DECSUM = Arr
End Function

Sub test()
Range("A2:G2") = DECSUM(101)
End Sub

Il est ainsi facile au prix d'une modification anodine (ou d'une boucle) de tester si mercredi appartient à "valeur_somme" ou non.

Mais... je renifle qu'une méthode plus générique est possible pour n éléments. De plus tout le tableau ne m'intéresse pas forcément.

Peut-être même existe-t-il une manière plus intelligente de gérer une telle somme, pour identifier chaque élément ?

Une piste ?

Bon dimanche.



Modifié par galopin01 le 16/12/2007 14:27
Publicité
ferrand
 Posté le 16/12/2007 à 20:31 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Salut Galopin,

Je te proposerais une adaptation utile :

Function DECSUM(n As Byte)
Dim i As Byte, Arr(6)
For i = 0 To 6
If 2 ^ i And n Then Arr(i) = WeekdayName(i + 1) Else Arr(i) = ""
Next
DECSUM = Arr
End Function

On peut arranger ça de diverses façons mais l'élément essentiel est la comparaison au moyen de l'opérateur And extrêmement rapide, et aussi le fait que les puissances de 2 peuvent s'incrémenter dans une boucle.

Je ne l'ai pas inventé, j'utilise ce système depuis longtemps après être tombé sur un article consacré aux opérateurs permettant des comparaisons au niveau du bit (je ne saurais plus retrouver ni l'article, ni l'auteur...)

Je n'avais par contre jamais pensé à l'utiliser dans des fonctions, surtout matricielles (c'est la première fois que j'en fais une (que j'en adapte une plus précisément).

Ce qui m'éclairerait, c'est de savoir pourquoi elle fonctionne bien quand je sélectionne 7 cellules en ligne, mais pas si je les sélectionne en colonne.

A plus.

PS: On peut balayer un grand nombre d'éléments mais la limite me paraît résider plutôt dans la progression des puissances de 2. La sélection de 19 éléments donne déjà 1048575.



Modifié par ferrand le 16/12/2007 20:39
galopin01
 Posté le 16/12/2007 à 21:10 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

bonsoir et merci,

Trop fort ! Je me doutais bien que c'étais un truc pour toi.

Bien d'accord sur la limitation du nombre des éléments. Bien entendu dans ce cas ça ne pose pas de problème, mais j'ai voulu généraliser car ce n'est pas la première fois que j'utilise cette progression, et à chaque fois je me pose un peu la question car il est clair que ma méthode est un peu rustique...

Je verrais ça demain car aujourd'hui, je suis complètement HS.

A+



Modifié par galopin01 le 16/12/2007 21:17
galopin01
 Posté le 16/12/2007 à 21:18 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien
Zarbi... impossible de cocher résolu en modification ??
ferrand
 Posté le 16/12/2007 à 21:28 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

galopin01 a écrit :

Je verrais ça demain car aujourd'hui, je suis complètement HS.

A+


Il me semblait un peu après avoir lu le sujet sur les arrondis. Je n'ai pas eu le temps de retrouver un sujet similaire où un certain Galopin avait proposé avec brio les fonctions PLAFOND et PLANCHER...

Bonne nuit.

galopin01
 Posté le 17/12/2007 à 09:51 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

bonjour,

Ce qui m'éclairerait, c'est de savoir pourquoi elle fonctionne bien quand je sélectionne 7 cellules en ligne, mais pas si je les sélectionne en colonne.

Probablement un problème de déclaration de type : Un fonction renvoie une variable pas un tableau. (Mais cette variable peut contenir un Array(1 dimension)

???

On peut contourner le problème avec une boucle de transposition ou de cette manière :

Sub DECSUM(n As Byte)
Dim i As Byte, Arr()
Range("A1:A7").Clear
Arr() = Range("A1:A7")
For i = 1 To 7
Arr(i, 1) = IIf(2 ^ (i - 1) And n, 1, "")
Next
Range("A1:A7") = Arr()
End Sub

Sub test()
DECSUM 101
End Sub

Bon j'suis pas sur qu'avec ça tu seras mieux éclairé ! mébon... ç'est ce que j'ai trouvé de mieux pour mes petits pb au ras des paquerettes !

A+



Modifié par galopin01 le 17/12/2007 09:54
ferrand
 Posté le 17/12/2007 à 10:50 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

, Merci, ta procédure fonctionne en forçant le tableau en colonne. Si j'inverse et remplace A1:A7 par A1:G1, elle fonctionne aussi et j'obtiens un résultat en ligne. Ce qui m'a donné l'idée de doubler le tableau pour ma fonction matricielle : Arr(6,6), j'affecte Arr(i,0) et Arr(0,i)=Arr(i,0). Là ça fonctionne en formule matricielle aussi bien en ligne qu'en colonne.

Je suis pas sûr d'avoir bien tout compris. Je laisse décanter. Prochain essai : dimensionner le tableau en fonction de la plage choisie, ligne ou colonne... A plus.

galopin01
 Posté le 17/12/2007 à 11:40 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Oui bien sur... C'est le tableau à base 0 qui me perturbait, mais ça marche très bien même sur une fonction :

Function FSUM(n As Byte)
Dim i As Byte, Arr(6, 1)
For i = 0 To 6
Arr(i, 0) = IIf(2 ^ i And n, 1, "")
Next
FSUM = Arr
End Function

Sub test()
Range("A1:A7") = FSUM(101)
End Sub

A+



Modifié par galopin01 le 17/12/2007 11:43
ferrand
 Posté le 17/12/2007 à 22:38 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

On peut pas compacter plus !

Mais pourquoi la 2e dimension du tableau à 1 ?

Publicité
galopin01
 Posté le 17/12/2007 à 23:42 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

J'te dis que ça me perturbe... Effectivement 0 convient très bien !

n2c_coxiste
 Posté le 16/01/2008 à 19:21 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

bon sang, vous achetez votre herbe ou???

Sujet de ouf quand même!!! bon, je vais prendre mes cachets. Chapeau les gars.

Greg.

Page : [1] 
Page 1 sur 1

Vous devez être connecté pour poster des messages. Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !


Les bons plans du moment PC Astuces

Tous les Bons Plans
89,90 €Alimentation PC modulaire Gigabyte P750GM (750W, 80+Gold) à 89,90 €
Valable jusqu'au 04 Octobre

RueDuCommerce fait une promotion sur l'alimentation PC modulaire Gigabyte P750GM (750W, 80+Gold) qui passe à 89,90 € au lieu de 109,90 € ailleurs. Tous les câbles plats noirs sont de conception modulaire. Installez uniquement les câbles dont vous avez besoin pour réduire l’encombrement, augmenter le débit d’air et améliorer les performances thermiques du châssis.


> Voir l'offre
28,49 €Jeu de société Unlock! Star Wars à 28,49 €
Valable jusqu'au 30 Septembre

Amazon fait une promotion sur le jeu de société Unlock! Star Wars qui passe à 28,49 € livré gratuitement grâce à un coupon de réduction automatiquement appliqué au produit. Plongez dans l'univers de Star Wars avec ce nouvel opus d'Unlock avec 3 aventures inédites pleines de vaisseaux, de droïdes et d’action dans l'univers culte de Star wars ! Unlock! est un jeu de cartes coopératif inspiré des escape rooms, ces salles où vous devez vous échappez en moins de 60 minutes ! L'application gratuite Unlock!, compatible avec les téléphones et tablettes Android et iOS, est nécessaire pour jouer. Elle permet d'obtenir des indices, de repérer des objets cachés, mais aussi d'entrer les codes découverts. Elle contribue également à l'ambiance avec ses musiques dédiées à chaque aventure, ses énigmes audio, ses terribles pénalités et son compte à rebours fatal ! Unlock ! vous permet de vivre cette expérience dans votre salon ! Réussirez-vous à résoudre les énigmes pour vous échapper ?


> Voir l'offre
GratuitJeu PC Rocket League gratuit + bon d'achat de 10 €
Valable jusqu'au 23 Octobre

Epic Game Store offre actuellement le jeu PC Rocket League. Rocket League est un jeu hybride mêlant jeu de football d'arcade et carnage à quatre roues dans d'intenses rencontres à la jouabilité intuitive basée sur la physique. De plus, si vous téléchargez le jeu avant le 23 Octobre, Epic vous offre un bon de 10 € valable sur son catalogue pour un achat de plus de 14,99 € avant le 1er Novembre.


> Voir l'offre

Sujets relatifs
Fonction RANG
Comment choisir la "fonction" de mes mails ?
EXCEL: Fonction DATEDIF
VBA Excel valeur en fonction de cellules
Fonction Si ou Macro ?
tarif en fonction de la date
Compteur d'impression en fonction destinataire
afficher une cellule en fonction d'une autre cellule
fonction SI avec trois critères - cellule en format [h]mm
Somme en fonction du N° de semaine
Plus de sujets relatifs à A la manière de... la fonction MsgBox !
 > Tous les forums > Forum Bureautique