Macro: probleme programmation colonnes

Bonjour,
bonsoir à tous et à toutes .
je suis nouveau sur le forum et novice en programmation. (système d'exploitation windows vista excel 2007).
depuis quelques jours j'essai de modifier une macro récupérée sur un forum.
Après quelques modifications la macro fonctionne bien mais mon problème est que cette macro fonctionne sur les colonnes entières de la feuille. Or ce que souhaiterais faire c'est que cette macro fonctionne dans un tableau uniquement.
est-ce possible?

(Autoriser saisie dans une cellule si un autre est bien renseignée ).

voici la macro récupérée.

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 5 And Target.Count = 1 Then
If Target.Offset(, -1).Value = Empty Then
Application.EnableEvents = False
MsgBox "il faut saisir l'agence avant le compte !"
Target.Value = Empty
Target.Offset(, -1).Select
Application.EnableEvents = True
End If
End If
If Target.Column = 4 And Target.Count = 1 Then
Target.Offset(0, 1).Select
End If
End Sub

Voici la macro modifiée qui fonctionne bien mais qui utilise les colonnes entières sur la feuille

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 6 And Target.Count = 1 Then
If Target.Offset(, -2).Value = Empty Then
Application.EnableEvents = False
MsgBox "il faut saisir l'agence avant le compte !"
Target.Value = Empty
Target.Offset(, -2).Select
Application.EnableEvents = True
End If
End If
If Target.Column = 4 And Target.Count = Empty Then
Target.Offset(, -1).Select
End If

If Target.Column = 6 And Target.Count = 1 Then
If Target.Offset(, -3).Value = Empty Then
Application.EnableEvents = False
MsgBox "il faut saisir l'agence avant le compte !"
Target.Value = Empty
Target.Offset(, -3).Select
Application.EnableEvents = True
End If
End If
If Target.Column = 3 And Target.Count = Empty Then
Target.Offset(, -1).Select
End If
End Sub

Ce que je souhaiterais c'est une macro qui utiliserait uniquement les colonnes du tableau du style:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column("F61:F80") And Target.Count = 1 Then
If Target.Offset(, -2).Value = Empty Then
Application.EnableEvents = False
MsgBox "il faut saisir l'agence avant le compte !"
Target.Value = Empty
Target.Offset(, -2).Select
Application.EnableEvents = True
End If
End If
If Target.Column("D61:D80") And Target.Count = Empty Then
Target.Offset(, -1).Select
End If

If Target.Column("F61:F80") And Target.Count = 1 Then
If Target.Offset(, -3).Value = Empty Then
Application.EnableEvents = False
MsgBox "il faut saisir l'agence avant le compte !"
Target.Value = Empty
Target.Offset(, -3).Select
Application.EnableEvents = True
End If
End If
If Target.Column("C61:C80") And Target.Count = Empty Then
Target.Offset(, -1).Select
End If
End Sub
Après plusieurs tentatives et essais
Il m'est impossible de faire fonctionner cette macro sous cette forme là où est le problème?

Exemple: j'ai un tableau qui se presente ainsi:

Colonnes

("C61:C80"),("D61:D80"),("F61:F80").....jusqu'à ("T61:T80")

Il faut que les cellules "C et D" soient renseignées avant de pouvoir renseigner les cellules de la même ligne. d'avance merci pour l'attention que vous voudrez bien porter à mon problème.

Berrot.
Configuration: Windows Vista. Excel 2007
Internet Explorer 7.0

6 réponses

  • Votes
  • Date
  • Date décroissante
  1. Bonjour,

    Suggestion :

    Option Explicit
    '
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    
        Dim Plage As Range, Intersection As Range
        
        Set Plage = Range("F61:F80")
        Set Intersection = Application.Intersect(Plage, Target)
    
        If Not Intersection Is Nothing Then
            If Target.Offset(, -2).Value = Empty Then
                Application.EnableEvents = False
                MsgBox "il faut saisir l'agence avant le compte !"
                Target.Value = Empty
                Target.Offset(, -2).Select
                Application.EnableEvents = True
            End If
        End If
    
    '    If Target.Column("F61:F80") And Target.Count = 1 Then
    '        If Target.Offset(, -2).Value = Empty Then
    '            Application.EnableEvents = False
    '            MsgBox "il faut saisir l'agence avant le compte !"
    '            Target.Value = Empty
    '            Target.Offset(, -2).Select
    '            Application.EnableEvents = True
    '        End If
    '    End If
    
        Set Plage = Range("D61:D80")
        Set Intersection = Application.Intersect(Plage, Target)
        
        If Not Intersection Is Nothing Then
            Application.EnableEvents = False
            Target.Offset(, -1).Select
            Application.EnableEvents = True
        End If
    
    '    If Target.Column("D61:D80") And Target.Count = Empty Then
    '        Target.Offset(, -1).Select
    '    End If
    
        Set Plage = Range("F61:F80")
        Set Intersection = Application.Intersect(Plage, Target)
        
        If Not Intersection Is Nothing Then
            If Target.Offset(, -3).Value = Empty Then
                Application.EnableEvents = False
                MsgBox "il faut saisir l'agence avant le compte !"
                Target.Value = Empty
                Target.Offset(, -3).Select
                Application.EnableEvents = True
            End If
        End If
    
    '    If Target.Column("F61:F80") And Target.Count = 1 Then
    '        If Target.Offset(, -3).Value = Empty Then
    '            Application.EnableEvents = False
    '            MsgBox "il faut saisir l'agence avant le compte !"
    '            Target.Value = Empty
    '            Target.Offset(, -3).Select
    '            Application.EnableEvents = True
    '        End If
    '    End If
        
        Set Plage = Range("C61:C80")
        Set Intersection = Application.Intersect(Plage, Target)
        
        If Not Intersection Is Nothing Then
            Application.EnableEvents = False
            Target.Offset(, -1).Select
            Application.EnableEvents = True
        End If
    
    '    If Target.Column("C61:C80") And Target.Count = Empty Then
    '        Target.Offset(, -1).Select
    '    End If
        
    End Sub
    '
    

    Lupin
    1. bonsoir

      merci beaucoup de vous être interessé à mon problème .
      je vais essayer cette macro

      et je vous tiendrais informé

      merci encore.
    2. Bonsoir
      c'est exactement ce que je voulais.

      Cependant il y a quelques petits problèmes qui surviennent à l'exécution de la macro:

      1° lorsque je saisis la colonne C la sélection se décale d'une cellule vers la gauche (colonne B qui ne devrait pas être selectionnée) au lieu de se déplacer vers la droite en colonne D ou F si D est renseignée.

      2° lorsque je mets en surbrillance les colonnes C ou D et clique droit de la souris "effacer le contenu" tout s'efface mais la surbrillance se décale vers la gauche en colonne C ou B.

      3° lorsque je mets en surbrillance la colonne F clique droit de la souris " efacer le contenu" un message d'erreur du débogage s'affiche "erreur d'exécution 13 incompatibilité du type :"
      Je clique débogage :

      la 6eme ligne de la macro est surlignée en jaune "If Target.Offset(, -2).Value = Empty Then"
      lorsque je ferme le débogage, la feuille se réduit dans la barre des tâches.

      Excusez moi de vous poser ces quelques problèmes
      et encore merci.
  2. re :

    dans un premier temps, essayer avec ceci :

    Option Explicit
    '
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    
        Dim Plage As Range, Intersection As Range
        
        Application.EnableEvents = False
        
        Set Plage = Range("F61:F80")
        Set Intersection = Application.Intersect(Plage, Target)
    
        If Not Intersection Is Nothing Then
            If Target.Offset(0, -2).Value = Empty Then
                MsgBox "il faut saisir l'agence avant le compte !"
                Target.Value = Empty
                Target.Offset(0, -2).Select
            End If
        End If
    
        Set Plage = Range("D61:D80")
        Set Intersection = Application.Intersect(Plage, Target)
        
        If Not Intersection Is Nothing Then
            Target.Offset(0, -1).Select
        End If
    
        Set Plage = Range("F61:F80")
        Set Intersection = Application.Intersect(Plage, Target)
        
        If Not Intersection Is Nothing Then
            If Target.Offset(0, -3).Value = Empty Then
                MsgBox "il faut saisir l'agence avant le compte !"
                Target.Value = Empty
                Target.Offset(0, -3).Select
            End If
        End If
    
        Set Plage = Range("C61:C80")
        Set Intersection = Application.Intersect(Plage, Target)
        
        If Not Intersection Is Nothing Then
            Target.Offset(0, -1).Select
        End If
            
        Application.EnableEvents = True
    
    End Sub
    '
    


    ainsi, dès l'entrée dans cette routine les évènement seront désactiver.

    Lupin
    1. re:
      Bonjour et merci pour votre aide et surtout pr votre patience.
      suite :

      Lorsque je mets en surbrillance la colonne F clic droit de la souris "effacer le contenu" le problème persiste, la boîte de dialogue du débogage s'affiche "erreur d'exécution 13 incompatibilité de type :"
      Je clique débogage
      la 7ème ligne apparait surlignée en jaune ( If Target.Offset(0, -2).Value = Empty Then )

      Avec cette nouvelle macro lorsque je ferme le débogage la fenêtre ne se réduit plus dans la barre des tâches , mais la macro est désactivée. Je suis obligé de fermer le fichier, de le rouvrir , de recoller la macro puis ça fonctionne une fois et ainsi de suite..
      1. Re :

        Private Sub Worksheet_Change(ByVal Target As Range)
        
            Dim Plage As Range, Intersection As Range
            
            Application.EnableEvents = False
            
            Set Plage = Range("F61:F80")
            Set Intersection = Application.Intersect(Plage, Target)
        
            If Not Intersection Is Nothing Then
                If IsEmpty(Target.Offset(0, -2).Value) Then
                    MsgBox "il faut saisir l'agence avant le compte !"
                    Target.Value = ""
                    Target.Offset(0, -2).Select
                End If
            End If
        
            Set Plage = Range("D61:D80")
            Set Intersection = Application.Intersect(Plage, Target)
            
            If Not Intersection Is Nothing Then
                Target.Offset(0, -1).Select
            End If
        
            Set Plage = Range("F61:F80")
            Set Intersection = Application.Intersect(Plage, Target)
            
            If Not Intersection Is Nothing Then
                If IsEmpty(Target.Offset(0, -3).Value) Then
                    MsgBox "il faut saisir l'agence avant le compte !"
                    Target.Value = ""
                    Target.Offset(0, -3).Select
                End If
            End If
        
            Set Plage = Range("C61:C80")
            Set Intersection = Application.Intersect(Plage, Target)
            
            If Not Intersection Is Nothing Then
                Target.Offset(0, -1).Select
            End If
                
            Application.EnableEvents = True
        
        End Sub
        '
        


        de plus le décalage à gauche se fait avec l'instruction :
        Target.Offset(0, -1).Select

        dans la partie de code :
            Set Plage = Range("C61:C80")
            Set Intersection = Application.Intersect(Plage, Target)
            
            If Not Intersection Is Nothing Then
                Target.Offset(0, -1).Select
            End If
        


        si tu désire un décalage à droite, il faut inscrire :

            Set Plage = Range("C61:C80")
            Set Intersection = Application.Intersect(Plage, Target)
            
            If Not Intersection Is Nothing Then
                Target.Offset(0, 1).Select
            End If
        


        Lupin
        1. Bonsoir Lupin

          Super ça fonctionne très bien !

          J'ai corrigé le décalage vers la gauche.

          Encore merci pour tout.

          Je te souhaite de bonnes fêtes de fin d'année.

          BERROT.

          PS.
          Peut-ëtre aurai-je encore besoin de tes services !

          Je ne sais pas comment mettre ta réponse en ligne ou sur le forum pour que ça puisse rendre service à d'autres.
      2. re :

        Excellent, ce fut un plaisirs à partager :-)

        Passer de joyeuses fêtes.

        Michel

        Lupin
        1. Bonjour Michel (Lupin)

          C'est Berrot (Robert) ce petit message pour te souhaiter une tres bonne et heureuse année 2009.
          A+
          Robert