Probleme avec Intersect dans un private sub

bobbob83 Messages postés 32 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 22 novembre 2007 - 5 sept. 2007 à 12:46
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 - 11 sept. 2007 à 00:23
bonjour

j'ai un probleme avec intesect dans une macro private sub ci dessous
Private Sub Worksheet_Change(ByVal zz As Range)<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

If Intersect(zz, [C1:C555]) Is Nothing Then Exit Sub

Application.EnableEvents = False

zz = UCase(zz)

Application.EnableEvents = True

End Sub

la macro transforme automatiquement  les minuscules en majuscules dans la colone c mais je n'arrive pas à ajouter d'autres colones, comme colone b g h

j'ai tester un deuxieme macro en modifiant la valeur ZZ en XX mais ça me donne une erreur

pourriez vous m'indiquer comment modifier ce code pour integrer les colones B G et H

merci d'avance

14 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
6 sept. 2007 à 00:18
Tu écris ceci
If Intersect(zz, [C1:C555]) Is Nothing Then Exit Sub
Donc, si la sélection ne fait pas partie de C1 à C555 la procédure se termine là...

Est-ce que la puce te titille l'oreille ?

MPi
0
bobbob83 Messages postés 32 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 22 novembre 2007
6 sept. 2007 à 12:22
ça j'avais compris mais se que je ne sais pas c'est comment integrer des cellulles qui ne sont pas contigu si j'ecris [C1 : C555 , E1 : E555 , H1 : H555] ça marche pas

quel code dois je ecrire pour avoir le resultat voulu ???
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
7 sept. 2007 à 00:34
Essaie comme ceci

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("A1:A10")) Is Nothing Or _
       Not Application.Intersect(Target, Range("C1:C10")) Is Nothing Or _
       Not Application.Intersect(Target, Range("E1:E10")) Is Nothing Then

        MsgBox "Dans les limites"
    Else
        MsgBox "En dehors des limites"
    End If
   
End Sub

MPi
0
bobbob83 Messages postés 32 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 22 novembre 2007
7 sept. 2007 à 13:44
Merci  MPi

j'ai modifier le code que tu ma donnés et ça fonctione

Private Sub Worksheet_Change(ByVal zz As Range)
    If Not Application.Intersect(zz, Range("A1:A10")) Is Nothing Or _
       Not Application.Intersect(zz, Range("C1:C10")) Is Nothing Or _
       Not Application.Intersect(zz, Range("E1:E10")) Is Nothing Then
zz = UCase(zz)
       End If
    End Sub

par contre peut tu m'expliquer la difference entre c deux lignes

ma macro

Private Sub Worksheet_Change(ByVal zz As Range)
If Intersect(zz, [C1:C555]) Is Nothing Then Exit Sub
Application.EnableEvents = False
zz = UCase(zz)Application.EnableEvents True<?xml:namespace prefix o ns = "urn:schemas-microsoft-com:office:office" /??>

End Sub

Ton code :

Not Application.Intersect(zz, Range("E1:E10")) Is Nothing Then

quel role joue le "EnableEvents" dans la macro ???

et si je les ajoutes dans ton code ça me fait une erreur IF sans END IF

Private Sub Worksheet_Change(ByVal zz As Range)
    If Not Application.Intersect(zz, Range("A1:A10")) Is Nothing Or _
       Not Application.Intersect(zz, Range("C1:C10")) Is Nothing Or _
       Not Application.Intersect(zz, Range("E1:E10")) Is Nothing Then Exit Sub
Application.EnableEvents = False

zz = UCase(zz)
Application.EnableEvents = True

       End If
    End Sub

Porquoi ???
0

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

Posez votre question
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
7 sept. 2007 à 23:45
Le mot Application est facultatif. Tu pourrais l'enlever.
[C1:C10] équivaut à mettre Range("C1:C10"), un peu plus court, mais moins lisible...

Not ... Is Nothing est une double négation donc positif

