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

Staple1600

XLDnaute Barbatruc
Re

Voici de quoi continuer à mouiller ta chemise, camarade!
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("E24:G24,E50:G50,E76:G76")) Is Nothing Then
Select Case Target.Row
Case 24
Target.FormulaLocal = "=PI()"
Case 50
Target.FormulaLocal = "=COS(LIGNE())"
Case 76
Target.FormulaLocal = "=HEURE(MAINTENANT())"
End Select
End If
End Sub
Moi, je vais mouiller la mienne, en allant couper du bois (sans VBA) mais avec une hache aiguisée en Option Explicit.
;)
 

spike29

XLDnaute Occasionnel
1) Erreur de copié / collé de ma part. RAS ton code marche bien.

2) Pas de soucis, normal, comme je me suis dépatouillé sur le sujet passons aux suivants ;)

3) Oui, j'imagine bien que la clef de mon problème se trouve dans la syntaxe mais ta réponse ne m'avance malheureusement pas plus...
Quelle est la synthaxe a utiliser pour que cela fonctionne sans problème ?

4 ) Oui surement mais cela ne m'avance pas plus ^^

Je viens de voir ton dernier message et toute mes excuses mais tes codes me paraissent plus compliqués les uns que les autres... ou plutôt hors de ma porté et j'ai horreur de ne pas comprendre ^^

Est-il possible pour toi de les simplifier au maximum en restant dans le même ordre d'idée que les codes déjà présents ?
Un retour de mon fichier avec tes solutions serait un grand plus dans l'échange pour toi comme pour moi ;)

Merci d'avance !

Bonne coupe de bois !
 

Staple1600

XLDnaute Barbatruc
Re

J'avais mes bottes aux pieds et j'allais sortir
Mais je prends le temps de quelques précisions
1) mon mode opératoire, c'est d'inciter/inviter le demandeur à mettre les mains dans le cambouis
(à essayer/tester/échouer/chercher sur le net et recommencer ;)
Et si difficulté, revenir poser des questions précises.
Le dernier code est juste un code iillustratif avec des formules illustratives (donc à tester sur un fichier vierge)
Avec tous les codes présents dans ce fil, tu as de quoi faire moult essais (en adaptant mixant) jusqu'à à la fin de l'après-midi;
Ce qui me laissera le temps de vaquer à d'autres occupations
(dont mes buchettes ;)
J'ai lu quelpart dans le fil que tu disais ne pas être inculte en VBA.
Ce que je traduis en : je ne débute pas le VBA.
Donc, à mon sens, largement compétent pour mouiller ta chemise en triturant ton classeur de E24 à G76, à coup de formules et de VBA.
;)
 

spike29

XLDnaute Occasionnel
Rien n'a redire sur ton mode op, que je trouve aussi intéressant qu'enrichissant.

Concernant ton dernier code, je n'ai rien réussi a en tirer. De ma lecture, c'est une autre présentation du code d'origine mais je n'arrive pour l'instant pas à voir plus loin et sans ta lanterne je pense pas que ça ne changera...

En fouillant un peu sur le net j'ai trouver la réponse à une partie de mes questions :

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;))))"

Il suffisait de mettre des guillemets doubles ""vendredi"" pour que cela fonctionne et que la formule soit correctement transcrite dans la cellule.
Une chose de faite ^^

Concernant les deux autres points :

1) Absence de mise à jour des cellules à l'ouverture du fichier

2) 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


Je vais vraiment avoir besoin que tu me donnes la solution car malgré les recherches je ne vois pas comment en venir à bout...


Puis au passage, ne pas être inculte n'est pas incompatible avec mon statut de débutant VBA, car bien que j'ai quelques fragiles notions, je suis loin d'être un virtuose, même très loin 😅

J'ai mouillé la chemise comme je pouvais avec mes petits moyens, une solution serait la bienvenue mon cher STAPLE après ce long fil d'échange 😇
 

Pièces jointes

  • TEST222.xlsm
    41.7 KB · Affichages: 1

Staple1600

XLDnaute Barbatruc
Re

Petit conseil en passant
Trés mauvaise idée ce genre de formule quand on travaille avec des dates
SI(D8=""vendredi"";L8+2;SI(D8=""samedi"";L8+1;L8))"
Car Excel possède des formules pour travailler avec les dates
D'ou les formules que je t'ai proposé plus bas dans le fil.

Pour le dernier code, je vais ajouter quelques commentaires
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("E24:G24,E50:G50,E76:G76")) Is Nothing Then
Select Case Target.Row
Case 24
MsgBox Target.Row, vbInformation, "La ligne active est: "
'donc ici on mettra la formule qu'on réserve
' pour E24
Target.FormulaLocal = "=PI()"
Case 50
MsgBox Target.Row, vbInformation, "La ligne active est: "
'donc ici on mettra la formule qu'on réserve
' pour E50
Target.FormulaLocal = "=COS(LIGNE())"
Case 76
MsgBox Target.Row, vbInformation, "La ligne active est: "
'donc ici on mettra la formule qu'on réserve
' pour E76
Target.FormulaLocal = "=HEURE(MAINTENANT())"
End Select
End Sub
NB: Les cellules sont fusionnées comme dans ton fichier exemple.
Ce code est donc à tester sur un classeur vierge, juste pour comprendre la logique de fonctionnement.
Quand ce sera fait, à toi de faire les adapations pour y mettre les formules de ton choix (ou changer les adresses des cellules concernées)

