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 :

Boucle incompréhensible avec Application.Intersect [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Par défaut Boucle incompréhensible avec Application.Intersect
    Bonjour à tous,

    Je me permet de venir demander votre aide, car j'ai un morceau de programme de quelques lignes qui me donne du fil à retordre, et à avoir le nez dedans, je ne suis pas sur de trouver un jour la solution.

    En fait, non par choix, mais par necessité matériel, je fais du Access avec Excel.
    En effet, je dispose d'une Base de Données Excel, et je souhaite via une autre table, pouvoir fonctionner comme avec un formulaire, sans que ce soit un formulaire... Je sais, je fais simple...

    Donc sur ce "pseudo formulaire", grâce à une scanette, j'entre une référence produit, et j'affiche ses propriétés venant de la base de données.
    Je souhaite également pouvoir afficher une photo de la pièce, venant d'un dossier serveur.
    Pour ça, j'ai codé une macro qui permet à chaque fois que la référence entrée change, de charger une nouvelle photo, qui écrase l'ancienne dans le contrôle image.

    Voici le code:

    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
    Public Sub worksheet_change(ByVal Target As Range)
        'Initialisation
        Dim KeyCells As Range
        Dim Ref As String
        'Set des variables
        Set KeyCells = Range("A3")
        Ref = Range("C3")
        'Test modification cellule
        If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
            Range("A3").Value = Target.Value
            Image = "H:\data\" & Ref & ".jpg"
            'Chargement image
            Image1.Picture = LoadPicture(Image)
        End If
    End Sub
    Mon problème, est que automatiquement durant 280 cycles (avant d'utiliser un contrôle image, celà me superposait 280 fois la même photo), le programme tourne entre le début et Image1.Picture = LoadPicture(Image), sans vouloir aller au delà (j'ai testé en essayant de rajouter une instruction après, elle n'est pas prise en compte).

    Quelqu'un aurait une piste de réponse?

    En vous remerciant par avance.

  2. #2
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    salut.

    pas bien compris tes explications.
    néanmoins place ces 2 instructions respectivement avant le bloc If et à la fin de la procécedure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Application.EnableEvents=False
     
    Appication.EnableEvents=True

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Par défaut
    Malheureusement même avec, la boucle tourne toujours.
    Dans la pratique, le plus embétant, c'est que celà me bloque excel le temps d'activité de la boucle...

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Par défaut
    le problème c'est que tu crées un évènement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Sub worksheet_change(ByVal Target As Range)
    qui déclenche une action conditionnelle sur modification de la cellule A3.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing
    Cette action consiste à modifier A3,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A3").Value = Target.Value
    ce qui relance le même évènement. Ton évènement fait un appel récursif à lui-même.

    En fait si j'ai compris ce que tu veux, et ta procédure, ta ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Range("A3").Value = Target.Value
    ne sert à rien, tu peux la commenter et cela résous ton problème.

    Enfin pour le test tu peux l'écrire comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not Application.Intersect(keycells, Target) Is Nothing Then




    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
     
    Public Sub worksheet_change(ByVal Target As Range)
    'Initialisation
    Dim KeyCells As Range
    Dim Ref As String
    'Set des variables
    Set KeyCells = Range("A3")
    Ref = Range("C3")
    'Test modification cellule
    If Not Application.Intersect(KeyCells, Target) Is Nothing Then
    'Range("A3").Value = Target.Value
    Image = "H:\data\" & Ref & ".jpg"
    'Chargement image
    Image1.Picture = LoadPicture(Image)
    End If
    End Sub

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Par défaut
    Ohhhhhhhh merci!

    Je me disais que j'avais fait une boulette grosse comme...
    Mais comme c'est un bout de code que j'ai repris d'une autre utilisation que j'en ai faite, et qui ne m'avais pas posée problème, je ne n'ai même pas remis en question ce qu'il aurait fallu!
    Encore merci, tu me sors du sable!

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Par défaut
    et pour tes 280 appels c'est la taille de la pile d'appel avant qu'Excel sature

    ciao

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/01/2006, 19h53
  2. [Débutant]Boucle imbriquée avec des bornes différentes
    Par Hayato dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 29/08/2005, 16h23
  3. problème avec Application->ProcessMessages()
    Par petitours dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/08/2005, 10h27
  4. [XSL]boucle imbriquée avec condition
    Par kor dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 11/01/2005, 14h19
  5. incompréhension avec ado
    Par Orgied dans le forum Bases de données
    Réponses: 3
    Dernier message: 19/05/2004, 18h24

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