Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Boucle, protection et cellule verrouillée

6 réponses
Avatar
Manbas
Bonjour à tous,
Voici mon probleme.
Sur mes feuilles certaines cellules sont verrouillées d'autres pas.
Dans la macro qui "nettoie" les cellules non verrouillées de ma feuille
protégée, je défini le range sur lequel je souhaite agir.
J'utilise une boucle plutôt qu'un selection.clearcontents car la feuille
contient du Worksheet_Change(ByVal Target As Range) qui gêne ce "nettoyage".
Ma macro est en échec répété, à cause de cellules qui ne se trouvent PAS
dans ce range !!

For Each f In Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin",
"Juillet", "août", _
"Septembre", "Octobre", "Novembre", "décembre")
With Sheets(f)
.Visible = True
.Unprotect
.Activate
End With
'le bogue se présente ici
For Each cell In
Range("P10:P114,Z10:Z114,AJ10:AJ114,AT10:AT114,BD10:BD114,BN10:BN114,BX10:BX114,CH10:CH114,CR10:CR114,DB10:DB114,DL10:DL114,DV10:DV114,EF10:EF114,EP10:EP114,EZ10:EZ114,FJ10:FJ114,FT10:FT114,GD10:GD114,GN10:GN114,GX10:GX114")
If cell.Value <> "" Then cell.Value = ""
Next cell

Ne comprenant pourquoi cette macro s'arrêtait j'ai rajouté
On Error GoTo Line1
Line1:
ColonnBug = Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27) +
2)
MsgBox ActiveSheet.Name & ColonnBug & ActiveCell.Row

et là je découvre que les cellules "bloquantes" se trouvent dans les
colonnes G, N, A. !
Je corrige leur format et le problème recommence tout de suite sur une autre
cellule, je ne sais pas pourquoi.
Ce que je voudrais savoir en premier c'est pourquoi il y a cette interaction
avec le code qui est pourtant limité à un range défini à l'exterieur de ces
colonnes G,N,A.

Merci de votre aide

6 réponses

Avatar
MichDenis
A ) Le nombre de caractères maximum pour définir un range dans (("P10:P114,Z10:Z114...) est de 255

B ) Ce type de boucle sur un range définit de cette façon n'est pas sûre même en deçà de 255
caractères
Il arrive que cela ne fonctionne pas -> et c'est aléatoire !!!

C ) il serait mieux que tu définisses un "Array" comme tu as fais avec les mois de l'année
et que tu boucles sur chaque entré de la plage.

D ) Si tu plaçais dans le ThisWorkbook, ceci, tu pourrais utiliser toutes les macros
que tu désires sans te soucier du fait que tes feuilles soient protégées ou pas. Et,
pourtant tes feuilles seraient quand même inaccessible à l'usager.


'--------------------------
Private Sub Workbook_Open()
Dim Sh As Worksheet
For Each Sh In Worksheets
Sh.Protect "MonMotDePasse", True, True, True, True
Next
End Sub
'--------------------------

"Manbas" a écrit dans le message de news:
%
Bonjour à tous,
Voici mon probleme.
Sur mes feuilles certaines cellules sont verrouillées d'autres pas.
Dans la macro qui "nettoie" les cellules non verrouillées de ma feuille
protégée, je défini le range sur lequel je souhaite agir.
J'utilise une boucle plutôt qu'un selection.clearcontents car la feuille
contient du Worksheet_Change(ByVal Target As Range) qui gêne ce "nettoyage".
Ma macro est en échec répété, à cause de cellules qui ne se trouvent PAS
dans ce range !!

For Each f In Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin",
"Juillet", "août", _
"Septembre", "Octobre", "Novembre", "décembre")
With Sheets(f)
.Visible = True
.Unprotect
.Activate
End With
'le bogue se présente ici
For Each cell In
Range("P10:P114,Z10:Z114,AJ10:AJ114,AT10:AT114,BD10:BD114,BN10:BN114,BX10:BX114,CH10:CH114,CR10:CR114,DB10:DB114,DL10:DL114,DV10:DV114,EF10:EF114,EP10:EP114,EZ10:EZ114,FJ10:FJ114,FT10:FT114,GD10:GD114,GN10:GN114,GX10:GX114")
If cell.Value <> "" Then cell.Value = ""
Next cell

Ne comprenant pourquoi cette macro s'arrêtait j'ai rajouté
On Error GoTo Line1
Line1:
ColonnBug = Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27) +
2)
MsgBox ActiveSheet.Name & ColonnBug & ActiveCell.Row

