Création formule en VB
touroul
Messages postés
518
Statut
Membre
-
touroul Messages postés 518 Statut Membre -
touroul Messages postés 518 Statut Membre -
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 :
soit :
Voici à présent mon essai en VB :
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
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:
- Création formule en VB
- Formule si et - Guide
- Formule moyenne excel plusieurs colonnes - Guide
- Creation compte gmail - Guide
- Formule mathématique - Télécharger - Études & Formations
- Création site web - Guide
9 réponses
Bonjour,
Essaie comme cela
Attention ! le code doit être placé dans le module de la feuille concernée soit module Feuil1 (Essai).
A+
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+
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
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
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+
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+
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 !
Je vais appliquer ça à plusieurs fichiers à présent.
Encore merci de m'avoir permis de progresser.
Au plaisir, bonne soirée !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :
Puis-je à nouveau te solliciter ? Merci par avance.
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.
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 :
A+
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+
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 :
"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 :
Bon réveillon !
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 !
Bonjour,
Pour éviter le problème lié à la sélection de ligne, essaie en ajoutant cette instruction en début de procédure :
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+
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+