Code VBA pour remplacer fonction index et equiv sous condition

bonjour,

J'ai crée un petit fichier pour automatiser la réalisation des emplois du temps. J'ai utilisé une formule qui se répète dans chaque cellule et qui utilise les données de la feuille EDT Type pour remplir automatiquement le planning mensuel. Je souhaiterais "convertir" cette formule en vba mais pour l'instant je n'y arrive pas. Quelqu'un parmi vous pourrait-il m'aider ?

Merci bcp

bonjour,

une fonction personnalisée, mais qui selon moi n'apporte aucun avantage.

Function edt(tabedttype, jour, edtp)
    Set re = tabedttype.Rows("1:1").Find(edtp, lookat:=xlWhole, LookIn:=xlValues)
    If re Is Nothing Then
        edt = ""
    Else
        edt = tabedttype(Application.WorksheetFunction.Weekday(jour, 2) + 1, re.Column - 1)
    End If
End Function

appel de la fonction dans une cellule excel

=edt(reference du tableau edt,jour,type edt)

formules mises pour la première semaine.

Merci pour cet apport.

En fait je voudrais que dans les cellules du planning mensuel n'apparaisse que les valeurs numériques.

Cela me permettrait à partir du planning type de rajouter des infos dans les cellules

bonjour,

solution via une macro

Sub remplirtableau()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Set wsm = Sheets("edt mois")
    Set wst = Sheets("edt type")
    wsm.Range("E8:W38").ClearContents
    For i = 8 To 38
        djour = wsm.Cells(i, 3)
        If djour <> "" Then
            jour = Application.WorksheetFunction.Weekday(djour, 2)
            If jour < 6 Then
                wst.Cells(jour + 3, 3).Resize(1, 19).Copy wsm.Cells(i, 5)
            End If
        End If
    Next i
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub

Merci bcp. C'est quasi ça !

Pensez-vous qu'il soit possible de rajouter une condition supplémentaire en fonction du nom de la personne. Dans mon planning, j'ai remplacé les noms par A, B, C...

bonjour,

il doit y avoir quelque chose que je n'ai pas compris, car je ne vois pas l'intérêt de cette demande. le code fonctionne si les noms présents dans le planning (edt mois) et les noms présents dans edt type sont dans le même ordre sur les 2 feuilles. (ce qui est le cas dans le classeur que tu as mis à disposition)

mais voici

Sub remplirtableau()
    Dim tabp(38, 18) 'tableau planning
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Set wsm = Sheets("edt mois")
    Set wst = Sheets("edt type")
    wsm.Range("E8:W38").ClearContents 'on efface le planning
    For i = 8 To 38 'on remplit chaque ligne du planning
        djour = wsm.Cells(i, 3) 'date
        If djour <> "" Then ' non vide
            jour = Application.WorksheetFunction.Weekday(djour, 2) 'détermine le jour de la semaine
            If jour < 6 Then 'pas un samedi ni un dimanche
                For ip = 5 To 23 ' on remplit chaque colonne
                    personne = wsm.Cells(7, ip) 'nom de la personne dans cette colonne sur le planning
                    Set re = wst.Range("C3:U3").Find(personne, lookat:=xlWhole, LookIn:=xlValues) 'recherche du nom dans edttype
                    If re Is Nothing Then
                        tabp(i - 8, ip - 5) = "" 'pas trouvé
                    Else
                        tabp(i - 8, ip - 5) = wst.Cells(jour + 3, re.Column) 'trouvé
                    End If
                Next ip
            End If
        End If
    Next i
    wsm.Range("E8:W38") = tabp 'copie du tableau planning sur la feuille
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub

je ne dois pas savoir utiliser correctement le code parce que qu'il y ait ou non les noms cela ne change rien, ça recopie les données de la feuille EDT Type sans tenir compte du reste !

Je vais essayer de comprendre....

Merci bcp pour votre aide, je n'y arriverai pas seule

bonjour,

je t'ai mis la macro dans ton fichier exemple. Dis-moi précisément ce qui n'est pas correct.

Bonjour

Merci beaucoup d'avoir pris ce temps pour m'aider.

J'ai testé le fichier et à priori ça fonctionne comme je le souhaite.

C'est super.

Je suis entrain de me former au vba et je vois que ma marge de progression est immense.

Je vais déjà essayer de bien comprendre la macro que tu as réalisé et améliorer mon petit fichier, j'ai plein d'idée mais à voir si c'est réalisable !

Bonjour,

Pourrais-tu m'expliquer le code ci dessous que tu as utilisé dans la macro "Planning EDT 2020"

dim tabp(38,18) ---> ça correspond à quoi 38 et 18 ?

If re Is Nothing Then

tabp(i - 8, ip - 5) = "" 'pas trouvé

Else

tabp(i - 8, ip - 5) = wst.Cells(jour + 3, re.Column) 'trouvé

End If

que signifie tabp(i -8, ip -5) ?

Je t'en remercie.

bonjour,

alors voici

dim tabp(38,18) ---> ça correspond à quoi 38 et 18 ?

En fait cela aurait dû être dim tabp(30,18) pour correspondre exactement à la plage de cellules E8:W38. (31 lignes (de 0 à 30) et 19 colonnes (de 0 à 18)).

tabp est un tableau géré par VBA, qui contient les données à mettre dans la plage E8:W38.Un tableau VBA est utilisé pour des raisons de performances. En effet, les interactions avec la feuille de calcul (surtout en écriture) ont un gros impact sur la vitesse d'exécution des macros.

If re Is Nothing Then
tabp(i - 8, ip - 5) = "" 'pas trouvé
Else
tabp(i - 8, ip - 5) = wst.Cells(jour + 3, re.Column) 'trouvé
End If

que signifie tabp(i -8, ip -5) ?

dans ce code, i est le numéro de ligne et ip est un numéro de colonne.

Une boucle fait varier i de 8 à 38 (ceci pour prendre la date dans la bonne ligne) et une autre boucle fait varier ip de 5 à 23 (colonne E à W) ceci pour prendre le nom de la personne). la ligne 8 correspond à la ligne 0 du tableau tabp (d'où le i-8 pour avoir 0) et la colonne E correspond à la colonne 0 du tableau tabp (d'où le ip-5 pour avoir 0).

Le tableau chargé avec toutes les données est ensuite copié sur la feuille en une seule instruction.

wsm.Range("E8:W38") = tabp 'copie du tableau planning sur la feuille

Bonjour,

un grand merci pour ces explications, j'ai tout compris c'est très clair.

Rechercher des sujets similaires à "code vba remplacer fonction index equiv condition"