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.