Selectionner une ligne d'une plage donnée

seb -  
Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   -
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. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    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
  2. seb
     
    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. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
       
      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. S&eacute;b > Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention  
       
      Bonjour,

      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. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784 > S&eacute;b
       
      Effectivement, 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. S&eacute;b > Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention  
       
      Merci 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. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784 > S&eacute;b
       
      Il 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
  3. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    De rien, au plaisir de te relire sur le Forum.
    0