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
Si c'est l'impression que j'ai pu laisser alors je m'en excuse car j'ai un trop grand respect pour ce forum et ses membres pour volontairement laisser planer cela.
Je te confirme bien là qu'il ne s'agissait que d'un "oubli" de réponse de ma part.
Car le code a bien été testé ;)

Et concernant une éventuelle incruste, oh grand non ! plus on est de participants mieux c'est. Je prends tout les échanges qui peuvent venir c'est comme ça qu'on apprend ou du moins qu'on essaie d'apprendre ^^

Alors déjà merci à toi pour ce code.

Je l'ai placé dans thisworkbook

VB:
Private Sub Workbook_Open()

    With Worksheets("Feuil1")
    
    ActiveSheet.Unprotect Password:="sandman"
    
    

        [E24].FormulaLocal = "=L8+2*(JOURSEM(L8;2)=5)+1*(JOURSEM(L8;2)=6)"
        [G24].FormulaLocal = "=L8+3*(JOURSEM(L8;2)=5)+1*(W8=""JOUR"")"
        [E50].FormulaLocal = "=L8+2*(JOURSEM(L8;2)=5)+1*(JOURSEM(L8;2)=6)"
        [G50].FormulaLocal = "=L8+3*(JOURSEM(L8;2)=5)+1*(W8=""JOUR"")"
        [E76].FormulaLocal = "=L8+2*(JOURSEM(L8;2)=5)+1*(JOURSEM(L8;2)=6)"
        [G76].FormulaLocal = "=L8+3*(JOURSEM(L8;2)=5)+1*(W8=""JOUR"")"
  
  
   .Range("E24", "G24").Calculate
  
  
    ActiveSheet.Protect Password:="sandman"
 
    End With
    
    
End Sub


Cependant, cela ne semble pas résoudre mon problème de mise à jour des cellules lorsque je reclique dessus et que l'on sélectionne "annuler" ou la croix pour quitter.
Peut-être que j'utilise mal ton code, mauvais emplacement ?

Bonne soirée et merci encore pour votre aide :)
 

spike29

XLDnaute Occasionnel
Zappé non, message croisé OUI ^^

je viens de tester le code.
La différence dans mon fichier :

L'affichage des dates est au format US. Lorsque tape : 12.03.2020 j'ai en retour 03/12/2020
Je ne l'avais pas avec le précédent code.

Et ma problématique persiste.

Si en G24 je change la date du jour pour mette le 11/11/2020 et qu'ensuite par erreur je sélectionne E24 et clique sur annulé, G24 se remet aussitôt à jour avec la date du jour.

Pour illustrer mon propos dernière version du fichier en PJ.

Merci d'avance et bon dodo :)
 

Pièces jointes

  • TEST222.xlsm
    41.2 KB · Affichages: 3

eriiic

XLDnaute Barbatruc
Faut être logique.
Je t'avais mis 2 cellules car c'était celles listées au début.
Si maintenant tu en as 6 il faut toutes les mettre, ou .Calculate pour toute la feuille.
Je viens de tester ton dernier fichier.
Si je supprime E24, j'ai bien la formule et 03/01/21 d'affiché à l'ouverture.

Tous mes voeux pour 2021 également Staple, en l'espérant plus calme
 

Staple1600

XLDnaute Barbatruc
Re

Depuis quand on saisit les dates au format US? :rolleyes:
Je bosse en Bretagne, avec Excel tous les jours, je saisis donc mes dates avec des /
:rolleyes:

Depuis le début, je dis que je ne comprends ta logique, puis te précise que je n'aime pas les questions à tiroirs ;)
J'ajoutererai que j'essaie de fuir les usines à gaz.
Et de toujours promouvoir le principe K.I.S.S ;)
(je te laisse chercher qu'est ce principe) et je file sous la couette.
Bonne nuit.

NB: Je reprecise (pour avoir le sommeil léger) que ce message a été rédigé amicalement et sans une once de méchanté.
Juste l'expression de mon opinion (dont le demandeur fera ce qu'il voudra)
 

spike29

XLDnaute Occasionnel
Bonjour à tous les deux,

@eric, dès mon #post41 j'indiquais que la mise à jour à l'ouverture semblait correctement fonctionner.
Je pensais que ton code .Calculate concernait ma problématique restante :

mise à jour des cellules lorsque je reclique dessus et que l'on sélectionne "annuler" ou la croix pour quitter

En tout cas oui, je n'ai plus de problème de mise à jour à l'ouverture du fichier cela fonctionne parfaitement.
Pour cette partie là, merci pour ton aide et ta contribution :)