PS: On n'est pas aux pièces.
Nous sommes tous ici bénévoles.
Donc que l'échange soit court ou long, n'est pas un problème.
;)
 

spike29

XLDnaute Occasionnel
J'ai testé et essayé de "bidouiller" mais honnêtement c'est surement très simple mais je ne vois pas....

là je bloque.

Bidouille 1 en appliquant ce que tu m'as dit mais je ne vois pas comment ça peut résoudre les deux problématiques qu'il me reste.

VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("E24:G24,E50:G50,E76:G76")) Is Nothing Then
Select Case Target.Row


Case 24
MsgBox Target.Row, vbInformation, "La ligne active est: "
'donc ici on mettra la formule qu'on réserve
' pour E24
Target.FormulaLocal = "=SI(D8=""vendredi"";L8+2;SI(D8=""samedi"";L8+1;L8))"
Case 50
MsgBox Target.Row, vbInformation, "La ligne active est: "
'donc ici on mettra la formule qu'on réserve
' pour E50
Target.FormulaLocal = "=SI(D8=""vendredi"";L8+2;SI(D8=""samedi"";L8+1;L8))"
Case 76
MsgBox Target.Row, vbInformation, "La ligne active est: "
'donc ici on mettra la formule qu'on réserve
' pour E76
Target.FormulaLocal = "=SI(D8=""vendredi"";L8+2;SI(D8=""samedi"";L8+1;L8))"
End Select

End If


End Sub


Bidouille 2, en prenant comme base un ancien de tes codes du fil

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


'If InStr(Target.Address, "$L$8") Then
choixdate = MsgBox("Voulez-vous modifier la date,", vbCritical + vbYesNo, "Choix date")
Select Case choixdate

Case 24
Target.FormulaLocal = "=SI(D8=""vendredi"";L8+2;SI(D8=""samedi"";L8+1;L8))"

Case 50
Target.FormulaLocal = "=SI(D8=""vendredi"";L8+2;SI(D8=""samedi"";L8+1;L8))"

Case 76
Target.FormulaLocal = "=SI(D8=""vendredi"";L8+2;SI(D8=""samedi"";L8+1;L8))"

Target = CDate(InputBox("Nouvelle date?"))
Case Else
Target = Date
End Select
End If
End Sub
 

Staple1600

XLDnaute Barbatruc
Re