Je ne peux expliquer vraiment, mais si tu regardes les exemples de Microsoft, ils utilisent presque toujours cette forme. Fais des tests en utilisant la négation simple (if Is Nothing) et tu verras que ça ne fonctionne plus dans bien des cas. J'ai donc pris l'habitude d'y aller avec la double-négation.

Par contre, ton code original était "si la cellule n'est pas dans le Range... Exit Sub"
Avec la double-négation, il ne faudra pas mettre le Exit Sub puisque la cellule est dans le Range

EnableEvents = False empêche le code de revenir dans des actions automatiques comme le Change ou SelectionChange. Si ton code utilise des Select, ces événements seront rappelés et ça bousillera la macro. Excel ne saura plus où mettre de la tête. Le programme tournera en boucle sans fin, éventuellement.

Personnellement, je ne l'utilise jamais; je préfère utiliser des variables Boolean que je gère moi-même. J'ai déjà eu des problèmes avec et maintenant cette commande est sur ma liste noire.

À titre d'exemple:
Public ÇaRoule as Boolean ' en entête de feuille ou dans un Module, au besoin

Private Sub Worksheet_Change(ByVal Target As Range)
    If ÇaRoule Then Exit Sub  ' la macro roule

    If Not Application.Intersect(Target, Range("A1:A10")) Is Nothing Or _
       Not Application.Intersect(Target, Range("C1:C10")) Is Nothing Or _
       Not Application.Intersect(Target, Range("E1:E10")) Is Nothing Then
    ÇaRoule = True
    '....du code qui change des valeurs de cellules
    ÇaRoule = False   ' on remet à False une fois la procédure terminée
End Sub

MPi
0
bobbob83 Messages postés 32 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 22 novembre 2007
8 sept. 2007 à 13:23
je ne comprends pas l'utilité de la variable çaRoule a quoi ça sert je ne vois acunne différence avec ou sens !

je pense que c'est la meme chose que "EnableEvents" mais la non plus je ne comprends pas l'utilité de ce code dans le "Private Sub Worksheet_Change"

"EnableEvents" arrete le "Private Sub Worksheet_Change" ????

d'autre part j'ai un probleme avec le code ''Target = UCase(Target)''

si je selectionne une plage de cellules entre A1 et E10 et que je tappe sur touche supprime ou que je change le format des cellules le "Private Sub" plante
la ligne ''Target = UCase(Target)'' deviens jaune et la boite de dialogue me dit qu il y a une erreur 13  "incompatibilité de type"

que manque t' il comme code pour eviter cette erreur

Je commence à peter les plombs chaques fois que je regle un probleme j' en ai un qui vient  

je te remerci pour  tes explications cela m 'aide beaucoup
0
bobbob83 Messages postés 32 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 22 novembre 2007
8 sept. 2007 à 13:27
PS : pourrais tu me mettre le code avec l'explication et les effets de chaques lignes

de façon à comprendre la logique de VBA

Merci d'avance
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
8 sept. 2007 à 14:06
Essaie ce bout de code et inscris un chiffre entre A1 et A10
La macro "veut" additionner 1 à la cellule A1 qui fait partie de l'intersection.

Option Explicit
Private CaRoule As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
'If CaRoule Then Exit Sub  'tester avec et sans le commentaire

    If Not Intersect(Target, Range("A1:A10")) Is Nothing Then
        CaRoule = True
        Range("A1") = Range("A1") + 1
    End If
   
    CaRoule = False
End Sub

Maintenant, enlève le commentaire de la ligne en vert et récris une valeur en A1
Tu vois la différence ?

MPi
0
bobbob83 Messages postés 32 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 22 novembre 2007
9 sept. 2007 à 23:55
Oh !!!! je vois la difference mais je ne comprends plus rien, je suis perdu

je viens de perdre la boule en testant ton code, au secours je patoge ! et j'ai tres peur de se que je vois !

si j'ai bien compris ce que j'ai vu,

