IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Empêcher saisies dans plage (ligne) suivant contenu colonne


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 663
    Par défaut Empêcher saisies dans plage (ligne) suivant contenu colonne
    Bonjour,
    Je cherche (avec une Sub Worksheet_Change), à empêcher toute saisie sur la plage [C9:L100], si la colonne A des lignes correspondantes est vide.

    Je me suis un peu emmêlé avec des :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not Intersect([C9:L100], Target) Is Nothing And Target.Column = 1
    Mais, sans surprise, ça ne fonctionne pas !
    Doit-on utiliser un "Is Not Nothing" ? (Pas sûr que ça existe)
    Comment identifier le numéro de colonne ? Faut-il passer par un Offset ? Si oui, faut-il le recalculer suivant la Target de la plage [C9:L100] ?

    Merci d'avance pour votre aide,
    jpma75

  2. #2
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Essaie comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
        If Target.Count <> 1 Or _
        (Not Application.Intersect(Target, Range("C9:L100")) Is Nothing And _
        Range("A" & Target.Row) = "") Then
            Application.Undo
        End If
        Application.EnableEvents = True
    End Sub
    Cordialement.

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 663
    Par défaut
    Avant même d'essayer, j'étais sûr que ça marcherait ! ;-
    Un grand merci gFZT82 !

    Puis-je abuser ? Si oui :

    Pourquoi ? On s'assure qu'au delà de la cellule qu'on vient de saisir, il n'y a rien d'autre ? Comprends pas !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Or (Not Application.Intersect(Target, Range("C9:L100")) Is Nothing And _
        Range("A" & Target.Row) = "") Then
    Il faut que je me penche sur cette méthode : Not (application) (...) Is Nothing.
    Cette double négation n'est pas très claire pour moi.

    Je vais essayer d'ajouter un petit commentaire qui s'affiche pendant 2 secondes avant d'effacer la cellule.

    Cordialement

  4. #4
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    If Target.Count <> 1
    Pourquoi ? On s'assure qu'au delà de la cellule qu'on vient de saisir, il n'y a rien d'autre ? Comprends pas !
    Cela permet de se protéger contre les multi sélections.
    Exemple : tu sélectionnes C9 :G12 et tu fais suppr.
    If Not Application.Intersect(Target, Range("C9:L100")) Is Nothing.
    Cette double négation n'est pas très claire pour moi.
    Il suffit de décomposer :
    If Application.Intersect(Target, Range("C9:L100")) Is Nothing : si la cellule modifiée (Target) n’est pas incluse dans la plage C9 :L100
    If Not Application.Intersect(Target, Range("C9:L100")) Is Nothing : si la cellule modifiée (Target) est incluse dans la plage C9 :L100

    Cordialement.

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 663
    Par défaut
    Merci !

    Puis-je te soumettre la modif que j'y ai faite pour ajouter une tempo ? Il est probable que ça ne soit pas très académique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Private Sub Worksheet_Change(ByVal Target As Range)  'proposition gFZT82
    Dim comment As String
    Dim tempo As Date
     
        Application.EnableEvents = False
     
        If Target.Count <> 1 Or (Not Application.Intersect(Target, Range("C9:L100")) Is Nothing _
            And Range("A" & Target.Row) = "") Then
     
            Application.Undo
     
            ActiveSheet.UnProtect Password:="****"
     
            ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 200, 150, 170.25, 91.5).Select
                Selection.Characters.Text = "Impossible ! Il n'y a pas de nom sur cette ligne !"
                DoEvents
                With Selection.Characters(start:=1, Length:=50).Font
                    .Name = "Arial"
                    .FontStyle = "Normal"
                    .Size = 15
                    .Shadow = True
                    .ColorIndex = 5  '(bleu)
     
                    With Selection
                        .ShapeRange.Fill.ForeColor.SchemeColor = 13
                        .Name = "leTxt"
                        .AutoSize = True
                        .HorizontalAlignment = xlCenter
                        .VerticalAlignment = xlCenter
                    End With
                End With
     
                tempo = Time
                    Do While Time < tempo + TimeSerial(0, 0, 2)  '(2 sec.)
                    Loop
     
                ActiveSheet.Shapes("leTxt").Delete
     
                'Application.ScreenUpdating = False
                comment = "Impossible ! Il n'y a pas de NOM pour cette ligne !"
                DoEvents
     
            With ActiveSheet
                .Protect Password:="****", userinterfaceonly:=True
                .Protect _
                    DrawingObjects:=True, _
                    Contents:=True, _
                    Scenarios:=True
                .EnableSelection = xlUnlockedCells
            End With
        End If
        Application.EnableEvents = True
    End Sub
    Cordialement,

Discussions similaires

  1. xlswrite dans la ligne suivante Excel
    Par spopo2012 dans le forum Interfaces Graphiques
    Réponses: 0
    Dernier message: 04/05/2013, 18h02
  2. [AC-2003] Empêcher saisie dans textbox
    Par Shankara dans le forum IHM
    Réponses: 4
    Dernier message: 15/03/2012, 12h37
  3. Réponses: 11
    Dernier message: 05/08/2010, 14h19
  4. Réponses: 7
    Dernier message: 20/04/2010, 09h15
  5. Remplacer dans chaque ligne de la colonne A
    Par morgan47 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/04/2009, 16h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo