Macro: probleme programmation colonnes

Fermé
Berrot Messages postés 7 Date d'inscription mardi 16 décembre 2008 Statut Membre Dernière intervention 2 janvier 2009 - 17 déc. 2008 à 17:35
Berrot Messages postés 7 Date d'inscription mardi 16 décembre 2008 Statut Membre Dernière intervention 2 janvier 2009 - 2 janv. 2009 à 10:53
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.
A voir également:

6 réponses

Utilisateur anonyme
17 déc. 2008 à 19:11
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
0
Berrot Messages postés 7 Date d'inscription mardi 16 décembre 2008 Statut Membre Dernière intervention 2 janvier 2009
17 déc. 2008 à 19:47
bonsoir

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

et je vous tiendrais informé

merci encore.
0
Berrot Messages postés 7 Date d'inscription mardi 16 décembre 2008 Statut Membre Dernière intervention 2 janvier 2009
17 déc. 2008 à 20:56
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.
0
Utilisateur anonyme
17 déc. 2008 à 22:29
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
0
Berrot Messages postés 7 Date d'inscription mardi 16 décembre 2008 Statut Membre Dernière intervention 2 janvier 2009
19 déc. 2008 à 08:25
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..
0
Utilisateur anonyme
19 déc. 2008 à 13:22
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
0
Berrot Messages postés 7 Date d'inscription mardi 16 décembre 2008 Statut Membre Dernière intervention 2 janvier 2009
20 déc. 2008 à 10:23
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
20 déc. 2008 à 15:14
re :

Excellent, ce fut un plaisirs à partager :-)

Passer de joyeuses fêtes.

Michel

Lupin
0
Berrot Messages postés 7 Date d'inscription mardi 16 décembre 2008 Statut Membre Dernière intervention 2 janvier 2009
2 janv. 2009 à 10:53
Bonjour Michel (Lupin)

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

Discussions similaires