[VBA] Mettre une formule dans une cellule
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

[VBA] Mettre une formule dans une cellule



  1. #1
    matthieu2

    [VBA] Mettre une formule dans une cellule


    ------

    Bonjour à toutes et à tous,

    J'ai écris un programme d'extraction de données d'un fichier Excel à un autre. Dans une cellule, je souhaite mettre une formule (un IF) qui va voir ce qu'il y a dans la cellule d'à coté et faire un petit calcul le cas échéant. Le tout est imbriqué dans une boucle For, j'utilise donc une variable en indice de ligne.

    Voici le début de mon code. La ligne de code concernée est en gras et rouge (je précise que le reste fonctionne très bien c'est juste cette ligne qui pose soucis):
    Code:
    Private Sub CommandButton1_Click()
        
        'Définition des variables
        Dim FichierMaintenance As Workbook
        Dim FichierPlanning As Workbook
        Dim i As Long
        Dim SemaineUtilisateur1 As Long
        Dim SemaineUtilisateur2 As Long
        Dim SemaineUtilisateur3 As Long
        Dim SemaineAnnee As String
        Dim SemaineMaintenance As Long
        Dim DateDebut As Date
        Dim OT As Long
        Dim WorkCenterMaintenance
        Dim EtatImmoMarchine As String
        Dim EtatImmoOperateur As String
        Dim DescriptionOT As String
           
        'Test si l'utilisateur à bien entré une donnée
        If TextBox1.Value = "" Then
            MsgBox ("Merci d'entrez une valeur!")
            TextBox1.SetFocus
        Else
            SemaineUtilisateur1 = TextBox1.Value
        End If
        
        'Calcul de la (Sem+1) et (Sem+2) pour afficher extract sur 3 semaines
        SemaineUtilisateur2 = SemaineUtilisateur1 + 1
        SemaineUtilisateur3 = SemaineUtilisateur2 + 1
        
        'Donne au programme le lien pour allez chercher le fichier maintenance
        'UPDATER CETTE PARTIE POUR IMPLEMENTATION
        'Dim Repertoire As String
        'Lien du fichier maintenance
        'Repertoire = "C:\...."
        
        'POUR LE TEST
        Dim Repertoire1 As String
        Repertoire1 = "G:\I care - LEAN\Follow up new organisation 08 2015\Fichier Planning New Orga\Copy of 1 Copy of Copie de Planif Maint Prév à Avril (2).xlsx"
         
        'Attribut aux variables les 2 fichiers Excel et ouvre le fichier maintenance
        'Set FichierMaintenance = Application.Workbooks.Open(Repertoire, False, True)
        Set FichierPlanning = ThisWorkbook
        Set FichierMaintenance = Application.Workbooks.Open(Repertoire1, False, True)
        
        'Calcul automatique désactivité pour éviter de faire ramer le programme
        Application.Calculation = xlCalculationManual
        
        'Recherche de la dernière ligne du fichier maintenance
        Dim DerniereLigneMaint As Long
        DerniereLigneMaint = FichierMaintenance.Worksheets("Planning").Range("S" & Rows.Count).End(xlUp).Row
            
        '*****************************************************************************************
        'Pour N1L
        
        Dim DerniereLignePlanningN1L As Long
        Dim WorkCenterPlanning1L
        WorkCenterPlanning1L = "Asset F&P Nord 1L"
        
        'Boucle permettant de ballayer toutes les lignes du fichier maintenance
        For i = 3 To DerniereLigneMaint
            SemaineAnnee = FichierMaintenance.Worksheets("Planning").Cells(i, 19).Value
            SemaineMaintenance = Left(SemaineAnnee, 2)
            WorkCenterMaintenance = FichierMaintenance.Worksheets("Planning").Cells(i, 9).Value
            
            'Semaine 1 de l'utilisateur
            If SemaineMaintenance = SemaineUtilisateur1 And WorkCenterMaintenance = WorkCenterPlanning1L Then
                OT = FichierMaintenance.Worksheets("Planning").Cells(i, 3).Value
                EtatImmoMachine = FichierMaintenance.Worksheets("Planning").Cells(i, 13).Value
                EtatImmoOperateur = FichierMaintenance.Worksheets("Planning").Cells(i, 14).Value
                DescritpionOT = FichierMaintenance.Worksheets("Planning").Cells(i, 8).Value
                DateDebut = FichierMaintenance.Worksheets("Planning").Cells(i, 15).Value
                
                DerniereLignePlanningN1L = FichierPlanning.Worksheets("1 L").Range("A" & Rows.Count).End(xlUp).Row + 1
                
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 1) = DatePart("ww", Date, vbMonday, vbFirstFourDays)
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 2).Value = SemaineMaintenance
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 3).Value = OT
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 4).Value = DateDebut
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 5).Formula = "IF(Cells(DerniereLignePlanningN1L, 7)="";"";((Cells(DerniereLignePlanningN1L, 7)*34000)/6.25))"
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 6).Value = EtatImmoMachine
                'FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 7).Value = DUREE
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 8).Value = EtatImmoOperateur
                'FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 9).Value =
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 10).Value = DescritpionOT
    
            End If
            
            'Semaine 2 de l'utilisateur
            If SemaineMaintenance = SemaineUtilisateur2 And WorkCenterMaintenance = WorkCenterPlanning1L Then
                OT = FichierMaintenance.Worksheets("Planning").Cells(i, 3).Value
                EtatImmoMachine = FichierMaintenance.Worksheets("Planning").Cells(i, 13).Value
                EtatImmoOperateur = FichierMaintenance.Worksheets("Planning").Cells(i, 14).Value
                DescritpionOT = FichierMaintenance.Worksheets("Planning").Cells(i, 8).Value
                DateDebut = FichierMaintenance.Worksheets("Planning").Cells(i, 15).Value
                
                DerniereLignePlanningN1L = FichierPlanning.Worksheets("1 L").Range("A" & Rows.Count).End(xlUp).Row + 1
                
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 1) = DatePart("ww", Date, vbMonday, vbFirstFourDays)
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 2).Value = SemaineMaintenance
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 3).Value = OT
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 4).Value = DateDebut
                'FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 5).Value = EQUIVALENT VOLUME
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 6).Value = EtatImmoMachine
                'FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 7).Value = DUREE
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 8).Value = EtatImmoOperateur
                'FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 9).Value =
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 10).Value = DescritpionOT
            End If
            
            'Semaine 3 de l'utilisateur
            If SemaineMaintenance = SemaineUtilisateur3 And WorkCenterMaintenance = WorkCenterPlanning1L Then
                OT = FichierMaintenance.Worksheets("Planning").Cells(i, 3).Value
                EtatImmoMachine = FichierMaintenance.Worksheets("Planning").Cells(i, 13).Value
                EtatImmoOperateur = FichierMaintenance.Worksheets("Planning").Cells(i, 14).Value
                DescritpionOT = FichierMaintenance.Worksheets("Planning").Cells(i, 8).Value
                DateDebut = FichierMaintenance.Worksheets("Planning").Cells(i, 15).Value
                
                DerniereLignePlanningN1L = FichierPlanning.Worksheets("1 L").Range("A" & Rows.Count).End(xlUp).Row + 1
                
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 1) = DatePart("ww", Date, vbMonday, vbFirstFourDays)
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 2).Value = SemaineMaintenance
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 3).Value = OT
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 4).Value = DateDebut
                'FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 5).Value = EQUIVALENT VOLUME
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 6).Value = EtatImmoMachine
                'FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 7).Value = DUREE
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 8).Value = EtatImmoOperateur
                'FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 9).Value =
                FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 10).Value = DescritpionOT
            End If
            
        Next i
        
        '*****************************************************************************************
    Je suis complètement bloqué avec cette formule. Je ne vois pas où se trouve mon erreur étant donnée que c'est la premiere fois que je fais ce genre de code.

    Si vous avez une idée ???

    Merci d'avance.

    -----

  2. #2
    cherbe

    Re : [VBA] Mettre une formule dans une cellule

    Bonjour
    C'est normal que ça bug. Tu as enfermé un nom de variable dans les quottes. Ce nom est vu comme une chaine et non comme une variable.
    Remplace :
    Code:
    "IF(Cells(DerniereLignePlanningN1L, 7)=""
    par
    Code:
    "IF(Cells(" & DerniereLignePlanningN1L & ", 7)=""

  3. #3
    matthieu2

    Re : [VBA] Mettre une formule dans une cellule

    Bonjour Cherbe,

    Merci pour ta réponse. J'ai cependant encore un soucis. J'ai commencer à tester avec:
    Code:
    FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 5).Formula = "=IF(Cells(" & DerniereLignePlanningN1L & ", 7)="";"";((Cells(" & DerniereLignePlanningN1L & ", 7)*34000)/6.25))"
    Puis je me suis demandé si ce n'était pas à cause des guillemets (qui sont là pour tester la cellule vide) d'où ce second test:
    Code:
    FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 5).Formula = "=IF(Cells(" & DerniereLignePlanningN1L & ", 7)=" & "" & ";" & "" & ";((Cells(" & DerniereLignePlanningN1L & ", 7)*34000)/6.25))"
    Mais nop

    J'ai le message d'erreur suivant:
    Run-tume error '1004':
    Application-defined or object-defined error

  4. #4
    cherbe

    Re : [VBA] Mettre une formule dans une cellule

    Ouah, c'est du lourd (je parle des erreurs) !
    Ayant trouvé une 1ère erreur, je n'ai pas vérifié le reste mais tu as au moins 1 autre erreur.
    Les quottes nécessaires à la fonction IF du tableur posent effectivement problème. Pour prévenir VBA qu'elles sont nécessaires à la formule, il faut les doubler, c'est à dire, enfermer les quottes de la formule dans des quottes du langage.
    Ailleurs qu'en VBA, on dirait qu'il faut les back-slasher ! (beaucoup d'autres langages utilisent le back-slash ou anti-slash "\" dans ce cas mais pas VBA)
    Dernière modification par cherbe ; 17/11/2015 à 08h39.

  5. A voir en vidéo sur Futura
  6. #5
    matthieu2

    Re : [VBA] Mettre une formule dans une cellule

    Re,

    J'ai testé:
    Code:
    FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 5).Formula = "=IF(Cells(" & DerniereLignePlanningN1L & ", 7)="""";"""";Cells(" & DerniereLignePlanningN1L & ", 7)*34000/6.25)"
    Mais bon toujours pas...

    Vu que ça me saoule, j'ai trouvé une autre solution qui alourdi malheureusement mon code mais qui fonctionne:
    Code:
                If EtatImmoMachine = "" Then
                    FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 5).Value = 0
                Else
                    FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 5).Value = FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 7).Value * 34000 / 6.25
                End If
    Na

  7. #6
    cherbe

    Re : [VBA] Mettre une formule dans une cellule

    Citation Envoyé par matthieu2 Voir le message
    Re,

    J'ai testé:
    Code:
    FichierPlanning.Worksheets("1 L").Cells(DerniereLignePlanningN1L, 5).Formula = "=IF(Cells(" & DerniereLignePlanningN1L & ", 7)="""";"""";Cells(" & DerniereLignePlanningN1L & ", 7)*34000/6.25)"
    Mais bon toujours pas...
    Na
    Tu as aussi 2 autres incohérences. Moi j'aurais écris :
    Code:
    "=IF(Cells(" & DerniereLignePlanningN1L & ", 7).Value="""";"""";Cells(" & DerniereLignePlanningN1L & ", 7).Value=Cells(" & DerniereLignePlanningN1L & ", 7).Value*34000/6.25)"
    Il m'est déjà arrivé de ne pas pouvoir m'en sortir avec cette histoire de quadruple quottes. Si ta solution fonctionne, pourquoi s'en priver ?

  8. #7
    matthieu2

    Re : [VBA] Mettre une formule dans une cellule

    Citation Envoyé par cherbe Voir le message
    Si ta solution fonctionne, pourquoi s'en priver ?
    Ben car c'est 4 lignes de code en plus et c'est beaucoup moins élégant

    Mais en tout cas bien vu pour les ".Value" que j'avais complètement oublié. Au moins j'aurais compris 1 erreur de plus

Discussions similaires

  1. Excel - verrouiller formule dans une cellule
    Par invite524edebb dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 20/09/2011, 15h27
  2. Excel: formule donnant le contenu de la cellule voisine
    Par SunnySky dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 04/11/2009, 07h33
  3. Réponses: 10
    Dernier message: 11/10/2009, 11h12
  4. formule excel - couleur cellule
    Par invitefa5b8744 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 07/08/2009, 20h26
  5. mettre du son dans ma xm
    Par aldo84 dans le forum Technologies
    Réponses: 1
    Dernier message: 26/09/2006, 09h24