XL 2010 VBA convertir fonction SI

spike29

XLDnaute Occasionnel
Bonjour,

Débutant en VBA, je souhaite convertir deux formules Excel en VBA.

Les voici :

En cellule E24
SI(D8="Vendredi";L8+2;SI(D8="Samedi";L8+1;L8))

En cellule G24
=SI(D8="vendredi";$L$8+3;SI(W8="NUIT";$L$8;SI(W8="JOUR";$L$8+1;)))


La quasi intégralité de mon fichier est protégé afin d'éviter des suppressions involontaires (code de protection "spike")
Pour les cas particuliers comme les fériers ou autres, l'utilisateur pourra être amené à directement modifier les dates dans les cellules E24 et G24 pour qu'elles correspondent au besoin du moment.


J'aimerai également qu'une inputbox lui propose OUI/NON s'il veut modifier la date dans la cellule qu'il sélectionne (E24 ou G24)
S'il coche "OUI" cela aura pour action de déprotéger la cellule.

En PJ, un fichier exemple pour mieux illustrer mon besoin.

Merci d'avance pour votre aide.

Bonne journée à toutes et à tous !

Spike.
 

Pièces jointes

  • TEST.xlsx
    25.3 KB · Affichages: 23

spike29

XLDnaute Occasionnel
Bonjour Staple,

Si l'utilisateur modifie E24 ou G24 il déclenchera ensuite le reste de ma macro en cliquant sur un bouton dédié, qui après moultes séquences aura pour finalité de sauvegarder le workbook et de le fermer.
Il faut donc que la formule initialement contenue en E24/G24 réapparaisse systématiquement lors de chaque ouverture du workbook.

A placer dans ta macro contenue en Feuil1

VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Ou bien dans un :

Code:
Private Sub Workbook_Open()

End Sub

Qui serait lui aussi présent dans la Feuil1 et non dans un module classique.

Et du coup on oubli bien la réflexion sur L8 qu'on ne touche pas. Seul E24/G24 sont concernées par mon besoin.

En PJ le fichier avec ton premier code fourni pour L8 (qui au passage fonctionne bien ^^) mais qu'il faudrait réadapter pour E24/G24 uniquement.

j'identifie donc 2 étapes :

1) Trouver comment reformuler en VBA la formule contenue dans E24/G24
2) Adapter ton code initialement utilisé pour L8 pour qu'il traite E24/G24 (je parle bien là de l'inputbox permettant de déprotéger la cellule que l'on sélectionne) ;)

Etant totalement incapable de réaliser l'étape 1 comme la 2 d'ailleurs je sollicite ton aide :)

Merci d'avance et bonne après-midi à toi.
 

Pièces jointes

  • TEST.xlsm
    33.1 KB · Affichages: 4

Staple1600

XLDnaute Barbatruc
Bonjour le fil

Si j'ai bien compris, et donc avec avance, petit Kdo pour le réveillon du 31

VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("E24:G24")) Is Nothing Then
mDate = InputBox("Modifier la date?", "Modification", Date)
If StrPtr(mDate) = 0 Then
[E24].FormulaLocal = "=L8+2*(JOURSEM(L8;2)=5)+1*(JOURSEM(L8;2)=6)"
[G24].FormulaLocal = "=L8+3*(JOURSEM(L8;2)=5)+1*(W8=""JOUR"")"
ElseIf mDate = vbNullString Then
[E24].FormulaLocal = "=L8+2*(JOURSEM(L8;2)=5)+1*(JOURSEM(L8;2)=6)"
[G24].FormulaLocal = "=L8+3*(JOURSEM(L8;2)=5)+1*(W8=""JOUR"")"
ElseIf IsDate(mDate) Then
Target = mDate
End If
End If
End Sub

A tester en situation réelle.
 

eriiic

XLDnaute Barbatruc
Bonjour à tous,

pour rétablir tes formules à l'ouverture :

VB:
Private Sub Workbook_Open()
    With Worksheets("Feuil1")
        .Range("E24").FormulaR1C1 = "=R[-16]C[7]+2*(WEEKDAY(R[-16]C[7],2)=5)+1*(WEEKDAY(R[-16]C[7],2)=6)"
        .Range("G24").FormulaR1C1 = "=R[-16]C[5]+3*(WEEKDAY(R[-16]C[5],2)=5)+1*(R[-16]C[16]=""JOUR"")"
    End With
