Simplication d'une formule INDEX/EQUIV en VBA

Bonsoir à tous !

Je viens vers vous car j'ai un petit soucis avec un code VBA.

Assez simplement, je dois créer une feuille de présence qui vient donner l'information si telle ou telle personne est présente telle ou telle date. Ma grosse difficulté réside dans le fait que si j'utilise les fonctions INDEX/EQUIV, la formule est très longue et fastidieuse (cf la formule entrée sur ma feuille Présence) dû au fait que chaque mois est sur une feuille différente.

C'est pourquoi, je suis parti dans le principe de créer un code VBA qui automatise la formule. Voilà en dessous l'idée globale :

Mois = Monthname(Month(Sheets("Présence").Range("B5")))
DerLig = Sheets(Mois).Range("A65536").End(xlUp).Row
DerCol = Sheets(Mois).Range("ADE1").End(xltoLeft).Column

For i = 7 to 12
x = Application.Match(Sheets("Présence").Cells(i,1).Value , Sheets(Mois).Range("A2", Cells(DerLig, 1)) , 0)
y = Application.Match(Sheets("Présence").Range("B5").Value , Sheets(Mois).Range("B1", Cells(1, DerCol)) , 0)
Sheets("Présence").Cells(i,2).Value = Application.Index(Sheets(Mois).Range("B2", Cells(DerLig, DerCol)) , x , y)
Next i

Or, cela me crée des petits bugs sur les fonctions Match et Index.

Ma question est simple : qu'est-ce que je fais de mal ?

Merci d'avance à toute personne qui prendra le temps de m'aider.

Bonne soirée,

Sha'

Bonsoir,

Une proposition avec une fonction personnelle

96sharney.xlsm (27.49 Ko)

A+

Bonsoir frangy,

Merci pour l'astuce, je n'avais pas pensé à utiliser une fonction personnelle. C'est exactement ce qu'il me fallait.

J'ai plu qu'à adapter ça sur mon vrai fichier.

Merci !


Bonjour,

Je reviens vers vous après avoir essayer d'adapter la solution de frangy à mon fichier.

Function PresenceAM(Personne As String, LaDate As Date) As Double
Dim c As Range, lig As Integer
    With Sheets(MonthName(Month(LaDate)))
        Set c = .Columns(1).Find(Personne, , xlValues, xlWhole)
        If Not c Is Nothing Then
            PresenceAM = .Cells(c.Row, 2 * Day(LaDate)).FormulaR1C1
        End If
    End With
End Function

La formule semble fonctionner à merveille quand la valeur de référence à prendre est un nombre, cependant une erreur de type #VALEUR m'est envoyée quand la valeur de la cellule est une lettre ou vide.

Pour compenser les cases vides, j'ai réussi à ne plus avoir d'erreur en demandant de réaliser la formule directement en VBA, comme suit :

Dim lig As Integer, c As Range
Range("a8:a500").Rows.Hidden = False
lig = Range("b63356").End(xlUp).Row
For I = 8 To lig
    Cells(I, 6).Value = PresenceAM(Cells(I, 2), Range("E5"))
    Cells(I, 7).Value = PresencePM(Cells(I, 2), Range("E5"))
Next I

Par contre, quelqu'un aurait-il une idée pour éviter l'erreur quand les valeurs sont des lettres ?

Merci.

Rechercher des sujets similaires à "simplication formule index equiv vba"