Graphique et formule VBA

Résolu
Darkam1 Messages postés 181 Statut Membre -  
Darkam1 Messages postés 181 Statut Membre -
Bonjour à tous et à toutes

J'expose mon problème

Dans le fichier que vous pouvez consulter via : http://cjoint.com/12jv/BAjpdUl0eAb.htm

Plusieurs problèmes s'exposent.

Premièrement dans la première feuille qui se nomme : « Scoring », vous pouvez apercevoir deux colonnes
Une qui est le total de la note ATTRAIT et la deuxième qui est le total de la note ATOUT.
Le premier total « TOTAL ATTRAIT » et le résultat de plusieurs choix dans « Maitre d'ouvrage », « Architecte/Maitre d'oeuvre »etc... La somme de ces deux résultats affichera le résultat sur le graphique de la feuille « Matrice de Postionnement ». (X et Y).

À ce jour j'utilise une formule incluse dans la feuille « Scoring » :

Sub comptage()
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$D$16,$D$23,$D$31,$D$39,$D$47,$D$52" Then Range("D56") = Range("D56") + 0
If Target.Address = "$D$29,$D$30,$D$38,$D$46" Then Range("D56") = Range("56") + 1
If Target.Address = "$D$15,$D$22,$D$28,$D$37,$D$45,$D$51" Then Range("D56") = Range("D56") + 2
If Target.Address = "$D$14,$D$21,$D$36,$D$44" Then Range("D56") = Range("D56") + 3
If Target.Address = "$D$17,$D$24,$D$32,$D$40,$D$53" Then Range("D56") = Range("D56") - 1
If Target.Address = "$D$18,$D$25,$D$33,$D$41,$D$48,$D$54" Then Range("D56") = Range("D56") - 2
End Sub

