Selectionner une ligne d'une plage donnée

Bonjour à toutes et à tous,

Voila, j'ai effectuer plusieurs recherche sur le net et sur différents forum mais je n'est pas trouver ma réponse.

A l'aide du VBA, je souhaite, dans une plage donnée, sélectionner la ligne qui ce trouve en face d'un mot définie.

J'ai déjà réussi a faire quelque chose mais le problème, c'est que ca sélectionne toute la colonne et non ma plage.

un aperçu de ce que j'ai réalisé:

"
Sub verrouillage()

'------------------------------------------------------- declaration des variable
Dim plage As Range
Set plage = Range("g7:h9,g13:h15,g19:h21")
'plage.Select

Dim i As Integer
i = 1

'------------------------------------------------------- boucle sur les ligne 7 a 21
For i = 7 To 21
Application.ScreenUpdating = False '------------ desactivation de la mise à jour
'------------------------------------------------------- condition "si vrai"
If Range("j" & i).Value Like "FERIE" Then '- recherche dans la colonne J la valeur "FERIE"
With ActiveSheet '-------------------------- active la feuille
.Unprotect Password:="123" '---------------- désactive la protection de feuille
Range("g" & i, "h" & i).Select
Range("g" & i, "h" & i).Locked = True '----- selectionne les cellules en face du "FERIE" et les rends verrouiller
'ActiveCell.EntireRow.Locked = True
'Range(plage & i).Locked = True
.Protect Password:="123" '------------------ active la protection de feuille
End With
'------------------------------------------------------- condition "si faux"
Else
With ActiveSheet '-------------------------- active la feuille
.Unprotect Password:="123" '---------------- désactive la protection de feuille
Range("g" & i, "h" & i).Locked = False '---- selectionne les cellules en face du "FERIE" et les rends déverrouiller
'ActiveCell.EntireRow.Locked = False
'Range(plage & i).Locked = False
.Protect Password:="123" '------------------ active la protection de feuille
End With
'------------------------------------------------------- fin de la condition If
End If
'------------------------------------------------------- fin de la boucle
Next
Application.ScreenUpdating = True '----------------- activation de la mise à jour
End Sub
"

Je vous remercie de l'aide que vous allez m'apporter.

Seb

excel office Pro Plus 2013

3 réponses

  1. Bonjour,

    Sélectionner dans quel but ?
    En général sélectionner est toujours une mauvaise méthode.

    Pour chercher FERIE dans la colonne J la méthode FIND est bien plus rapide qu'une boucle sur toutes les cellules.
    0
    1. Bonjour et merci de prendre le temps de me répondre,

      En faite, sélectionner les cellules qui ce trouvent en face de "FERIE" me permets de faire 2 choses.
      - Soit "FERIE" est présent, alors les cellules sont verrouillées (et donc "immodifiable").
      - Soit "FERIE" n'est pas présent, et là, les cellules sont déverrouillées (et donc "modifiable").

      cordialement,

      Séb
      0
      1. Bonjour,

        Essaies :
        Option Explicit
        Public Sub verrouillage()
        ' Déclaration des variable
        Dim plage As Range
        Dim ferie As Range
        Dim adresse As String
        
          ' Initialisation des varaibles
          Set plage = ActiveSheet.Range("J7:J21")
          ' Déverrouiller toutes les cellules (soit la plage G7:H21)
          plage.Offset(0, -3).Resize(, 2).Locked = False
          ' Chercher la première cellule contenant FERIE
          Set ferie = plage.Find("FERIE", , xlValues, xlPart)
                       'ou .Find("FERIE", , xlValues, xlWhole)
                       'pour chercher la valeur exacte.
          If Not ferie Is Nothing Then
            ' Si elle existe, noter son adresse
            adresse = ferie.Address
            ' Déprotéger la feuille
            ActiveSheet.Unprotect  'Inutile de mettre un mot de passe qui
                                   'apparaît en clair dans la macro !!!
            Do
              ' Verrouiller les cellules G:H de la ligne
              ferie.Offset(0, -3).Resize(, 2).Locked = True
              '  Chercher le FERIE suivant
              Set ferie = plage.FindNext(ferie)
            Loop While ferie.Address <> adresse  'Boucler tant qu'on n'est
                                                 'pas revenu à la 1° cellule
            ' Protéger la feuille
            ActiveSheet.Protect
          End If
        
        End Sub
        

        Pas besoin de sélectionner quoi que ce soit !
        0
      2. @Patrice33740Bonjour,

        Je te remercie de ton retour.

        Je viens de testé mais, ta proposition, bloque sur cette ligne:
        "plage.Offset(0, -3).Resize(, 2).Locked = False"

        "Erreur d'exécution '1004':
        impossible de définir la propriété Locked de la classe Range"
        0
      3. @S&eacute;bEffectivement, désolé, il faut déprotéger la feuille avant :
        Public Sub verrouillage()
        ' Déclaration des variable
        Dim plage As Range
        Dim ferie As Range
        Dim adresse As String
        
          ' Initialisation des variables
          Set plage = ActiveSheet.Range("J7:J21")
          ' Déprotéger la feuille
          ActiveSheet.Unprotect  'Inutile de mettre un mot de passe qui
                                 'apparaît en clair dans la macro !!!
          ' Déverrouiller toutes les cellules (soit la plage G7:H21)
          plage.Offset(0, -3).Resize(, 2).Locked = False
          ' Chercher la première cellule contenant FERIE
          Set ferie = plage.Find("FERIE", , xlValues, xlPart)
                       'ou .Find("FERIE", , xlValues, xlWhole)
                       'pour chercher la valeur exacte.
          If Not ferie Is Nothing Then
            ' Si elle existe, noter son adresse
            adresse = ferie.Address
            Do
              ' Verrouiller les cellules G:H de la ligne
              ferie.Offset(0, -3).Resize(, 2).Locked = True
              '  Chercher le FERIE suivant
              Set ferie = plage.FindNext(ferie)
            Loop While ferie.Address <> adresse  'Boucler tant qu'on n'est
                                                 'pas revenu à la 1° cellule
          End If
          ' Protéger la feuille
          ActiveSheet.Protect
        
        End Sub
        0
      4. @Patrice33740Merci beaucoup, ça fonctionne nickel. :)

        Le plus, serait que, dans la plage, elle n'est pas suivi.
        C'est a dire que seule le groupe "J7:J9,J13:J15,J19:J21" soit activé et non une plage de "J7:J21".

        (j'ai un doute sur la clarté de ma demande :) )

        Merci d'avance,

        Séb
        0
      5. @S&eacute;bIl faut traiter chaque zone :
        Public Sub verrouillage()
        Dim plage As Range
        Dim zone As Range
        Dim ferie As Range
        Dim adresse As String
        
          Set plage = ActiveSheet.Range("J7:J9,J13:J15,J19:J21")
          ActiveSheet.Unprotect
          For Each zone In plage.Areas
            zone.Offset(0, -3).Resize(, 2).Locked = False
          Next zone
          Set ferie = plage.Find("FERIE", , xlValues, xlPart)
          If Not ferie Is Nothing Then
            adresse = ferie.Address
            Do
              ferie.Offset(0, -3).Resize(, 2).Locked = True
              Set ferie = plage.FindNext(ferie)
            Loop While ferie.Address <> adresse
          End If
          ActiveSheet.Protect
        
        End Sub
        0
    2. De rien, au plaisir de te relire sur le Forum.
      0