et là je découvre que les cellules "bloquantes" se trouvent dans les
colonnes G, N, A. !
Je corrige leur format et le problème recommence tout de suite sur une autre
cellule, je ne sais pas pourquoi.
Ce que je voudrais savoir en premier c'est pourquoi il y a cette interaction
avec le code qui est pourtant limité à un range défini à l'exterieur de ces
colonnes G,N,A.

Merci de votre aide
Avatar
Manbas
Merci +++ MichDenis.

A) & B) Tu as certainement raison.
C'est en effet aléatoire.
La preuve: lorsque la macro bloque elle est inscrite dans une série de
public sub déclenchée par un optionbutton.
Je débogue en arrêtant le code mais sans rien écrire: je relance simplement
la macro, et elle passe sans difficulté!

C) Je ne sais pas écrire l'Array que tu me suggères.
Est-ce Array("P10:P114","Z10:Z114",etc). La place des guillemets change
tout.

D) Justement des utilisateurs vont écrire dans ce classeur, et seulement
dans certains emplacements et pas dans d'autres.
Je défini donc la protection " a priori"? C'est extrêmement intéressant car
je veux partager ce classeur, et que les actions de protection-déprotection
étaient pour moi des obstacles à cette solution.


"MichDenis" a écrit dans le message de news:
%
A ) Le nombre de caractères maximum pour définir un range dans
(("P10:P114,Z10:Z114...) est de 255

B ) Ce type de boucle sur un range définit de cette façon n'est pas sûre
même en deçà de 255
caractères
Il arrive que cela ne fonctionne pas -> et c'est aléatoire !!!

C ) il serait mieux que tu définisses un "Array" comme tu as fais avec les
mois de l'année
et que tu boucles sur chaque entré de la plage.

D ) Si tu plaçais dans le ThisWorkbook, ceci, tu pourrais utiliser toutes
les macros
que tu désires sans te soucier du fait que tes feuilles soient
protégées ou pas. Et,
pourtant tes feuilles seraient quand même inaccessible à l'usager.


'--------------------------
Private Sub Workbook_Open()
Dim Sh As Worksheet
For Each Sh In Worksheets
Sh.Protect "MonMotDePasse", True, True, True, True
Next
End Sub
'--------------------------

"Manbas" a écrit dans le message de news:
%
Bonjour à tous,
Voici mon probleme.
Sur mes feuilles certaines cellules sont verrouillées d'autres pas.
Dans la macro qui "nettoie" les cellules non verrouillées de ma feuille
protégée, je défini le range sur lequel je souhaite agir.
J'utilise une boucle plutôt qu'un selection.clearcontents car la feuille
contient du Worksheet_Change(ByVal Target As Range) qui gêne ce
"nettoyage".
Ma macro est en échec répété, à cause de cellules qui ne se trouvent PAS
dans ce range !!

For Each f In Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin",
"Juillet", "août", _
"Septembre", "Octobre", "Novembre", "décembre")
With Sheets(f)
.Visible = True
.Unprotect
.Activate
End With
'le bogue se présente ici
For Each cell In
Range("P10:P114,Z10:Z114,AJ10:AJ114,AT10:AT114,BD10:BD114,BN10:BN114,BX10:BX114,CH10:CH114,CR10:CR114,DB10:DB114,DL10:DL114,DV10:DV114,EF10:EF114,EP10:EP114,EZ10:EZ114,FJ10:FJ114,FT10:FT114,GD10:GD114,GN10:GN114,GX10:GX114")
If cell.Value <> "" Then cell.Value = ""
Next cell

Ne comprenant pourquoi cette macro s'arrêtait j'ai rajouté
On Error GoTo Line1
Line1:
ColonnBug = Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27) +
2)
MsgBox ActiveSheet.Name & ColonnBug & ActiveCell.Row

et là je découvre que les cellules "bloquantes" se trouvent dans les
colonnes G, N, A. !
Je corrige leur format et le problème recommence tout de suite sur une
autre
cellule, je ne sais pas pourquoi.
Ce que je voudrais savoir en premier c'est pourquoi il y a cette
interaction
avec le code qui est pourtant limité à un range défini à l'exterieur de
ces
colonnes G,N,A.

Merci de votre aide






Avatar
MichDenis
Dim Arr
dim Elt as variant

arr = Array("P10:P114","Z10:Z114",etc).

