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

quadrature du cercle et crise de nerfs

7 réponses
Avatar
Philippe
Comment protéger une feuille et autoriser une macro à y insérer des lignes ?

Bonjour,

Soit une feuille Excel

Les utilisateurs peuvent choisir dans un menu déroulant (valider données) un
lieu
Qui vient d'une liste (plage de cellules).
Ce lieu choisi est réutilisé dans une autre feuille (=page0!i7)

Il peuvent ajouter un lieu :
une macro va à la fin de la plage où se trouve la liste,
insère une ligne, et colle le nouveau nom de lieu,
après avoir vérifié (recherchev masqué) que le lieu n'existe pas déjà.

Je veux protéger les cellules de la feuille autre que celles prévues pour la
saisie.
Mais du coup, ma macro d'insertion d'un nouveau lieu ne peut plus insérer de
lignes
Or, pour pouvoir faire une liste déroulante avec validation de donnée, la
plage où se trouve les données valides doit être sur la même feuille !
Donc je dois choisir de laisser toute ma feuille non protégée,
ou laisser tomber la validation de données !

Toute idée de solutions est la bienvenue,
Merci à tous ceux qui m'auront lu jusque là

Philippe

7 réponses

Avatar
Philippe
Si je protège comme ça :
Sheets("p0").Protect AllowInsertingRows

Je fais quand même planter ma macro d'insertion :

Sub AjouterLieu()
Dim Lieu As String
If Worksheets("p0").Range("V11").Value = False Then
MsgBox ("Ce lieu figure déjà dans la liste : utiliser la liste déroulante
pour le sélectionner")
Sheets("p0").Range("I7").Select
End If

Lieu = Worksheets("p0").Range("V10").Value

If Worksheets("p0").Range("V11").Value = True Then
MsgBox ("Je vais insérer : " & Lieu)
Cells.Find(What:="FinListeLieux", After:¬tiveCell, LookIn:= _
xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
xlNext, MatchCase:úlse, SearchFormat:úlse).Activate
ActiveCell.Offset(-1).Activate
Selection.EntireRow.Insert
Cells.Find(What:="FinListeLieux", After:¬tiveCell, LookIn:= _
xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
xlNext, MatchCase:úlse, SearchFormat:úlse).Activate
ActiveCell.Offset(-1).Activate
ActiveCell.Offset(-1).Value = Lieu
Sheets("p0").Range("G1").Select
End If

End Sub
Avatar
ThierryP
Bonjour Philippe,

Regarde au menu, Insertion, Nom, Définir, pour nommer la plage
tu pourras te servir de ce nom dans Données, Validation, Liste,
Référence : =toto. Ta liste de validation se trouve sur alors sur une
autre feuille que ta page active.

Dans ta macro, tu désactives la protection de la feuille où se trouve ta
liste (sheets("tata").unprotect) avant d'écrire la nouvelle ligne, et tu
la reprotège en fin de macro (sheets("tata").protect).

...Tout ça, si j'ai bien compris le problème :-)))

Comment protéger une feuille et autoriser une macro à y insérer des lignes ?

Bonjour,

Soit une feuille Excel

Les utilisateurs peuvent choisir dans un menu déroulant (valider données) un
lieu
Qui vient d'une liste (plage de cellules).
Ce lieu choisi est réutilisé dans une autre feuille (=page0!i7)

Il peuvent ajouter un lieu :
une macro va à la fin de la plage où se trouve la liste,
insère une ligne, et colle le nouveau nom de lieu,
après avoir vérifié (recherchev masqué) que le lieu n'existe pas déjà.

Je veux protéger les cellules de la feuille autre que celles prévues pour la
saisie.
Mais du coup, ma macro d'insertion d'un nouveau lieu ne peut plus insérer de
lignes
Or, pour pouvoir faire une liste déroulante avec validation de donnée, la
plage où se trouve les données valides doit être sur la même feuille !
Donc je dois choisir de laisser toute ma feuille non protégée,
ou laisser tomber la validation de données !

Toute idée de solutions est la bienvenue,
Merci à tous ceux qui m'auront lu jusque là

Philippe


--
@+ thierryp

Avatar
anonymousA
Bonjour,

en 1er lieu, si tu veux que ta feuille soit protégée mais qu'une
macro puisse y écrire quelque chose, il suffit dans la protecttion
d'écrire le paramètre UserInterfaceonly à True
ex: sheets("toto").Protect "motdepasse", , , , True

en second lieu, il est tout à fait possible de référencer une liste
de validation avec des données se situant sur une autre feuille voire
sur un autre classeur. Voici ci-dessous le mode opératoire

'************************************************************************** *******
'Comment faire référence à une liste dans une autre feuille par
Données Validation

'Ecrire la liste sur la feuille 2 p.e (mettons toto, titi, tata que les
cellules
'de A1 à A3. Donner un nom à cette liste , mettons listenoms.
'Aller sur la feuille 1, prendre 1 cellule et faire
Données/validation/Autoriser/Liste
'Dans Source, écrire =listenoms.

'************************************************************************** *******
'Comment faire référence à une liste dans un autre classeur par
Données Validation

'Ecrire la liste sur le classeur1 dans la feuille 1 p.e (mettons toto,
titi, tata
'sur les cellules de A1 à A3. Donner un nom à cette liste , mettons
lnoms.
'Aller sur le classeur2 et faire Insertion/définir un nom. Taper p.e
le nom Noms1
'et écrire en toute lettres dans la fenêtre RefEdit =Classeur1!lnoms.
'Puis aller dans la cellule devant recevoir la validation et faire
Données/validation/Autoriser/Liste
'Dans Source, écrire =Noms1.
'Attention: pour que ca puisse marcher, il faut que le fichier Classeur
1 soit ouvert.


A+
Avatar
Philippe
Je vais re-essayé, en effet j'ai déjà essayé ces solutions mais :

avec protège, agit, déprotège, j'ai déjà eu des plantage que je ne me suis
pas expliqué (c'était pour utiliser un filtre élaboré sur une liste que je
voulais protéger)

avec la liste de validation utilisée via une plage nommée,
je crois me souvenir que :
- insérer une ligne au milieu de la plage, laisse la plage se redimensionner
- mais l'insérer avec une macro (en tous cas la mienne) posait problème



Bonjour Philippe,

Regarde au menu, Insertion, Nom, Définir, pour nommer la plage
tu pourras te servir de ce nom dans Données, Validation, Liste,
Référence : =toto. Ta liste de validation se trouve sur alors sur une
autre feuille que ta page active.

Dans ta macro, tu désactives la protection de la feuille où se trouve ta
liste (sheets("tata").unprotect) avant d'écrire la nouvelle ligne, et tu
la reprotège en fin de macro (sheets("tata").protect).

....Tout ça, si j'ai bien compris le problème :-)))

Comment protéger une feuille et autoriser une macro à y insérer des lignes ?

Bonjour,

Soit une feuille Excel

Les utilisateurs peuvent choisir dans un menu déroulant (valider données) un
lieu
Qui vient d'une liste (plage de cellules).
Ce lieu choisi est réutilisé dans une autre feuille (=page0!i7)

Il peuvent ajouter un lieu :
une macro va à la fin de la plage où se trouve la liste,
insère une ligne, et colle le nouveau nom de lieu,
après avoir vérifié (recherchev masqué) que le lieu n'existe pas déjà.

Je veux protéger les cellules de la feuille autre que celles prévues pour la
saisie.
Mais du coup, ma macro d'insertion d'un nouveau lieu ne peut plus insérer de
lignes
Or, pour pouvoir faire une liste déroulante avec validation de donnée, la
plage où se trouve les données valides doit être sur la même feuille !
Donc je dois choisir de laisser toute ma feuille non protégée,
ou laisser tomber la validation de données !

Toute idée de solutions est la bienvenue,
Merci à tous ceux qui m'auront lu jusque là

Philippe


--
@+ thierryp




Avatar
Philippe
Merci pour ces explications.
-----------
Est-ce que avec userInterfaceOnly,
une macro qui fait du xlPaste passera aussi ?
ou faut-il que je la réécrive pour passer par range("a1").value, a2, a3 etc ?
-------
J'ai également essayé de masquer des feuilles,
Sheets("archRecue").Visible = xlSheetHidden
mais mes macros ne voulaient plus rien coller dedans :
sub CopierCollerInfoNvCandidat()
bloquait sur : Sheets("recupNvCand").Select
alors que la procédure fonctionne lancée depuis le même endroit si la
feuille n'est pas masquée



Sub NouvelEnregistrement()
' bouton en p0 : fait faire les copies nécessaires, passe en page1
CopierCollerInfoNvCandidat
Sheets("p1").Activate
Range("a1").Select
End Sub


Sub CopierCollerInfoNvCandidat()
'copie au bon endroit les infos correspondant au matricule sélectionné
Sheets("recupNvCand").Select
Range("G2:G24").Select
Application.CutCopyMode = False
Selection.Copy
Range("C2:C24").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
End Sub






Bonjour,

en 1er lieu, si tu veux que ta feuille soit protégée mais qu'une
macro puisse y écrire quelque chose, il suffit dans la protecttion
d'écrire le paramètre UserInterfaceonly à True
ex: sheets("toto").Protect "motdepasse", , , , True

en second lieu, il est tout à fait possible de référencer une liste
de validation avec des données se situant sur une autre feuille voire
sur un autre classeur. Voici ci-dessous le mode opératoire

'*********************************************************************************
'Comment faire référence à une liste dans une autre feuille par
Données Validation

'Ecrire la liste sur la feuille 2 p.e (mettons toto, titi, tata que les
cellules
'de A1 à A3. Donner un nom à cette liste , mettons listenoms.
'Aller sur la feuille 1, prendre 1 cellule et faire
Données/validation/Autoriser/Liste
'Dans Source, écrire =listenoms.

'*********************************************************************************
'Comment faire référence à une liste dans un autre classeur par
Données Validation

'Ecrire la liste sur le classeur1 dans la feuille 1 p.e (mettons toto,
titi, tata
'sur les cellules de A1 à A3. Donner un nom à cette liste , mettons
lnoms.
'Aller sur le classeur2 et faire Insertion/définir un nom. Taper p.e
le nom Noms1
'et écrire en toute lettres dans la fenêtre RefEdit =Classeur1!lnoms.
'Puis aller dans la cellule devant recevoir la validation et faire
Données/validation/Autoriser/Liste
'Dans Source, écrire =Noms1.
'Attention: pour que ca puisse marcher, il faut que le fichier Classeur
1 soit ouvert.


A+




Avatar
ThierryP
Re-bonjour Philippe,

Avec ceci : ÞCALER(Feuil1!$AA$3;;;NBVAL(Feuil1!$AA:$AA)-1) que tu mets
en Insertion -> Nom -> Définir -> Fait référence à
tu ajustes automatiquement la taille de ta liste (ajout ou suppression).
Normalement, ça doit le faire...!!

Je vais re-essayé, en effet j'ai déjà essayé ces solutions mais :

avec protège, agit, déprotège, j'ai déjà eu des plantage que je ne me suis
pas expliqué (c'était pour utiliser un filtre élaboré sur une liste que je
voulais protéger)

avec la liste de validation utilisée via une plage nommée,
je crois me souvenir que :
- insérer une ligne au milieu de la plage, laisse la plage se redimensionner
- mais l'insérer avec une macro (en tous cas la mienne) posait problème




Bonjour Philippe,

Regarde au menu, Insertion, Nom, Définir, pour nommer la plage
tu pourras te servir de ce nom dans Données, Validation, Liste,
Référence : =toto. Ta liste de validation se trouve sur alors sur une
autre feuille que ta page active.

Dans ta macro, tu désactives la protection de la feuille où se trouve ta
liste (sheets("tata").unprotect) avant d'écrire la nouvelle ligne, et tu
la reprotège en fin de macro (sheets("tata").protect).

....Tout ça, si j'ai bien compris le problème :-)))


Comment protéger une feuille et autoriser une macro à y insérer des lignes ?

Bonjour,

Soit une feuille Excel

Les utilisateurs peuvent choisir dans un menu déroulant (valider données) un
lieu
Qui vient d'une liste (plage de cellules).
Ce lieu choisi est réutilisé dans une autre feuille (=page0!i7)

Il peuvent ajouter un lieu :
une macro va à la fin de la plage où se trouve la liste,
insère une ligne, et colle le nouveau nom de lieu,
après avoir vérifié (recherchev masqué) que le lieu n'existe pas déjà.

Je veux protéger les cellules de la feuille autre que celles prévues pour la
saisie.
Mais du coup, ma macro d'insertion d'un nouveau lieu ne peut plus insérer de
lignes
Or, pour pouvoir faire une liste déroulante avec validation de donnée, la
plage où se trouve les données valides doit être sur la même feuille !
Donc je dois choisir de laisser toute ma feuille non protégée,
ou laisser tomber la validation de données !

Toute idée de solutions est la bienvenue,
Merci à tous ceux qui m'auront lu jusque là

Philippe


--
@+ thierryp




--
@+ thierryp



Avatar
anonymousA
Pas de problèe pour les Paste par macro. Quant à la sélection d'une
feuille cachée, c'est normal que ca se plante puisque par définition
, on ne peut selectionner une feulle cachée
Par ailleurs, pour éviter ces affaires de sélection, au lieu de
Sheets("recupNvCand").Select
Range("G2:G24").Select
Application.CutCopyMode = False
Selection.Copy
Range("C2:C24").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse

je te propose , si la feuille recupNvCand a été protégée par
Sheets("recupNvCand").Protect "motdepasse", , , , True ,

with Sheets("recupNvCand")
.Range("G2:G24").copy
.Range("C2").PasteSpecial xlPasteValues
end with
Application.CutCopyMode = False

A+