Changer 1 ligne VBA sur une conditionnelle par rapport à aujourdhui
Bonsoir,
Il faudrait arriver à changer la ligne VBA suivante ==>
___________________________
Or j'aimerais qu'à la place de "If Lundi > Date", que chaque cellule des lignes où se trouvent les dates soient comparées à la date d'aujourd'hui.
Exemple :
Admettons, nous sommes aujourd'hui, le mardi 10 février ==> Donc toutes les cellules strictement supérieures au 10 février, pourront se voir appliquer les croix...
Donc ça oblige à tester les cellules C3, F3, I3, L3, ... AD3 et aussi toutes les lignes suivantes C7, F7, I7, L7, ... AD7 etc, etc pour tout le tableau ==>
En réalité on teste toutes ces cellules pour repérer celle qui contient le jour d'aujourd'hui !
______________________________________
_____________________
Merci à vous...
Bonne soirée
_____________________
Sub M_PreBarrage(Optional SH As Worksheet)
'*************************************************************************************************
'chaque cellule aune propriété "ID" qui selon MS sert pour "identifying labels for webpages, blabla ..."
'bon, inappropriate use, je l'utilise pour sauvegarder le statut du "Croix" de la cellule, c'est plus pratique et plus rapide que les "comments"
'les statuts: 0 = sans croix, 1 = croix rouge, 2 : croix noir
'le temps pour lire ou écrire l'ID est négliable
'*****************************************************************************************************
' Procédure réagissant au Paramètre 1 ou autre en J2 de l'onglet Paramètres :
' 1 = mettre une croix
' Autre : enlever la croix
'*************************************************************************************************
Dim c, Arr, TBL, bPM, bImPair, i, j, j1, iWeekday, r, aBorders, bPrebarrage, Lundi, bDiagonal
t = Timer
If SH Is Nothing Then Set SH = ActiveSheet 'si on ne sait pas la feuille, c'est la feuille actuelle
If SH.Name Like "*## *##" Then 'nom de la feuille ressemble à cela
Application.ScreenUpdating = False
bPrebarrage = (Range("pre_barrage").Value = 1) ' on demande "pré-barrage"
TBL = Range("t_Semaine").Value2 'TS avec les propriétés des tâches
With SH
Set c = .Range("C2:AF41") 'votre plage
Arr = c.Value2 'lire vers matrice
For i = 3 To UBound(Arr) Step 4 'les lignes avec les tâches
Lundi = Arr(i - 1, 1) 'première cellule de la ligne dessus = lundi
If Lundi > Date And Len(Lundi) Then ' NEW - Tester ICI
bImPair = (WorksheetFunction.IsoWeekNum(Lundi) Mod 2 = 1) 'semaine impaire ?
j1 = Application.Max(1, (Date - Lundi) * 6 + 1) 'on ne touche pas aux colonnes d'une date dans le passé (6 colonnes par jour)
For j = 1 To UBound(Arr, 2) 'boucler horizontal
Debug.Print c.Cells(i, j).Address
bDiagonal = (TBL(j - bImPair * 30, 6) = 1) 'on veut le diagonal et le pré-barrage
If bDiagonal And c.Cells(i, j).ID = "" Then c.Cells(i, j).ID = "2" 'quand l'ID n'est pas connu, on commence avec un croix noir
M_Bordures c.Cells(i, j), Array(-bPrebarrage * Val(c.Cells(i, j).ID), xlNone, 0, c.Cells(i, j).Borders(xlDiagonalDown).LineStyle = xlNone) 'matrice avec la valeur de l'ID, linestyle "xlnone" et couleur "noir" du bordure
Next
End If
Next
End With
End If
bHS_NouvelleFeuille = False 'RAZ ce drapeau
End Sub
Bonsoir,
je n'ai pas pris le fichier mais essayez If c > Date Then
Bonjour,
il ne faut pas mettre And Len(Lundi), juste If c > Date Then
Il me semble que les cellules contenant autre chose que des chiffres (ce que sont les dates) seront ignorées.
Si ça ne va pas, essayez : If c > Date And IsNumeric(c) Then
Sinon je ne vois pas.
Bonsoir Doux Rêveur et merci beaucoup,
J'avais testé en mettant ta première solution sans le "And Len(Lundi)" mais j'avais quand même l'erreur.
Et en testant ta nouvelle solution, ça ne change pas ==>
Je pense qu'il faut tester, comme je l'avais indiqué dans le message initial du sujet, uniquement les cellules concernées avec une formule colonnes/lignes mais je ne sais pas faire
Tester les cellules C3, F3, I3, L3, ... AD3 et aussi toutes les lignes suivantes C7, F7, I7, L7, ... AD7 etc, etc pour tout le tableau...
En tout cas merci d'avoir tenté
Bonne soirée
à bientôt...
Bonjour Vodoraix,
Je m'aperçois que tu nous indiques ce que tu voudrais avoir, mais jamais comment tu fais pour l'avoir
Donc, par rapport à ta demande, comment le code est exécuté !?
Tu cliques sur un bouton, tu saisis une valeur, autre ..
Quel est le résultat escompté, capture d'écran de ce que tu veux ?
Sinon ta boucle initiale
For i = 3 To UBound(Arr) Step 4 Parcours les lignes de la 3ème à X toutes les 4 lignes, donc : 3, 7, 11, etc...
Donc les cellules qui sont dans le tableau Arr() sont bien testées pour moi
Lundi = Arr(i - 1, 1) Récupère bien la date de la cellule
De plus "c" est une plage, donc tester
C > dateN'est pas possible => Incompatibilité de type = logique
A te lire
Bonjour JExcel2fr et merci pour ton aide
Je m'aperçois que tu nous indiques ce que tu voudrais avoir, mais jamais comment tu fais pour l'avoir
Jamais est un bien grand mot puisqu'il s'agit toujours du même problème sur les 4 derniers sujets dont un sur lequel tu as participé, et d'ailleurs c'est très sympa de ta part ==>
https://forum.excel-pratique.com/excel/pas-appliquer-1-sub-si-les-cellules-ont-une-date-inferieure-a...
Donc ça vient de la valeur en J2 sur la feuille paramètres :
- Si je mets "1" ==> Apparition des croix provenant du tableau de la feuille paramètres
- Si on met autre chose ==> Toutes les croix sont effacées
_______________________________
Sinon, merci pour la boucle, je crois que j'ai compris mais alors pourquoi j'ai toutes les croix automatiques sur toute une ligne de la semaine et pas seulement à partir du lendemain de la date d'aujourd'hui ==> Voir précisions au tout début de ce sujet...
Ne faut-il pas également boucler sur les colonnes C donc 3, F donc 6, I donc 9, etc... ? Comme je l'écris au au tout début du sujet ?
Merci...
Bonne journée
