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.
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 ?
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.
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
Depuis quand on saisit les dates au format US?
Je bosse en Bretagne, avec Excel tous les jours, je saisis donc mes dates avec des /
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)
@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.
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.
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.
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é.
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.
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.
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
@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