@Staple1600, depuis quand je ne sais pas, en tout cas pas chez moi dans le Finistere mais depuis hier dans mon fichier que je t'invite à tester tu verras bien que lorsqu'on saisie une date dans l'inputbox elle est retranscrite dans la cellule concernée sous le format US ( mmddyyyy ) et non ( ddmmyyyy ).
J'ai essayer de tester le code suivant mais rien ne change, je n'explique absolument pas cela.

VB:
Defaut = Format(Now, "dd/MM/yyyy")


T = ""
mDate = InputBox("Modifier la date?", "Modification", Defaut, (10 + Application.Left) * 20, (10 + Application.Top) * 20)

Tu as la même chose de ton côté en testant le fichier ???

Concernant les questions à tiroirs et ton principe KISS (keep it simple, stupid) oui bien entendu j'adhère.
La question à tiroirs il y en a effectivement eu une pour laquelle en fouillant j'ai trouvé réponse (élargir à 6 cellules à la place des 2 initiales la réflexion, pas de grand chamboulement dans la demande).

Pour le reste de mes deux besoins d'origines, ils sont restés les mêmes depuis le 1er post, simplement des précisions en fonction du résultat observé en pratiquant.

Après comme je te disais, pour ce qui est de juger une logique sur la base de bribe de fichier servant à illustrer le propos du demandeur, je dirais chacun sa logique tant que ça reste cohérent avec le but recherché par le concepteur du fichier.

Dans la plupart de mes demandes je fourni un fichier de démonstration pour illustrer mon propos et m'efforce de limiter au maximum la quantité d'information afin de ne pas "parasiter" l'échange.

Mais je respecte à 100% ton opinion ;)
 

spike29

XLDnaute Occasionnel
Du coup, pour mettre un peu d’ordre dans le fil de discussion, mes deux problématiques restantes sont :

  • Format de la date lors d’une saisie sur l’inputbox qui pour je ne sais quelle raison est depuis hier en mmjjdddd et non jjmmdddd. Je n’explique absolument pas cela…. A tester sur le fichier qui sera en PJ.
  • Si l’on sélectionne une des 6 cellules concernées par le code et que l’on annule l’inputbox via «annuler » ou la croix cela annule la dernière modification éventuellement réalisée sur la cellule d’à côté.
Exemple à tester de votre côté pour illustrer mon propos

  • Si en G24 je change la date du jour pour mette le 11/11/2020 et qu'ensuite par erreur je sélectionne E24 et clique sur annulé, G24 se remet aussitôt à jour avec la date prévue dans le code.

  • Cela peut paraître être du détails à vos niveaux mais je me projette systématiquement dans la peau d’un utilisateur et ce que cela implique (fausses manip etc… je parle en connaissance de cause).

  • Merci d’avance pour votre aide et compréhension.
Comme toujours, la dernière version du fichier en PJ.

  • Bonne soirée à vous
 

Pièces jointes

  • TEST222.xlsm
    43.2 KB · Affichages: 2

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

=>spike09
Ce n'est pas moi qui ait écrit cela, ce me semble ;)
(dans aucun de mes messages dans ce fil)
Defaut = Format(Now, "dd/MM/yyyy")
Si j'étais moi, il se peut que j'aurai écrit ceci
VB:
Sub Doris_Day_Tribute()
With Application
.ScreenUpdating = False
mDate = InputBox("Modifier la date?", _
        "Modification", Date, _
        (10 + .Left) * 20, (10 + .Top) * 20)
End With
[A1] = CDate(mDate)
End Sub


PS: Je n'ai rien contre le parasitisme.
C'est ce qui me donne un microbiote de bonne qualité.
 

Staple1600

XLDnaute Barbatruc
Re

Cela peut paraître être du détails à vos niveaux mais je me projette systématiquement dans la peau d’un utilisateur et ce que cela implique (fausses manip etc… je parle en connaissance de cause).
Moi itoo, c'est pour cela qu'avec ma casquette KISS visée sur la tête, je limite au maximum l'usage de VBA et privilégie toujours les fonctions natives d'Excel.
 

spike29

XLDnaute Occasionnel
Re,

Pour répondre à ton message #54

C'est moi qui ai écris ce code comme je l'explique dans mon message 53... donc effectivement ça n'est pas toi

VB:
Defaut = Format(Now, "dd/MM/yyyy")

Merci pour ton code mais honnêtement je ne vois pas comment l'utiliser.
Possibilité de l'intégrer dans mon fichier (qui sert à cela notamment) stp ?? si ce code répond à ma problématique bien entendu.

