Bonjour à tous,
Comment lister les mardi et les mercredi d'une année en VBA
Merci d'avance
Comment lister les mardi et les mercredi d'une année en VBA
Merci d'avance
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
si tu fais une recherche sur le Net
un lien parmi d'autres LolLBound et UBound vba
etLowBound= Limite Basse
UpperBound= Limite Supérieure
Limite haute et limite basse mais ça ne m'aide pas beaucoup plus, pour vous c'est peut-être logique mais pas pour d'autresBonsoir 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.
Bonjour Laurent,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 à
[Précisions pour Nico_J]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.
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).[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.