Sélection d'une plage selon deux critères (cellule) variables

BOnjour à tous,

Voici un petit casse-tête, pour moi du moins grand débutant VBA.

Une collègue m'a fait une drôle de demande avec des faux calendriers. J'ai créer une BD et trouver les formules pour faire ressortir la données souhaitées : la prochaine salle disponible à une date précise.

Cependant, je me demandais si je ne pouvais pas atteindre directement la cellule de cette salle.

Dans le fichier joint, je n'ai mis que l'onglet avec un bout de calendrier nécessaire à la compréhension et les résultats des formules me donnant l'information. J'ai fouillé pour une macro avec Sélection de plage (OFFSET(EQUIV()) mais je navigue en terrain inconnu avec le VBA.

L'idée de la macro et en commentaire dans le fichier.

Merci bien.

Bonjour Spage,

En P.J. une proposition en espérant avoir bien compris ton pb.

Dans l'Onglet "Accès Rapide", j'ai

  • Ajouté des formules pour calculer "Onglet", "Jour" et "Mois Année"
  • Ajouté une liste déroulante pour le choix de l'horaire.
  • Nommé toutes les zones de paramétrage "SALLE";"Onglet"...
  • Ajouté un bouton de déclenchement de la sélection de la cellule cherchée.

Le code associé est :

Option Explicit
Function selectionRapide(zSalle As String, zOnglet As String, zJour As Integer, zMoisAnnee As String, zHoraire As String) As String
    Dim oSheet As Worksheet, oRange1 As Range, oRange2 As Range, oFocusCell As Range, oRoomCell As Range, oDayCell As Range, oMonthYearCell As Range, oHourCell As Range
    Dim booMoisOK As Boolean

    'On recherche l'Onglet
    Set oSheet = ThisWorkbook.Worksheets(zOnglet)
    If Not oSheet Is Nothing Then
        'On recherche la salle pour connaitre sa 1ère ligne
        Set oRoomCell = oSheet.Cells.Find(zSalle)
        If Not oRoomCell Is Nothing Then
            'On recherche le mois pour connaitre sa 1ère ligne
            booMoisOK = False
            For Each oMonthYearCell In oSheet.Columns(1).Cells
                If oMonthYearCell.Value = zMoisAnnee Then
                    booMoisOK = True
                    Exit For
                End If
            Next
            If booMoisOK Then
                'On recherche l'horaire pour connaitre la ligne de la cellule ciblée
                Set oRange1 = oSheet.Range(oSheet.Cells(oMonthYearCell.Row + 2, oRoomCell.Column), oSheet.Cells(oMonthYearCell.Row + 13, oRoomCell.Column))
                Set oHourCell = oRange1.Find(zHoraire)
                If Not oHourCell Is Nothing Then
                    'On recherche le jour pour connaitre la colonne de la cellule ciblée
                    Set oRange1 = oSheet.Range(oSheet.Cells(oMonthYearCell.Row + 1, oHourCell.Column + 1), oSheet.Cells(oMonthYearCell.Row + 1, oHourCell.Column + 9))
                    Set oDayCell = oRange1.Find(zJour, , xlValues, xlWhole)
                    If Not oDayCell Is Nothing Then
                        'On cible la cellule
                        Set oFocusCell = oSheet.Cells(oHourCell.Row, oDayCell.Column)
                        oSheet.Select
                        oFocusCell.Activate
                    Else
                        MsgBox "Jour '" & zJour & "' non trouvé!"
                    End If
                Else
                    MsgBox "Horaire '" & zHoraire & "' non trouvé!"
                End If
            Else
                MsgBox "Mois '" & zMoisAnnee & "' non trouvé!"
            End If
        Else
            MsgBox "'" & zSalle & "' non trouvée!"
        End If
    Else
        MsgBox "Onglet '" & zOnglet & "' non trouvé!"
    End If
End Function
Sub Plaque1_Cliquer()
    Dim sSalle As String, sOnglet As String, iJour As Integer, sMoisAnnee As String, sHoraire As String

    'On récupère les valeurs présentes dans "Accès Rapide"
    sSalle = ThisWorkbook.Names("Salle").RefersToRange.Value
    sOnglet = ThisWorkbook.Names("Onglet").RefersToRange.Value
    iJour = ThisWorkbook.Names("Jour").RefersToRange.Value
    sMoisAnnee = ThisWorkbook.Names("MoisAnnee").RefersToRange.Value
    sHoraire = ThisWorkbook.Names("Horaire").RefersToRange.Value

    selectionRapide sSalle, sOnglet, iJour, sMoisAnnee, sHoraire
End Sub

Merci bien GVIALLES,

Ça fonctionne à merveille.

Je ne suis pas très à l'aise en VBA, c'est un sapré bon coup de main.

Je viens juste de terminer la version en formule, c'est moins beau et moins efficace.

Je suis toujours surpris par la rapidité et l'efficacité des réponses sur le site.

Ci-joint la version avec les formules.

Encore Merci.

Rechercher des sujets similaires à "selection plage deux criteres variables"