Comment exploiter des données sur une feuille masquée
Salut le forum
Je souhaite masquer certaines des feuilles d'un de mes fichiers.
J'ai des inquiétudes sur la possibilité de pouvoir exploiter les données contenues dans ces feuilles.
Est-il possible de pouvoir exploiter les données d'une feuille masquée comme une feuille non masquée?
Pour être précis, une macro dont l'objet est de copier des données d'une feuille vers une autre peut-elle bien fonctionner si les données à copier sont sur la feuille protégée?
Sinon y'a t-il une possibilité de pouvoir le faire quand bien la feuille est masquée?
Merci à tous
Bonjour,
Drôle de question.. Fais l'essai et tu verras bien par toi-même
A+
Salut lermite
A part l'erreur comise dans la question ci-dessous, je ne pense pas que ce soit drole.
zombe a écrit :Pour être précis, une macro dont l'objet est de copier des données d'une feuille vers une autre peut-elle bien fonctionner si les données à copier sont sur la feuille protégée?
Je voulais dire masquée et non protégée. Je pense qsue l'idée générale y était : j'ai des données à exploiter dans une feuille masquée et je souhaite connaitre les limite liées au masquage de la feuille et les solutions éventuelles si je souhaite que le feuille soit masquée.
Merci
Je réitère ma réponse du poste précédant... Tu fais un test !!
Si tu comprend pas, un exemple
Ouvrir Nouveau classeur
Mettre une valeur dans la feuille2 en A1
Mettre le code ci-dessous dans un module et le lancer,
Sub TestFeuilleCachée()
Sheets("Feuil2").Visible = False
Sheets("Feuil1").[A1] = Sheets("Feuil2").[A1]
End SubSi protégée !! faut alors ajouter la déprotection avec UnProtect.
Ça répond à ta question ?
A+
Salut lermite et le forum
Merci pour votre réponse.
J'ai un cas réel qui doit fonctionner comme suit :
Les éléments à copier se trouvent dans la feuille PARAMETRE.
Cette feuille est protégée et masquée.
Avec le code ci-dessous, j'arrive à ôter le masque, la protection et la copie des éléments vers la destination indiquée.
Le problème que je rencontre est le suivant :
après la copie, la protection de la feuille devrait être selon moi automatique mais c'est pas le cas.
Est-ce une erreur de mon code et comment la rectifier?
Aussi je souhaite que la feuille PARAMETRE soit masquée après l'opération c'est à dire qu'après avoir collée les données de la feuille parametre dans la feuille STATBS tout devrait se réinitialé (feuille parametre protégée et masquée comme avant l'exécution).
Dim a, b, d, e, f, g As String
'Sélection de la valeur de !PARAMETRE E10 et mise en variable
Sheets("parametre").Visible = True
Sheets("parametre").Unprotect "enfant"
'verification des cellules à copier
If Range("ae7").Value = "" Then
MsgBox ("Manque le N° du compte")
ElseIf Sheets("donne").Range("e21").Value = "" Then
MsgBox ("Le code utilisateur n'est pas renseigné")
ElseIf Application.WorksheetFunction.CountIf(Sheets("statses").Range("C2:C" & Sheets("statses").Range("c65536").End(xlUp).Row), Range("ae7").Value) > 0 Then
MsgBox ("Ce compte est déjà présent dans la feuille statses")
Else
'copie des cellules
a = Range("ae6").Value
b = Range("ae7").Value 'nom_prenom
d = Range("ae9").Value 'téléphone
e = Range("ae8").Value 'n° compte
f = Range("ae11").Value 'Réf pièce
g = Range("ae13").Value 'code agent
'selection de la feuille de destination
Sheets("statses").Select
'selection de la première cellule de destination
Range("b1").Select
'vérification de la cellule de destination
If ActiveCell.Value = "" Then 'si la cellule est vide, on colle
ActiveCell = a
ActiveCell.Offset(0, 1) = b
ActiveCell.Offset(0, 2) = e
ActiveCell.Offset(0, 3) = d
ActiveCell.Offset(0, 4) = f
ActiveCell.Offset(0, 5) = g
Sheets("PARAMETRE").Select
Range("D3").Select
Exit Sub
Else 'la cellule n'est pas vide
'on boucle tant que la cellule de destination n'est pas vide
Do While ActiveCell.Value <> ""
'selection de la cellule du dessous
ActiveCell.Offset(1, 0).Select
'si la cellule est vide, on colle
If ActiveCell.Value = "" Then
ActiveCell = a
ActiveCell.Offset(0, 1) = b
ActiveCell.Offset(0, 2) = e
ActiveCell.Offset(0, 3) = d
ActiveCell.Offset(0, 4) = f
ActiveCell.Offset(0, 5) = g
Sheets("PARAMETRE").Select
Range("D3").Select
Exit Sub
Else
'selection de la cellule du dessous
ActiveCell.Offset(1, 0).Select
End If
Loop 'on boucle tant que la cellule n'est pas vide
End If
'si la cellule est vide, fin de la boucle, et on colle
ActiveCell = a
ActiveCell.Offset(0, 1) = b
ActiveCell.Offset(0, 2) = e
ActiveCell.Offset(0, 3) = d
ActiveCell.Offset(0, 4) = f
ActiveCell.Offset(0, 5) = g
Sheets("PARAMETRE").Select
Range("D3").Select
Sheets("parametre").Protect "enfant"
End If
End SubJ'ai tenté d'optimiser (et de faire fonctionner) ton code mais c'est impossible de décrypter ce que tu veux faire !!
'verification des identifiants
'Sur quel feuille ?????????????????
If Range("ae7").Value = "" Then
MsgBox ("Manque le N° du compte")Tu rend la feuille Paramètres accessible mais tu ne t'en sert nul part ??? du moins ça n’apparaît pas dans le code
Explique (sans code) ce que tu veux EXACTEMENT
A+
Salut lermite
Je souhaite copier des données (AE6:AE13) de la feuille PARAMETRE vers la feuille STATBS.
La copie doit se réaliser si certaines conditions sont vérifiées :
- la cellule contenant le numero de compte ne doit pas être vide,
- la cellule code utilisateur (E21) ne doit pas être vide.
Aussi, à chaque fois que la macro sera exécutée et que les conditions sont reunies, les nouveaux éléments copiés seront collés à la suite de la ligne du dessous et ainsi de suite.
NB: la feuille PARAMETRE devra toujours être protégée et masquée car cette feuille contiendra des données secrètes et ne doit pas être accessible aux utilisateurs.
C'est l'idée générale du code joint ci-dessus.
NB: la feuille PARAMETRE devra toujours être protégée et masquée car cette feuille contiendra des données secrètes et ne doit pas être accessible aux utilisateurs.
La feuille sera toujours accessible à l'affichage, clic droit sur un onglet quelconque et afficher.
La protection par mot de passe sert juste a bloquer la modification de la feuille.
Il y a moyen de faire ce que tu veux par VBA, j'y cogite.
A+
Essaye ce code
Sub Copier()
Dim TB(5) As String
Dim LigneVide As Long, i As Integer
Sheets("PARAMETRE").Visible = xlSheetVeryHidden
'verification des identifiants
If Sheets("PARAMETRE").Range("AE7").Value = "" Then
MsgBox ("Manque le N° du compte")
Exit Sub
ElseIf Sheets("donne").Range("e21").Value = "" Then
MsgBox ("Le code utilisateur n'est pas renseigné")
Exit Sub
ElseIf Application.WorksheetFunction.CountIf(Sheets("statses").Range("C2:C" & Sheets("statses").Range("c65536").End(xlUp).Row), Range("ae7").Value) > 0 Then
MsgBox ("Ce compte est déjà présent dans la feuille statses")
Exit Sub
End If
With Sheets("PARAMETRE")
'copie des cellules
TB(0) = .Range("ae6").Value
TB(1) = .Range("ae7").Value 'nom_prenom
TB(3) = .Range("ae9").Value 'téléphone
TB(2) = .Range("ae8").Value 'n° compte
TB(4) = .Range("ae11").Value 'Réf pièce
TB(5) = .Range("ae13").Value 'code agent
End With
'Avec la feuille de destination
With Sheets("statses")
'selection de la première cellule vide
LigneVide = .Cells(Rows.Count, 2).End(xlUp).Row
If LigneVide > 1 Then LigneVide = LigneVide + 1
'Copie les données
For i = 1 To 5
.Cells(LigneVide, i + 1) = TB(i)
Next i
End With
End SubPa besoin de protection sur la feuille, elle est uniquement accessible en VBA
Si tu veux vraiment la protéger met un mot de passe sur l'IDE.
note que la ligne Sheets("PARAMETRE").Visible = xlSheetVeryHidden n'est nécessaire qu'une seule fois.
J'ai pas tester,
Note, si tu veux voir la feuille Paramètre copie la sub ci-dessous dans un module et la lancer
Sub AFFICHER()
Sheets("PARAMETRE").Visible = True
End SubC'est la seule façon de la voire.
A+
Salut lermite
Merci pour votre solution.
Je fais mes tests et voici mes constats:
- votre code permet de masquer la feuille et le 2è code permet de l'afficher à nouveau.
cela me convient. ce qui restait était la protection de la feuille.
J'ai protégé et masqué la feuille PARAMETRE pour voire si les copies se réaliseraient ; ce qui fut fait.
Le seul problème que je rencontre est la 1ère cellule de destination
'selection de la première cellule vide
LigneVide = .Cells(Rows.Count, 2).End(xlUp).RowLe collage commence en A3 au lieu de B3.
Pouvez-vous voir cela?
La ligne que tu montre n'a rien à voir avec le problème que tu souligne.
Et si ça commence en A au lieu de B c'est que tu à modifier le code que je t'ai montré, explique c e que tu a fais
A+
Salut lermite
Merci pour le feedback.
J'ai vu mon erreur en revoyant mes modifications.
C'est en cherchant à vous donner les explications que j'ai vu la source de mon erreur.
Au lieu de For i = 1 to 5 j'avais changé comme ceci for i = 0 to 5
J'ai corrigé et c'est super.
Je souhaite ajouter qques paramètres :
en supposant que je dois faire des statistiques hebdomadaires ou mensuelles, est-il possible de faire en sorte que si je commence une nouvelle semaine, que les éléments à copier soient collés sur une nouvelle page.
Même raisonnement si les statistiques doivent se faire mensuellement.
Merci
Dans la ligne
With Sheets("statses")Tu n'a que de changer le nom de la feuille et les données seront copiées dessus.
A+
Salut lermite
Etant donné que mon fichier sera utilisé par d'autres personnes et que je ne serai pas là pour toujours changer le nom de la feuille, je souhaite tout automatisé. Suis entrain de chercher les critères pour cela mais j'ai pas encore trouvé. si vous en avez, merci de m'en proposer sinon je vous reviendrai
Automatiser ne pose aucun problème, juste qu'il faudrait connaitre les critères qui détermine la feuille
Ok. voici ce que je pense définir comme critères:
Je fais mes statistiques du du lundi au samedi.
je souhaite que le nom de l'onglet porte le nom de la semaine (Ex: STATSBSMS_S13-18).
Pour la semain suivante (20 au 25 aout), le nom de l'onglet change à STATBSMS_S20-25 et ainsi de suite.
Lorsque je passe à une nouvelle semaine, cela devra entrainer une réinitialisation de la feuille.
Pour ne pas jouer sur les mots, j'ai préféré joindre un fichier pour mieux traduire mon besoin.
La feuille STATBSMS_S13-18 est la feuille qui comportera les statistiques de la semaine en cours.
A partir du 1er jour de la nouvelle semaine on devra avoir un onglet nommé STATBSMS_S20-25;cette feuille centralisera les statistiques correspondant à la dite semaine. elle devra toujours se presenter comme celle du fichier joint.
Techniquement je ne sais pas comment vous procederai, je ne sais pas si vous le ferai en transformant la feuille contenant les statistiques antérieures.
Telles sont mes idées. si vous avez une meilleure offre, je suis preneur.
Encore merci pour le coup de main.
Je veux bien t'aider mais de là à te pondre ton appli en entier il y a de la marge.
Quelque conseils..
1°) Voir comment on peu définir le 1er et dernier jour d'une semaine
2°) Voir comment créer une nouvelle feuille avec le nom qui comprend ces jours.
Fais déjà ça pour avancer
A+
Salut lermite et le forum
Si le nom d'un onglet peut se faire par la valeur d'une cellule, je pense que je pourrai automatiser cela par formule qui sera utilisé dans la macro.
J'attend votre réponse svp.
Bonne idée avec le nom de l'onglet dans une cellule.
Tu peu alors mettre
With Sheets(Range("A1").Value)
par exemple..
Coçntinue à cogiter.;
Et n'oublie pas de te servir de l'éditeur de macros, notamment pour créer une nouvelle feuille et changer son nom.
A+
Salut lermite
Merci pour l'appréciation et pour le soutien positif que vous m'apportez.
J'ai trouvé dans un forum un code qui permet de créer des feuilles et je l'ai adapté à mon cas.
Ca fonctionne mais il me manque qquechose.
Lorsque le nvel onglet est crée, l'ancien demeure toujours alors qu'il ne sert plus.
Je manque pour le moment d'idée pour permettre la suppresion de l'ancien feuille.
Ci-dessous le code que je laisse à votre appréciation:
Sub dupliquer_feuilles1()
Dim Nom As String
Dim f As Worksheet
Nom = Worksheets("feuil1").Range("h15")
If Nom = "" Then MsgBox "Vous devez entrer un numéro de semaine": Exit Sub
For Each f In ThisWorkbook.Worksheets
If f.Name = Nom Then Exit Sub
Next f
Sheets(Sheets.Count).Copy After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = Worksheets("feuil1").Range("h15")
End Sub