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 :

Garder en mémoire un nombre variable de données [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Par défaut Garder en mémoire un nombre variable de données
    Bonjour le forum,

    Je suis embêté pour donner une définition de mon problème (et donc pour le rechercher... désolé si ce genre de sujet à déjà été ouvert).

    Dans une feuille (appelons la "Proposition"), l'utilisateur rentre un code article en colonne A. J'ai une autre feuille contenant des prix par quantités (avec en colonne A le code article, en colonne B sa description, en colonne C la quantité, et en D le prix pour cette quantité). L'article peut avoir un prix unitaire de 100 pour une quantité de 10, et de 75 pour une quantité de 20 par exemple - mais vous aviez compris ...

    Je souhaiterais en fait garder les différentes quantités et les prix qui s'y rapportent en mémoire pour les utiliser dans un formulaire.

    Je sais faire la recherche pour trouver les prix différents, mais je n'arrive pas à les garder en mémoire (sachant qu'ils sont en nombre variable)...

    Je ne sais pas si je suis clair en fait :/

  2. #2
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Bonjour
    Je pense avoir compris ton problème, mon idée
    Utilise un tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim variable() as single 'je met single mais tu choisie le type
    ensuite une fois que tu connais sa taille on va dire n
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    redim variable ( 1 to n)
    et après tu rempli ton tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i = 1 to n
       vraiable(i)= feuil2.cells(i,3) ' par exemple
    next i
    Un tableau peu avoir plusieurs dimension , 1 il ressemble a un veteur, 2 a une matrice 3 un cube , 4 ben un truc a 4 dimension on va dire un cube qui varie dans le temps, 5 la on va pas se l'imaginer,...

    Si la dimension change et que tu utilise redim tu perd toutes les valeur déjà présente
    tu peux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    redim preserve tableau(1 to n+5)
    qui conserve les valeurs mais seule la dernière dimension peu être modifié ainsi

    Un cours algo sur le concept de tableau en générale (et sur bien d'autre notion d'algorithmique essentielle a tout programme)

    ce n'est pas du VBA (ni aucune langage d'ailleur c'est du pseudo code) mais c'est complet et ca te permettra de saisir le fonctionnement d'un tableau (qui est commun a tous les langage) Ensuite le passer en VBA sera très simple je t'ai pratiquement donnée toutes les commande de base

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Pourquoi vouloir mettre les prix en mémoire , si j'ai bien compris ils sont dans des feuilles, tu peux faire appel à eux dans un formulaire.

    A moins qu'il y ait un truc que je n'ai pas compris.

    Philippe

  4. #4
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Par défaut
    Merci Krovax pour ta réponse. J'avoue que je pensais regarder vers les tableaux, mais que je ne les maîtrise pas encore. Je vais m'y pencher.

    Philippe, j'ai peut-être (certainement) un problème de méthodologie. En fait, j'aimerais faire apparaître autant de boutons radio qu'il y a de prix par quantité dans un formulaire, afin que l'utilisateur puisse choisir la quantité qui lui convient. Si tu as une autre méthode, n'hésite pas. Toutes les occasions sont bonnes pour me perfectionner.

  5. #5
    Expert confirmé
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Par défaut
    Salut Julien,

    pour ce genre de besoin j'utilise un treeview avec case à cocher.
    le meilleur moyen de stocker des données reste les cellules des feuilles de calcul.

  6. #6
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Par défaut
    Salut cafeine,

    Mon problème est que ce fichier va être utilisé par des personnes qui n'auront pas forcément le contrôle TreeView installé et je n'aurai pas accès à leurs postes (et je n'ose même pas envisager l'idée de leur faire un tutoriel)...

  7. #7
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Par défaut
    Aaah, j'ai progressé, et j'ai réalisé quelques trucs... je pensais devoir garder les données en mémoire, puis les ajouter dans un userform ensuite...

    Pour faire court, voilà où j'en suis. J'ai créé un userform avec un frame dedans, et j'ajoute des boutons radio au fur et à mesure que je trouve des prix par quantité.

    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
     
    Dim OpB As Control
    For i = 2 To WsPN.[A65536].End(xlUp).Row
        If WsPN.Cells(i, 1) = Ws1.[A1] Then
            Qte = Qte + 1
            Set OpB = UserForm1.Frame1.Add("Forms.OptionButton.1")
            With OpB
                .Left = 5
                .Width = 75
                .Height = 20
                .Caption = "Quantité: " & WsPN.Cells(i, 3) & " Prix : " & WsPN.Cells(i, 4) & "€"
                .Width = 200
                .Height = 30
            End With
        End If
    Next i
    UserForm1.Show
    Il me reste deux problèmes. A la fin, je me retrouve avec un seul bouton radio qui a le label du plus haut prix par quantité. Je suppose qu'en fait, tous mes boutons sont superposés parce que je ne sais pas comment les décaler... si c'est ça, est-ce que vous avez un truc pour décaler les boutons les uns par rapport aux autres? (la propriété .top n'est pas top justement).

    Et comment est-ce que je peux faire pour ajuster la taille de mon frame au nombre de boutons que j'ai ajoutés?

    Merci d'avance.

  8. #8
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Une piste de recherche

    Regarde les propriété top, left, height,....

    Tu redimensionne ton frame avec height qui vaux X fois le nombre de crontrole.
    Tu positionne le i ème bouton avec Top qui vau ini+i*X

  9. #9
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Par défaut
    Bonjour Krovax,

    Je voulais effectivement passer par .top, mais je ne trouvais pas la formule appropriée. Finalement, j'ai trouvé une solution. Mon code (sûrement améliorable) donne ça. Je ne mets pas la partie déclaration de variables...

    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
     
    Dim OpB As Control
    Hauteur = 20
    Qte = 0
    For i = 2 To WsPN.[A65536].End(xlUp).Row
        If WsPN.Cells(i, 1) = Ws1.[A1] Then
            Qte = Qte + 1
            Set OpB = UserForm1.Frame1.Add("Forms.OptionButton.1")
            With OpB
                .Left = 5
                .Top = Hauteur
                .Width = 75
                .Height = 20
                .Caption = "Quantité: " & WsPN.Cells(i, 3) & " Prix : " & WsPN.Cells(i, 4) & "€"
                .Width = 200
                .Height = 30
            End With
        Hauteur = 20 + (OpB.Top)
        End If
    Next i
    UserForm1.Frame1.Height = 20 + Hauteur
    HtUsf = UserForm1.Frame1.Top + UserForm1.Frame1.Height + 100
    UserForm1.Height = HtUsf
    UserForm1.Show

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 48
    Par défaut
    Salut, Je suis tombé par hasard sur ta question.
    Je ne sais pas si j'arrive après la bagarre, mais il me semble que tu te complique un peu la vie.
    Pourquoi tu ne fais pas un tableau avec en ordonnées les produits, en abscisses les quantités. L'intérressé clique au croisement des cellules, et tu envoi la proposition correspondante dans une autre.

  11. #11
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    je suis tout a fait d'accord et avec l'évènement selection change ca marche tout seul
    un exemple pour mettre des croix quand on clique sur une case de la d'un tableau de B2 à E10 (que tu peux sans problème) rendre dynamique
    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
     
    Dim cel as range
    if not intersect(target,Range("B2:E10") is nothing then
        For Each cel In Target
            If cel = "X" Then
                cel = ""
            ElseIf cel = "" Then
                cel = "X"
                cel.Font.Bold = True
                cel.HorizontalAlignment = xlCenter
                cel.VerticalAlignment = xlCenter
     
            End If
        Next cel
    range("A1").select
    End If
    Ensuite tu regarde ou sont les croix
    Mais après c'est un peu la solution de faicilté (pour cela que je l'aime bien)

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Une autre idée (?)
    Un tableau avec les produits en ligne
    En colonnes les prix par Qu

    Un userform avec une liste des produits
    La sélection d'un produit renvoie vers la saisie d'une quantité dans une Textbox.

    La procédure :
    - Recherche du produit d'après la sélection
    - Recherche sur la ligne du produit du prix unitaire selon la quantité

    Mais ce n'est qu'une idée

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 48
    Par défaut
    Un truc marrant ?

    Le client sélectionne sa case avec la souris ( ou flèches ), clique sur le bouton " PROPOSITION " et...

    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 proposition()
    ADRE = ActiveCell.Address
    ADRE = Right(ADRE, Len(ADRE) - 1)
    ( convertion en LC)
    POSA = 1
    Do While Mid(ADRE, POSA, 1) <> "$"
    POSA = POSA + 1
    Loop
    
    LIGN = Val(Right(ADRE, Len(ADRE) - POSA))
    If LIGN < 2 Then LIGN = ANCLIGN ((*) des trucs à modifier pour ne pas sortir du cadre que j'ai fais  pour un autre prog )
    If LIGN > 5 Then LIGN = ANCLIGN(*)
    
    COLO = Asc(Left(ADRE, POSA - 1)) - 64
    
    
    If POSA > 2 Then COLO = (COLO * 26) + Asc(Mid(ADRE, 2, 1)) - 64
    
    If LIGN = 2 And COLO > 116 Then COLO = ANCCOLO(*)
    If LIGN = 3 And COLO > 116 Then COLO = ANCCOLO(*)
    If LIGN = 4 And COLO > 119 Then COLO = ANCCOLO(*)
    If LIGN = 5 And COLO > 122 Then COLO = ANCCOLO(*)
    
    Cells(LIGN, COLO).Select
    
    Puis :
    Select case ( en fonction de la ligne et colonne selec )
    
    Case blabla
    
    Case turlututu
    
    Case etc..
    
    end Select

  14. #14
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Par défaut
    Bonjour vous tous,

    Bonnes idées! Je vais m'en inspirer. Ce sera compliqué voire impossible de faire un tableau unique pour tout le monde, par contre.
    Pour faire simple, j'ai trois feuilles. La feuille de "proposition", le tarif commun à tous avec presque 4 000 références, et une feuille qui contient une liste d'articles très réduite sur lesquels quelques clients ont des prix en particulier.
    Je ne pourrai donc pas faire un seul tableau commun à tous avec les produits en abscisses et les quantités en ordonnée (puisque ces quantités varient selon le client, selon l'article)... c'est aussi pour cela que je n'avais pas pris l'option userform. C'est un peu difficile à gérer pour le client.

    Mais je vais leur laisser l'option de cliquer directement sur les produits dans le tarif et dans la liste de prix par quantité...

  15. #15
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Mais tu peut faire un tableau ou tu copie uniquement les références qui t'intéresse en ligne et en colonne

    Sinon les liste box peuvent être une bonne idée


    Par contre CRACOS38 ca serait pratique que tu utilise les balise code
    (voir le premier message du forum pour leur utilisation)

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 48
    Par défaut
    Pour gagner de la place et rester confidentiel pour chaque client, donnes leur un code perso qu'ils entrent au moment de la consultation, et tu va chercher un fichier .txt particulier en acces aléatoire que tu préablement rempli voir mis à jour.

  17. #17
    Membre éclairé
    Inscrit en
    Octobre 2008
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 240
    Par défaut
    Mais tu peut faire un tableau ou tu copie uniquement les références qui t'intéresse en ligne et en colonne
    Je ne suis pas sûr de comprendre ce que tu veux dire Krovax... tu suggères que je fasse un tarif par client?

    Cracos, ton idée de gagner de la place m'intéresse, mais il faudrait que mes clients aient accès au réseau où je rangerais mes fichiers texte, non?

  18. #18
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Non je ne suggère rien sur les tarif ca serait de la gestion de réparation de tracteur je taurais fait la meme suggestion. Le dommaine d'application de ton programme ne m'interesse pas.
    Je voi le problème ainsi
    Tu as des références un très grand nombre et tu doit en mettre certaine dans un tableau.
    La seule chose qui me parle c'est d'insérer des ligne des colonne, une colonne apr référence,... après savoir de quoi parle ta référence c'est ton boulot.

    Ce qui est possible c'est de "personnaliser" les référence que tu affiches quelle référence leur nombre etc... c'est tout ce que je dit

    Une idée pour ton problème. Un fichier source qui est uniquement chez toi contient toutes les infos, il créé un fichier qui contient uniquement les infos nécessaire pour un client et l'enregistre quelque part voir l'envoie directment par mail. Le coup du fichier texte est très bien mais ca pose un petit problème car il doit avoir accé a ton résau

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 48
    Par défaut
    Pour la question réseau, ma réponse est oui et non.
    Comment les utilisateurs vont avoir acces a ce prog??

  20. #20
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Je reprends ma proposition : 10000 articles et 50 tarifs par quantité (et il m'étonnerait bien que tu aies 50 tarifs) ne sont rien pour Excel.
    Supposons l'organisation suivante :
    Une ligne par article
    Une colonne par tarif / Qu
    Une colonne spécial par tarif spécial par type de client privilégié
    En supposant 10 tarifs de base par Qu, 5 types privilèges clients, ça donne 25 colonnes.
    Si tu veux placer ce tarif dans un txt, privilégie un csv dont la structure est directement exploitable par Excel.
    A toutes fins utiles : Un csv (fichier texte avec séparateur ";" - en France) ouvert avec Excel est une feuille de calculs. Inversement, une feuille de calculs enregistrée en csv est un fichier texte avec ";" comme séparateur. On le renseigne dans Excel et on l'enregistre en csv.

    Si tu ajoutes un Usf avec les listebox qui vont bien et, comme le dit CRACOS38, un code client (qui peut être simplement son nom) qui désigne les colonnes des tarifs qui le concernent, le tout est transparent pour l'utilisateur et le changement de tarif peut l'être aussi sous simple forme de "mise à jour". L'application ne change pas.

    Mais tu fais bien comme tu veux
    Bon après-midi

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [PHP 5.3] Nombre variable de données liées
    Par Seidris dans le forum Langage
    Réponses: 2
    Dernier message: 20/12/2010, 22h58
  2. Garder en mémoire des données
    Par Roud9 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 03/11/2010, 18h35
  3. JSP et JavaScript | nombre variable de données à valider
    Par Thébé dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 14/07/2010, 12h44
  4. Garder en mémoire des variables
    Par Mandjames dans le forum ASP.NET
    Réponses: 3
    Dernier message: 11/05/2009, 15h40
  5. [CR?] Garder en mémoire une donnée pour l'enregistrement suivant
    Par leloup84 dans le forum SAP Crystal Reports
    Réponses: 12
    Dernier message: 25/02/2008, 09h53

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