Recopie d'une donnée en fonction d'une macro double clic

Bonjour à tous,

C'est la 1ère fois que je publie qqch mais j'ai lu de nombreuses solutions.

Comme je suis bloqué, je me jette à l'eau.

Je vous expose mon souci:

  • J'ai un tableau avec des items dans la colonne B de la feuille 1 (cf Fichier Joint) et en colonne I, j'utilise une macro pour identifier certains items grâce au double clic. Voici la macro
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim arrList As Variant
If Not Intersect(Target, Range("SWOT")) Is Nothing Then
arrList = Array("-", "+", "")
Else
Exit Sub
End If
Dim iList As Integer
For iList = LBound(arrList) To UBound(arrList)
If Target.Value = arrList(iList) Then
If iList = UBound(arrList) Then
Target.Value = arrList(0)
If Target.Value = "OK" Then
Target.Font.Name = "Century Schoolbook"
End If

Else
Target.Value = arrList(iList + 1)
If Target.Value = "en attente" Or Target.Value = "Non" Or Target.Value = "" Then
Target.Font.Name = "Century Schoolbook"

End If
End If
Exit For
End If
Next
Cancel = True
End Sub

edit modo : code mis entre balise code (</>) merci d'y penser à l'avenir.

  • Cette macro permet aussi d'utiliser des caractères wingdings c'est pour cela qu'il existe une condition et une police spécifique. Là ce n'est pas le cas
  • J'ai besoin quand j'identifie un item soit + soit - que l'intitulé de l'item se recopie automatiquement en feuille 2 (B8 et suivant pour - et C8 et suivant)
  • Je voudrais aussi définir le nombre de + et de - max .

J'ai essayé plusieurs manières mais je n'y parviens pas et je ne maitrise pas assez le code VBA pour le créer.

Je fais donc appel au forum.

Si une personne peut me sortir de ce pétrin, je suis preneur.

Au plaisir de vous lire,

Merci pour votre temps ;)

13essai-fichier.xlsm (35.35 Ko)

bonjour,

Si j'ai bien compris ce que tu essaies de faire, voici une version adaptée...

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim arrList As Variant
    If Intersect(Target, Range("SWOT")) Is Nothing Then Exit Sub

    Dim WB As Worksheet, WA As Worksheet, lr&
    Set fa = ThisWorkbook.Worksheets("Feuil1")
    Set fb = ThisWorkbook.Worksheets("Feuil2")
    Select Case Target.Value
        Case "-"
            Target.Value = "+"
        Case "+"
            Target.Value = ""
            Target.Font.Name = "Century Schoolbook"
        Case ""
            Target.Value = "-"
    End Select
    lr = fb.Cells(fb.Rows.Count, 1).End(xlUp).Row + 1
    fb.Cells(lr, 1).Value = fa.Cells(Target.Row, 2).Value
End Sub

Bonjour et

"Français" n'est pas le renseignement demandé : Attendu une année 2016, 2021... ou 365 si tu as un abonnement suivi de 32 ou 64 bits le cas échant.

Ce renseignement se trouve dans le menu Fichier > Compte (en bas) + Clic sur le point d'interrogation :

ver2016 copie

puis page suivante :

ver2016b

Merci de mettre à jour ton profil

A+

Bonsoir H2so4,

Merci beaucoup pour votre retour et proposition. Cela répond en grande partie à mon souci.

On y est presque mais j'ai encore quelques besoins :

  • Il faudrait que je puisse faire passer de -, + et rien à chaque double clic. Je peux réutiliser le code que j'avais non?
  • Ensuite, j'avais bien essayer de copier avec des feuilles variables mais je m'y étais pris comme un manche. Maintenant j'ai besoin de recopier chaque item qui va être noté + et - dans un tableau de synthèse où il y aura que 3 lignes. Il faut donc que j'intègre un message d'erreur si l'utilisateur de la grille a identifié plus de 3 items + ou plus de 3 items -. Il me faudrait une alerte quand on identifie le 4ème. J'ai pensé à Msg Box mais je ne parviens pas à construire correctement le If
  • Pour recopier les items + ou -, j'avais pensé utiliser les filtres de la colonne I. J'ai déjà construit ce type de code que j'utilise souvent pour recopier.

Qu'en pensez-vous?

Comment procéderiez vous?

Je suis très preneur de conseils.

Enfin, j'ai bien regardé le code. Pouvez-vous m'expliquer le dim de la variable lr en écrivant lr&.

Merci beaucoup de votre aide précieuse.

PS: j'ai bien fait de m'inscrire.

Bonsoir Galopin01,

Merci pour le message.

J'ai complété bêtement ;).

Je viens de mettre à jour mon profil.

Bonne soirée

bonsoir,

Il faudrait que je puisse faire passer de -, + et rien à chaque double clic. Je peux réutiliser le code que j'avais non?

J'avais compris qu'il fallait copier l'info en feuille 2 dès lors qu'on double-cliquait sur une cellule en colonne I. Je me suis donc permis de simplifier le code, de le débarrasser de toutes les instructions inutiles (=qui ne seront jamais exécutées ou qui ne font pas de sens dans ce contexte) et d'y ajouter les instructions nécessaires à la copie des informations demandées. Je comprends maintenant qu'il faut 2 macros différentes. une pour mettre le +,- ou rien et une autre pour copier les infos des lignes contenant + ou -. Ai-je bien compris ?

Pouvez-vous m'expliquer le dim de la variable lr en écrivant lr&.

dim lr& est une version raccourcie de dim lr as long

Il me faudrait une alerte quand on identifie le 4ème. J'ai pensé à Msg Box mais je ne parviens pas à construire correctement le If

dans la macro que j'ai proposée, il suffit de tester la valeur de lr, si elle est plus grande que 10 (=les lignes 8,9 et 10 sont remplies) exécuter le msgbox.

Bonjour H2so4,

Tout d'abord, merci pour vos éclairages très utiles.

Me revoilà, j'ai tenté d'avancer avec vos remarques mais je suis encore bloqué.

Je vous remets le fichier en PJ car sur la feuille où il faudrait que cela recopie, je vous ai mis le tableau afin que cela soit plus clair.

En fait à chaque fois qu'1 item est identifié en -, il faut que cela se recopie en F5 puis F6 puis F7 et après cela bloque,

Et si c'est un + il faut que cela se copie en C5 puis C6 puis C7.

Comme c'est à chaque double clic que je passe de +, +, "", il me faut à chaque fois effacer ce qui a été copié avant.

J'ai aussi mis un Msgbox afin qu'à partir du 3ème + ou 3ème - cela ne met rien et que le message d'erreur se mette.

Voici donc le code :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim arrList As Variant
Dim fa As Worksheet, fb As Worksheet, lr&

Set fa = ThisWorkbook.Worksheets("Feuil1")
Set fb = ThisWorkbook.Worksheets("Feuil2")

If Not Intersect(Target, Range("SWOT")) Is Nothing Then
arrList = Array("-", "+", "")
Else
Exit Sub
End If
Dim iList As Integer
For iList = LBound(arrList) To UBound(arrList)
If Target.Value = arrList(iList) Then
If iList = UBound(arrList) Then
Target.Value = arrList(0)

' vérifier si le nombre de - n'est pas supérieure à 3

If WorksheetFunction.CountIf(Range("I2:I16"), "-") <= 3 Then

' recopie des items marqués par -

lr = fb.Range("F5:F7").End(xlUp).Row + 1

fb.Cells(lr, 6).Value = fa.Cells(Target.Row, 2).Value

Else
Target.Value = ""
MsgBox "Le nombre d'items identifiés en - est trop important, veuillez en enlever"

End If

Else

Target.Value = arrList(iList + 1)

' effacer les infos collées précédemment
fb.Cells(lr, 6).ClearContents

' vérifier si le nombre de + n'est pas supérieure à 3

If WorksheetFunction.CountIf(Range("I2:I16"), "+") <= 3 Then

' recopie des items marqués par +

lr = fb.Range("C5:c7").End(xlUp).Row + 1

fb.Cells(lr, 3).Value = fa.Cells(Target.Row, 2).Value

Else
Target.Value = ""
MsgBox "Le nombre d'items identifiés en + est trop important, veuillez en enlever"

End If

End If

Exit For
End If
Next
Cancel = True

