Macros qui s'emballent

Bonjour chers experts VBA,

Bon, j’ai voulu simplifier la tâche aux utilisateurs de ce formulaire. Au lieu de double cliquer dans les cellules Date et Arrivée-départ, les utilisateurs n’ont qu’à cliquer dans la cellule et l’userform apparaît.

Tout fonctionnait très bien avant ces modifications ou si je ne protège pas le fichier!

Dès que je protège le fichier, j’ai ce premier bogue qui survient :

Erreur d’exécution ‘1004’

Impossible de définir la propriété NumberFormat de la classe Range.

Ce qui me renvoi à l’userform HrsMins en surlignant en jaune : Selection.NumberFormat = "[hh]:mm"

Alors, j’applique un Unprotect et protect comme me la suggéré monsieur LouReed (mais je ne suis pas trop certain si c’est Ok – ce que je sais c’est que l’erreur ‘1004’ est corrigée.

Mais c’est la que ça se gâte. Si je protège le fichier et applique le Unprotect-protect, j’ai trois bogues qui surviennent :

1. lorsque j’ai terminé d’inscrire de l’info dans la section Information supplémentaires, et que je fais Enter, c’est la cellule H7 avec l’userform calendrier qui s’active. Alors, je ferme l’userform!

2. lorsque je clique sur le bouton Envoyez votre demande, l’userforme Calendrier s’active. Alors je ferme l’userform. Je reçois les confirmations d’envoi, mais fichier d'envoi est incomplet.

3. Ensuite je reçois un autre message d’erreur ‘1004’ (la cellule ou le graphique est protégé et en lecture seule) quand je clique sur Continuer par exemple. À déblocage, cela m’envoi à Range("G20:H32").Value = "" du module 1. Ce qui est la section Information supplémentaires.

Bref, je ne m’en sors pas.

Merci pour l’intérêt que vous portez aux problèmes de ce fichier.

26ponctuel.7z (237.10 Ko)

Bonsoir,

c'est monsieur Loureed qui vous parle

Vu sur le net, je n'ai pas essayé :

Autre solution à mon avis meilleure

Worksheets("PM_Tasks").Protect userinterfaceonly:=True, Password:="mot de passe"

permet de laisser la protection mais d'autoriser la macro à faire ce qu'elle doit faire

Peut-être que cela pourra résoudre votre problème.

Chez moi j'ai un soucis de "bibliothèque" avec votre fichier du coup il ne tourne pas...

@ bientôt

LouReeD

Bonjour,

Moi je n'ai pas WinZip et je n'ai pas l'intention de me faire suer avec cette daube qui fait couiner mon antivirus.

Prière d'utiliser une compression classique ou un hébergeur type cjoint

Nota : Et s'il y a un mot de passe, le fournir...

A+

Bonjour

merci pour vos interventions. c'est très enrichissant.

Voici le lien pour monsieur Galopin.

Bonjour monsieur LouReed

et j'intègre ça comment dans le code?

Dois-je remplacer

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

par

'Worksheets("PM_Tasks").Protect userinterfaceonly:=True, Password:="mot de passe"

le code actuel:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    adresse = Target.Address

    'ActiveSheet.Unprotect ("mlbp")

    For i = 18 To 32
        If adresse = "$A$" & i Then
            Calendrier.Show
            Cancel = True
            Exit For

        ElseIf adresse = "$B$" & i Or adresse = "$C$" & i Or adresse = "$D$" & i Then
            HrsMins.Show
            Cancel = True
            Exit For

        End If

    Next

    If adresse = "$H$7" Then
        Calendrier.Show
        Cancel = True
    End If

  'ActiveSheet.Protect ("mlbp")

End Sub

bonjour,

Faire un double clic sur ThisWorkbook (dans la fenêtre VBAProject)

Coller cette macro dans le module qui apparait :

Private Sub Workbook_Open()
Worksheets("PM_Tasks").Protect UserInterfaceOnly:=True, Password:="mlbp"
End Sub

Fermer le classeur. Lors de la prochaine ouverture les macros pourront s'exécuter sans déprotection.

Nota : Lors de la phase de bricolage dans tes macros une erreur d'exécution peut provoquer une perte de mémoire momentanée d'Excel qui oublie que le UserInterfaceOnly est True. C'est rare mais si on provoque vraiment beaucoup d'erreur d'éxécution, des débordements de pile ou des erreurs de compilation, ça peut arriver...

Dans ce cas il suffit d'aller dans ThisWorbook cliquer dans la macro et d'appuyer sur la touche F5 et tout se rétabli.

Personnellement j'utilise exclusivement cette méthode qui peut s'appliquer à toutes les feuilles du classeur sans problème. Dans ce cas remplacer par cette macro :

Private Sub Workbook_Open()
Dim i%
For i = 1 To Worksheets.Count
   Worksheets(i).Protect UserInterfaceOnly:=True, Password:="mlbp"
Next
End Sub

A+

Wow, vous êtes des génies!

merci beaucoup.

Le seul bogue restant est le #1 de mon poste original:

  • 1. lorsque j’ai terminé d’inscrire de l’info dans la section Information supplémentaires, et que je fais Enter, c’est la cellule H7 avec l’userform calendrier qui s’active.

Généralement, les utilisateurs finiront de remplir cette section du formulaire. Or il serait préférable que l'userforme de la cellule H7 ne s'active pas après avoir fait Enter dans la section Information supp. afin qu'il puisse passer à la dernière étape Envoyez votre demande.

Pour éviter ce problème, j'ai laissé la cellule H32 non protégée afin que le curseur bascule vers la H32 plutôt que la H7, mais de tout évidence cela ne fonctionne pas!

Merci encore de votre aide indispensable.

Bonsoir,

c'est l'inconvénient de ce genre de formulaire bâtis sur des feuilles : On ne contrôle pas grand chose.

Les userforms sont bien plus riches en moyens de contrôle... Pour le coup il va falloir utiliser l'artillerie lourde :

Tu peux contourner le problème en modifiant ta macro de la manière suivante :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    adresse = Target.Address
Application.ScreenUpdating = False
Application.MoveAfterReturn = True
    For i = 18 To 32
        If adresse = "$A$" & i Then
            Calendrier.Show
            Cancel = True
            Exit For
        ElseIf adresse = "$B$" & i Or adresse = "$C$" & i Or adresse = "$D$" & i Then
            HrsMins.Show
            Cancel = True
            Exit For
        End If
    Next
    If adresse = "$H$7" And [H7] = "" Then
        Calendrier.Show
        Cancel = True
    End If
   If adresse = "$G$20" Then
      Application.MoveAfterReturn = False
   End If
End Sub

... et en rajoutant cette macro :

Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Target.Address = "$G$20" Then [G15].Activate
ActiveWindow.ScrollRow = 1
End Sub

A+

Super monsieur Galopin01, tout fonctionne bien.

Un site indispensable et des personnes exceptionnelles.

Merci

Rechercher des sujets similaires à "macros qui emballent"