Comment mettre des variables dans une macro

Résolu
Bonjour Je veux récupérer des commentaires créés sur un planning de travail ou en abscisses sont les employés (une centaine) et en ordonnées les jours de l'année.
J'ai réussi à lister tous les numéros 9 du mois de janvier de M. TOTO par index etc...

Après de multiples recherches (je n'ai pas fait tout seul.. je débute) j'ai réussi à récupérer un commentaire sur une feuille par cette macro :
Private Sub Worksheet_Calculate()
If Range("L8 ") = 9 Then
Call Commentaire
End If
End Sub

Sub Commentaire()
Sheets("Activités_liste_noms").Range("M8").Value = Sheets("TAV").Range("D16").Comment.Text
End Sub
OU L8 est le code trouvé (ici 9); M8 là ou je place le commentaire; et D16 ou se trouve le commentaire.
Maintenant je voudrais que tous les commentaires trouvés par le code 9 soient publiés. Mais M8 donne M8+1; M8+2 etc.. pour les placements et D16 fait la même chose jour après jour. Je vous présente deux tableaux : le planning et ce que je veux obtenir (pour l'instant stade recherche) :

et


Donc je voudrais que la suite de la macro aille chercher les infos dans le planning : la prochaine valeur 9 et affiche cette valeur dans la ligne 9 janvier (par ex qui est la deuxième valeur trouvé..
ai je été assez claire.
Je vous remercie de votre aide par avance.
CDL
Robby

11 réponses

  1. Bonjour

    Plutôt qu'une image, peux tu envoyer un bout de ton fichier anonymisé, mais avec la même structure que l'original,sur cjoint.com et joindre le lien obtenu à ton prochain message. N'oublies pas d'y ajouter des explications et des exemples de résultat attendu
    1) Tu vas dans https://www.cjoint.com/
    2) Tu cliques sur [Parcourir] pour sélectionner ton fichier
    3) Tu descends en bas de la page pour cliquer sur [Créer le lien Cjoint]
    4) Au bout de quelques secondes la deuxième page s'affiche, avec le lien
    en bleu souligné ; tu le sélectionnes et tu fais "Copier"
    5) Tu reviens dans ta discussion sur CCM, et dans ton message de réponse tu fais "Coller".

    Cdlmnt
    0
    1. Bonjour CCM81
      Je te remercie tout d'abord de ta réponse rapide et de ta proposition. Mais je ne peux pas t'envoyer un bout de tableaux.Il y a dix feuilles dans le classeur et de nombreux TCD. Tout est lié, je change un paramètre tout change. Et il y a des données confidentielles. Ce que j'ai fait, je t'ai recopié deux écrans, le premier le planning et le deuxième la recherche de la solution. Cela fonctionne pour une journée, mais je voudrais que cela lise tous les jours ou la macro trouve le code 9.
      Planning:


      Recherche :

      Si tu prends TOTO sur le planning, il a plusieurs codes à 9 donc plusieurs commentaires qui ne sont pas adjacents. J'arrive à lire le premier et à l'inscrire dans une cellule, mais pas les autres. Je pense que c'est un problème de boucle, mais je ne sais pas faire. Après je choisirai un autre nom et afficherait les commentaires. Peux etre n'est ce pas possible.
      CDL
      Robby
      0
      1. Contributeur
        Bonjour,

        Pourquoi aurait-on plus de courage que toi pour construire un fichier de travail ?
        Qui en plus sera sûrement bancal par rapport à ton besoin...
        eric
        0
      2. comprends pas...
        Je suis novice en VBA et je ne connais pas les boucles. Juste une petite infos sur celleci et sur les variables me ferait progresser.
        CDL
        0
      3. Contributeur
        Pas de problème : Cours VBA
        0
    2. Comme dit eric, salut l'ami, au vu de tes explications, il est quasiment impossible de reconstituer le fichier
      Un essai quand même, en reprenant ta tentative, non testé bien sûr
      Private Sub Worksheet_Calculate()
      Dim li As Long, lideb As Long, lifin As Long, lili As Long
      lideb = 8
      lifin = 30
      lili = 8
      For li = lideb To lifin
      If Range("L" & li) = 9 Then
      Sheets("Activités_liste_noms").Range("M" & lili).Value = Sheets("TAV").Range("D16").Comment.Text
      lili = lili + 1
      End If
      Next li
      End Sub

      RQ. Je n'ai pas compris si "D16" devait évoluer

      Cdlmnt
      0
      1. Bonjour CCm81
        La macro fonctionne mais me recopie le meme commentaire, alors que je veux les commentaires pour toutes les dates qui sont validées par le code 9..
        Eh oui d16 évolue, puisque c'est la ligne qui va correspondre aux dates. D17 sera le 17 janvier, d18 le 18 janvier ect. Je vais voir et travailler du coté des cells(2,3) pour référencer mes cellules. Si tu vois dans un autre sens je suis preneur. Merci quand même pour ton travail.

        Pour répondre à Eric.
        Je suis retraité et ce travail est pour une association à but non lucratif. Donc tout ce dont je fais est gratuit, normal "but non lucratif".. Donc le commentaire d'eric est un peu déplacé.. Mais hélas les associations ont de plus en plus de mal à trouver des bénévoles. Je pense que l'on est passé dans une autre ère. DOMMAGE
        Robby
        0
    3. Re bonjour
      J'essaie avec cells voilà ce que cela donne :
      Private Sub Worksheet_Calculate()
      Dim counter As Long, lideb As Long, lifin As Long, lili As Long
      'lideb = 8
      'lifin = 30
      lili = 8
      For counter = 1 To 31
      If Worksheets("Activités_liste_noms").Cells(12, counter).Value = 9 Then
      Worksheets("Activités_liste_noms").Cells(13, lili).Value = Sheets("TAV").Cells(4, lili).Comment.Text

      'ancienne ligne Sheets("Activités_liste_noms").Range("M" & lili).Value = Sheets("TAV").Range("D16").Comment.Text
      lili = lili + 1
      End If
      Next counter
      End Sub
      Mais une erreur de compilation apparait à cet endroit. Il manque quelque chose avec cette formule :
      Worksheets("Activités_liste_noms").Cells(13, lili).Value = sheets("TAV").Cells(4, lili).Comment.Text
      ou cells(13, lili) est le cellule ou sera recopié le commentaire qui est avec le cellule ("TAV").cells(4,lili).comment.text.
      Quelqu'un pourrait-il me corriger la syntaxe.
      Je vous remercie par avance.
      CDL
      Robby
      0
      1. Contributeur
        Bonjour,

        une erreur de compilation
        De compilation, tu es sûr ? Quel est le message ??

        Déjà il faut t'assurer de la présence d'un commentaire, sinon erreur :
        If Not sheets("TAV").Cells(4, lili).Comment Is Nothing Then
        ' copier
        End if

        eric
        0
      2.  
        Bonjour Robby,

        ⚠  Tu as inversé : ce n'est pas Cells(colonne, ligne) ; c'est Cells(ligne, colonne) =>

        a) Pour If Range("L" & li) = 9 : remplace .Cells(12, counter) par .Cells(counter, 12)
        b) Pour .Range("M" & lili) : remplace .Cells(13, lili) par .Cells(lili, 13)
        c) Pour .Range("D16") : remplace .Cells(4, lili) par .Cells(lili, 4)

        Lis aussi le message d'eriiic à 15:42

        -------------------------------------------------------

        Je te propose donc ce code VBA :

        
        Option Explicit
        
        Private Sub Worksheet_Calculate()
          Dim counter As Long, lili As Long: lili = 8
          With Worksheets("Activités_liste_noms")
            For counter = 1 To 31
              If .Cells(counter, 12) = 9 Then
                If Not Worksheets("TAV").Cells(lili, 4).Comment Is Nothing Then
                  .Cells(lili, 13) = Worksheets("TAV").Cells(lili, 4).Comment.Text
                End If
                lili = lili + 1
              End If
            Next counter
          End With
        End Sub
        
        

        Si ton problème est réglé, n'oublie pas de passer le sujet en résolu.
         
        0
      3. @lucienBonjour Lucien
        Suis de retour, cela fonctionne presque comme je veux. J'ai juste un soucis de boucle. Mais je vais faire fonctionner mes "vieux" neurones. Là je pense pouvoir me débrouiller. Quand la solution est trouvé je passe un message. Merci à tous. Je n'y serai pas arrivé seul, me manque une partie du vocabulaire.
        CDL
        Robby
        0
      4. Ca y est j'ai trouvé.. cela fonctionne... Juste un renseignement supplémentaire. Comment fais je pour lancer la macro, je ne peux pas la lancer par un bouton... Il faut que j'aille dans le texte et F5 pour que cela prenne en considération les commentaires.
        CDL
        Robby
        0
    4. Une macro peut être lancée avec un raccourci-clavier
      Pour excel 2003 > Outils/Macro/macros/Sélectionner la macro/Option et définir le raccourci-clavier
      Pour les versions ultérieures voir ici

      RQ. Il te faut changer le "nom" de ta macro actuellement attachée au re-calcul dans la feuille (Worksheet_Calculate)

      Private Sub Kommentaires()
      .....
      End Sub

      Bonne soirée
      0
      1. Bonjour CCM81
        Un dernier coup de main (enfin je pense.... la suite nous le dira.
        Si je veux récupérer deux variables dans ma feuille commentaire comment dois je m'y prendre. (Ces deux variables vont me permettre de définir mes colonnes dans les boucles) Si je clique sur le bouton 1 cela m'envoie le contenu des variables de la colonne 3 dans ma macro, si je clique sur le bouton 2 le contenu des variables de la colonne 5.
        Est ce possible ?
        Ainsi voir la macro :
        Private Sub Kommentaire()

        Dim counter As Long, lili As Long, Col_commentaire As Long, Col_TAV
        lili = 7
        Col_commentaire = 3 'a recupérer dans feuille commentaires
        Col_TAV = 4 'a récupérer dans feuille commentaire


        With Worksheets("commentaires")
        For counter = 1 To 31

        If .Cells(counter, Col_commentaire) = 9 Then
        If Not Worksheets("TAV").Cells(lili, Col_TAV).Comment Is Nothing Then
        .Cells(counter, Col_commentaire + 1) = Worksheets("TAV").Cells(lili, Col_TAV).Comment.Text
        End If

        End If
        lili = lili + 1
        Next counter
        End With
        End Sub

        Ces deux variables sont ici :


        Merci par avance
        0
        1. Bonjour

          Toujours pas très clair, je tente quand même avec ce que j'ai compris !
          Tu peux te passer de bouton, et demander au moment de l'exécution quelle colonne tu veux traiter via un inputbox et pour être sûr d'obtenir une bonne colonne, redemander jusqu'à obtenir une réponse satisfaisante (ici 3 ou 5)
          Le bout de code à mettre en début de ta procédure Kommentaire
          à toi ensuite de voir ce que tu veux faire de la variable co
          Private Sub Kommentaire()
          Dim counter As Long, lili As Long, Col_commentaire As Long, Col_TAV
          Dim co As Long
          Do
          co = Val(InputBox("colonne à traiter 3 ou 5", , "3"))
          Loop Until co = 3 Or co = 5
          ...
          End Sub

          Cdlmnt
          0
          1. merci ccm81. J'essaie cela et te tiens au courant
            CDL
            Robby
            0
          2. Bon et bien cela est parfait.Merci Ccm81. J'ai réussi à integrer mes variables avec tes indications. Le seul point que je n'arrive pas est de lancer la macro par un bouton. Pourtant j'ai noté comme tu me l'as indiqué 'private sub Kommentaire", mais pour l'affectation je ne la trouve pas dans les macros.
            Merci encore de ton aide.
            J'avance un peu dans le vocabulaire et je note au fur et à mesure. Peut etre un jour je ferai cela sans aide..
            CDL
            Robby
            (les neurones sont au rouge)
            0
          3. Contributeur
            Bonjour,

            il faut enlever Private pour qu'elle soit visible depuis le classeur.
            Ca doit être un reste du Private Sub Worksheet_Calculate() du début.
            eric
            0
        2. Bonjour
          Je l'avais fait et la macro ne fonctionnait plus. Je viens de faire ce que tu m'as indiqué et cela fonctionne.. Comprends pas... Mais l'essentiel est que je suis arrivé accompagné de votre aide à ce que je voulais. Merci encore à tous.
          CDL
          Robby
          0
          1. Bonjour à tous.
            Je reviens vers vous pour fignoler ma feuille qui fonctionne super bien avec votre aide. d'ailleurs plusieurs personnes m'ont demandé comment j'avais fait et leur ai répondu "comment ca marche"... je m'égare...
            Bref dans la macro à un moment donné, est écrit ".Comment Is Nothing ", s'il ne trouve rien il va à l’occurrence suivante enfin c'est que j'ai compris. J'ai essayé plusieurs trucs mais choux blanc, je voudrais que lorsqu'il trouve une cellule vide (sans texte), soit noté "Pas de commentaire". Une idée ?
            Merci par avance
            CDL
            Robby
            0
            1.  
              Bonjour Robby,

              La ligne VBA complète était celle-ci :

                If Not Worksheets("TAV").Cells(lili, 4).Comment Is Nothing Then
              

              La cellule concernée est celle de la feuille "TAV", ligne lili, colonne D ;
              je l'appelle cellX juste pour simplifier.

              « If cellX.Comment Is Nothing Then » signifie : si la cellule cellX n'a pas
              de commentaire, alors (car Nothing = Rien) ; mais attention, avec Not,
              c'est l'inverse : Not ... Is Nothing = pas ... est rien => signification :
              si la cellule cellX a un commentaire, alors.

              Ce test est obligatoire car essayer de lire le commentaire d'une cellule
              qui n'en n'a pas provoque une erreur ; mais c'est quand même possible,
              heureusement, de tester la présence dudit commentaire sans que ça
              provoque une erreur.  ;)

              Je crois que ce code VBA correspond à ta demande :

              
              Option Explicit
              
              Sub Commentaires()
                Dim counter As Long, lili As Long: lili = 8
                With Worksheets("Activités_liste_noms")
                  For counter = 1 To 31
                    If .Cells(counter, 12) = 9 Then
                      If Worksheets("TAV").Cells(lili, 4).Comment Is Nothing Then
                        .Cells(lili, 13) = "Pas de commentaire en feuille TAV, D" & lili
                      Else
                        .Cells(lili, 13) = Worksheets("TAV").Cells(lili, 4).Comment.Text
                      End If
                      lili = lili + 1
                    End If
                  Next counter
                End With
              End Sub
              
              

              Merci de me dire si ça te convient.
               
              0
            2. Bonjour Lucien. Parfaitement parfait. Avec quelques modifications qui ne touchaient pas trop à la structure mais pour adapter à mon classeur, trop bien..... Mille mercis Lucien
              CDL
              Robby
              0