End Sub

J'ai un bug sur l'effacement des données copiées précédemment et aussi sur la recopie à partir du 3ème.

Pouvez-vous me dire ce qui ne fonctionne pas et me conseiller pour arriver à mes fins?

Je vous en remercie par avance.

Heinbert.

7essai-fichier.xlsm (37.94 Ko)

bonjour,

merci à l'avenir (comme déjà demandé voir message initial) de mettre tes parties de code sur le forum en utilisant le bouton </>.

concernant tes demandes :

En fait, dans ma compréhension de ce que tu veux faire, ta procédure contient 2 étapes distinctes

Une première qui est l'écriture d'un +, - ou effacement dans la colonne I. (double-clic)

Une seconde qui est l'écriture dans une autre feuille des lignes qui ont un + en colonne I. (Procédure qui ne devrait être activée quand la colonne I est complétée avec les infos voulues. Cette procédure ne devrait pas être exécutée à chaque double-clic.

Ma compréhension est-elle correcte ?

Bonjour,

Désolé pour la consigne par rapport au code, je ne l'avais pas vu.

si je comprends bien, Il suffit de commencer par < puis le code et finir par >; C'est bien cela?

Ensuite par rapport à vos interrogations, voici mes précisions et réponses:

- effectivement, cela peut se décomposer en 2 phases mais elles doivent se produire automatiquement. C'est pour cela que je pensais les inclure à chaque double clic. En effet, les utilisateurs ne vont pas forcément identifier 3 items + et 3 items -. Dans ce cas, comment savoir si la colonne I est complétée? Avez-vous une idée?

- En fait, j'ai besoin que les items + et les items - se dupliquent sur la feuille 2 dans le tableau en exemple dans mon fichier car il y a plusieurs onglets qui vont correspondre à un domaine précis et chaque onglet aura son code afin de bien copier les éléments dans la feuille bilan (ex tableau en feuille 2 du fichier).

- Il faut juste que l'utilisateur identifie 3 + max et/ou 3 - max.

- On peut aussi imaginer si c'est plus simple une liste déroulante pour choisir - ou + et que la macro s'exécute automatiquement. SI cette solution est la meilleure, il faut juste penser que si on efface la cellule avec le + ou le -, il faut effacer l'item recopié dans le tableau de la feuille 2.

J'espère que mes explications sont claires même si cela n'est pas forcément facile à expliquer par écrit.

Je vous remercie de votre aide très précieuse.

Bonjour, bonsoir,

si je comprends bien, Il suffit de commencer par < puis le code et finir par >; C'est bien cela?

non, il faut utiliser le bouton </> qui se trouve dans la barre de menu de la fenêtre d'édition/rédaction du message (cliquer sur le bouton puis copier le code)

pour le reste, voici une adaptation du code

Bonjour H2So4

Tout d'abord, un grand merci pour votre retour et votre proposition.

Maintenant, j'aimerais comprendre la démarche du code afin de progresser:

- Pourquoi utiliser "Select Case" ? Quelles sont les fonctions?

- Y a t il une possibilité afin d'éviter de garder l'intérieur de la cellule active pour valider l'entrée ou pour aller du plus ou au moins et rien?

- Vous pouvez m'expliquer la construction du code pour recopier :

' on recopie les lignes marquées d'un + ou d'un -
    dl = fa.Cells(Rows.Count, "I").End(xlUp).Row 'dl = dernière ligne de la colonne "I" de fa contenant une valeur
    fb.Range("C5:H7").ClearContents 'efface la plage C5:H7 de fb
    ctrp = 4 'n° de ligne +, numéro auquel on ajoutera 1 si un + est trouvé en colonne "I" (ctrp pour +,Plus)
    ctrm = 4 'n° de ligne -, numéro auquel on ajoutera 1 si un - est trouvé en colonne "I" (ctrm pour -,Moins)
    For i = 3 To dl 'on parcourt les lignes 3 à DL
        Select Case fa.Cells(i, "I") on prend la valeur de la cellule en ligne i, colonne "I" de fa
            Case "+" 'si +
                ctrp = ctrp + 1 ' on incrémente le numéro de ligne où mettre un critère positif
                fb.Cells(ctrp, 3).Value = fa.Cells(i, 2).Value 'on met le critère en colonne "C" (=3) sur fb
            Case "-" 'si -
                ctrm = ctrm + 1 'on incrémente le numéro de ligne où mettre un critère négatif (point d'amélioration)
                fb.Cells(ctrm, 6).Value = fa.Cells(i, 2).Value 'on met le critère en colonne "F" (=6) sur fb
        End Select
    Next i

