Créer plusieurs macros dans une même feuille

Bonjour à tous,

Voilà mon petit soucis. Comment puis je faire pour intégrer sur une même feuille plusieurs macro.

Je m'explique

Dans la feuille Récapitulatifs j'ai une macro qui quand je clique deux fois sur "limite Etalonnage " elle me renvoie à la feuille Limite Etalonnage et me détaille les appareils en limite

J'ai essayé de faire cela dans les autres cases pour avoir le même résultat mais je patauge grave.

Pourriez-vous m'aiguiller ou alors faut-il faire autrement qu'avec des macros?

Un tout grand merci pour votre aide à tous et très bonne journée.

Bonjour

en retour avec une feuille de plus

A toi de continuer

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

'Lancement de la procédure au double clic En Ordre Etalonnage.
If Not Application.Intersect(Target, Range("C3")) Is Nothing Then
    Call limiteEtalonnage
    Cancel = True
End If
If Not Application.Intersect(Target, Range("B3")) Is Nothing Then
    Sheets("En Ordre Etalonnage").Activate
    Cancel = True
End If
End Sub

pourquoi ne pas faire un lien hyper texte dans la cellule

au clic sur la cellule le lien est exécuté

CTRL + clic : le lien est ignoré

35lien.docx (52.87 Ko)

Bonjour Gullot,

Le petit soucis du double clic est qu'après j'aimerais passer sur un tableau VBA et là je risque d'être ennuyé c'est pour cela que je préfère bosser avec des macros mais ton idée est bonne aussi

Merci beaucoup

Hello M12

