Microsoft 365 Remplir un onglet avec les données d'un autre onglet

debutant.excel

XLDnaute Nouveau
Bonsoir à tous,
Je voudrai remplir un onglet "Final" avec les données d'un autre onglet "Base de donnée"
Je voudrai une macro qui, selon les dates saisies, irait rechercher dans les colonnes des bonnes date de l'onglet "Base de donnée" les noms a mettre dans l'onglet "Final"
Je joins un Excel qui, j'espère, sera plus facile a comprendre. (j'ai mis mes explications dans l'onglet "Final")
sinon je répondrai pour plus d'explication
Bonne soirée
 

Pièces jointes

  • Programme.xlsm
    209.6 KB · Affichages: 16
Solution
Bonjour debutant.excel, JHA,

Pour moi il n'y a aucun problème en utilisant cette fonction VBA placée dans un module standard :
VB:
Function RechercheNom(dat As Range, mot As String) As String
If Not IsDate(dat) Then Exit Function
Dim c As Range, cc As Range
With Sheets("Base de donnée")
    For Each c In .UsedRange
        If IsDate(c) Then
            If c = dat Then
                For Each cc In Intersect(.UsedRange, c.EntireColumn)
                    If cc = mot Then RechercheNom = .Cells(cc.Row, 2): Exit Function
                Next cc
            End If
        End If
    Next c
End With
End Function
Dans le fichier joint je me suis contenté de renseigner les cellules jaunes, à vous de compléter.

A+

JHA

XLDnaute Barbatruc
Bonjour à tous,

Désolé mais ton fichier "Base de donnée" est très mal construit et ne permet pas de trouver facilement les noms, de plus les dates sont différentes.

Je te mets un exemple de formule pour les 2 premiers tableaux.

Je n'irai pas plus loin car trop compliqué pour moi.

Bon courage à toi et à ceux qui te proposeront des solutions avec le fichier en l'état.

JHA
 

Pièces jointes

  • Programme.xlsm
    207.9 KB · Affichages: 2

debutant.excel

XLDnaute Nouveau
Bonjour JHA
Merci pour ta réponse et ton fichier. Désolé pour mon fichier mal construit. est ce que c'est le vide entre les noms qui n'est pas bon? (j'avais ce vide pour me mettre un rappel dans les dates car je le faisait manuellement)
Je vais essayer de simplifier l'onglet "Base de donnée" et partir sur tes suggestions.
Par contre pour les dates différentes j'ai pris en compte ta remarque, mais je ne suis pas sur d'avoir compris: Est ce que c'est parce que dans un onglet c'est écrit en lettre? ou parce que j'ai mis = Cellule +7 jours?
Merci pour ton aide et le temps consacré à mon fichier.
 

job75

XLDnaute Barbatruc
Bonjour debutant.excel, JHA,

Pour moi il n'y a aucun problème en utilisant cette fonction VBA placée dans un module standard :
VB:
Function RechercheNom(dat As Range, mot As String) As String
If Not IsDate(dat) Then Exit Function
Dim c As Range, cc As Range
With Sheets("Base de donnée")
    For Each c In .UsedRange
        If IsDate(c) Then
            If c = dat Then
                For Each cc In Intersect(.UsedRange, c.EntireColumn)
                    If cc = mot Then RechercheNom = .Cells(cc.Row, 2): Exit Function
                Next cc
            End If
        End If
    Next c
End With
End Function
Dans le fichier joint je me suis contenté de renseigner les cellules jaunes, à vous de compléter.

A+
 

Pièces jointes

  • Programme(1).xlsm
    215.3 KB · Affichages: 7

debutant.excel

XLDnaute Nouveau
Bonjour job75,
Merci pour ton code VBA, je suis entrain de le transposer dans mon fichier et meme sans maitriser VBA ça a l'air de bien marcher, je dois tester les cas spécifiques a ma liste, mais pour l'instant j'arrive a m'en sortir :)
Merci encore pour ton temps et ton aide
Bonne journée
 

job75

XLDnaute Barbatruc
Deux variantes :

(1 bis) :
VB:
Function RechercheNom(dat As Range, mot As String) As String
If Not IsDate(dat) Then Exit Function
Dim c As Range, lig&, cc As Range
With Sheets("Base de donnée")
    For Each c In .UsedRange
        If IsDate(c) Then
            If c = dat Then
                lig = c.Row
                For Each cc In Intersect(.UsedRange, c.EntireColumn)
                    If cc.Row > lig Then 'sous ia date
                        If cc = mot Then RechercheNom = .Cells(cc.Row, 2): Exit Function
                    End If
                Next cc
            End If
        End If
    Next c
End With
End Function
Les résultats sont les mêmes qu'en (1).

(1 ter) :
VB:
Function RechercheNom(dat As Range, mot As String) As String
If Not IsDate(dat) Then Exit Function
Dim c As Range, lig&, cc As Range
With Sheets("Base de donnée")
    For Each c In .UsedRange
        If IsDate(c) Then
            If c = dat Then
                lig = c.Row
                For Each cc In Intersect(.UsedRange, c.EntireColumn)
                    If cc.Row > lig Then 'sous ia date
                        If IsDate(cc) Then Exit Function 'mais avant une autre date
                        If cc = mot Then RechercheNom = .Cells(cc.Row, 2): Exit Function
                    End If
                Next cc
            End If
        End If
    Next c
End With
End Function
Les résultats sont différents.
 

Pièces jointes

  • Programme(1 bis).xlsm
    215.6 KB · Affichages: 0
  • Programme(1 ter).xlsm
    215.3 KB · Affichages: 2

job75

XLDnaute Barbatruc
Encore une chose.

Pour que la fonction se recalcule quand on modifie une cellule quelconque, il faut la rendre volatile :
VB:
Function RechercheNom(dat As Range, mot As String) As String
Application.Volatile
'-----
End Function
 

Discussions similaires