For each elt in Arr
with Worksheets("NomDeLaFeuille").Range(elt)
'ce que tu veux faire
end with
next


"Manbas" a écrit dans le message de news:

Merci +++ MichDenis.

A) & B) Tu as certainement raison.
C'est en effet aléatoire.
La preuve: lorsque la macro bloque elle est inscrite dans une série de
public sub déclenchée par un optionbutton.
Je débogue en arrêtant le code mais sans rien écrire: je relance simplement
la macro, et elle passe sans difficulté!

C) Je ne sais pas écrire l'Array que tu me suggères.
Est-ce Array("P10:P114","Z10:Z114",etc). La place des guillemets change
tout.

D) Justement des utilisateurs vont écrire dans ce classeur, et seulement
dans certains emplacements et pas dans d'autres.
Je défini donc la protection " a priori"? C'est extrêmement intéressant car
je veux partager ce classeur, et que les actions de protection-déprotection
étaient pour moi des obstacles à cette solution.


"MichDenis" a écrit dans le message de news:
%
A ) Le nombre de caractères maximum pour définir un range dans
(("P10:P114,Z10:Z114...) est de 255

B ) Ce type de boucle sur un range définit de cette façon n'est pas sûre
même en deçà de 255
caractères
Il arrive que cela ne fonctionne pas -> et c'est aléatoire !!!

C ) il serait mieux que tu définisses un "Array" comme tu as fais avec les
mois de l'année
et que tu boucles sur chaque entré de la plage.

D ) Si tu plaçais dans le ThisWorkbook, ceci, tu pourrais utiliser toutes
les macros
que tu désires sans te soucier du fait que tes feuilles soient
protégées ou pas. Et,
pourtant tes feuilles seraient quand même inaccessible à l'usager.


'--------------------------
Private Sub Workbook_Open()
Dim Sh As Worksheet
For Each Sh In Worksheets
Sh.Protect "MonMotDePasse", True, True, True, True
Next
End Sub
'--------------------------

"Manbas" a écrit dans le message de news:
%
Bonjour à tous,
Voici mon probleme.
Sur mes feuilles certaines cellules sont verrouillées d'autres pas.
Dans la macro qui "nettoie" les cellules non verrouillées de ma feuille
protégée, je défini le range sur lequel je souhaite agir.
J'utilise une boucle plutôt qu'un selection.clearcontents car la feuille
contient du Worksheet_Change(ByVal Target As Range) qui gêne ce
"nettoyage".
Ma macro est en échec répété, à cause de cellules qui ne se trouvent PAS
dans ce range !!

For Each f In Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin",
"Juillet", "août", _
"Septembre", "Octobre", "Novembre", "décembre")
With Sheets(f)
.Visible = True
.Unprotect
.Activate
End With
'le bogue se présente ici
For Each cell In
Range("P10:P114,Z10:Z114,AJ10:AJ114,AT10:AT114,BD10:BD114,BN10:BN114,BX10:BX114,CH10:CH114,CR10:CR114,DB10:DB114,DL10:DL114,DV10:DV114,EF10:EF114,EP10:EP114,EZ10:EZ114,FJ10:FJ114,FT10:FT114,GD10:GD114,GN10:GN114,GX10:GX114")
If cell.Value <> "" Then cell.Value = ""
Next cell

Ne comprenant pourquoi cette macro s'arrêtait j'ai rajouté
On Error GoTo Line1
Line1:
ColonnBug = Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27) +
2)
MsgBox ActiveSheet.Name & ColonnBug & ActiveCell.Row

et là je découvre que les cellules "bloquantes" se trouvent dans les
colonnes G, N, A. !
Je corrige leur format et le problème recommence tout de suite sur une
autre
cellule, je ne sais pas pourquoi.
Ce que je voudrais savoir en premier c'est pourquoi il y a cette
interaction
avec le code qui est pourtant limité à un range défini à l'exterieur de
ces
colonnes G,N,A.

Merci de votre aide






Avatar
Manbas
Merci MichDenis +++


"MichDenis" a écrit dans le message de news:

Dim Arr
dim Elt as variant

arr = Array("P10:P114","Z10:Z114",etc).

For each elt in Arr
with Worksheets("NomDeLaFeuille").Range(elt)
'ce que tu veux faire
end with
next


"Manbas" a écrit dans le message de news:

Merci +++ MichDenis.

