Formule dans VBA avec variable

Résolu
SF-TU Messages postés 19 Statut Membre -  
SF-TU Messages postés 19 Statut Membre -
Bonjour,

Je voudrais insérer une formule dans une macro qui intègrerait une variable.

La variable est nommée plus haut dans ma Macro :
... Dim HArrivM As Date
HArrivM = Workbooks("Calcul et suivi RTT.xlsm").Worksheets("Semaine Type").Range("B3").Value

sachant que B3 = 08:30

La formule est la suivante :
ActiveCell.FormulaR1C1 = "=IF((OR(RC[9]=1,RC[9]=2)),HArrivM,"""")"

Le résultat qui s'affiche est #NOM? et non 08:30. Pourquoi ?
Pouvez-vous m'aider à solutionner mon problème ?

En vous remerciant,
Bien cordialement
Aurélie Rocheteau

12 réponses

  1. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Bonjour

    Essaies ceci
    f = "=IF((OR(RC[9]=1,RC[9]=2))," & HArrivM & ","""")"
    ActiveCell.FormulaR1C1 = f

    Cdlmnt
    1
  2. skk201 Messages postés 942 Date d'inscription   Statut Membre Dernière intervention   55
     
    Est-ce que vous pouvez nous donner votre code en entier ?
    0
  3. SF-TU Messages postés 19 Statut Membre
     
    Bonjour ccm81

    Merci mais le code ne marche pas.

    Je vous donne le code en entier mais il fait appel à une feuille de planning mensuel.

    Merci d'avance de voir si vous pouvez y faire quelque chose.

    Cdt
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Bonjour,

      pourquoi veux tu faire le calcul par formule alors que VBA pourrait peut-^tre le faire par code (ce qui allège le fichier d'ailleurs) ?
      0
    2. SF-TU Messages postés 19 Statut Membre
       
      Parce que les valeurs à tester (si =1 ou =2) ne sont pas encre renseignées. C'est quand la personne va saisir 1 ou 2 dans une cellule que la formule va s'appliquer. Je sais pas si c'est très clair...
      0
  4. SF-TU Messages postés 19 Statut Membre
     
    Bonjour ccm81, ça ne marche pas non plus.
    La valeur de HArrivM est bien enregistrée, f également se met bien en mémoire mais ça plante à la ligne ActiveCell.FormulaR1C1=f
    "erreur définie par l'application ou par l'objet"

    Je met tout le code même si c'est difficilement buvable! :-)

    Sub FusionFeuillesPrésence()
    '
    '
    ' permet de fusionner les feuilles de présence pour RTT avec les horaires et spécificités du salarié
    
    ' Recupération des données
        NomSalarie = Range("A1").Value
        Annee1 = Range("J2").Value
        Annee2 = Range("J3").Value
        Dim HArrivM As Date
        HArrivM = Workbooks("Calcul et suivi RTT.xlsm").Worksheets("Semaine Type").Range("B3").Value
    
    ' Ouvrir le fichier générale des Feuilles de présence pour RTT
        Workbooks.Open Filename:= _
            "T:\Ressources Humaines\Suivi des Parcours\Feuilles de présence\Feuilles de présence pour RTT " & Annee1 & "-" & Annee2 & ".xlsm"
    
    ' Enregistrer le fichier au nom du Salarié
        ChDir "T:\Ressources Humaines\Suivi des Parcours\Feuilles de présence"
        ActiveWorkbook.SaveAs Filename:= _
            "T:\Ressources Humaines\Suivi des Parcours\Feuilles de présence\Feuilles de présence pour RTT " & Annee1 & "-" & Annee2 & " " & NomSalarie & ".xlsm" _
            , FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
            
    ' Copier le nom et le service du salarié
        Sheets(Array("JUIN", "JUILLET", "AOÛT", "SEPTEMBRE", "OCTOBRE", "NOVEMBRE", _
            "DÉCEMBRE", "JANVIER", "FÉVRIER", "MARS", "AVRIL", "MAI")).Select
        Sheets("JUIN").Activate
        Windows("Calcul et suivi RTT.xlsm").Activate
        Range("A1").Copy
        Windows("Feuilles de présence pour RTT " & Annee1 & "-" & Annee2 & " " & NomSalarie & ".xlsm").Activate
        Range("I3:O3").Select
        ActiveSheet.Paste
        Windows("Calcul et suivi RTT.xlsm").Activate
        Range("C1").Copy
        Windows("Feuilles de présence pour RTT " & Annee1 & "-" & Annee2 & " " & NomSalarie & ".xlsm").Activate
        Range("I4:O4").Select
        ActiveSheet.Paste
    
    'Dissocier les feuilles
        Sheets(2).Activate
        Sheets(1).Select
        Range("A9").Select
        
    ' Insérer les formules
    
        ' Faire la manip pour chaque feuille
        Dim k As Integer, i As Integer
        k = Sheets.Count
        For i = 1 To k
            Sheets(i).Activate
            Range("A9").Select
            
            'Insérer les formules jusqu'à ce que la case A9 soit vide
                Do Until ActiveCell.Value = ""
                    'Pour chaque jour de la semaine du lundi au samedi
                    If ActiveCell.Value = "Lundi" And ActiveCell.Offset(0, 2) = "" _
                    Or ActiveCell.Value = "Mardi" And ActiveCell.Offset(0, 2) = "" _
                    Or ActiveCell.Value = "Mercredi" And ActiveCell.Offset(0, 2) = "" _
                    Or ActiveCell.Value = "Jeudi" And ActiveCell.Offset(0, 2) = "" _
                    Or ActiveCell.Value = "Vendredi" And ActiveCell.Offset(0, 2) = "" _
                    Or ActiveCell.Value = "Samedi" And ActiveCell.Offset(0, 2) = "" Then
            
                    'Insérer la formule de Arrivée Matin
                    ActiveCell.Offset(0, 2).Select
                    ActiveCell.FormulaR1C1 = "=IF((OR(RC[9]=1,RC[9]=2)),HArrivM, """")" 
                    Selection.HorizontalAlignment = xlCenter
    
                 Loop
       Next i
    
      ....... Suite du code
    End Sub               
    


    Le problème se situe dans l'utilisation de variable (HArrivM) dans la formule. Mais je ne vois pas où est l'erreur...
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. SF-TU Messages postés 19 Statut Membre
     
    Bonjour,

    Je viens d'essayer ton fichier, ccm81 et en effet ça marche mais ma variable HArrivM est une "date" ou plutôt un horaire de début ou fin de journée (exemple 08:30).
    Alors si je mets dans ton fichier : Dim HArrivM as Date alors une fois arrivé à la formule, VBA dit "Erreur défini par l'application ou par l'objet".

    Je pense que cela vient du format de ma variable qu'il ne veut pas prendre en compte.
    Qu'en pensez-vous ?
    Merci
    Cdt
    0
  7. SF-TU Messages postés 19 Statut Membre
     
    Je suis désolée mais il doit y avoir un truc que je ne comprends pas car même avec ton fichier, si à la place de la date, je mets 08:30, le VBA ouvre une fenêtre d'erreur avec le chiffre 400 et une croix dans un rond rouge.
    Je ne sais pas ce que cela signifie.

    Merci, cdt
    0
  8. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    Parce que les valeurs à tester (si =1 ou =2) ne sont pas encre renseignées. C'est quand la personne va saisir 1 ou 2 dans une cellule que la formule va s'appliquer.
    On ne fait pas de vba pour ça...

    On teste la cellule, si elle est vide on ne met rien, si ok on évalue la formule :
    =si(A2="";"";ta_formule)

    eric

    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Salut Eric

      Hé Oui!
      d'autant plus, une fois que la macro a fini de se dérouler, HArrivM est vide....
      0
    2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      ouf, je ne n'avais même pas vu tout le code...
      Moi j'essaierai
      ActiveCell.FormulaR1C1 = "=IF((OR(RC[9]=1,RC[9]=2)),""" & HArrivM & """*1, """")"

      eric
      0
  9. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Effectivement ça ne fonctionne pas
    Une solution (pas jolie mais qui semble fonctionner)
    https://www.cjoint.com/?3FstdccAEsn

    @eric, salut à toi
    je ne crois pas que le problème vienne de là, si la formule était bonne ça donnerait un message d'erreur de la feuille et non de la part de vba
    il y a un problème au niveau de la fabrication de la formule, avec HArrivM entier (date) ça fonctionne, mais avec HArrivM décimal (heure) ça coince
    je fais appel à tes lumières
    0
  10. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Je crois que c'était un problème au niveau des "virgules et "point-virgule".
    En passant au format local, ça fonctionne
    f = "=SI(OU(LC(9)=1;LC(9)=2);" & HArrivM & ";"""")"

    https://www.cjoint.com/?3Fst1tnap6S

    Cdlmnt
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      J'avais laissé HArrivM As Date, dans ce cas la conversion avec le *1 fonctionne.
      J'avais testé.
      eric
      0
    2. ccm81 Messages postés 11033 Statut Membre 2 434
       
      Exact .... Ouf!

      Bonne soirée à toi

      ccm81
      0
  11. SF-TU Messages postés 19 Statut Membre
     
    Bonjour,

    Merci à tous ceux qui ont participé à la résolution de mon problème et surtout à ccm81 et eriiic pour la solution trouvée. Je viens de l'essayer dans mon code et tout marche nickel.
    Merci encore et bonne nuit
    Cdt, AR
    0