Somme Prod avec VBA

Bonjour à tous,

Je travaille actuellement à l'élaboration d'un fichier Excel, totalement automatisé grâce à VBA, me permettant de suivre les absences des salariés d'une entreprise.

Grâce à différents userforms, je peux renseigner les jours d'absences des salariés ainsi que le motif. Ces informations sont ensuite stockées dans une base de données. Je souhaite maintenant que ces différentes absences alimentent le planning de façon totalement automatisée.

J'ai trouvé la solution grâce à la fonction SOMMEPROD d'Excel et aux plages nommées mais je souhaite la retranscrire en VBA. J'ai essayé différentes solutions mais aucune ne fonctionne... Je débute sur VBA alors peut-être que je m'y prends mal.. J'ai notamment essayé avec la fonction Application.WorksheetFunction.SumProduct mais peut-être l'ai-je mal adapté...

Je vous joins une version de mon fichier Excel : je l'ai simplifié au maximum pour ne laisser apparaître que mon problème et la macro qui me pose soucis. Plus précisément, je souhaite :

- Rapatrier les données de l'onglet "Base_congès" dans l'onglet "Planning" ;

- Transformer la formule sommeprod que j'ai mis en C4:AG6 de l'onglet planning (= plage nommée "select_planning") en VBA.

Si qqun sait comment je pourrais faire, à une idée que je pourrais tester, je suis preneuse !

Merci beaucoup pour votre aide !

Clémence =)

Bonsoir,

Quelques remarques préalables :

- Les modules d'objets (feuilles, classeur) sont essentiellement destinées à accueillir des procédures évènementielles. Il est très souhaitables de les réserver à cet usage et n'y placer que ces dernières avec eventuellement des proc. non évènementielles mais qui ne pourront être appelées que par une évènementielle dudit module, et de placer les procédures ordinaires dans un module Standard.

- Les noms donnés à des plages sont des noms dans le classeur, ils y sont par définition uniques, et les utilisant en VBA (tant qu'on ne travaille que sur un seul classeur) : Range("NomPlage") ou en notation compacte [NomPlage] suffisent pour cibler la plage sans autre qualification, donc sans aucune référence à la feuille.

En outre, si les noms sont donnés en vue d'une utilisation exclusive en VBA, inutile de les multiplier, un seul judicieusement placé permet d'atteindre n'importe quelle cellule de la feuille ou d'en définir toute partie quelle qu'elle soit.

- L'utilisation de fonctions de feuilles de calcul en VBA peut s'avérer utile, quand il n'existe pas de fonction équivalente en VBA et/ou quand cela s'avère plus commode qu'une méthode proprement VBA, mais s'agissant d'un calcul complexe répété cela n'est pas forcément la meilleure solution. Il convient en tout cas de voir si une méthode VBA ne peut être trouvée et la privilégier à moins qu'elle ne s'avère moins rapide que l'utilisation de ladite fonction Excel (ce qui sera rarement le cas).

- Quand tu écris un For (Each), tu sais que cela appelle un Next, donc tu l'écris immédiatement à la suite en sautant une ligne pour y mettre le code de la boucle... Ceci vaut pour toutes les instructions qui réclament un code de fin d'instruction, cela évite de l'oublier.

- Je conseillerais aussi de déclarer toutes ses variables et pas seulement une partie d'entre elles...

Après ce préalable je te proposerai donc une autre méthode, qui consiste à définir un tableau à la taille de ton [Select_planning], de le remplir pour l'affecter ensuite à ladite plage...

Sub Test()
    Dim TblNoms, TblPlanning(), N%, i%, j%, a%
    TblNoms = [Select_planning].Offset(, -1).Resize(, 1).Value
    ReDim TblPlanning(1 To UBound(TblNoms), 1 To 31)
    With [Noms]
        For i = 1 To .Rows.Count
            For N = 1 To UBound(TblNoms)
                If TblNoms(N, 1) = .Cells(i, 1) Then Exit For
            Next N
            If N <= UBound(TblNoms) Then
                a = .Cells(i, 6)
                For j = Day(.Cells(i, 3)) To Day(.Cells(i, 4))
                    TblPlanning(N, j) = a
                Next j
            End If
        Next i
    End With
    [Select_planning].Value = TblPlanning
End Sub

Clique sur le bouton Test pour tester (efface la plage avant pour voir se passer quelque chose...)

Cordialement.


Bonjour,

Merci beaucoup pour votre retour et vos différentes remarques. J'en prends note.

J'ai adapté la méthode que vous préconisez et cela fonctionne.

Merci encore d'avoir prit le temps de répondre à ma demande et d'avoir formulé une réponse aussi clair

Cordialement,

Clémence

Rechercher des sujets similaires à "somme prod vba"