End Sub
eric
 

spike29

XLDnaute Occasionnel
Bonsoir !

Merci à tous les deux et merci pour vos réponses.

Par curiosité et prochainement par nécessité j'ai essayé d'adapter le code de Staple pour d'autres groupes de cellules mais a chaque fois cela me met une erreur sur la méthode intersect target :

VB:
If Not Intersect(Target, Range("E24:G24") And Range("E50:G50") And Range("E76:G76")) Is Nothing Then

J'ai en effet essayé d'ajouter le groupe de cellule:
E50/G50
E76/G76

Mais avec un succès limité... 😅

Autre point Staple, j'ai ajouté toutes les formules que tu m'avais donné, y compris celle pour afficher le jour de la semaine en D8 :

STXT("LuMaMeJeVeSaDi";(JOURSEM(S1600;2)*2)-1;2)

Mais tu pourras le constater, elle m'affiche en ce Jeudi 31, Sa pour Samedi. J'ai remis ma formule d'origine en F12.

Du coup, afin que je reste à l'aise avec mon fichier d'origine je préfère rester avec mes formules d'origines peut-être imparfaites ^^ mais que je maîtrise a peu près.

En E24 E etc... : =SI(D8="Vendredi";L8+2;SI(D8="Samedi";L8+1;L8))

En G24 etc... : =SI(D8="vendredi";$L$8+3;SI(W8="NUIT";$L$8;SI(W8="JOUR";$L$8+1;)))


Du coup, quel serait la déclinaison VBA de ces deux formules ci-dessus svp ?



Pour une meilleur compréhension le fichier en PJ.

Merci d'avance pour votre aide et surtout bon réveillon à toutes et à tous :)

Spike.
 

Pièces jointes

  • TEST.xlsm
    37.1 KB · Affichages: 1

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

=>spike29
1)
Ici détection d'une [pj]
=STXT("LuMaMeJeVeSaDi";(JOURSEM(S1600;2)*2)-1;2)
Où il fallait voir que S1600 ressemble fortement à Staple1600
On en déduira alors que si la date est en L8 alors on aura...

Testes ceci sur une feuille vierge
VB:
Sub D_Day()
[L8] = DateValue("31/12/" & 2020 + Val("Staple1600"))
[D8].FormulaLocal = "=STXT(""LuMaMeJeVeSaDi"";(JOURSEM(L8;2)*2)-1;2)"
End Sub


2) Au départ on parlait de E24 et G24
Si la donne change en cours de route, cela devient une question à tiroirs
Et j'aime pas les tiroirs ;)
On se pince les doigts avec!
 

spike29

XLDnaute Occasionnel
Bonjour et bonne année 2021 (si on peut toujours le souhaiter de la sorte vu l'année 2020 qui vient de s'écouler...^^)

J'ai essayer ton code :

VB:
Sub D_Day()
[L8] = DateValue("31/12/" & 2020 + Val("Staple1600"))
[D8].FormulaLocal = "=STXT(""LuMaMeJeVeSaDi"";(JOURSEM(L8;2)*2)-1;2)"
End Sub

Mais sans succès chez moi (J'ai réutilisé mon code d'origine, le tiens est peut-être plus propre mais je m'y retrouve plus avec le miens).
Bref ne perdons pas de temps sur ce point qui au final ne fait pas parti de ma problématique.

C'est pourtant pratique les tiroirs.
Tu l'auras compris, copier coller "bêtement" des codes qui marche ça ne m’intéresse pas, j'aime bien comprendre leurs fonctionnement pour le moment venu pouvoir les adapter / réutiliser sans soucis, d'ou ma question. ;)

Mais sur ce point j'ai réussi à me dépatouiller en utilisant la bonne syntaxe :

Code:
If Not Intersect(Target, Range("E24:G24, E50:G50, E76:G76")) Is Nothing Then

Et maintenant cela fonctionne à merveille sur les deux autres groupes de cellules.

Concernant la déclinaison de mes deux formules, j'ai bien compris que tu avais utilisé FormulaLocal. pour faciliter la conversion ^^ le champagne ne m'avait pas trop attaqué encore à ce moment là. J'ai donc utilisé ce code comme il se doit, seulement il s'énerve sur les " " utilisé pour les "Vendredi" ou "Jour" "Nuit".

J'ai donc enlevé les " " là il ne bloque pas, en revanche sans surprise, j'ai la mention #NOM? qui apparaît dans mes cellules car la syntaxe n'est pas respectée.

Une idée car là pour le coup je bloque sur cela.

VB:
 [E24].FormulaLocal = "=SI(D8=vendredi;L8+2;SI(D8=Samedi;L8+1;L8))"
        [G24].FormulaLocal = "=SI(ET(D8=vendredi;W8=JOUR);$L$8+3;SI(ET(D8=vendredi;W8=NUIT);$L$8;SI(W8=NUIT;$L$8;SI(W8=JOUR;$L$8+1;))))"


Deux autres points :

1) Quand on décide de modifier par exemple la date contenue en G24 et qu'ensuite on se lance idem pour E24 mais que l'on stoppe l'opération en cliquant sur annulé ou la croix de l'inputbox et bien alors l'ensemble des 6 cellules E24:G24, E50:G50, E76:G76 se remettent à zéro et affiche la date prévu à l'initiale.

