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 :

[XL-2000] Faire en VBA un Select Case "dynamique"


Sujet :

Macros et VBA Excel

Vue hybride

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 12
    Par défaut [XL-2000] Faire en VBA un Select Case "dynamique"
    Bonjour

    J'aimerai faire un select case dont les valeurs de choix seraient dynamique en fonction du contenu d'une colonne d'un onglet.

    J'explique le détail :
    J'ai une liste de projet qui ont chacun un ou plusieurs codes
    Prj1 : 45 , 57 , 67
    Prj2 : 32, 56, 63, 87
    Prj3 : 43
    J'ai cette liste dans un onglet car elle évolue. Le nombre de code par projet n'est pas fixe.
    Et d'un autre coté (un autre onglet), une longue liste de frais par code .
    Et je veux créer un onglet par projet en y copiant toute les lignes qui contiennent un des codes du projet.

    J'ai pensé faire un select case sur le code pour copier dans l'onglet concerné. Mais comme la liste de code et de projet évolue, ca me fait changer le programme à chaque fois.

    Comment serait il possible de faire un équivalent select case dynamique en fonction de ce que j'ai entré dans la liste des codes par projets ?

    J'espère que j'ai réussi à expliquer clairement mon problème.

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut et bienvenu
    Le mieux dans ton cas je pense, serait de créer une collection de dictionnaires
    Le nombre de dico est déterminé en fonction du nombre de lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Prj1 : 45 , 57 , 67
    Prj2 : 32, 56, 63, 87
    Prj3 : 43
    ici donc une collection de 3 dicos
    Dico(0) -> Prj1
    Dico(1) -> Prj2
    Dico(2) -> Prj3

    Puis dans ton code utiliser la méthode Exists des dico pour asvoir si un code donnée s'y trouve

    Si tu veux savoir si le project 1 contient le code 57 tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Dico(0).Exist(57) then
    Je n'ai pas trop le temps de m'y pencher plus, peut etre en fin de journée.
    Essai de donner plus d'infos
    Et je veux créer un onglet par projet en y copiant toute les lignes qui contiennent un des codes du projet.
    ou se trouvent toutes ses donnée quelles lignes, quelles colonnes.

    Nous n'avons pas ton fichier sous les yeux, donc ce qui peu te paraitre évident a tes yeux, ne l'ai pas forcement au notre

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 12
    Par défaut
    Bonjour Qwaz
    Merci pour la réponse.
    Je ne suis pas habitué à écrire du VB objet ( -> ), mais je comprend que tu propose un tableau à 2 dimensions. (je ne sais pas affecter les codes aux dico sauf à faire un tableau à 2 dim)

    Ca me va bien, mais ce qu'il me faudrait dans ce cas ( pour éviter une boucle sur tous les indices de Dico existants) c'est un équivalent à
    "Dans quel dico est le code xx"

    Après réflexion je pense que plutot que d'organiser ma liste de projets/code comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Prj1 : 45 , 57 , 67
    Prj2 : 32, 56, 63, 87
    Prj3 : 43
    je peux tout aussi bien faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Projet	code
    AA	     12
    AA	     42
    BB	     17
    BB	     25
    BB	     36
    CC	     37
    CC	     13
    CC	     56
    DD	     32
    Ce qui facilitera le remplissage d'un tableau

    Par contre j'aimerai éviter de faire 2 boucles imbriquées:
    - une boucle sur chaque occurence d'association projet-code pour trouver le projet à partir du code
    - ceci dans une boucle sur chaque ligne de la liste des montant à affecter.

    J'ai joint un fichier avec
    -l'exemple d'organisation projet-code (onglets projetType1 et projetType 2)
    - les données sources
    - et les onglets résultat que je veux obtenir (un par projet)

    A+
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    Un petit truc, la notation Dico(0) -> Prj1 n'est pas du code vb, c'est juste pour imagé, je sais que certain langage utilise ce type de syntaxe mais pas VB
    La notion de dico est plus complète qu'un tableau a 2 dimensions, des méthodes lui sont rattachées, elle permettent entre autre de rapidement trouver si une entrée existe déjà. Je les avait déjà croisé auparavant mais je n'ai que ressemant découvert qu'ils permettaient un travail rapide et efficace.

    Les infos sont elles amenées a être modifiées par la suite?
    J'entend pas modifier, une fois la macro exécutée, est ce que des ligne seront rajoutées dans l'onglet DataSource ou dans l'onglet Projet_Type ?

    Si oui comment vois tu l'évolution des données contenues dans tes différents onglets?
    Les montants doivent ils changés de valeur lorsque tu fais une modif dans DataSource? (-> Mise en place de formules dans les cellules)
    Les montants et nouveaux onglets sont créés ou modifiés a chaque lancement de la macro?

    La 1er organisation des codes (onglet Projet_type1) me parait plus adapté a ce que tu souhaites faire.
    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 12
    Par défaut
    Bonsoir

    après plus de creuzage de tete, j'ai vu que le 1er type d'organisation ne pouvait pas aller car j'avais besoin d'autres info par code
    Donc je suis parti sur le type 2 ( une ligne par code) pour pouvoir mettre un texte explicatif par code.

    J'ai utilisé les type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Type CodeType
        Number As String
        Detail As String
    End Type
    Type ProjectType
        Name As String
        Code() As CodeType
        ProjetFic As String
    End Type
    Dim Projet() As ProjectType
    Et jai fait mes boucles imbriquées avec des Do / until

    Par contre je suis très intéressé pour savoir où trouver comment fonctionne le "Dico" et toutes les fonctions qui lui sont attachées.

    Merci pour l'aide, ca m'a permis de clarifier mon besoin et les possibilités.
    Et je doit finir ca pour demain.

    A+

  6. #6
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Pour demain...

    Pour le dico.
    il faut ajouter la reference "Microsoft Scripting Runtime" au projet
    Dans VBA menu Outils->References -> Dans la liste cocher "Microsoft Scripting Runtime"

    Pour la déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim dicoType as Object
    Set dicoType = CreateObject("Scripting.Dictionary")
    Pour l'utilisation voila un lien qui contient les méthodes du dico

    Bon courage
    ++
    Qwaz

    Ce code te crée un dico contenant la liste des projets a créer, et un dico par projet contenant chacun la liste des codes liés au projet.
    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
    Sub lolod()
    Dim DicoListPrj As Object, DicoPrj() As Object, aDico As Object
    Dim TheCel As Range
     
    Set DicoListPrj = CreateObject("Scripting.Dictionary")
     
    'On boucle sur les cellules de la colonne A (de A2 jusqu'a la derniere cellule non vide)
    'Le but et de savoir combien de projet sont a generé et d'en avoir une liste
    With Sheets("Projet_type2")
        For Each TheCel In .Range("A2", .Cells(Rows.Count, "A").End(xlUp))
            If Not DicoListPrj.Exists(TheCel.Value) Then
                DicoListPrj.Add TheCel.Value, DicoListPrj.Count
                ReDim Preserve DicoPrj(DicoListPrj.Count - 1)
                Set DicoPrj(DicoListPrj.Count - 1) = CreateObject("Scripting.Dictionary")
            End If
            DicoPrj(DicoListPrj.Item(TheCel.Value)).Add TheCel.Offset(0, 1).Value, TheCel.Value 'On ajoute le code en Key et le nom du projet en item
        Next
    End With
     
     
    'Reste du code
     
     
     
    End Sub
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

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

Discussions similaires

  1. VBA reconnaissance d'une feuille sélectionnée par Select Case
    Par DaVinci_067 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/01/2008, 05h22
  2. Select Case Access VBA
    Par solal57 dans le forum VBA Access
    Réponses: 6
    Dernier message: 12/11/2007, 18h09
  3. Réponses: 8
    Dernier message: 24/07/2007, 10h06
  4. [VBA-E] Problème Select case
    Par jamelie dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 12/04/2007, 13h21
  5. [VBA-E]Select case qui ne fonctionne pas :(
    Par DonKnacki dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 31/01/2006, 13h13

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