Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 14/03/2010, 12h03   #1
Invité de passage
 
Inscription : mars 2010
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 5
Points : 1
Points : 1
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
lolod est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2010, 12h40   #2
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 431
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 31
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 431
Points : 4 042
Points : 4 042
Envoyer un message via MSN à Qwazerty
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 :
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 :
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
Citation:
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
HammerFest
Score PowerBall Gyroscope Green : 11847
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2010, 15h55   #3
Invité de passage
 
Inscription : mars 2010
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 5
Points : 1
Points : 1
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 :
1
2
3
Prj1 : 45 , 57 , 67
Prj2 : 32, 56, 63, 87
Prj3 : 43
je peux tout aussi bien faire
Code :
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
Type de fichier : xls exemple_ProjetCode.xls (25,0 Ko, 3 affichages)
lolod est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2010, 17h44   #4
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 431
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 31
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 431
Points : 4 042
Points : 4 042
Envoyer un message via MSN à Qwazerty
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
HammerFest
Score PowerBall Gyroscope Green : 11847
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2010, 19h51   #5
Invité de passage
 
Inscription : mars 2010
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 5
Points : 1
Points : 1
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 :
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+
lolod est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2010, 19h59   #6
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 431
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 31
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 431
Points : 4 042
Points : 4 042
Envoyer un message via MSN à Qwazerty
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 :
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 :
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
HammerFest
Score PowerBall Gyroscope Green : 11847

Dernière modification par AlainTech ; 09/05/2010 à 19h02. Motif: Fusion de 2 messages
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2010, 23h43   #7
Invité de passage
 
Inscription : mars 2010
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 5
Points : 1
Points : 1
Merci pour toutes ces infos.

J'ai déjà un autre programme à faire, je vais pratiquer le dico ;-)
lolod est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 07h25.


 
 
 
 
Partenaires

Hébergement Web