Selectionner une ligne d'une plage donnée

Fermé
seb - 24 oct. 2017 à 15:43
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 30 oct. 2017 à 09:01
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

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
24 oct. 2017 à 23:12
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
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
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
Modifié le 25 oct. 2017 à 16:58
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
S&eacute;b > Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023
26 oct. 2017 à 10:02
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
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779 > S&eacute;b
Modifié le 26 oct. 2017 à 12:36
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
S&eacute;b > Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023
26 oct. 2017 à 14:18
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
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779 > S&eacute;b
26 oct. 2017 à 17:59
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
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
30 oct. 2017 à 09:01
De rien, au plaisir de te relire sur le Forum.
0