Merci beaucoup pour ton aide cela fonctionne pour toutes les cellules mais (ben voui y'a toujours un tit mais) je n'arrive pas à aller sur la feuille En Ordre Etalonnage. Quand je clique dessus il me renvoi sur la feuille Limite Etalonnage tandis que les autres fonctionne

J'ai aussi mis une macro pour afficher les appareils dans Retard Etalonnage mais la feuille reste vide et pourtant, je pense, avoir correctement intégré la macro.

Auriez-vous une idée? ou simplement quel est mon erreur?

Merci d'avance pour votre aide à tous

David

Bonjour,

essayez d'être attentif...

"Limite Etalonnage" n'est pas égal à "En Ordre Etalonnage"...

Après de mon coté j'avais compris qu'il fallait que la macro soit lancée en fonction du clic pour mettre à jour le tableau correspondant de la feuille lancée, non ?

Pour moi ce n'est pas juste une histoire de lien, sinon comme le dit gullaud, il suffit de mettre des lien hypertextes !

Attention ! Vous écrivez une procédure "Private" d'une feuille dans un module...

Et comme dit ci-dessus, il n'y a plus le "Call" pour lancer la procédure adéquate du fait du double clic.

vbMBHB

Bonjour vbMBHB,

J'ai bien été attentif et la macro double clic renvoi bien à la feuille demandée. Le soucis est que juste pour le double clic sur En ordre Etalonnage m'envoi sur la feuille Limite Etalonnage et je n'arrive pas à comprendre pourquoi au vu que les autres fonctionnent.

En mettant les lien hypertexte, comme je l'avais déjà dis, je ne suis pas sur que cela fonctionnera quand je passerai en VBA pour faire un tableau actif.

Et enfin je ne comprends pas ce que tu dis quand tu parles de procédure private d'une feuille dans un module . Que cela veut il dire?

En effet je viens de remarquer qu'il n'y avait plus de call. Puis je le mettre en place du Sheets?

David

Sous VBA, lorsque vous faites un double clic sur le nom de la feuille Récapitulatifs, sur la fenêtre de droite s'ouvre alors le code "private" de cette feuille, c'est ici que se "déroule" le code du double clic car cet événement fait parti de la feuille et non pas d'un Module.

Si vous faites ceci vous verrez qu'il y a deux fois écrit "Limite Etalonnage" et 0 fois "En ordre Etalonnage".

L'erreur vient du faite que vous vous devez regardez le code qui se trouve dan sle module "doubleclic" (de mémoire), hors celui-ci n'est jamais "joué" par un double clic sur la feuille...

Ensuite pour le Call il faut le mettre avant le "sheets("").Activate, de cette façon la feuille sera mise à jour avant d'être activée.

vbMBHB

Génial cela fonctionne parfaitement pour le double clic. En effet je n'avais pas remarqué dans la feuille en elle même

Maintenant j'ai bien mis call devant la feuille je vais devoir donc intégrer les autres macro afin de voir si cela fonctionne

Un tout grand merci déjà pour ton aide

David

Hello,

Voilà cela fonctionne nickel pour le reste. je m'attaque maintenant à la formule dans ma macro pour dire que quand je n'ai pas une cellule vide il l'a prenne en compte à la place des dates.

merci à tous

De mon coté je cherchais à faire "moins long" : en effet le nom des feuilles se trouve dans la cellule après "Nombre d'Appareil" donc avec la fonction MID(Target.value,19) on récupère le nom de la feuille à activer et on fait un :

Sheets(MID(Target.value,19)).Activate

avce un test :

If Not Application.Intersect(Target, Range("B2:G2")) Is Nothing Then

où on test d'un coup l'ensemble des cellules titres cliquables.

ce qui donne en "Private" :

Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    'Lancement de la procédure au double clic En Ordre Etalonnage.
    If Not Application.Intersect(Target, Range("B2:G2")) Is Nothing Then
        Cancel = True
        Call Listing(Mid(Target.Value, 19))
    End If
End Sub

et en module :

Option Explicit

Sub Listing(Optional Nom_Feuille As String)
    Dim i&, ii&, k&
    Dim shListe As Worksheet, shListing As Worksheet
    'Tu peux modifier les délais souhaités ici:
    Const jMax = 30
    Const jMin = 0

    'Enregistrement des feuilles.
    With ThisWorkbook
        Set shListe = .Sheets("Liste Générale")
        Set shListing = .Sheets(Nom_Feuille)
    End With

    'Remise à zéro de la feuille Limite Etalonnage.
    shListing.[a1].CurrentRegion.Offset(1).Clear

    'Détermination de la dernière ligne de la feuille Liste Générale.
    With shListe
        k = 1
        ii = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
            'Boucle de la liste à la recherche des trois conditions.
            For i = 2 To ii
                'Vérifie les conditions demandées.
                If .Cells(i, "I").Value > jMin And .Cells(i, "I").Value < jMax And .Cells(i, "L").Value = 0 Then
                    'Si les trois conditions sont remplies:
                    'Incrémentation de k
                    k = k + 1
                    'Copie de la ligne complète.
                    .Rows(i).Copy shListing.Cells(k, 1)
                End If
            Next i
    End With

    'Suppression du fond de la feuille Limite Etalonnage.
    shListing.[a1].CurrentRegion.Offset(1).FormatConditions.Delete

    'Ouvre la feuille Limite Etalonnage
    shListing.Activate

End Sub

Reste à voir comment rendre "variable" le code d'extraction en fonction du titre cliqué.

Attention ! pour que cela fonctionne il faut que les titre du tableau soit de la forme suivante :

Nombre d'Appareil(retour à la ligne sans espace avec les touches [Alt]+[entrée])

Envoyé Etalonnage

L'ensemble sans espace inutile !

vbMBHB

En effet,

Beaucoup plus court mais un peu plus compliqué pour moi

Par contre je te remercie de ton aide sur ce point. J'essaie maintenant de voir comment ma macro peut fonctionner dans la fonction envoyé en étalonnage, perdu et en prêt.

Je n'arrive pas à lui dire que si des cases dans la colonne L sont remplies elle doit justement en tenir compte.

bref j'enlève dans les délais les const jmax et jmin mais j'aimerais lui mettre une formule qui lui dis de tenir compte si la case n'est pas vide.

Ecoutez ce n'est pas très compliqué : MID permet d'extraire un sous texte d'une valeur alphanumérique, on indique la chaine à tester, l'emplacement du premier caractère de la sous chaine, et la longueur de la sous chaine (en cas d'absence de cette donnée, la sous chaine va jusqu'à la fin). Donc si l'on a plusieurs chaines qui commencent par "Nombre d'appareil " et qui finissent par le nom de la feuille correspondante, alors la fonction MID est simple pour retourner le nom de la feuille :

La Chaine : "Nombre d'appareil Nom de la feuille"

Le N de Nom de la feuille est en position 19 (en effet tout caractère compte pour 1)

On ne connaît pas la longueur de la sous chaine, donc on ne l'indique pas et tant mieux comme cela on aura le nom complet du nom de la feuille car MID("Nombre d'appareil Nom de la feuille",19) = "Nom de la feuille".

A la procédure on ajoute un paramètre optionnel Nom_de_feuille, et lors de l'appel à cette procédure on passe en paramètre le nom trouvé : Call(MID("Nombre d'appareil Nom de la feuille",19)) ce qui donne Call(Nom_de_feuille), du coup la procédure fonctionnera avec la feuille Nom_de_feuille.

vbMBHB

Hello,

Heu je t'avoue que je décroche un peu là.

J'ai rien compris. En plus simple tu saurais m'expliquer? Je dois changer toute mes macros?

Bonjour, J'ai simplement essayé d'expliquer simplement le fonctionnement du code qui test sur quel entête de tableau on vient de cliquer... A priori ce n'était pas simple... Après l'idée était de faire de même avec la seconde partie du code....

vbMBHB

Plus facile expliqué comme cela. Un tout grand merci

Rechercher des sujets similaires à "creer macros meme feuille"