mais je ne vois pas comment ça peut résoudre les deux problématiques qu'il me reste.
Je n'ai pas écris cela.
J'ai simplement dis que c'était une procédure de test, c'est à dire à tester sur un classeur vierge
(d'où la présence des MsgBoc qui sont là pour voir comment se déroule le test)
Ce code ne sert qu'à une chose voir comment on peut faire faire un chose différente à la macro selon qu'on soit en ligne 24, 50 ou 76.
Elle ne fait que cela.
Ni plus, ni moins
(et dans mon exemple, elle insère donc une formule différente selon le numéro de ligne actif)

NB: Tu n'es pas d'accord avec ce que j'évoquais dans le message#35?
(à propos des dates et Excel)
 

spike29

XLDnaute Occasionnel
Oui, j'ai bien vu qu'elle permettait une autre approche et que ça n'était qu'un test sur cela pas de soucis.

Mais je ne vois pas de quelle manière elle peut me diriger vers la solution à mes deux problématiques.

Concernant ta remarque en message "35 => Tu es à minima 1000 fois plus calé que moi en VBA donc je suppose sans aucune hésitation que tu as raison. Toutefois, je m'y retrouve mieux avec mon code qui me paraît plus compréhensible au premier regard et donc plus facilement adaptable que le tiens, bien que ce dernier soit très certainement mieux rédigé et plus robuste.

Pouvons nous nous pencher de façon précise sur mes deux problématique.
Honnêtement que ça soit au travers de nos derniers échange ou via mes recherches je sèche totalement...

Merci d'avance
 

Staple1600

XLDnaute Barbatruc
Re

Si j'étais moi, et je débutais dans l'usage d'un logiciel, je prendrai en compte le conseil d'un utilisateur "chevronné" du dit logiciel.
Tu es sur un forum d'entraide dédié à Excel où en général on essaie de donner des conseils judicieux.
Donc quand on travaille avec des dates dans Excel, l'usage est de toujours formater les cellules les recevant au format date, ce qui permet l'utilisatiion des fonctions natives d'Excel liées au date
dont voici la liste
Libre à toi ne pas suivre ce conseil
Mais moi, je l'ai suivi quand je me suis inscrit sur ce forum en 2005
Et donc j'utilise en conséquence mes formules précédemment postées
VB:
Const formA As String = "=L8+2*(JOURSEM(L8;2)=5)+1*(JOURSEM(L8;2)=6)"
Const formB As String = "=L8+3*(JOURSEM(L8;2)=5)+1*(W8=""JOUR"")"

Private Sub Worksheet_SelectionChange(ByVal T As Range)
If Not Intersect(T, Range("E24:G24,E50:G50,E76:G76")) Is Nothing Then
mDate = InputBox("Modifier la date?", "Modification", Date)
If StrPtr(mDate) = 0 Then
Cells(T.Row, "E").FormulaLocal = formA
Cells(T.Row, "G").FormulaLocal = formB
ElseIf mDate = vbNullString Then
Cells(T.Row, "E").FormulaLocal = formA
Cells(T.Row, "G").FormulaLocal = formB
ElseIf IsDate(mDate) Then
T = mDate
End If
End If
End Sub
NB:
Pouvons nous nous pencher de façon précise sur mes deux problématique.
Pourquoi donc devrais-je me pencher plus avant lorsque "tu persistes" dans "un mésusage" d'Excel? ;)
(je parle des formules, pas de VBA)

PS: Je prends les devants: aucune animosité dans mon message, ni méchancété.
Juste des conseils.
 

spike29

XLDnaute Occasionnel
Staple,Eric,


De ce que j'ai pu voir de VBA de ma très courte expérience, c'est qu'il y a différentes manières d'arriver à ses fins avec des codes plus ou moins élaboré et robustes.
Vos codes doivent tous marcher à la perfection mais mon niveau étant ce qu'il est je ne suis pas forcément en mesure de les comprendre du premier regard donc lorsqu'il faut faire des combinaison de bout de codes c'est même pas la peine ^^
Ce qui explique ma difficulté à utiliser un code que je comprend pas. Certes là j'ai utiliser ton code mais le jour ou je vais devoir l'adapter je vais ramer un peu avant d'arriver à mes fins 😅
Donc oui je prend tout les bons conseils et les votre valent de l'or mais peut-être sont-il 3 crans au dessus de mon niveau 😅
Mai bon je vais bûcher et y a pas de raison.



Eric, je vous ai remercié pour vos codes dans mon post26.
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.

VB:
 .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.

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.


Bonne soirée à tous les deux et encore merci !
 

Pièces jointes

  • TEST222.xlsm
    41.3 KB · Affichages: 1

spike29

XLDnaute Occasionnel
Vu la quantité de message sur le fil il me semblait t'avoir répondu, voilà pourquoi.
Loin de moi un manque de respect ou autre... c'est pas le genre de la maison.
Etant donné qu'il y a eu une grappe de message avant ma réponse j'ai du oublié pourtant je me souvient avoir testé ton code.
Si c'est un motif suffisant pour ne pas continuer à m'aider ainsi soit-il bien que ça reste dommage sur un tel forum ;)
 

eriiic

XLDnaute Barbatruc
Parler dans le vent ne motive pas. On ne veut pas laisser l'impression de se taper l'incruste non plus...
En supposant que tu soies bien en calcul automatique Essaie en ajoutant :
VB:
.Range("E24", "G24").Calculate
ou .Calculate tout court si tu veux recalculer toute la feuille.
eric
 

Staple1600

XLDnaute Barbatruc
Re, Bonsoir eriiiic (meilleurs voeux)

=>spike29
Précisions avant dodo
Je ne parle pas de code VBA.
Je parle de bonnes habitudes à prendre dès le départ avec Excel.
Donc pour les dates: cellules formatées en Date et utilisation des formules Excel dédiées aux Dates
(voir la liste dans le message#39 => mot en bleu, cliquable)

VB:
Const formA As String = "=L8+2*(JOURSEM(L8;2)=5)+1*(JOURSEM(L8;2)=6)"
Const formB As String = "=L8+3*(JOURSEM(L8;2)=5)+1*(W8=""JOUR"")"

Private Sub Worksheet_SelectionChange(ByVal T As Range)
If Not Intersect(T, Range("E24:G24,E50:G50,E76:G76")) Is Nothing Then
T = ""
mDate = InputBox("Modifier la date?", "Modification", Date)
If StrPtr(mDate) = 0 Then
Cells(T.Row, "E").FormulaLocal = formA
Cells(T.Row, "G").FormulaLocal = formB
ElseIf mDate = vbNullString Then
Cells(T.Row, "E").FormulaLocal = formA
Cells(T.Row, "G").FormulaLocal = formB
ElseIf IsDate(mDate) Then
T = mDate
End If
End If
End Sub
Pour infos:
FormulaLocal (comme son nom l'indique) permet d'écrire les formules (pour ce qui nous concerne) en français.
 

Discussions similaires

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa