Userform qui écrit sur plusieurs lignes

Bonjour!

Je reviens toujours pour ce même problème qui m'occupe depuis un petit moment, je pensais avoir trouvé une solution pour que ma userform écrive dans mon fichier de cette façon:

10exemple-forum.xlsx (9.22 Ko)

J'ai donc réalisé une partie du code dans Sub Ok Click dans ma userform, malheureusement l'insertion de ligne se met en erreur et les valeurs que je désire ne s'affichent pas, comprenez vous pourquoi?

Bonjour,

À chacun des bouts de code pour les CheckBox, tu protèges f.Protect DrawingObjects ... la feuille avant d'y écrire les infos.

Au code du CheckBox suivant, la feuille n'est pas déprotégée f.Unprotect d'où les erreurs.

Je suggère de déprotéger la feuille f.Unprotect au début du code et de protéger à nouveau la feuille à la fin du code f.Protect DrawingObjects ... (pas à chaque CheckBox).

ric

Merci Ric! Un collègue m'a aidé et c'était effectivement cela! Pour l'instant j'ai fais à chaque check box, mais j'ai de gros problèmes désormais avec le reste du programme, certaines macros qui ne sont pas sur la même feuille ne marchent plus du tout, sans toutefois se mettre en erreur... notamment pour les priorités et les résultats..

Bonjour,

... certaines macros qui ne sont pas sur la même feuille ne marchent plus du tout, ...

Est-ce que tu aurais l'amabilité de les nommer (module et macros). Car, c'est toi qui connais ton code.

ric

Oui désolé, c'est la macro "Prio" située dans le module "DemandeMesure" et la macro qui se déclanche au changemant de la feuille "Résultats" c'est a dire Sub Worksheet_Change....

Bonjour,

Après quelques tests sommaires, les deux macros, dont tu as fait mention, semblent fonctionner correctement.

As-tu tenté un pas-à-pas (touche F8 sur le code) ? C'est souvent très révélateur.

ric

J'ai pu cibler une erreur, elle vient de cette ligne, mais je ne l'ai pas modifiée et avant elle marchait très bien...

erreur ligne erreur

Bonjour,

Après plusieurs tests, la macro PRIO fonctionne correctement et ne donne pas d'erreur.

Est-ce que tu travailles sur le même fichier que celui que tu nous as soumis Aujourd’hui, 03:39 ?

Si oui, je ne sais pas quoi dire à part : " As-tu redémarré ta machine dernièrement? "

Autre point que n'a pas rapport à ce problème, For n = 4 To 100 ... S'il n'y a pas toujours 100 lignes, le temps d'exécution est plus long inutilement.

Une suggestion pour limiter les tests ...

Sub Prio()
Dim n As Integer
Dim Dlig As Integer

Dlig = Worksheets("Demande").Cells(Rows.Count, "E").End(xlUp).Row
   For n = 4 To Dlig
      If Sheets("Demande").Range("F" & n).Value = Sheets("Priorité").Range("B4").Value Then
         Sheets("Demande").Range("A" & n, "H" & n).Interior.Color = RGB(255, 0, 0)
      ElseIf Sheets("Demande").Range("F" & n).Value = Sheets("Priorité").Range("C4").Value Then
         Sheets("Demande").Range("A" & n, "H" & n).Interior.Color = RGB(255, 165, 0)
      ElseIf Sheets("Demande").Range("F" & n).Value = Sheets("Priorité").Range("D4").Value Then
         Sheets("Demande").Range("A" & n, "H" & n).Interior.Color = RGB(255, 255, 0)
      End If
   Next n
End Sub

ric

Merci c'est top! Ça va bien me servir pour alléger mon programme!

Et non, je travaille sur la version corrigée, celle de 11h56

Bonjour,

Sur cette version, la feuille "Demande" est protégée en ne permettant pas de modifier le fond des cellules. Au début du code PRIO, l'on peut déprotéger la feuille et la protéger à nouveau à la fin.

Exemple :

Sub Prio()
Dim n As Integer
Dim Dlig As Integer

Worksheets("Demande").Unprotect
   Dlig = Worksheets("Demande").Cells(Rows.Count, "A").End(xlUp).Row
   For n = 4 To Dlig
      If Worksheets("Demande").Range("F" & n).Value = Worksheets("Priorité").Range("B4").Value Then
         Worksheets("Demande").Range("A" & n, "H" & n).Interior.Color = RGB(255, 0, 0)
      ElseIf Worksheets("Demande").Range("F" & n).Value = Worksheets("Priorité").Range("C4").Value Then
         Worksheets("Demande").Range("A" & n, "H" & n).Interior.Color = RGB(255, 165, 0)
      ElseIf Worksheets("Demande").Range("F" & n).Value = Worksheets("Priorité").Range("D4").Value Then
         Worksheets("Demande").Range("A" & n, "H" & n).Interior.Color = RGB(255, 255, 0)
      End If
   Next n
Worksheets("Demande").Protect
End Sub

ric

Top! Merci Ric, plus de problème avec la fonction prio, désormais j'ai une erreur avec celle ci:

erreur

J'ai bien compris que c'était encore une fois un problème de protection alors j'ai mis unprotect au début puis protect à la fin mais ça m'a remis la même erreur

Bonjour,

Un peu avant l'erreur, il y a Call Prio.

À la fin de Prio, il y a Worksheets("Demande").Protect.

Ainsi, la feuille est protégée à nouveau ... d'où l'erreur.

Private Sub Worksheet_Change(ByVal Target As Range)
   Application.EnableEvents = False
   Call EnCours
   Call Prio
   Worksheets("Demande").Unprotect    ' déprotéger la feuille
   For Each Cell In Range("A4:H20")
      If Cell.Value = "" Then      'Enleve la couleur des cellules vides
         Cell.Interior.Color = xlColorIndexNone
      End If
   Next Cell
   Application.EnableEvents = True
   Worksheets("Demande").Protect    ' protéger la feuille à nouveau
End Sub

ric

Ça marche mais... Arghhhh! Maintenant c'est là...

C'est sans fin ces problèmes de protections

erreur

Merci encore de ton aide en tout cas

Bonjour,

Au risque de me répéter : " Dans le code, la touche F8 exécute le code en pas-à-pas. "

La ligne précédente f.Rows(4).Insert déclenche une macro événementielle

Private Sub Worksheet_Change(ByVal Target As Range) de la feuille "Demande"

dans laquelle l'on y retrouve Call Prio et à la fin de Prio, le feuille est protégée à nouveau.

Ou bien, tu revois toute la séquence de protect / unprotect ..­.

Ou tu ajoutes un autre unprotect ainsi ...

f.Unprotect
f.Rows(4).Insert
f.Unprotect
f.Rows(4).Locked = False

ric

Merci pour la technique de F8, elle va bien me servir!

Tu aurais pas une idée pour simplifier toutes ces protections de feuilles? Parce que la j'ai encore des problèmes avec ça et je pense que c'est pas fini

Bonjour,

Je n'ai pas étudié ton code à fond.

Mais supposons que l'utilisateur ne doit pas écrire dans les feuilles "Demande" et "Résultat".

Mets en commentaire ou efface toutes les lignes Protect et Unprotect se rapportant à ces deux feuilles.

Puis, dans "Thisworkbook" > Workbook_Open ...

Private Sub Workbook_open()

Worksheets("Demande").Protect , UserInterFaceOnly:=True
Worksheets("Résultats").Protect , UserInterFaceOnly:=True

Call Heure
End Sub

"UserInterfaceOnly" protège la feuille des modifications de l'usager, mais permet toutes les modifications provenant des codes Vba.

À tester si cela convient ...

ric

Dans la feuille demande effectivement ils ne doivent rien écrire mais dans la feuille résultat ils doivent changer les valeurs du tableau avec les listes déroulantes

Bonjour,

Tout en conservant les derniers changements que j'ai proposés ...

La feuille "Résultat" est prête. La plage "J7:J9" est déjà déverrouillée.

La feuille "Demande" > déprotège manuellement cette feuille, sélectionne l'intersection des lignes et des colonnes (en haut à gauche) pour que toute la feuille soit sélectionnée > clique droit > Format des cellules > onglet Protection > clique sur la case "Verrouillée" une ou deux fois afin d'y retrouver le "choché" indiquant que le verrouillage est appliqué sur toute la sélection.

Si la case est noire, cela indique que seulement certaines cellules sont verrouillées dans la sélection. Si la case est blanche, cela indique qu'aucune cellule de la sélection n'est verrouillée.

Enregistre le classeur, ferme-le.

À la prochaine ouverture, la protection des deux feuilles sera réactivée.

ric

Quand tu dis que je conserve les changements, ça aussi?

Private Sub Workbook_open()

Worksheets("Demande").Protect , UserInterFaceOnly:=True

Worksheets("Résultats").Protect , UserInterFaceOnly:=True

Call Heure

End Sub

Bonjour,

Oui, les deux lignes ajoutées conservent la protection sur les deux feuilles.

ric

Rechercher des sujets similaires à "userform qui ecrit lignes"