quand le code "If CaRoule Then Exit Sub" et un commentaire la macro ajoute 1 + la valeur 198 (ça doit representer le Zéro en code ASCII ou autre ....) ça je n'y connais rien mais je me doute que cela doit etres un bazard comme ça.

quand le code n'est pas un commentaire la macro ajoute 1 chaque fois que j'inscrit quelque chose entre A1 et A10

dans le premier cas la macro travaille directement sur la cellule et dans le deuxieme elle ne prends en compte que la valeur inscrit dans la cellule

je pense avoir saisie la difference, en esperant que mon raisonnement soi bon.

(dis moi si je me trompe).

ce code c'est la declaration de la variable CaRoule ??!!
Option Explicit
Private CaRoule As Boolean

la macro traduite en français ça donne

voici la variable caroule
changer la valeur
si un cellule entre A1 et A10  est modiffié ajouter 1 a la cellule A1
fin du programme

je sais tu vas me dire que c'est tiré par les cheveux mais bon je n'ai pas l ame d'un programmeur !

mais apres je m y  perds je ne comprends pas le reste, que veux dire ce code et comment il agit sur la macro
If CaRoule Then Exit Sub

heureusement que je ne fais pas de calul avec mes macros et que cela n'est que pour de la mise en page, car avec ce que tu m as montrés la, je ne suis pas pret d envoyer une fusée sur la lune  ouf ! y a du boulot

Bon MAis en se qui concerne mon probleme d'erreur de type avec le code ''Target = UCase(Target) quand je selectionne plusieurs cellules et que je les modifies.
 y a t'il une solution  car pour l'instant j'avoue que ma macro ne me sert pas à grand chose si a chaque fois il faut que je debogue le programme

en tous les cas merci pour se petit bout de code qui ma rendu fou toute la soirée.
en attente d'une prochaine lecture je te shouaite une bonne nuit @+ 
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
10 sept. 2007 à 01:47
Bon, pour clarifier la chose, l'événement Change est appelé lorsqu'il y a un changement effectué dans une cellule. Si, dans la macro, tu appelles un changement à une cellule, l'événement est encore rappelé et ainsi de suite... ce qui crée un genre de boucle infinie.

Et là-dessus, je ne suis pas certain, mais il semble qu'Excel arrête cette boucle pour éviter le crash.

Donc, la variable booléenne est là pour éviter de recommencer plusieurs fois le traitement.
Par défaut une variable booléenne est fausse.
Donc, si tu fais une modification, tu la mets à True pour indiquer qu'il y a un traitement à effectuer et comme tu ne veux pas que ça recommence sans arrêt, tu vérifies au début son état. Si elle est vraie, c'est qu'il y a traitement et on sort. Quand le traitement est terminé, on la remet à False.

Pour ton erreur 13, il peut s'agir d'un chiffre que tu essaies de mettre en majuscule, ce qui ne va pas. Si ce n'est pas le cas, ajoute .Value après Target pour spécifier que c'est le texte que tu veux mettre en majuscule et non pas l'objet lui-même.

Et je ne comprends pas pourquoi tu changes le nom des variables par défaut des événements comme "zz" au lieu de "Target" ??? tu coures après les problèmes... Ce n'est pas une procédure que tu crées, mais un événement "créé" par Excel.

MPi
0
bobbob83 Messages postés 32 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 22 novembre 2007
10 sept. 2007 à 13:41
c'est génial j'ai tout compris pour la valeur booléenne,  merci beaucoup

pour mon erreur 13  ce n'est pas le contenu qui plante l"evenement, le probleme arrive quand je selectionne un plage de cellule (ex A1 : A5) et que je supprime le contenu
Mais la suppression se fais correctement quand je prends un cellule à la fois

donc le probleme c est  la selection et je ne vois pas comment le résoudre.

tu ma dis de rajouter un .Value apres le target mais ça ne fonctionne pas dans ces lignes de code
 
