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

IHM Discussion :

Calcul à partir d'une liste déroulante à choix multiples [AC-2007]


Sujet :

IHM

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien SIG
    Inscrit en
    Mars 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien SIG

    Informations forums :
    Inscription : Mars 2013
    Messages : 62
    Points : 44
    Points
    44
    Par défaut Calcul à partir d'une liste déroulante à choix multiples
    Bonjour à tous
    voici mon problème: j'ai une zone de liste déroulante à choix multiple alimentée par une requête. Cette liste affiche les codes de parcelles dans la première colonne (column(0)) et la surface dans la 2ième colonne (column(1)).

    Ainsi je coche les parcelles qui m'intéresse dans ma liste déroulante (lst_Parcelles) et je voudrais obtenir dans une zone de texte la somme des surfaces (txt_SumSurface)

    Comment faire? Voici une ébauche de script sur l'évènement "afterUpdate" de ma zone de liste déroulante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.txt_SumSurface = Sum(lst_Parcelles.column(1))
    évidemment ça ne marche pas; alors je pourrais éventuellement faire une boucle "for-next" sur le nombre d'élément de ma liste mais là je suis perdu.

    Je ne trouve rien sur les tutaux concernant les calculs spécifiques aux zones de listes déroulantes à choix multiple

    Aidez moi âmes charitables

  2. #2
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    Salut,

    Tu as la solution ici.

    @+.
    N'oubliez pas le Tag afin de faciliter la recherche, et en votant cela permet de mieux la cibler.

    Je ne réponds pas aux messages privés s'ils sont liés à une question technique

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien SIG
    Inscrit en
    Mars 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien SIG

    Informations forums :
    Inscription : Mars 2013
    Messages : 62
    Points : 44
    Points
    44
    Par défaut
    Merci pour ta réponse Zoom61, c'est effectivement ce que je pensais faire: une boucle "For-Next"; donc normalement j'ai maintenant la bonne syntaxe grâce à ton lien.

    Malheureusement ça ne marche pas; voici ce que j'ai fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim vSel As Variant, SommeSurface As Long
     
        For Each vSel In Me.lst_Irrig_Parcelles.ItemsSelected
            SommeSurface = SommeSurface + Me.lst_Irrig_Parcelles.Column(1, vSel)
        Next
        Me.txt_Irrig_Surface = SommeSurface
    j'obtiens "0" donc c'est comme si Access ne trouvais aucune surface

    Ducoup j'ai réalisé le test suivant pour voir si Access m'affiche les codes de parcelles présents dans la première colonne (index 0), mais rien, la MsgBox reste vide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim vSel As Variant, strSelection As String
     
        For Each vSel In Me.lst_Irrig_Parcelles.ItemsSelected
            strSelection = strSelection & Me.lst_Irrig_Parcelles.Column(0, vSel)
        Next
        MsgBox strSelection
    D'autant plus étrange que j'ai vérifié la feuille de propriété:
    --> la colonne liée est la 1
    --> nombre de colonne = 2
    --> largeur colonne: 2,5 cm ; 2,5cm

    c'est quoi ce bazarre!

  4. #4
    Membre du Club
    Homme Profil pro
    Technicien SIG
    Inscrit en
    Mars 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien SIG

    Informations forums :
    Inscription : Mars 2013
    Messages : 62
    Points : 44
    Points
    44
    Par défaut
    Bon j'ai utilisé le debogueur avec des point d'arrêt et je remarque que finalement la liste n'est pas balayé: on ne rentre pas dans la boucle "for-next"

    Il y a donc un problème avec la variable vSel!


    Par ailleurs j'ai fais des tests qui m'ammène a penser que la première colonne à l'index "1" et non "0", mais de toute façon le problème subsiste au niveau de l'entrer dans la boucle "for-next"

  5. #5
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    Et en mettant un msgbox dans la boucle, obtiens tu des valeurs ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim vSel As Variant, SommeSurface As Long
     
        For Each vSel In Me.lst_Irrig_Parcelles.ItemsSelected
            SommeSurface = SommeSurface + Me.lst_Irrig_Parcelles.Column(1, vSel)
            msgbox Me.lst_Irrig_Parcelles.Column(1, vSel)
        Next
        Me.txt_Irrig_Surface = SommeSurface
    @+.
    N'oubliez pas le Tag afin de faciliter la recherche, et en votant cela permet de mieux la cibler.

    Je ne réponds pas aux messages privés s'ils sont liés à une question technique

  6. #6
    Membre du Club
    Homme Profil pro
    Technicien SIG
    Inscrit en
    Mars 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien SIG

    Informations forums :
    Inscription : Mars 2013
    Messages : 62
    Points : 44
    Points
    44
    Par défaut
    Et bien ça ne change rien la msgbox ne s'affiche même pas: c'est bien ce que je dis; on ne rentre même pas dans la boucle for-next. Je ne comprends vraiment pas. N'y aurait t'il pas une option dans la feuille de propriété qui empêche cela?

  7. #7
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    Peux-tu envoyer une maquette de ta base avec des données ?

    Car le code est correct.

    @+.
    N'oubliez pas le Tag afin de faciliter la recherche, et en votant cela permet de mieux la cibler.

    Je ne réponds pas aux messages privés s'ils sont liés à une question technique

  8. #8
    Membre du Club
    Homme Profil pro
    Technicien SIG
    Inscrit en
    Mars 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien SIG

    Informations forums :
    Inscription : Mars 2013
    Messages : 62
    Points : 44
    Points
    44
    Par défaut
    Merci Zoom61 de m'aider
    Donc voici une maquette de ma base en pièce jointe. J'ai passé un peu de temps pour cause de confidentialité à nettoyer ma base des enregistrements formulaires et tables inutiles pour le problème soulevé dans ce topic. Faut imaginer qu'il y en réalité plus de 1000 champs, 122 formulaires, une centaine de requêtes etc...(c'est une vrai base à l'origine quoi!).
    La base est simplifié au maximum: je t'invite à regarder le formulaire "F04_Irrigation" dans lequel tu peux choisir entre 2 exploitation différentes et tenter de résoudre ce calcul de surface (sur l'événement AfterUpdate de la liste "lst_Irrig_Parcelles"

    Merci à toi, j'espère que c'est résolvable.
    Fichiers attachés Fichiers attachés

  9. #9
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    Voici une solution.

    @+.
    Fichiers attachés Fichiers attachés
    N'oubliez pas le Tag afin de faciliter la recherche, et en votant cela permet de mieux la cibler.

    Je ne réponds pas aux messages privés s'ils sont liés à une question technique

  10. #10
    Membre du Club
    Homme Profil pro
    Technicien SIG
    Inscrit en
    Mars 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien SIG

    Informations forums :
    Inscription : Mars 2013
    Messages : 62
    Points : 44
    Points
    44
    Par défaut
    Alors là.... un grand merci Zoom61

    Pour moi ce n'est pas si simple ton bout de script, mais après quelques recherche sur "Dlookup" et "Ubound" je saisie bien maintenant le fonctionnement. J'ai bien vu aussi le rajout du textbox "Id_Irrig" dans le formulaire continu; en fait j'en avais déja mis un au bout de la ligne à droite.
    Pour que tout le monde puisse profiter du génie de Zoom61, voici son script:

    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
    Dim vSel As Variant
    Dim monTab() As String
     
    Me.Refresh
     
    vSel = DLookup("[Irrig_Parcelles]", "Tb_Irrigation", "Irrig_ID = " & Irrig_ID & " and Irrig_Culture = '" & lst_Irrig_Culture & "'")
     
    monTab = Split(vSel, ";")
     
    ValSomme = 0
    For i = 0 To UBound(monTab)
        ValSomme = ValSomme + DLookup("[Par_Surface]", "Tb_Parcelles", "Par_Num = '" & Replace(monTab(i), " ", "") & "'")
     
    Next i
    txt_Irrig_Surface.Value = ValSomme
    1) on rafraichit la source de donnée pour pouvoir faire une recherche
    2) on récupère les parcelles selectionnée (Dlookup)
    3) on en fait un tableau (monTab)
    4) on balaye le tableau en faisant la somme des surfaces des parcelles selectionnées

    Je n'aurais jamais pu par moi même trouver la bonne syntaxe (surtout avec le "replace(monTab(i)....". Bref, c'est très bien ça marche, mais je suis incapable d'adapter cette méthode pour des calculs plus complexes, et malheureusement je vais en avoir un paquet.....
    Et comme vous n'allez pas m'assister pour chaque calculs que je dois faire sur ma base (ce serait abusé), je voudrais savoir afin d'avoir plus d'autonomie:
    1) Pourquoi la première méthode (Cf début du topic) ne fonctionne pas?
    2) Peut on réaliser cela en SQL via VBA: je pense à une requête de mise à jour sur le champs "Irrig_surface"; j'ai déja essayé mais je ne parviens pas à mettre les résultats sur les bons enregistrements, malgré tout je préfèrerai cette démarche, car elle me permettra par la suite de faire des calculs bien plus complexe (notamment à partir d'abaques....)

    Désolé de t'embêter encore Zoom61, j'espère ne pas trop abuser de ton temps.

  11. #11
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    Citation Envoyé par MatAllwhite Voir le message
    1) Pourquoi la première méthode (Cf début du topic) ne fonctionne pas?
    Car ce n'est pas une zone de choix multiple dans le sens Access...

    Citation Envoyé par MatAllwhite Voir le message
    2) Peut on réaliser cela en SQL via VBA: je pense à une requête de mise à jour sur le champs "Irrig_surface"; j'ai déja essayé mais je ne parviens pas à mettre les résultats sur les bons enregistrements, malgré tout je préfèrerai cette démarche, car elle me permettra par la suite de faire des calculs bien plus complexe (notamment à partir d'abaques....)
    Ce que j'ai réalisé peut être automatisé d'autre façon par une fonction que tu peux appeler à tout moment...

    @+.
    N'oubliez pas le Tag afin de faciliter la recherche, et en votant cela permet de mieux la cibler.

    Je ne réponds pas aux messages privés s'ils sont liés à une question technique

  12. #12
    Membre du Club
    Homme Profil pro
    Technicien SIG
    Inscrit en
    Mars 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien SIG

    Informations forums :
    Inscription : Mars 2013
    Messages : 62
    Points : 44
    Points
    44
    Par défaut
    Ce que j'ai réalisé peut être automatisé d'autre façon par une fonction que tu peux appeler à tout moment...
    Heu d'accord....donc par rapport à ma question ce n'est pas réalisable avec une requête SQL de mise à jour? C'est juste pour savoir si je creuse cette autre piste pour de calculs un peu plus complexe...
    Je pensais à quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DoCmd.RunSQL "UPDATE Tb_Irrigation SET Tb_Irrigation.Irrig_Surface =" _
    & "(SELECT Sum(Tb_Parcelles.Par_Surface) AS SommeDePar_Surface," _
    & "FROM Tb_Irrigation INNER JOIN Tb_Parcelles" _
    & "ON Tb_Irrigation.Irrig_Parcelles.Value = Tb_Parcelles.Par_Num;)" _
    & "WHERE (([Tb_Irrigation]![Irrig_ID]=(SELECT  Tb_Irrigation.Irrig_ID" _
    & "FROM Tb_Irrigation INNER JOIN Tb_Parcelles" _
    & "ON Tb_Irrigation.Irrig_Parcelles.Value = Tb_Parcelles.Par_Num;)));
    "
    Je ne demande pas qu'on me fasse la requête à ma place, juste savoir si c'est possible: si tu me confirme que c'est réalisable je continu à bosser ma syntaxe qui évidemment n'est pas encore juste ci-dessus mais me permettra de faire des calculs plus hard à l'avenir.

  13. #13
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    A ma connaissance, il n'y a pas d'équivalence à la fonction split en SQL.

    @+.
    N'oubliez pas le Tag afin de faciliter la recherche, et en votant cela permet de mieux la cibler.

    Je ne réponds pas aux messages privés s'ils sont liés à une question technique

  14. #14
    Membre du Club
    Homme Profil pro
    Technicien SIG
    Inscrit en
    Mars 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien SIG

    Informations forums :
    Inscription : Mars 2013
    Messages : 62
    Points : 44
    Points
    44
    Par défaut
    Ok merci à toi

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

Discussions similaires

  1. [WD-2010] Comment insérer une liste déroulante à choix multiple
    Par djibril dans le forum Word
    Réponses: 10
    Dernier message: 18/06/2019, 14h21
  2. Réponses: 20
    Dernier message: 19/11/2016, 22h32
  3. [AC-2010] Comment créer une liste déroulante à choix multiple
    Par e2r34 dans le forum IHM
    Réponses: 2
    Dernier message: 24/02/2013, 17h35
  4. Requête avec choix d'un champ à partir d'une liste déroulante
    Par Worms6969 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 17/03/2008, 14h53
  5. actualisation des cellules a partir d'une liste de choix multiples
    Par crachzero dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/03/2008, 20h42

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