Concernant le parasitisme, je préfère rester focus sur la problématique sinon on se perds vite... ;)


Du coup, pouvons avancer sur ces deux problématiques qui perdurent.

Merci;)
 

spike29

XLDnaute Occasionnel
Concernant le message 55. Je partage à 100% moi aussi.

Mais a part si tu as une solution a me proposer qui répond à 100% à mon besoin avec des formules natives, je suis preneur.

Sinon, ça risque d'être VBA. Ce que j'ai identifier au préalable avant de poster mon #message1.

Merci ;)
 

Staple1600

XLDnaute Barbatruc
Re

Puisque j'ai toujours ma casquette KISS sur la tête
1) Dans ThisWorkBook
VB:
Private Sub Workbook_Open()
Const f = "Feuil1!"
ActiveWorkbook.Names.Add Name:="f_a", RefersToR1C1:= _
        "=" & f & "R8C12+2*(WEEKDAY(" & f & "R8C12,2)=5)+1*(WEEKDAY(" & f & "R8C12,2)=6)"
ActiveWorkbook.Names.Add Name:="f_b", RefersToR1C1:= _
        "=" & f & "R8C12+3*(WEEKDAY(" & f & "R8C12,2)=5)+1*(" & f & "R8C23=""JOUR"")"
End Sub

2) Insertion d'un CommandButton sur la feuille idoine
(code du CommandButton)
VB:
Private Sub CommandButton1_Click()
mDate = InputBox("Saisir votre date,svp", "Modification date", Date)
If StrPtr(mDate) = 0 Then
Range("E24,E50,E76") = [f_a]: Range("G24,G50,G76") = [f_b]
ElseIf mDate = vbNullString Then
Range("E24,E50,E76") = [f_a]: Range("G24,G50,G76") = [f_b]
ElseIf IsDate(mDate) Then
Range("E24,G24,E50,G50,E76,G76") = CDate(mDate)
End If
End Sub
La Caption du CommandButton est: Modification Date

A toi de voir ce que cela t'inspire ;)

(bien évidemment, il faut supprimer tout les codes VBA déjà présents pour faire le test (sur une copie du classeur dédiée aux tests)

NB: adapter si besoin le nom de la feuille dans Const f
 

eriiic

XLDnaute Barbatruc
@eric, dès mon #post41 j'indiquais que la mise à jour à l'ouverture semblait correctement fonctionner.

Oui et ? Moi c'est au post #40 que je répondais à
Concernant les deux autres points :
1) Absence de mise à jour des cellules à l'ouverture du fichier
en te signalant mon post #21 à ce sujet resté sans réponse, et potentiellement non vu.

Donc j'aurais dû deviner le #41.
Je voudrais bien avoir ce don... ;)
Enfin, l'essentiel est que cette partie fonctionne maintenant.
eric
 

spike29

XLDnaute Occasionnel
Bonjour,

@eriiiic , oui je me doute que tu répondais au #post40 mais ce que je t'indique c'est que mon post #41 indique que ma problématique d'absence de mise à jour des cellules à l'ouverture du fichier est résolu:

VB:
En tout cas concernant ce point, ça semble fonctionner correctement depuis que j'utilise le dernier code de STAPLE.

Reste la problématique de la mise à jour des cellules lorsque je reclique dessus et que l'on sélectionne "annuler" ou la croix pour quitter.

J'explique donc qu'en utilisant une partie de ton code et la méthode .FormulaLocal ça fonctionne.

VB:
Je ne me suis pas plus étendu sur ton code, que j'ai utilisé dans un premier temps avec succès avant de m'apercevoir qu'a l'ouverture du fichier la mise à jour automatique ne se faisait pas correctement mais seulement après avoir cliqué sur l'une des cellules.

Extrait post#41
VB:Copier dans le presse-papier
.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"")"

A la place de .FormulaR1C1 j'ai réutilisation le .FormulaLocal de Staple qui me paraît plus lisible et simple d'utilisation. Le format R1C1 reste du chinois pour moi même si j'ai à peu près compris la fonctionnement.


Concernant ton Post#21, à partir du moment ou j'insert un extrait de ton code présent dans le Post#21 dans mon post#41, c'est que je l'ai à minima lu... ;)

Comme tu le dis, l’essentiel est que ce point là fonctionne. Et à notre décharge collective, il est aisé de se perdre lorsque l'on atteint les #60 post 😅

Merci pour l'ensemble des tes contribution et bonne journée
 

Discussions similaires

Statistiques des forums

Discussions
312 195
Messages
2 086 072
Membres
103 110
dernier inscrit
Privé