If Not Application.Intersect(Target, Range("A1:A10")) Is Nothing Or _
       Not Application.Intersect(Target, Range("C1:C10")) Is Nothing Or _
       Not Application.Intersect(Target, Range("E1:E10")) Is Nothing Then

Alors je l'ai mis ici

Target = UCase(Target.Value)

et pour la question du zz je savais pas qu'il ne fallait pas renommer les variables des evenements c'etait juste pour pouvoir les différencier

bobbob83
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
10 sept. 2007 à 14:07
Effectivement, je n'avais pas bien lu...
Comme il y a plusieurs cellules de sélectionnées, tu dois les passer une à une.

Sur le même principe, avec une variable booléenne de vérification de traitement.
Option Explicit
Dim CaRoule As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim I As Integer
   
    If CaRoule Then Exit Sub
   
    For I = 1 To Target.Count  'Changer chaque cellule
        CaRoule = True
        Target(I) = UCase(Target(I))
    Next

    CaRoule = False
End Sub

MPi
0
bobbob83 Messages postés 32 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 22 novembre 2007
10 sept. 2007 à 21:43
Bonsoir MPi

j'ai modifié ton code et ça donne ça :

Option Explicit
Dim CaRoule As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim I As Integer
   
    If CaRoule Then Exit Sub
    If Not Application.Intersect(Target, Range("A1:A10")) Is Nothing Or _
      Not Application.Intersect(Target, Range("C1:C10")) Is Nothing Or _
      Not Application.Intersect(Target, Range("E1:E10")) Is Nothing Then


    For I = 1 To Target.Count  'Changer chaque cellule
        CaRoule = True
        Target(I) = UCase(Target(I))
    Next
End If
    CaRoule = False
End Sub

les résultats sont :

mise en forme des lettres en majuscules dans les plages de cellules A1:A10 C1:C10 E1:E10
et je peux supprimer une selection entre A1:E10 sans faire planter le private sub

j'ai obtenu le résultat souhaité

j'ai testé plusieurs "Private sub" dans la meme feuille mais ça me marque une erreur "nom ambigu  Worksheet_Change"

donc j'ai integrer bout a bout les differents Worksheet_Change comme ceci

 Option Explicit
Dim CaRoule As Boolean


Private Sub Worksheet_Change(ByVal Target As Range)


If CaRoule Then Exit Sub  ' la ligne miracle

    If Not Intersect(Target, Range("A1:A10")) Is Nothing Then 'ton petit code de test
        CaRoule = True
        Range("A1") = Range("A1") + 1
    End If
    
      Dim W As Integer 'le code qui copie la valeur d'une cellule en fontion de la valeur de B2 (celle de mon autre post )
          If Target.Address(False, False) = "B2" Then
          For W  = 1 To Target.Value - 1
    Macro1 W * 2
   Next
     End If
     
    Dim I As Integer ' le code pour mettre la saisie en majuscule
    
       If Not Application.Intersect(Target, Range("A1:A10")) Is Nothing Or _
      Not Application.Intersect(Target, Range("C1:C10")) Is Nothing Or _
      Not Application.Intersect(Target, Range("E1:E10")) Is Nothing Then

    For I = 1 To Target.Count 
       Target(I) = UCase(Target(I))
       Next
End If
    CaRoule = False



End Sub

voila, tout ce petit monde a l'air de cohabiter tres bien,
 mais je suis sur que tu dois avoir un attaque cardiaque en voyant ça

suis je prets pour lancer une fusée sur la lune ???

merci, merci

bobbob83
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
11 sept. 2007 à 00:23
Si tu lances un fusée maintenant, tu risques de faire comme les Américains et perdre des morceaux en chemin...

La déclaration de la variable CaRoule = True devrait, en principe, se trouver dans chaque condition, au cas où le code ne passerait pas dans une ou l'autre des conditions. Histoire d'assurer au max.

Bonne continuation.

MPi
0
Rejoignez-nous