Comment faire en sorte que l'action d'annuler la modification d'une date en sélectionnant "annuler" ou la croix de l'inputbox ne viennent pas impacter les autres cellules ?
Il faut laisser la possibilité à l'utilisateur de se rétracter s'il à fait une sélection hasardeuse sans venir remettre à zéro les autres cellules qu'il aurait pu modifier auparavant.


2) Lorsque l'on modifie la date d'une des cellules et que l'on sauvegarde et ferme le workbook. Lors de la réouverture la date modifier reste inchangé, il faut faire l'action de cliquer sur la cellule concerné ou sur l'une des 6 pour qu'elles se remettent à zéro avec le code prévu à cet effet.

Étrange car j'utilise bien la fonction Workbook_Open dans Thisworkbook

Code:
Private Sub Workbook_Open()

    With Worksheets("Feuil1")
    
    ActiveSheet.Unprotect Password:="sandman"
    
        [E24].FormulaLocal = "=SI(D8=vendredi;L8+2;SI(D8=Samedi;L8+1;L8))"
        [G24].FormulaLocal = "=SI(ET(D8=vendredi;W8=JOUR);$L$8+3;SI(ET(D8=vendredi;W8=NUIT);$L$8;SI(W8=NUIT;$L$8;SI(W8=JOUR;$L$8+1;))))"
        [E50].FormulaLocal = "=SI(D8=vendredi;L8+2;SI(D8=Samedi;L8+1;L8))"
        [G50].FormulaLocal = "=SI(ET(D8=vendredi;W8=JOUR);$L$8+3;SI(ET(D8=vendredi;W8=NUIT);$L$8;SI(W8=NUIT;$L$8;SI(W8=JOUR;$L$8+1;))))"
        [E76].FormulaLocal = "=SI(D8=vendredi;L8+2;SI(D8=Samedi;L8+1;L8))"
        [G76].FormulaLocal = "=SI(ET(D8=vendredi;W8=JOUR);$L$8+3;SI(ET(D8=vendredi;W8=NUIT);$L$8;SI(W8=NUIT;$L$8;SI(W8=JOUR;$L$8+1;))))"
            
  
    ActiveSheet.Protect Password:="sandman"
 
    End With
    
End Sub

Comme toujours je joint le fichier actualisé en PJ.
N'hésitez pas à l'utiliser et a directement travailler dessus, cela facilitera l'échange.

Merci d'avance pour votre aide et bonne après-midi à toutes et à tous :)
 

Pièces jointes

  • TEST222.xlsm
    37.8 KB · Affichages: 2

Staple1600

XLDnaute Barbatruc
Bonjour le fil,

1) Tu as testé comment le code D_Day?
(selon mes indications ou pas ?)

2) Je continue à ne pas aimer les tiroirs
(ce qui en langage XLDien veut dire
une question= une discussion
donc
une nouvelle question= une nouvelle discussion)

3) La syntaxe VBA comme toute syntaxe a ses régles
Si on les transgresse alors, des choses comme #NOM peuvent survenir

4) Si j'ai mes codes dans Selection_Change(), il y avait sans doute une raison

5) meilleurs voeux
;)
 

Discussions similaires

Statistiques des forums

Discussions
312 218
Messages
2 086 363
Membres
103 197
dernier inscrit
sandrine.lacaussade@orang