A) & B) Tu as certainement raison.
C'est en effet aléatoire.
La preuve: lorsque la macro bloque elle est inscrite dans une série de
public sub déclenchée par un optionbutton.
Je débogue en arrêtant le code mais sans rien écrire: je relance
simplement
la macro, et elle passe sans difficulté!

C) Je ne sais pas écrire l'Array que tu me suggères.
Est-ce Array("P10:P114","Z10:Z114",etc). La place des guillemets change
tout.

D) Justement des utilisateurs vont écrire dans ce classeur, et seulement
dans certains emplacements et pas dans d'autres.
Je défini donc la protection " a priori"? C'est extrêmement intéressant
car
je veux partager ce classeur, et que les actions de
protection-déprotection
étaient pour moi des obstacles à cette solution.


"MichDenis" a écrit dans le message de news:
%
A ) Le nombre de caractères maximum pour définir un range dans
(("P10:P114,Z10:Z114...) est de 255

B ) Ce type de boucle sur un range définit de cette façon n'est pas sûre
même en deçà de 255
caractères
Il arrive que cela ne fonctionne pas -> et c'est aléatoire !!!

C ) il serait mieux que tu définisses un "Array" comme tu as fais avec
les
mois de l'année
et que tu boucles sur chaque entré de la plage.

D ) Si tu plaçais dans le ThisWorkbook, ceci, tu pourrais utiliser toutes
les macros
que tu désires sans te soucier du fait que tes feuilles soient
protégées ou pas. Et,
pourtant tes feuilles seraient quand même inaccessible à l'usager.


'--------------------------
Private Sub Workbook_Open()
Dim Sh As Worksheet
For Each Sh In Worksheets
Sh.Protect "MonMotDePasse", True, True, True, True
Next
End Sub
'--------------------------

"Manbas" a écrit dans le message de news:
%
Bonjour à tous,
Voici mon probleme.
Sur mes feuilles certaines cellules sont verrouillées d'autres pas.
Dans la macro qui "nettoie" les cellules non verrouillées de ma feuille
protégée, je défini le range sur lequel je souhaite agir.
J'utilise une boucle plutôt qu'un selection.clearcontents car la feuille
contient du Worksheet_Change(ByVal Target As Range) qui gêne ce
"nettoyage".
Ma macro est en échec répété, à cause de cellules qui ne se trouvent PAS
dans ce range !!

For Each f In Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin",
"Juillet", "août", _
"Septembre", "Octobre", "Novembre", "décembre")
With Sheets(f)
.Visible = True
.Unprotect
.Activate
End With
'le bogue se présente ici
For Each cell In
Range("P10:P114,Z10:Z114,AJ10:AJ114,AT10:AT114,BD10:BD114,BN10:BN114,BX10:BX114,CH10:CH114,CR10:CR114,DB10:DB114,DL10:DL114,DV10:DV114,EF10:EF114,EP10:EP114,EZ10:EZ114,FJ10:FJ114,FT10:FT114,GD10:GD114,GN10:GN114,GX10:GX114")
If cell.Value <> "" Then cell.Value = ""
Next cell

Ne comprenant pourquoi cette macro s'arrêtait j'ai rajouté
On Error GoTo Line1
Line1:
ColonnBug = Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27)
+
2)
MsgBox ActiveSheet.Name & ColonnBug & ActiveCell.Row

et là je découvre que les cellules "bloquantes" se trouvent dans les
colonnes G, N, A. !
Je corrige leur format et le problème recommence tout de suite sur une
autre
cellule, je ne sais pas pourquoi.
Ce que je voudrais savoir en premier c'est pourquoi il y a cette
interaction
avec le code qui est pourtant limité à un range défini à l'exterieur de
ces
colonnes G,N,A.

Merci de votre aide












Avatar
LSteph
Bonjour,

(En annexe de ta question)

Pour employer une adresse pareille
s'il y en a vraiment beaucoup et que les colonnes
sont à intervalle régulier exemple moins fatiguant:

Sub tRange()
Dim myc As String, MyR As Range
For i = 16 To 206 Step 10
If Len(myc) = 0 Then
myc = Columns(i).Address
Else
myc = myc & "," & Columns(i).Address
End If
Next
Set MyR = Intersect(Range(myc), [10:114])
MyR.Activate
End Sub

'lSteph

Bonjour à tous,
Voici mon probleme.
Sur mes feuilles certaines cellules sont verrouillées d'autres pas.
Dans la macro qui "nettoie" les cellules non verrouillées de ma feuille
protégée, je défini le range sur lequel je souhaite agir.
J'utilise une boucle plutôt qu'un selection.clearcontents car la feuille
contient du Worksheet_Change(ByVal Target As Range) qui gêne ce "nettoyage".
Ma macro est en échec répété, à cause de cellules qui ne se trouvent PAS
dans ce range !!

