Ajouter une entrée à un tableau protégé

Bonjour à tous,

je reviens demander votre aide car je bloque sur un projet, et j'ai pas trouvé de solution sur ce forum ou ailleurs. Je suis en train de créer un tableur pour m’aider à garder le compte de ce que je prescris dans des projets d’architecture d’intérieur.

Pour ce faire, j’ai un tableau dans lequel je rentre les références, avec les caractéristiques qui m’intéressent. J’aimerais pouvoir y ajouter des références sans déverrouiller le tableau pour éviter les fausses manipulations.

j’imagine ça comme une ligne au dessus du tableau, avec les mêmes colonnes que le tableau, cette ligne est n’est pas protégée. Quand on a renseigné les informations nécessaires, on peut inscrire cette ligne au tableau. (si il faut je peux faire un fichier exemple, mais je suis pas sur de l'intérêt)


j’ai aucune expérience en codage, est ce que quelqu’un sait comment faire ça sans VBA ?

Si il faut passer par la VBA, est ce que quelqu’un à une idée d’une procédure simple (j’imagine quelque chose comme un bouton lançant ‘couper les cellules’ puis ‘coller les cellules’ en bas du tableau, mais j’ai vraiment aucune idée de si c’est comme ça que ça fonctionne)



merci d’avance!

Pierre

Bonjour,

Un essai à tester.

Cordialement

9migul.xlsm (16.50 Ko)

C'est exactement ce qu'il me faut, merci infiniment!

J'essaye de comprendre comment ça marche et comment le reproduire et si je n'y arrive pas je reviendrais vers toi.

pierre

J'ai essayé de comprendre comment marchait la macro que tu m'à faite, je pense avoir réussi à déchiffrer la plupart, mais je bloque sur la ligne qui m'a l'air essentielle ".Range("C" & li).Resize(1, UBound(a, 2)) = a". Est ce que tu pourrais me dire si mes déductions sont correctes et répondre aux questions concernant cette ligne ?

Sub ecrit()

With Sheets("compte")

commence la procédure, dans la feuille "compte"

li = .Range("c" & Rows.Count).End(xlUp).Row + 1

'définit une variable "li" (la ligne après la dernière information colonne C)

a = .Range("C3:O3")

'définit une plage de cellules "a"

.Unprotect

'instruction 1 : ote la protection de la feuille

.Range("C" & li).Resize(1, UBound(a, 2)) = a

'actualise la première colonne du tableau en lui ajoutant une ligne

'je ne comprends pas ce que fait UBound

'je ne comprends pas comment le contenu de "a" est ajouté au tableau

.Range("C3:O3").ClearContents

'efface le contenu saisi, pourquoi ne pas utiliser la plage nommee "a"? ça ne serait pas plus simple ?

.Protect: Password = ""

'protège la feuille, sans mot de passe

End With

End Sub

arrête d'ecrire dans "compte", arrête la procédure

J'aimerais avoir mes données sous forme de tableau, pour pouvoir les trier j'ai trouvé ceci qui me semble adaptable

, ça à aussi l'avantage de considérer la dernière ligne sans interruption plutôt que la dernière ligne tout court: https://www.excel-pratique.com/fr/vba/tableaux_vba_suite.php.

Pour connaître le n° de ligne de la dernière cellule d'un bloc de cellules non vides, autrement dit, la dernière ligne de notre base de données, utilisez cette formule :

derniere_ligne = Range("A1").End(xlDown).Row

Si vous entrez une variable lors de la déclaration, Excel ne l'acceptera pas.

Déclarez un tableau dynamique (parenthèses vides), puis définissez ses dimensions avec Redim :

Dim tab_exemple()

ReDim tab_exemple(derniere_ligne - 2, 2)

De cette manière vous enregistrerez automatiquement toutes les lignes de la base de données dans le tableau :

Sub enreg_tab()

derniere_ligne = Range("A1").End(xlDown).Row 'Dernière ligne de la base de données

Dim tab_exemple()

ReDim tab_exemple(derniere_ligne - 2, 2)

'Enregistrement des valeurs dans le tableau

For i = 0 To derniere_ligne - 2

tab_exemple(i, 0) = Range("A" & i + 2)

tab_exemple(i, 1) = Range("B" & i + 2)

tab_exemple(i, 2) = Range("C" & i + 2)

Next

End Sub

Je ne comprends pas la partie enregistrement des valeurs dans le tableau, je fais des tests dans les jours qui viennent et je vois si j'arrive à faire un mix entre ta proposition et la leur, mais je veux bien un avis sur la procédure générale, j'imagine ceci :

  • déclarer une plage "a"
  • déclarer une variable permettant de connaitre la dernière ligne du tableau ( derniere_ligne = Range("C4").End(xlDown).Row )
  • déclarer un tableau, le redimensionner à l'aide de la variable et .Redim
  • ôter la protection
  • inscrire les données de la plage "a" au tableau, avec ta formule ou la leur, quand je les aurais comprises
  • redimensionner le tableau
  • protéger la feuille

je dois dire que c'est un peu flou pour moi, mais est ce que ça semble cohérent ?

encore merci

Bonjour Migul,

Quelques erreurs d’appréciations dans tes commentaires.

Pour éclaircir la procédure que je t'ai proposée, je l'ai commentée. Vois le fichier en PJ.

Si tu débutes, je comprends ta difficulté de lecture de certaines procédures.

Insiste sur l'onglet "Cours VBA " du site qui te donnera de bonnes bases.

Ce que je t'ai proposé et plus rapide que de mettre des données dans un tableau.

Sache que les données peuvent être triées à postériori.

Espérant avoir répondu à ta demande.

Excellente journée

6migul2.xlsm (17.88 Ko)

Merci beaucoup pour ta réponse et le code commenté, ça devrait me permettre d'y voir plus clair.

Excellente nouvelle qu'on puisse trier les données à postériori.

J'ai commencé à potasser les cours VBA, je galère encore mais ça va venir!

Merci et excellente journée à toi aussi

Rechercher des sujets similaires à "ajouter entree tableau protege"