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 :

Petit soucis sur une macro comportant un "For" [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Petit soucis sur une macro comportant un "For"
    Bonjour,

    Je viens vers vous car j'ai un soucis sur ma macro et que je n'arrive pas à le résoudre. Qu'on s'entende bien, j'ai déjà cherché de mon côté et j'ai tourné le truc dans tout les sens sauf que j'en arrive à la conclusion que je loupe un truc évident et je ne vois pas quoi. Après, je connais un bon paquet de langage, donc il est possible que je me sois mélangé les pinceaux.

    Tout d'abord, deux screenshots pour contextualiser :

    Mon userform ===> http://image.noelshack.com/fichiers/...1-userform.jpg

    Puis mon tableau sur lequel je me base ===> http://image.noelshack.com/fichiers/...77-tableau.jpg

    Voici mon code, que je vous explique de suite après :
    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
     
    Private Sub CommandButton1_Click()
    Sheets("Calculs").Select
     
    If ComboBox1.Value = " " Then
        MsgBox "Veuillez sélectionner le nom de la balise"
    ElseIf ComboBox2.Value = " " Then
        MsgBox "Veuillez sélectionner la distance de la balise"
    ElseIf TextBox1.Value = "" Then
        MsgBox "Veuillez saisir la valeur de la balise"
    End If
     
    For Var = 3 To ValeurMax
        'MsgBox "Fraise"
        If ComboBox2.Value = "1km" And Cells(Var, 49).Value = "" Then
            'MsgBox Var
            Dog = Var
            'MsgBox Dog
            Var= ValeurMax
            'MsgBox Var
        End If
    Next
    MsgBox Var
    MsgBox Dog
    MsgBox ValeurMax
    Cells(Dog, 49).Value = ComboBox1.Value
    Cells(Dog, 50).Value = TextBox1.Value
     
    Application.ScreenUpdating = False
    End Sub
     
    Et aussi mon Userform_Initialize
     
    Private Sub UserForm_Initialize()
        Application.ScreenUpdating = True
        ComboBox1.ColumnCount = 1
        ComboBox1.List() = Array(" ", "AC1", "AC2", "AC3", "AC4")
        ComboBox1.Value = " "
        ComboBox2.ColumnCount = 1
        ComboBox2.List() = Array(" ", "1km", "2km", "5km", "10km")
        ComboBox2.Value = " "
    End Sub
    Le principe de ce code est le suivant : Sur mon tableau que vous avez en lien au dessus, je souhaiterais "ajouter" une balise et sa valeur associée à une distance donnée. Le principe étant que je peux en ajouter plusieurs balises (ici 4 car 4 lignes). Dans le userform, la ComboBox1 me sert à mettre le nom de la balise (exemple AS1) la ComboBox2 me sert à mettre ma distance (exemple "1km") et la TextBox1 à rentrer la valeur désirée, du genre 15 admettons. Ensuite j'appuie sur "Valider" et le code ci-dessus s’exécute.

    Bon ça c'est clarifié, donc pour le code, d'abord je commence par des "If" pour la vérification que l'user a bien rentré des données, sans quoi, je ne peux pas valider et poursuivre vers une autre fenêtre et je balance un message d'erreur, classique. Continuons.

    Et c'est là que les choses se gâtent. Le tableau que vous avez en image commence à la colonne 49. Dans cette colonne je souhaite mettre le nom de la balise seulement. De la colonne 50 à 53 et de la ligne 3 à 6 du tableau, c'est ma zone ou je saisie la valeur de la balise. Sachant qu'il n'y aurait qu'une seule valeur par ligne pour une balise bien entendu.

    Vu que je pars de la ligne 3 du tableau (les deux premières étant remplies et ne m'intéressant pas) je fais un "For Var = 3 ..." là ça va, ensuite je fais un MsgBox de débogage pour m'assurer que je suis bien rentré dans le "For" et là ça marche niquel.

    Puis je fais mon test pour savoir si j'ai déjà une balise d'inscrite en colonne 49 ligne 3 sur le tableau (je n'en ai pas mon tableau est vide) et en même temps je regarde si j'ai bien sélectionné "1km" dans ma userform (chose que j'ai bien évidemment faite et avec la même syntaxe "1km"). Et là, mon MsgBox qui suit cette ligne ne s’exécute pas.

    Quand j'appuie sur Valider, rien ne se passe. Les seules choses qui s’exécute sont mes MsgBox après le Next. Et j'ai la confirmation que mon Var est à 3, mais le Dog et ValeurMax sont totalement vides.

    Ma question est donc, qu'est ce que j'ai loupé ? J'ai l'air de rentrer dans mon For, mais celui-ci ne semble pas s'incrémenter. Je ne rentre même pas dans mon test "If", wtf ?

    Merci de votre temps et de la lecture, et si vous voulez aider un prog en galère ..

    Charly/Arkadian

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Points : 412
    Points
    412
    Par défaut
    Salut à toi,

    Comment est définie ta variable ValeurMax ? Est-elle bien globale à tout le formulaire ? Si le programme n'entre pas dans la boucle For, c'est qu'il ne doit pas y entrer car les bornes ne sont pas bien renseignées.
    As-tu essayé en mode pas à pas (F8 à répétition) en mettant un point d'arrêt juste avant ton for ? Ça te permettra de vérifier tes variables en cours de route en plaçant ton curseur dessus ou alors en regardant les variables locales voire en plaçant un espion...

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Salut ! Merci de ta réponse

    Donc ! Mon ValeurMax est défini comme suit dans le "ThisWorkBook" dans le "Open WorkBook" :
    Dim ValeurMax as Long

    Le pas à pas je l'ai déjà fait, et mes ComboBox1 & 2 et TextBox1 ont bien leurs valeurs que j'ai saisi (genre AC1, 1km et 20 admettons). J'avais déjà regardé de mon côté en faisant ça et même en mettant un espion.

    Donc ça c'était pour le point d'arrêt juste avant le For. Maintenant si je colle le point d'arrêt au If, là il passe carrément toute la procédure (il me la zappe total) et j'arrive à mon application ScreenUpdating. Et dans ma ligne For, mon Var est à 3 et mon ValeurMax est à..."vide".

    En regardant les valeurs avec mon curseur sur mon "If ComboBox2...." , mon ComboBox2.Value est bien à "1km" et ma "Cells(machintruc)" ne m'affiche même pas de fenêtre "vide". Pour le Var du Cells il est bien à 3. Mais tout ce qui est Dog et ValeurMax, c'est "vide".

    Donc en gros le ValeurMax est vide, pourquoi ?

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 199
    Points : 319
    Points
    319
    Par défaut
    Bonjour,

    Je suis peux etre à coté de la plaque mais pourquoi ne pas recherche la derniere ligne non vide et la colonne du nombre de KM à l'aide d'un FIND ?

    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
     
     
     
    Dim ligneCible As Integer, colonneCible As Integer, valDistance As String
     
    valDistance = ComboBox2.Value
     
    'Recherche de la derniere ligne vide de la colonne AW(49)
    ligneCible = Sheets("Calculs").Range("aw" & Rows.Count).End(xlUp).Row + 1
     
    'Recherche de la colonne cible
    Set R = Sheets("Calculs").Range("AX2:BA2").Find(valDistance, lookat:=xlWhole)
     
    If Not R Is Nothing Then
        colonneCible = R.Column
     
        Sheets("Calculs").Cells(ligneCible, colonneCible) = TextBox1.Value
     
    End If
    Cordialement,

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Oh la vache ... ça fait 4 heures que je planche dessus et j'y ai pas pensé >< Bon à vrai dire, je maîtrise assez mal ce genre de "fonction" et de syntaxe avec les find, les Not X Is Nothing Then, donc j'aurais pas su l'écrire seul mais j'aurais au moins pu y penser...

    En clair je comprends bien l'idée générale du code pour en avoir fait beaucoup (sur d'autres langages), mais je pourrais pas te dire quel terme correspond à quoi dans ce que tu as écrit et pourquoi tu l'écris comme ça. Je fais plus de la déduction qu'autre chose en fait.

    En attendant ta solution est juste très intelligente et toute bête quand on y pense, pourquoi s'embêter à chercher manuellement la distance et la dernière ligne ? Faire un find c'est plus rapide ^^

    Merci beaucoup ! Après il me reste à écrire le nom de la balise en colonne 49 du coup.

    EDIT: Après adaptation de ton code, ça fonctionne en effet. Bon maintenant il faut que je trouve le moyen d'écrire le nom de la balise en colonne 49, parce que sinon il ne passe pas de ligne, logique Merci en tout cas, c'est très sympa de votre part d'avoir filé un coup d'main !

    EDIT 2: Voilà c'est bon ! Je peux maintenant te demander en mariage ! Très bon coup d'main, encore merci messieurs ! J'apprécie

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 199
    Points : 319
    Points
    319
    Par défaut
    Cool si ca t'a aidé.

    Cordialement,

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Points : 412
    Points
    412
    Par défaut
    Tant mieux si tu as résolu ton problème

    Sinon, pour info :
    Donc ! Mon ValeurMax est défini comme suit dans le "ThisWorkBook" dans le "Open WorkBook" :
    Dim ValeurMax as Long
    Ta ValeurMax est donc une variable propre uniquement à ta macro "Workbook_Open" et est perdue une fois arrivé au End Sub. Pour qu'elle continue à exister et pour qu'elle soit transférable d'une procédure/fonction à une autre, il faut qu'elle soit (en écrivant tout en haut de ton code (en dehors des procédures)):
    → Globale (valable pour tout ton module) : Dim ValeurMax As Long
    → Publique (tu peux donc la lire même via ton UserForm) : Public ValeurMax As Long

    Pour la lire, depuis n'importe quel module, userform ou autre, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox ThisWorkbook.ValeurMax 'comme elle est située dans ThisWorkbook
    Je ne sais pas si c'est clair

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Je crois que ça l'est

    Mais je me demande pourquoi devoir la MsgBox en fait ^^

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

Discussions similaires

  1. Petit souci dans une macro - VBA
    Par chpierro62 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 12/01/2012, 16h43
  2. Réponses: 11
    Dernier message: 07/04/2010, 17h51
  3. Petit souci sur une boucle PHP
    Par ns_deux dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 30/03/2009, 20h31
  4. petite aide sur une macro pour transfere de valeur
    Par fpouzou dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/06/2007, 16h54

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