Création formule en VB

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. 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
    1. 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
      1. 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
        1. 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
          1. 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
            1. 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. 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
            2. 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
              1. 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
                1. 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