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 :

VBA : problème sur une macros basé sur un SI


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 55
    Par défaut VBA : problème sur une macros basé sur un SI
    Bonjour,

    Je suis étudiant et je cherche à développer une macros basé sur un SI pour mon épreuve d'oral en fin d'année.

    Mon classeur excel (Classeur test.xls) est basé sur une liste déroulante (des dates) qui me reporte des montants sur tous mes tableaux de coûts situés dans les feuilles suivantes (il s'agit d'une application de contrôle de gestion).

    Je souhaite donc faire une macro qui me sélectionne mon résultat analytique, ouvre un nouveau classeur (analyse.xls) existant et colle ce résultat analytique dans ce nouveau classeur ouvert. Je souhaite qu'il le colle à différents endroits selon la période. C'est pourquoi j'ai pensé à une fonction SI.

    Mon code VBA est donc celui-ci

    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
    Sub MacroTest() 
     
    Workbooks.Open Filename:= _ 
    "G:\Tableaux de couts\analyse.xls" 
     
    Windows("Classeur test.xls").Activate 
    If DateChoixTxt = mai_2008 Then 
     
    Windows("Classeur test.xls").Activate 
    Sheets("Résultat analytique").Select 
    Range("D7:D9").Select 
    Selection.Copy 
     
    Windows("analyse.xls").Activate 
    Sheets("Ecart").Select 
    Range("B4:B6").Select 
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ 
    False, Transpose:=False 
     
    Else 
     
    Windows("Classeur test.xls").Activate 
    Sheets("Résultat analytique").Select 
    Range("D7:D9").Select 
    Selection.Copy 
     
    Windows("analyse.xls").Activate 
    Sheets("Ecart").Select 
    Range("E4:E6").Select 
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ 
    False, Transpose:=False 
     
    End If 
     
    End Sub
    La cellule contenant la date est une cellule avec une fonction qui me renvoie la date au format mai 2008.

    Le code a l'air bon.
    Et pourtant, j'ai beau tester des tas de trucs, quand je lance la macro, elle colle toujours dans les cellules B4:B6, sans tenir compte de la condition.

    J'ai peut-être fait une erreur dans la syntaxe. A vrai dire, je ne suis qu'un débutant en VBA.
    Je sollicite donc votre aide, après des heures à avoir planché sur le sujet sans résultat.

    Merci d'avance pour votre aide,

    Cordialement,

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Bonjour,

    A vrai dire, si elle colle toujours dans les cellules B4:B6, ta macro tient compte de la condition. Elle rentre dans ta condition obligatoirement pour écrire dans ces cellules d'après ton code. Je dirais donc que le problème vient du fait que DateChoixTxt est toujours égal à mai_2008. Est-ce le cas ?

    D'un autre côté, tel que c'est écrit, mai_2008 est une variable. Il faudrait écrire "mai_2008" pour dire que ta variable DateChoixTxt est égale à une valeur donnée de la forme mai_2008.

    Essaie ça, si ça ne marche pas, poste ton code sur le fofo vu que, n'étant pas très calé, je suis un peu dans le flou sans avoir les choses en face de moi


  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut PeaceMaker et le forum
    Mon classeur excel (Classeur test.xls) est basé sur une liste déroulante (des dates) qui me reporte des montants sur tous mes tableaux de coûts situés dans les feuilles suivantes (il s'agit d'une application de contrôle de gestion).
    liste déroulante ? Je suppose que ta liste déroulante est un controle issu de la barre "boîte à outils contrôle" nommé "DateChoixTxt" ? Et que tu initialises autre part, dans une autre macro, une variable gobale nommée "mai_2008" ?

    - Commence déjà par l'obligation de déclarer tes variables
    (sous VBEditot => Menu Outils>>Options>>onglet Éditeur
    Coche : obligation de déclarer les variables)
    - déclare tes variables avec le type qu'elles sont supposées contenir : s'il y a une erreur de type (que ce ne soit pas le contenu que tu espérais) Excel déclenchera une erreur, alors qu'en Variant, tu n'auras pas l'information.
    La cellule contenant la date est une cellule avec une fonction qui me renvoie la date au format mai 2008.
    VBA ne teste que ce que tu lui demandes et si dans une cellule Excel affiche 31/03/09 ou 31-mar ou etc..., il teste la valeur 39903 (attention aux décimales qui ne sont pas affichées, mais qui existent peut-être, suivant les formules employées).
    Le code a l'air bon.
    C'est comme Canada Dry : il peut sembler, mais ne pas être
    Et pourtant, j'ai beau tester des tas de trucs, quand je lance la macro, elle colle toujours dans les cellules B4:B6, sans tenir compte de la condition.
    Et en mode pas-à-pas que sont tes valeurs au moment du test ?

    Pas assez d'infos pour t'aider concrêtemnt.
    A+

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 55
    Par défaut
    Tout d'abord, merci pour vos réponses rapides.

    Pas assez d'infos pour t'aider concrêtemnt.
    Je sais, j'imagine que ce n'est pas évident de m'aider avec aussi peu d'infos mais j'essaie d'être le plus précis possible pour vous faciliter la tâche. Je vais voir pour vous poster mon fichier excel avec des données test simples pour que vous puissiez voir en gros de quoi il en retourne.

    A vrai dire, si elle colle toujours dans les cellules B4:B6, ta macro tient compte de la condition. Elle rentre dans ta condition obligatoirement pour écrire dans ces cellules d'après ton code. Je dirais donc que le problème vient du fait que DateChoixTxt est toujours égal à mai_2008. Est-ce le cas ?
    Nan, justement ce n'est pas le cas. J'en suis donc arrivé à la conclusion que la "formulation" en VBA de ma condition n'était pas bonne.

    D'un autre côté, tel que c'est écrit, mai_2008 est une variable. Il faudrait écrire "mai_2008" pour dire que ta variable DateChoixTxt est égale à une valeur donnée de la forme mai_2008.
    Le problème, c'est qu'ici il s'agit d'une date, mais même quand je fais des tests avec juste des conditions toutes simples (du genre je nomme une cellule "Temps" et je tape Pluie dedans) et ça me colle toujours pas au bon endroit.

    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
    Sub MacroTest()
    
        Workbooks.Open Filename:= _
            "G:\Tableaux de couts\analyse.xls"
        
    Windows("Classeur test.xls").Activate
    If Temps = "Pluie" Then
    
        Windows("Classeur test.xls").Activate
        Sheets("Résultat analytique").Select
        Range("D7:D9").Select
        Selection.Copy
        
        Windows("analyse.xls").Activate
        Sheets("Ecart").Select
        Range("E4:E6").Select
        Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False
            
    Else
        
        Windows("Classeur test.xls").Activate
        Sheets("Résultat analytique").Select
        Range("D7:D9").Select
        Selection.Copy
        
        Windows("analyse.xls").Activate
        Sheets("Ecart").Select
        Range("B4:B6").Select
        Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False
    
    End If
    
    End Sub
    Vous pouvez à la limite voir qu'avec une condition aussi simple, j'élimine tout problème du à une variable ou quelque soit d'autre.

    Je lui demande simplement de me coller en E4:E6 si il y a écrit Pluie dans la cellule Temps, et sinon de me coller en B4:B6.

    Et ben, même quand il y a écrit correctement Pluie dans la cellule Temps, il colle en B4:B6.

    Donc une seule conclusion possible : la syntaxe ne lui convient pas.

    Je voudrais déja que tu m'aidiez à résoudre ce cas tout simple. Ca sera déja un premier pas vers ma réponse, parce que là je suis perdu. Tout ceci n'est pas logique et je veux absoluement faire la lumière là-dessus.

    Merci d'apporter votre aide à l'acharné que je suis.

    Cordialement

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 88
    Par défaut
    et quand tu débugge en pas à pas, qu'est-ce qu'il y a comme valeur pour "temps" ?

    si "temps" est le nom d'une cellule nommés dans EXCEL, alors la manière de faire référence à cette cellule serait plutot range("temps").

    si "temps" est le nom d'une cellule nommée dans VBA (par Set Temps = Cells(ligne, colonne)), alors tu peux utiliser la formulation que tu écris

    et dans les deux cas, ce serait plus rigoureux de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    range("temps").value = "pluie"
    ' ou
    temps.value = "pluie"

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut le petit nicolas et le forum
    Pas tout à fait d'accord
    si une cellule est nommée, il faut bien la désignée comme une plage pour qu'Excel comprenne :Range("Temps") ou [Temps]
    Mais il faut être feignant sur excel (pas trop quand même). Et si tu as bien déigné tes variables, objet, le .value est la propriété par défaut.
    Un essais, non testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub MacroTest()
    Workbooks.Open Filename:="G:\Tableaux de couts\analyse.xls"
    Workbooks("Classeur test.xls").Sheets("Résultat analytique").Range("D79").Copy
    If ucase(Workbooks("Classeur test.xls").[Temps]) = ucase("Pluie") Then
         Workbooks("analyse.xls").Sheets("Ecart").Range("E4").PasteSpecial _
                      Paste:=xlValues
    Else
         Workbooks("analyse.xls").Sheets("Ecart").Range("B4").PasteSpecial _
                      Paste:=xlValues
    End If
    End Sub
    - On ouvre le classeur "Analyse"(qui devient le classeur actif) (pas concerné par le test)

    classeur test
    - On copie la cellule D79 du classeur Test
    - On colle sa valeur en E4 ou B4 suivant l'égalité de la cellule nommée Temps de "test" avec le mot pluie (la mise en majuscules des deux valeurs à tester permet d'effacer les erreurs de casse)

    A+
    Nota : pour le code utilise les balises prévues à cet effet (#) plutôt que les Quote, ça évide les sourires

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 55
    Par défaut
    Citation Envoyé par le petit nicolas Voir le message
    si "temps" est le nom d'une cellule nommés dans EXCEL, alors la manière de faire référence à cette cellule serait plutot range("temps").

    ce serait plus rigoureux de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    range("temps").value = "pluie"
    ' ou
    temps.value = "pluie"
    La solution était exactement celle-ci.

    Il m'a suffi de mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Range("Temps") = "Pluie" Then
    ...
    pour que la condition marche bien correctement.

    @ Goarfel :
    Merci pour ton code VBA. Je le testerais, par respect pour le travail que tu as fourni. Et si tu le souhaites, je te présenterais mes conclusions. Merci de ton soutien.

    Je vous remercie d'avoir pris le temps de m'aider.

    Je passe un oral demain donc je n'ai pas eu le temps de m'en occuper aujourd'hui. mais, d'ici demain soir, j'aurais écrit la totalité du code de ma macro complète. Je vous posterais bien entendu mes conclusions, ou éventuels problèmes.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 88
    Par défaut
    Gorfael a raison aussi (ça c'est du consensus !). Les formulations Range("Temps") et [Temps] sont équivalentes

    De plus sa proposition de transformer tout en capitales, par Ucase, est particulièrement judicieuse.

Discussions similaires

  1. Problème de NULL sur un Pivot basé sur une Table Dynamique
    Par guilld dans le forum Développement
    Réponses: 3
    Dernier message: 01/08/2011, 15h05
  2. VBA - Macro : Action sur click droit souris sur une cellule
    Par Raphael DIAZ dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 02/02/2011, 10h45
  3. Réponses: 9
    Dernier message: 25/10/2007, 16h20
  4. [Vba-Excel] Exécuter une requete SQL sur une feuille de donnée
    Par Spacy_green dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/11/2006, 09h27
  5. Réponses: 3
    Dernier message: 05/01/2006, 15h14

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