Notamment que représente dl? Ctrp et ctrm sont la ligne avant le tableau sur feuille 2?

Je vous remercie pour votre aide très précieuse.

Bonne journée.

Au plaisir de vous lire et d'échanger.

bonjour,

Pourquoi utiliser "Select Case" ? Quelles sont les fonctions?

As-tu fait quelques recherches avant de poser cette question ? Si oui, que n'as-tu pas compris ?

Y a t il une possibilité afin d'éviter de garder l'intérieur de la cellule active pour valider l'entrée ou pour aller du plus ou au moins et rien?

Je n'ai pas compris la question.

Vous pouvez m'expliquer la construction du code pour recopier :

J'ai ajouté des commentaires dans la partie de code dans ton message précédent. Je pense que les réponses à tes questions s'y trouvent.

Bonjour,

as-tu eu réponses à tes questions ?

Bonjour,

Désolé pour ma réponse tardive, j'étais en déplacement professionnel.

En fait, il me manque encore quelques éléments de compréhension :

- Dans ma question "Pourquoi utiliser "Select Case" "? J'ai omis de mettre par rapport à "Target. Value". En effet, je voulais comprendre pourquoi ton choix et notamment par rapport au fait qu'avec le code proposé, la cellule dans laquelle se passe la macro reste "ouverte" avec le curseur. Il est donc nécessaire de faire "entrer". Je n'ai pas cela avec "Target. Value". Après je me doute que si tu passes par ce biais là, tu as une raison précise ;).
-Pour la construction du code, j'ai repris étape par étape et j'ai mieux compris.

En tout état de cause, je te remercie pour ton aide et tes propositions qui m'ont bien aidé.

Bonne fin de journée.

Désolé car je pense que je ne m'exprime pas bien.

Quand je parle de la solution target value c'est par rapport à la solution que j'avais pour écrire + , - ou rien

bonsoir,

Dans ma question "Pourquoi utiliser "Select Case" "? J'ai omis de mettre par rapport à "Target. Value". En effet, je voulais comprendre pourquoi ton choix et notamment par rapport au fait qu'avec le code proposé, la cellule dans laquelle se passe la macro reste "ouverte" avec le curseur. Il est donc nécessaire de faire "entrer".

Select case est une instruction qui permet de remplacer une succession de if then elseif then else ... que l'on aurait très bien pu utiliser également.

Pour ce qui est de "la cellule qui reste ouverte", je ne suis pas sûr de comprendre le problème. La macro réagit sur un double-clic dans une cellule de la colonne I, chaque fois que l'on fait un double-clic sur une cellule, la valeur qui s'y trouve (target.value) est remplacée par une autre suivant le cycle qui est codé dans ta macro initiale - devient +, + devient "" et "" devient -. Je ne vois pas la nécessité de faire entrée. De plus, c'est un comportement identique à celui de ta macro que tu as mise dans ton message initial.

Bonjour,

Merci pour tes explications, je comprends mieux l'intérêt de Select case.

Cependant, quand j'exécute la macro avec select case, il est nécessaire d'appuyer sur entrée à chaque fois sinon, j'ai bien le signe demandé mais j'ai aussi le curseur dans la cellule (comme quand tu doubles clique dans une cellule).

Avec l'autre solution, je n'avais pas besoin de le faire.

Peux-tu m'expliquer la raison?

Merci

bonjour,

Avec l'autre solution, je n'avais pas besoin de le faire.

Peux-tu m'expliquer la raison?

Malheureusement non, car je ne vois pas de quoi tu parles.

Voici ce qui se passe quand je fais un double-clic sur une cellule, je ne vois pas de curseur.

https://youtu.be/swWp1fuLn5w

Rechercher des sujets similaires à "recopie donnee fonction macro double clic"