Création formule en VB

Fermé
touroul Messages postés 465 Date d'inscription mardi 5 octobre 2010 Statut Membre Dernière intervention 29 janvier 2024 - 27 déc. 2015 à 10:45
touroul Messages postés 465 Date d'inscription mardi 5 octobre 2010 Statut Membre Dernière intervention 29 janvier 2024 - 31 déc. 2015 à 15:35
Chers contributeurs bonjour

M'étant aperçu que la fonction de tri par date d'Excel fonctionne mal lorsque les cellules triées sont issues de formules, je me suis mis en tête (aussi pour progresser en VB), de créer une fonction en VB qui effectue un calcul en colonne H : ajout d'une durée à une date.

Voici la formule Excel :
=SI(OU([@Date]="";[@Périodicité]="");"";MOIS.DECALER(E12;[@[Période en mois]])+0,25)

soit :
colonne H = colonne E + colonne F + 0,25


Voici à présent mon essai en VB :
Private Sub Worksheet_SelectionChange(ByVal sel As Range)
Dim ProchaineOperation As Range
If Not Application.Intersect(Selection, Range("ProchaineOperation")) Is Nothing Then
Range("ProchaineOperation").Formula=(IF(OR([@Date]="",[@Périodicité]=""),"",EDATE(E12,[@[Période en mois]])+0,25))
End If
End Sub


J'ai du faire une erreur (au moins une :)) quelque part ...

Voici un fichier exemple pour plus de facilité :
https://www.cjoint.com/c/ELBjR1HHWaf

Merci par avance pour l'aide


A voir également:

9 réponses

Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523
27 déc. 2015 à 12:05
Bonjour,

Essaie comme cela
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("ProchaineOperation")) Is Nothing Then
Target.FormulaR1C1 = "=IF(OR([@Date]="""",[@Périodicité]=""""),"""",EDATE(RC[-3],[@[Période en mois]])+0.25)"
End If
End Sub

Attention ! le code doit être placé dans le module de la feuille concernée soit module Feuil1 (Essai).

A+
0
touroul Messages postés 465 Date d'inscription mardi 5 octobre 2010 Statut Membre Dernière intervention 29 janvier 2024 15
27 déc. 2015 à 13:41
Bonjour Gyrus

Un grand merci, à priori la formule fonctionne après adaptations dans mon classeur.

Juste pour comprendre, pourquoi mets-tu 2 guillemets : """"" ?
Et pourquoi travailles-tu en références type L1C1 (RC[-3]) ?

J'ai appris encore quelque chose, c'est vraiment sympa.
@ plus
0
Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523
27 déc. 2015 à 18:46
Pourquoi mets-tu 2 guillemets ?
Lorsque tu construis une chaîne de texte dans VBA, tu dois faire précéder le guillemet que tu souhaites afficher avec une deuxième instance d'un guillemet.

Pourquoi travailles-tu en références type L1C1 ?
Ce mode est intéressant car on ne fait pas référence à des cellules déterminées mais à des références relatives, ce qui permet de conserver la même formulation, quelle que soit la cellule sélectionnée.

A+
0
touroul Messages postés 465 Date d'inscription mardi 5 octobre 2010 Statut Membre Dernière intervention 29 janvier 2024 15
27 déc. 2015 à 20:36
OK c'est très clair

Je vais appliquer ça à plusieurs fichiers à présent.

Encore merci de m'avoir permis de progresser.

Au plaisir, bonne soirée !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
touroul Messages postés 465 Date d'inscription mardi 5 octobre 2010 Statut Membre Dernière intervention 29 janvier 2024 15
Modifié par touroul le 28/12/2015 à 09:28
Bonjour Gyrus, si tu repasses par ici ...
Encore un souci.
Indépendamment, mes 2 macros fonctionnent.

Mais j'obtiens un message ""nom ambigu détecté" quand les 2 sont présentes.
J'ai essayé de mélanger, sans succès, après j'obtiens un message relatif aux déclarations des variables :


Private Sub Worksheet_SelectionChange(ByVal sel As Range)

Dim LastMetro As Range
If Not Application.Intersect(Selection, Range("LastMetro")) Is Nothing Then
MonUF.Show
End If


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("ProchaineMetrologie")) Is Nothing Then
Target.FormulaR1C1 = "=IF(OR([@Date]="""",[@Périodicité]=""""),"""",EDATE(RC[-3],[@[Période en mois]])+0.25)"
End If
End Sub

Puis-je à nouveau te solliciter ? Merci par avance.
0
Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523
28 déc. 2015 à 10:54
Bonjour,

Tu ne peux créer qu'une procédure Worksheet.SelectionChange.
Il faut donc que la distinction des traitements soit effectuée dans la procédure.

Exemple :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("ProchaineMetrologie")) Is Nothing Then
Target.FormulaR1C1 = "=IF(OR([@Date]="""",[@Périodicité]=""""),"""",EDATE(RC[-3],[@[Période en mois]])+0.25)"
ElseIf Not Application.Intersect(Target, Range("LastMetro")) Is Nothing Then
MonUF.Show
End If
End Sub

A+
0
touroul Messages postés 465 Date d'inscription mardi 5 octobre 2010 Statut Membre Dernière intervention 29 janvier 2024 15
28 déc. 2015 à 13:24
Merci pour ta réponse Gyrus.

J'ai encore quelques soucis d'adaptation, je vais essayer de m'en sortir seul.
Là faut que j'aille bosser je reprends aujourd'hui :-(
Je rebosse le sujet ce soir ...
@ plus je ferai un reply !
Bonne journée
0
touroul Messages postés 465 Date d'inscription mardi 5 octobre 2010 Statut Membre Dernière intervention 29 janvier 2024 15
Modifié par touroul le 31/12/2015 à 13:33
Bonjour Gyrus

Je m'y suis remis ce matin avec succès cette fois.
Petit détail qui m'a posé problème : dans la formule en VB, il faut travailler avec les titres des colonnes du tableau automatique, et pas, comme je le faisais au départ, avec les noms des colonnes nommées en Gestionnaire de noms.

Je reviens sur un dernier détail :
Dans :
    ElseIf Not Application.Intersect(Target, Range("LastMetro")) Is Nothing Then
MonUF.Show


"MonUF" apparaît bien lorsque je clique dans "LastMetro", mais aussi lorsque je sélectionne la ligne en entier : une astuce pour éviter celà ?

Enfin, j'ai remarqué qu'on ne peut plus utiliser le filtre automatique A>Z lorsque le contenu de la colonne est issu d'un calcul.
Dans mon cas :
=SI(OU(F3="";G3"");"";MOIS.DECALER(F3;G3+0,25)


Bon réveillon !
0
Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523
31 déc. 2015 à 15:15
Bonjour,

Pour éviter le problème lié à la sélection de ligne, essaie en ajoutant cette instruction en début de procédure :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub


Pour ce qui est du tri, je ne vois pas ce qui gène son utilisation.
Il faudrait que je puisse voir un exemple.

Bon réveillon également.
A+
0
touroul Messages postés 465 Date d'inscription mardi 5 octobre 2010 Statut Membre Dernière intervention 29 janvier 2024 15
31 déc. 2015 à 15:35
If Target.Count > 1 Then Exit Sub

Génial ! J'avais déjà vu cette commande sans savoir à quoi elle correspondait.

Je me permets de t'envoyer mon fichier en MP.

Belle-maman fait la cuisine pour ce soir je peux rester sur Excel :)
0