XL 2021 Comment lister mardi et mercredi d'une année VBA

job75

XLDnaute Barbatruc
Pour créer le total de l'année il suffit de modifier légèrement ma macro du post #44 :
VB:
Private Sub Worksheet_Calculate()
Dim efface As Boolean, deb&, dat&, i&, a(1 To 120, 1 To 2) '120 = 2 x 53 semaines + 12 + 2
efface = Val(CStr([A1])) <> Val(CStr([Annee])) 'test pour le début de l'année
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
ThisWorkbook.Names.Add "Annee", Val([A1])
deb = 1
With [A3].Resize(UBound(a)) '1ère ligne à adapter au besoin
    .Resize(, 1 - efface).ClearContents 'RAZ
    For dat = DateSerial([Annee], 1, 1) To DateSerial([Annee], 12, 31)
        If Weekday(dat) = 3 Then
            i = i + 1
            a(i, 1) = dat
            If Not efface Then a(i, 2) = .Cells(i, 2)
            .Cells(i).NumberFormat = """Mardi"" * dd/mm/yyyy" 'format Date personnalisé
        ElseIf Weekday(dat) = 4 Then
            i = i + 1
            a(i, 1) = dat
            If Not efface Then a(i, 2) = .Cells(i, 2)
            .Cells(i).NumberFormat = """Mercredi"" * dd/mm/yyyy" 'format Date personnalisé
        End If
        If Month(dat) < Month(dat + 1) Then
            i = i + 1 'saut de ligne
            a(i, 1) = 0
            a(i, 2) = "=SUM(" & .Cells(deb, 2).Resize(i - deb).Address(0, 0) & ")"
            .Cells(i).NumberFormat = """Total"""
            deb = i + 1
        End If
    Next dat
    '---dernier Total et Total année---
    a(i + 1, 1) = 0
    a(i + 1, 2) = "=SUM(" & .Cells(deb, 2).Resize(i + 1 - deb).Address(0, 0) & ")"
    a(i + 3, 1) = 0
    a(i + 3, 2) = "=SUM(" & .Cells(1, 2).Resize(i + 1).Address(0, 0) & ")/2"
    .Cells(i + 1, 1).NumberFormat = """Total"""
    .Cells(i + 3, 1).NumberFormat = """Total année"""
    '---restitution et MFC---
    .Resize(, 2) = a 'restitution
    .Resize(, 2).FormatConditions.Delete 'RAZ
    ThisWorkbook.Names.Add "Jour", Date 'nom défini
    ThisWorkbook.Names.Add "Mini", "=MIN(ABS(" & .Address & "-Jour))" 'formule matricielle nommée
    .FormatConditions.Add xlExpression, Formula1:="=ABS(A3-Jour)=Mini"
    .FormatConditions(1).Interior.Color = vbRed
    .FormatConditions(1).Font.Color = vbWhite
    .FormatConditions(1).Font.Bold = True 'gras
    .Resize(, 2).FormatConditions.Add xlExpression, Formula1:="=""""&$A3=""0"""
    .Resize(, 2).FormatConditions(2).Interior.Color = vbCyan
    .Resize(, 2).FormatConditions(2).Font.Bold = True 'gras
End With
Columns("A:B").AutoFit 'ajustement largeurs
Application.EnableEvents = True 'réactive les évènements
End Sub
 

Pièces jointes

  • Mardi et Mercredi.xlsm
    22 KB · Affichages: 9

Nico_J

XLDnaute Occasionnel
Supporter XLD
re,
j'adhère totalement à ce vous faites job75, mais vous pouvez pas faire une version novice modifiable facilement.
en principe j'arrive plus ou moins à comprendre, mais la c'est vraiment compliqué pour moi.
j'ai quelques rajout à faire mais vraiment incapable à ce niveau là, sans apparemment changer la totalité du code don je ne comprends très mal le sens, apparemment tableau ""UBound"" (chinois pour moi)
mais si ça ne peut qu'être ainsi tampi pour mois.
Ce que je disais à je sais plus quel poste, plus on en as, plus on en veux, mais la je n'ose plus.

A patrick, ta version tableau sl, à l'ai bien aussi mais n'y connais rien non plus.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
Lbound= 1 index de la dimension explicitement cité du tableau
Ubound= dernier index de la dimension explicitement cité du tableau

exemple j'ai une variable tableauqui se nom "tblo" de 10 ligne sur 3 colonnesce tablo est en base 1(exemple pris avec un range)

et bien
pour l la dimension(1)donc les lignes
lbound(tblo) donnera 1
le ubound(tblo) donnera 10

pour l la dimension(2)donc les colonnes
lbound(tblo,2) donnera 1
le ubound(tblo,2) donnera 3

maintenant pour un tblo avec le même nombre de lignes et colonnes MAIS !!! en base 0
pour l la dimension(1)donc les lignes
lbound(tblo) donnera 0
le ubound(tblo) donnera 9

pour l la dimension(2)donc les colonnes
lbound(tblo,2) donnera 0
le ubound(tblo,2) donnera 2

tu l'aura compris lbound et ubound ne donnent pas le nombre mini ou maxi mais les indexs mini ou maxi d'une dimension

voilà Nicolas ;)
 

Staple1600

XLDnaute Barbatruc
[Juste un p'tit complément en passant]
LBound
Pourquoi L ? L pour Low
U
Bound
Pourquoi U ? Pour Upper
Un dictionnaire ou G.Translate te dira ce que Low et Upper veulent dire dans la langue des Beatles
;)
[/Juste un p'tit complément en passant]
 

Staple1600

XLDnaute Barbatruc
Bonsoir ChTi160 ;)

[fin de l'aparté]
Je connaissais la réponse ;)

Je voulais juste encourager Nico_J à lui-même creuser la question dans la langue de Molière
(avec l'outil de son choix: un bon vieux dictionnaire anglais/français ou un outil de traduction sur le Net.
[/fin de l'aparté]

Bon courage à Nico_J sur le chemin de l'apprentissage VBA.
 

Nico_J

XLDnaute Occasionnel
Supporter XLD
Bonsoir ChTi160 ;)

[fin de l'aparté]
Je connaissais la réponse ;)

Je voulais juste encourager Nico_J à lui-même creuser la question dans la langue de Molière
(avec l'outil de son choix: un bon vieux dictionnaire anglais/français ou un outil de traduction sur le Net.
[/fin de l'aparté]

Bon courage à Nico_J sur le chemin de l'apprentissage VBA.
Limite haute et limite basse mais ça ne m'aide pas beaucoup plus, pour vous c'est peut-être logique mais pas pour d'autres
 

Laurent78

XLDnaute Occasionnel
Hello Le forum,
Hello Nico,

Je ne sais pas trop ou c'est bloquant pour toi.
Donc, au cas ou :
Les tableaux en vba sont une suite d'éléments auxquels on "accède" en utilisant un indice.
Si j'appelle mon tableau dans vba tt, je pourrais accéder aux éléments du tableau en utilisant tt(1), tt(2), etc ...

Toutefois, on peut faire en sorte que le premier indice ne soit pas 1, mais par exemple 0, auquel cas on accède au premier élément du tableau par tt(0) et non plus tt(1)

Un tableau pouvant avoir plusieurs éléments dans une même colonne, l'indice pourra par exemple aller de 1 à 20, ou de 0 à 40, ce ne sont que deux exemples;
et bien LBound et Ubound retourne/renvoi ces indices. Dans mes deux exemples juste au dessus, LBound et UBound sont respectivement 1 et 20 dans le premier cas, 0 et 40 dans le second.

Cela permet d'éviter d'aller chercher un élément d'un tableau en dehors dudit tableau, LBound et UBound, nous indiquant les limites basse et haute.

Dans le cas présent, code vba de Job75, le tableau vba s'appelle "a", il est initialisé à 120 lignes parce qu'il est prévu pour 53 semaines max et 2 jours, mardi & mercredi chaque semaine, cela fait donc 53*2=106, mais comme l'on souhaite également des sous totaux par mois, il faut ajouter 12 lignes (1 par mois) + 1 ligne vide + la ligne total général tout en bas.

Petite précision, le tableau a, est de dimension 120x2, pour le dire autrement, il possède 120 lignes et 2 colonnes, soit 240 éléments.

Enfin, ce que tu peux faire, c'est utiliser l'éditeur vba et utiliser la touche F8 pour suivre pas à pas l'exécution du code. Mais avant, supprime, à la main, les mise en forme et les mise en forme conditionnelles (sinon, tout est rouge).

Mets un point d'arrêt dans le code vba(en cliquant dans la marge à la hauteur de
efface = Val(CStr([A1])) <> ...

Ensuite, dans la cellule A1, saisie une autre année que celle qui y figure), en l'occurrence autre chose que 2024.

Voilà, je ne sais pas si cela peut t'aider.

Bonne soirée à tous
 

Nico_J

XLDnaute Occasionnel
Supporter XLD
Hello Le forum,
Hello Nico,

Je ne sais pas trop ou c'est bloquant pour toi.
Donc, au cas ou :
Les tableaux en vba sont une suite d'éléments auxquels on "accède" en utilisant un indice.
Si j'appelle mon tableau dans vba tt, je pourrais accéder aux éléments du tableau en utilisant tt(1), tt(2), etc ...

Toutefois, on peut faire en sorte que le premier indice ne soit pas 1, mais par exemple 0, auquel cas on accède au premier élément du tableau par tt(0) et non plus tt(1)

Un tableau pouvant avoir plusieurs éléments dans une même colonne, l'indice pourra par exemple aller de 1 à 20, ou de 0 à 40, ce ne sont que deux exemples;
et bien LBound et Ubound retourne/renvoi ces indices. Dans mes deux exemples juste au dessus, LBound et UBound sont respectivement 1 et 20 dans le premier cas, 0 et 40 dans le second.

Cela permet d'éviter d'aller chercher un élément d'un tableau en dehors dudit tableau, LBound et UBound, nous indiquant les limites basse et haute.

Dans le cas présent, code vba de Job75, le tableau vba s'appelle "a", il est initialisé à 120 lignes parce qu'il est prévu pour 53 semaines max et 2 jours, mardi & mercredi chaque semaine, cela fait donc 53*2=106, mais comme l'on souhaite également des sous totaux par mois, il faut ajouter 12 lignes (1 par mois) + 1 ligne vide + la ligne total général tout en bas.

Petite précision, le tableau a, est de dimension 120x2, pour le dire autrement, il possède 120 lignes et 2 colonnes, soit 240 éléments.

Enfin, ce que tu peux faire, c'est utiliser l'éditeur vba et utiliser la touche F8 pour suivre pas à pas l'exécution du code. Mais avant, supprime, à la main, les mise en forme et les mise en forme conditionnelles (sinon, tout est rouge).

Mets un point d'arrêt dans le code vba(en cliquant dans la marge à la hauteur de
efface = Val(CStr([A1])) <> ...

Ensuite, dans la cellule A1, saisie une autre année que celle qui y figure), en l'occurrence autre chose que 2024.

Voilà, je ne sais pas si cela peut t'aider.

Bonne soirée à
Bonjour Laurent,
ça bloque pour moi c'est les tableau (et d'autre aussi) , je demandai juste une base modifiable facilement, ou tu t'y retrouve dans les lignes et colonnes.
Le travail que m'a fait job75 est parfait, c'est propre, mais trop propre à mon niveau pour que je puisse modifier quoi que ce soi sans modifier le code entier ( que je ne serai faire, vu tableau apparemment ).
Alors quand j'entand les grosse pointures te dire " creuser la question dans la langue de Molière" , il on tout compris tout de suite.
Avant d'êtres grand faut être petit je crois.
Merci
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Alors quand j'entand les grosse pointures te dire " creuser la question dans la langue de Molière" , il on tout compris tout de suite.
[Précisions pour Nico_J]
Moi, je voulais juste te donner un moyen mnémotechnique sur LBound et Ubound
Ni plus, ni moins
En voici un autre d'ailleurs
L est avant U dans l'alphabet donc L c'est pour inférieur et U pour supérieur
[/Précisions]
Et effectivement tu as raison, généralement on bascule dans le VBA, quand on commence à bien maitriser bien les formules Excel, les TCD, les MFC, etc...
On peut s'y mettre avant mais quand on sort des macros faites avec l'enregistreur de macros, ca devient vite plus ardu.
 

Nico_J

XLDnaute Occasionnel
Supporter XLD
[Précisions pour Nico_J]
Moi, je voulais juste te donner un moyen mnémotechnique sur LBound et Ubound
Ni plus, ni moins
En voici un autre d'ailleurs
L est avant U dans l'alphabet donc L c'est pour inférieur et U pour supérieur
[/Précisions]
Et effectivement tu as raison, généralement on bascule dans le VBA, quand on commence à bien maitriser bien les formules Excel, les TCD, les MFC, etc...
On peut s'y mettre avant mais quand on sort des macros faites avec l'enregistreur de macros, ca devient vite plus ardu.
Je veux rien vous dire en mal, je cherche juste à comprendre, mais là avec les A et compagnie, ubound ou lbound je suis perdu, le vba un un truc qui m'interesse alors que j'y connaissais rien à la base (juste plaisir d'apprendre et qui m'interesse).
Je pensai juste que ma question de base aurai été plus simple et modifiable facilement, style( .cells.... ).
Mais comme je disais, le travail et la patience de job75, rien à dire, trop gentil d'avoir pris autant de tamps.
 

Discussions similaires

Réponses
5
Affichages
289
Réponses
8
Affichages
222

Statistiques des forums

Discussions
312 244
Messages
2 086 558
Membres
103 247
dernier inscrit
bottxok