Création formule en VB

touroul Messages postés 520 Date d'inscription   Statut Membre Dernière intervention   -  
touroul Messages postés 520 Date d'inscription   Statut Membre Dernière intervention   -
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

9 réponses

  1. Gyrus Messages postés 3360 Statut Membre 526
     
    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
  2. touroul Messages postés 520 Date d'inscription   Statut Membre Dernière intervention   16
     
    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
  3. Gyrus Messages postés 3360 Statut Membre 526
     
    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
  4. touroul Messages postés 520 Date d'inscription   Statut Membre Dernière intervention   16
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. touroul Messages postés 520 Date d'inscription   Statut Membre Dernière intervention   16
     
    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
  7. Gyrus Messages postés 3360 Statut Membre 526
     
    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
    1. touroul Messages postés 520 Date d'inscription   Statut Membre Dernière intervention   16
       
      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
  8. touroul Messages postés 520 Date d'inscription   Statut Membre Dernière intervention   16
     
    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
  9. Gyrus Messages postés 3360 Statut Membre 526
     
    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
  10. touroul Messages postés 520 Date d'inscription   Statut Membre Dernière intervention   16
     
    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