For Each f In Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin",
"Juillet", "août", _
"Septembre", "Octobre", "Novembre", "décembre")
With Sheets(f)
.Visible = True
.Unprotect
.Activate
End With
'le bogue se présente ici
For Each cell In
Range("P10:P114,Z10:Z114,AJ10:AJ114,AT10:AT114,BD10:BD114,BN10:BN114,BX10:BX114,CH10:CH114,CR10:CR114,DB10:DB114,DL10:DL114,DV10:DV114,EF10:EF114,EP10:EP114,EZ10:EZ114,FJ10:FJ114,FT10:FT114,GD10:GD114,GN10:GN114,GX10:GX114")
If cell.Value <> "" Then cell.Value = ""
Next cell

Ne comprenant pourquoi cette macro s'arrêtait j'ai rajouté
On Error GoTo Line1
Line1:
ColonnBug = Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27) +
2)
MsgBox ActiveSheet.Name & ColonnBug & ActiveCell.Row

et là je découvre que les cellules "bloquantes" se trouvent dans les
colonnes G, N, A. !
Je corrige leur format et le problème recommence tout de suite sur une autre
cellule, je ne sais pas pourquoi.
Ce que je voudrais savoir en premier c'est pourquoi il y a cette interaction
avec le code qui est pourtant limité à un range défini à l'exterieur de ces
colonnes G,N,A.

Merci de votre aide




Avatar
Manbas
Bonjour Lsteph
En effet les intervalles sont réguliers.
A ce jour ce code est encore trop difficile pour moi.
Je peux le reproduire néanmoins, l'adaptation m'aidera peut-être.
Merci beaucoup.
Bonne journée


"LSteph" a écrit dans le message de news:
%
Bonjour,

(En annexe de ta question)

Pour employer une adresse pareille
s'il y en a vraiment beaucoup et que les colonnes
sont à intervalle régulier exemple moins fatiguant:

Sub tRange()
Dim myc As String, MyR As Range
For i = 16 To 206 Step 10
If Len(myc) = 0 Then
myc = Columns(i).Address
Else
myc = myc & "," & Columns(i).Address
End If
Next
Set MyR = Intersect(Range(myc), [10:114])
MyR.Activate
End Sub

'lSteph

Bonjour à tous,
Voici mon probleme.
Sur mes feuilles certaines cellules sont verrouillées d'autres pas.
Dans la macro qui "nettoie" les cellules non verrouillées de ma feuille
protégée, je défini le range sur lequel je souhaite agir.
J'utilise une boucle plutôt qu'un selection.clearcontents car la feuille
contient du Worksheet_Change(ByVal Target As Range) qui gêne ce
"nettoyage".
Ma macro est en échec répété, à cause de cellules qui ne se trouvent PAS
dans ce range !!

For Each f In Array("Janvier", "Février", "Mars", "Avril", "Mai",
"Juin", "Juillet", "août", _
"Septembre", "Octobre", "Novembre", "décembre")
With Sheets(f)
.Visible = True
.Unprotect
.Activate
End With
'le bogue se présente ici
For Each cell In
Range("P10:P114,Z10:Z114,AJ10:AJ114,AT10:AT114,BD10:BD114,BN10:BN114,BX10:BX114,CH10:CH114,CR10:CR114,DB10:DB114,DL10:DL114,DV10:DV114,EF10:EF114,EP10:EP114,EZ10:EZ114,FJ10:FJ114,FT10:FT114,GD10:GD114,GN10:GN114,GX10:GX114")
If cell.Value <> "" Then cell.Value = ""
Next cell

Ne comprenant pourquoi cette macro s'arrêtait j'ai rajouté
On Error GoTo Line1
Line1:
ColonnBug = Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27)
+ 2)
MsgBox ActiveSheet.Name & ColonnBug & ActiveCell.Row

et là je découvre que les cellules "bloquantes" se trouvent dans les
colonnes G, N, A. !
Je corrige leur format et le problème recommence tout de suite sur une
autre cellule, je ne sais pas pourquoi.
Ce que je voudrais savoir en premier c'est pourquoi il y a cette
interaction avec le code qui est pourtant limité à un range défini à
l'exterieur de ces colonnes G,N,A.

Merci de votre aide