Cette formule sert a comptabiliser le nombre de cliques sur les cases D16 (+0) ou D15 (+2) etc.
Ce résultat s'affiche dans le graphique.
Le problème c'est que ma formule ne fonctionne pas et n'affiche rien sur « D56 » (du coup je n'ai pas fait le « TOTAL ATOUT».
Une solution ? Mon code n'est pas du tout optimisé ?

Deuxième problème :

Dans mon graphique « Matrice de Positionnement » l'abscisse et l'ordonnée sont inversées.

La note ATTRAIT donne le résultat ATOUT (et vis vers ça)...

Une solution ?

Troisième problème :

Dans le graphique je voudrais mettre les graduations [0,1,2,3,4,5,6,7,8,9,10,11,12] ou se situe les flèches rouges...

Possible ou pas ?

Amicalement.

19 réponses

  1. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Re,
    ton classeur en retour
    Remarques :
    Tu n'a aucun contrôle sur le nombre de fois que l'ont a cliquer.
    Ce n'est pas fort ergonomique.
    C'est inutile de travailler avec un zoom, vaux mieux travailler en normal et quand c'est terminer éventuellement jouer sur le zoom.
    Pour le type d'application que tu fais, tu pourrais t'intéresser à cette démo
    Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
    NOTE : Je ne répond pas aux MP pour les questions techniques.
    1
  2. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    C'est employer pour enlever la croix rouge du formulaire et ainsi obliger l'utilisateur à quitter par le bouton.
    Pour que ça fonctionne en 64 faut changer dans les déclarations d'API..
    Long par Integer
    Exemple :
    Declare Function GetWindowLongA Lib "user32" _  
    (ByVal hwnd As Integer, ByVal nIndex As Integer) As Integer

    Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
    NOTE : Je ne répond pas aux MP pour les questions techniques.
    1
    1. Darkam1 Messages postés 181 Statut Membre 18
       
      Ok, je regarde ça. Merci bien. Et bonne journée
      0
  3. Darkam1 Messages postés 181 Statut Membre 18
     
    J'ai trouvé pour les deuxième et le troisième problème.

    Le deuxième il suffisait d'inverser les cellules dans la formule (en cliquant sur le losange rouge).

    Pour la troisième il suffisait de modifier "L'axe vertical coupe" (dans options d'axe)

    Et de saisir une valeur négatif a l'axe (-20) pour ma part. L'automatique n'est pas en mesure de répondre forcément a nos besoins...

    Une solution pour ma première question... ?
    0
  4. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Bonjour,
    Tu n'est pas dans la bonne sub.. faut mettre dans WorkSheet_Change
    Private Sub Worksheet_Change(ByVal Target As Range) 
    
    End Sub

    Edit : Mais c'est pas tout, ça ne marchera pas comme tu fais, je reviens avec une solution.
    A+
    Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
    NOTE : Je ne répond pas aux MP pour les questions techniques.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Darkam1 Messages postés 181 Statut Membre 18
     
    Ca ne fonctionne pas.

    J'ai changé la formule, mais Excel m'a fait un Mega bug (Il s'est mis sélectionné toutes les cases dues a la fonction "Target")..

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Address = "$D$16,$D$23,$D$31,$D$39,$D$47,$D$52" Then Range("D56") = Range("D56") + 0
    Range("D16,D23,D31,D39,D47,D52").Select
    If Target.Address = "$D$29,$D$30,$D$38,$D$46" Then Range("D56") = Range("D56") + 1
    Range("D29,D30,D38,D46").Select
    If Target.Address = "$D$15,$D$22,$D$28,$D$37,$D$45,$D$51" Then Range("D56") = Range("D56") + 2
    Range("D15,D22,D28,D37,D45,D51").Select
    If Target.Address = "$D$14,$D$21,$D$36,$D$44" Then Range("D56") = Range("D56") + 3
    Range("D14,D21,D36,D44").Select
    If Target.Address = "$D$17,$D$24,$D$32,$D$40,$D$53" Then Range("D56") = Range("D56") - 1
    Range("D17,D24,D32,D40,D53").Select
    If Target.Address = "$D$18,$D$25,$D$33,$D$41,$D$48,$D$54" Then Range("D56") = Range("D56") - 2
    Range("D18,D25,D33,D41,D48,D54").Select
    End Sub

    Une solution ? Possibilité de faire une boucle plutôt que du gavage de IF ?
    0
  7. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Comme ça ça va aller.. :-)
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Column <> 4 Then Exit Sub 'éviter toutes les autres cellules.
        If Not Intersect(Target, Union([D16], [D23], [D31], [D39], [D47], [D52])) Is Nothing Then
        '?????????????????  à quoi ça sert Range("D56") = Range("D56") + 0
        ElseIf Not Intersect(Target, Union([D29], [D30], [D38], [D46])) Is Nothing Then
           [D56] = [56] + 1
        ElseIf Not Intersect(Target, Union([D15], [D22], [D28], [D37], [D45], [D51])) Is Nothing Then
            [D56] = [D56] + 2
        ElseIf Not Intersect(Target, Union([D14], [D21], [D36], [D44])) Is Nothing Then
            [D56] = [D56] + 3
        ElseIf Not Intersect(Target, Union([D17], [D24], [D32], [D40], [D53])) Is Nothing Then
            [D56] = [D56] - 1
        ElseIf Not Intersect(Target, Union([D18], [D25], [D33], [D41], [D48], [D54])) Is Nothing Then
           [D56] = [D56] - 2
        End If
    End Sub

    A+
    0
  8. Darkam1 Messages postés 181 Statut Membre 18
     
    Un très grand merci "Lermite222". Excellent travail.

    A bientôt.
    0
  9. Darkam1 Messages postés 181 Statut Membre 18
     
    J'ai voulu faire comme toi mais cela ne fonctionne pas... (J'ai voulu faire le total ATOUT)..

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column <> 4 Then Exit Sub 'éviter toutes les autres cellules.
    If Not Intersect(Target, Union([D16], [D23], [D31], [D39], [D47], [D52])) Is Nothing Then
    ElseIf Not Intersect(Target, Union([D29], [D30], [D38], [D46])) Is Nothing Then
    [D56] = [D56] + 1
    ElseIf Not Intersect(Target, Union([D15], [D22], [D28], [D37], [D45], [D51])) Is Nothing Then
    [D56] = [D56] + 2
    ElseIf Not Intersect(Target, Union([D14], [D21], [D36], [D44])) Is Nothing Then
    [D56] = [D56] + 3
    ElseIf Not Intersect(Target, Union([D17], [D24], [D32], [D40], [D53])) Is Nothing Then
    [D56] = [D56] - 1
    ElseIf Not Intersect(Target, Union([D18], [D25], [D33], [D41], [D48], [D54])) Is Nothing Then
    [D56] = [D56] - 2
    If Not Intersect(Target, Union([I17], [I31], [I37], [I44], [I48])) Is Nothing Then
    ElseIf Not Intersect(Target, Union([I16], [I22], [I30], [I36], [I43])) Is Nothing Then
    [I56] = [I56] + 1
    ElseIf Not Intersect(Target, Union([I15], [I29], [I42])) Is Nothing Then
    [I56] = [I56] + 2
    ElseIf Not Intersect(Target, Union([I14], [I21], [I28], [I35], [I41])) Is Nothing Then
    [I56] = [I56] + 3
    ElseIf Not Intersect(Target, Union([I24], [I32], [I45])) Is Nothing Then
    [I56] = [I56] - 2
    ElseIf Not Intersect(Target, Union([I49])) Is Nothing Then
    [I56] = [I56] - 5
    End If
    End Sub
    0
  10. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Supprime ces lignes..
    If Target.Column <> 4 Then Exit Sub 'éviter toutes les autres cellules. 
    If Not Intersect(Target, Union([D16], [D23], [D31], [D39], [D47], [D52])) Is Nothing Then 

    Et change la suivante
    ElseIf Not Intersect(Target, Union([D29], [D30], [D38], [D46])) Is Nothing Then 

    par
    If Not Intersect(Target, Union([D29], [D30], [D38], [D46])) Is Nothing Then 

    Les 3 lignes du dessus servent à rien.
    0
  11. Darkam1 Messages postés 181 Statut Membre 18
     
    Malgrès la suppresion des lignes, cela ne fonctionne toujours pas. Pourtant j'ai suivi a la les lettres tes indications. De plus pour la note "ATOUT", j'ai enlevé la ligne qui stipulé de ne pas réagir face au +0. Il est vrai qu'elle ne servait pas a grand chose.

    Voici mon code :

    Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Union([D29], [D30], [D38], [D46])) Is Nothing Then
    [D56] = [D56] + 1
    ElseIf Not Intersect(Target, Union([D15], [D22], [D28], [D37], [D45], [D51])) Is Nothing Then
    [D56] = [D56] + 2
    ElseIf Not Intersect(Target, Union([D14], [D21], [D36], [D44])) Is Nothing Then
    [D56] = [D56] + 3
    ElseIf Not Intersect(Target, Union([D17], [D24], [D32], [D40], [D53])) Is Nothing Then
    [D56] = [D56] - 1
    ElseIf Not Intersect(Target, Union([D18], [D25], [D33], [D41], [D48], [D54])) Is Nothing Then
    [D56] = [D56] - 2

    If Not Intersect(Target, Union([I16], [I22], [I30], [I36], [I43])) Is Nothing Then
    [I56] = [I56] + 1
    ElseIf Not Intersect(Target, Union([I15], [I29], [I42])) Is Nothing Then
    [I56] = [I56] + 2
    ElseIf Not Intersect(Target, Union([I14], [I21], [I28], [I35], [I41])) Is Nothing Then
    [I56] = [I56] + 3
    ElseIf Not Intersect(Target, Union([I24], [I32], [I45])) Is Nothing Then
    [I56] = [I56] - 2
    ElseIf Not Intersect(Target, Union([I49])) Is Nothing Then
    [I56] = [I56] - 5

    End If
    End Sub

    Et voici le fichier qui comprend le code et l'erreur
    : https://www.cjoint.com/?BAkjS2MwBxg

    Merci
    0
  12. Darkam1 Messages postés 181 Statut Membre 18
     
    Merci à toi pour ce retour.

    J'ai eu un peu de mal à comprendre ton code. Mais finalement, je crois avoir compris.

    Merci d'avoir pris le temps de me comprendre et de me répondre.

    La démo que tu as faite n'est pas disponible pour les versions 64 bits ? Je tente de voir ce que fait la suppression de ce code :

    'pour enlever la croix rouge d'un UF
    Declare Function GetWindowLongA Lib "user32" _
    (ByVal hwnd As Long, ByVal nIndex As Long) As Long

    Declare Function SetWindowLongA Lib "user32" _
    (ByVal hwnd As Long, ByVal nIndex As Long, _
    ByVal dwNewLong As Long) As Long

    Declare Function FindWindowA Lib "user32" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

    Encore un grand merci.
    0
  13. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Probablement que le niveau de cette démo est trop difficile pour toi pour le moment, tu pourras y revenir plus tard mais dans l'immédiat, pour remédier au problème que j'ai soulever plus haut, (pas de contrôle sur les cellules cliquées) donc montant imprévisible regarde si ce ne serait pas mieux avec l'exemple que j'ai mis dans un nouveau classeur
    Attention, je n'ai rien fait dans le code et je n'ai fait que la colonne D, si ça t'intéresse je pourrais facilement l'adapter.
    Tu dis.
    0
  14. Darkam1 Messages postés 181 Statut Membre 18
     
    Oui effectivement je n'ai pas de grande connaissance en VBA. Je jetterai un oeil quand même.

    Je viens de voir ce que tu as fait. C'est très intéressant. Si le temps te le permet, se sera avec joie. Pourrait tu ré-inclures sur le coté les indices (+1 +2 +4 -2..etc)

    Tu vas t'y prendre comment ?

    Merci bien.
    0
    1. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      Voir mon dernier poste.
      Concernant l'affichage des..indices (+1 +2 +4 -2..etc) possible en ajoutant une colonne mais je pense que se serait contre-productif, l'utilisateur ne devrais pas savoir l'influence que sont choix va avoir sur le résultat final.
      Maintenant je ferme, à ce soir.
      0
    2. Darkam1 Messages postés 181 Statut Membre 18
       
      Réponse juste.

      Ok je verrais en fonction de mes besoins. Merci :)
      0
  15. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Je doit partir mais pour pas te faire attendre au cas ou...
    Nouveau classeur
    Je n'ai fait que les lignes 27 à 48 de la colonne D
    T'en fais pas pour les cellules avec des ## ou des chiffres je t'expliquerais après comment faire.
    Si tu veux essayer de continuer..
    Lier chaque Option avec la cellule de droite de la même ligne colonne D
    Ruban Développeur >> cocher Mode Création
    Clic droit sur un option >> Propriétés.
    Repèrer la propriété LinkedCell et mettre l'adresse de la cellule.
    Dans la colonne E copier les formules que j'ai mis dans l'exemple en adaptant les montant à afficher.
    0
  16. Darkam1 Messages postés 181 Statut Membre 18
     
    C'est juste excellent.

    Du coup j'ai fait toute la colonne de 14 a 55.

    Par contre je n'arrive pas a enlever les # ni a voir les vrais chiffres. Les chiffres apparaissent que si seulement on sélectionne la case.

    De plus j'aurai une autre question :

    Comme tu peux le voir sur la fiche; il est écrit en bas de page :

    "Commentaires :
    Une affaire 3 fois notée -2 doit être éliminée."

    Du coup je voulais savoir via une fonction IF ; si l'utilisateur sélectionne 3 notes a -2 (que se soit ATTRAIT ou ATOUT) une cellule (proche du commentaire) écrivent : "Affaire éliminé" (Si possible en VBA que cette cellule clignote en rouge et blanc).

    Amicalement

    Très bon travail. Je continue de remplir les deux TOTAUX et puis ensuite je t'envoie le fichier pour que tu m'expliques comment enlever les #et afficher les vrais chiffres.
    0
  17. Darkam1 Messages postés 181 Statut Membre 18
     
    Comme tu peux le voir, ça fonctionne. J'ai masqué les cellules qui comprenaient des # (ou réduire).

    Malgré mes recherches je n'arrive toujours pas à intégrer une fonction IF (voir ci-dessus) ainsi qu'un code qui fonctionne pour un clignotement. Apparemment le VBA ne gère pas le temps du coup il faut prendre en compte le temps de Windows..

    Je te laisse regarder...

    Ce n'est pas bien grave si tu ne trouves pas. Dans ce cas; il serait intéressant que si au minimum l'utilisateur prend 3 fois la note -2 alors afficher sur une cellule "ÉLIMINE".

    Merci à toi
    0
  18. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Ton classeur
    Le cumule du 3 et 4 est limité à 4 >> Fait
    Met un troisième -2 pour voir.
    Note : J'ai considéré que le -5 était inclus dans l'avertissement, si faut pas tu dis.
    A+
    0
  19. Darkam1 Messages postés 181 Statut Membre 18
     
    Il ne fallait pas considérer le -5 comme dans l'avertissement. J'ai pris le choix de le modifier moi même.

    Sinon rien à dire excellent travail. La boîte d'erreur est très bien pensée.

    A bientôt.
    0
  20. Darkam1 Messages postés 181 Statut Membre 18
     
    J'avais une autre question. Est-il possible qu'après avoir rempli les deux totaux "Atout Attrait", qu'une Msgbox apparaissent demandant si oui ou non l'utilisateur voudrait une sauvegarde de ça matrice de positionnement (Feuille 2). Ainsi, si l'utilisateur dit OUI, cela sauvegardera la matrice de positionnement à chaque fois qu'il le modifie. (Voir image)

    Cela permettra de voir l'évolution de son étude.

    Le plus intéressant serait qu'il y est une duplication du point avec la date en dessous :
    https://www.cjoint.com/?BAlj2sbqwfu

    J'ai pensé à une macro permettant une impression d'écran de la matrice de positionnement à chaque fois que l'utilisateur quitte la page Excel avec une copie de l'image dans une nouvelle feuille. Mais je ne trouve pas d'autre code qu'en 32 bits. De plus, je pense qu'il y'a d'autres solutions. Le graphique d'Excel peut prendre en compte les changements ?

    Merci pour tout.

    Option Explicit

    Private Declare Sub keybd_event Lib "user32" ( _
    ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, _
    ByVal dwExtraInfo As Long)

    Private Sub commandButton1_Click()
    keybd_event vbKeySnapshot, 1, 0&, 0&
    DoEvents

    Range("A1").Select
    ActiveSheet.Paste
    End Sub
    0