Macro si Cellule contient

Bonjour à tous,

Après de multiples recherches et tentatives sans succès, je viens à vous pour chercher de l'aide quant à la création d'une macro.

Je ne suis pas du tout calé en VBA mais suis en général assez autodidacte pour m'en sortir seul. Seulement là, j'avoue que je sèche...

Je m'explique : le but final est d'avoir une macro qui permet d'ouvrir une boite de dialogue en double-cliquant sur une cellule (ou Ctrl+clic, ou autre, peu importe). Seulement cette macro ne doit être disponible que sur les cellules qui contiennent le texte "A valider".

La macro devrait chercher le texte ci-dessus sur la colonne J (sur la plage J13:J31 pour être exacte, en sachant qu'il peut y avoir des cellules vides sur cette même plage).

D'après mes recherches, la boite de dialogue que je cherche à afficher serait du type InputBox. Chose qui apparemment devrait ressembler à : (macro trouvée sur ce site)

Sub exemple()
    Dim resultat As String

    resultat = InputBox("Texte ?", "Titre") 'La variable reçoit la valeur entrée dans l'InputBox

    If resultat <> "" Then 'Si la valeur est différente de "" on affiche le résultat
       MsgBox resultat
    End If
End Sub

Pouvez-vous svp m'indiquer la marche à suivre pour parvenir imbriquer mes deux conditions ?

Je peux éventuellement joindre un extrait de mon fichier excel si besoin, si je ne le fais pas de suite c'est parce que les infos sont confidentielles et qu'il faudrait alors que je crée une copie "partageable" en modifiant les infos etc.

D'avance merci pour votre aide à venir,

Je reste dispo pour toute question. J'espère avoir été clair dans mon explication, pas facile de mettre des mots sur tout ça !!

EDIT : Je travaille actuellement sur Excel 2013

Bonjour,

Essaie : (sur selection)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim resultat As String
If Target.Count = 1 Then
If Target = "A valider" Then
resultat = InputBox("Texte ?", "Titre") 'La variable reçoit la valeur entrée dans l'InputBox
If resultat <> "" Then 'Si la valeur est différente de "" on affiche le résultat
MsgBox resultat
End If
End If
End If
End Sub

A+

Bonjour Galopin,

Merci pour ta réponse. Malheureusement je n'arrive pas à lancer la macro...

J'imagine que je dois rater une étape dans l'écriture de la macro, sur 2003 j'y arrivais mais là c'est là première fois que j'essaie sur 2013, les manip' ont-elles changées ?

Ne pas mettre la macro dans un module standart (module1) mais dans le module de la feuille concernée. (Clic Droit sur l'onglet de la feuille + Visualiser le code)

La macro ne se lance que si tu clic sur une cellule "à valider".

Ok !! C'est bon ça a marché ! Merci beaucoup

Maintenant je vais me creuser les méninges pour réussir à en faire ce que je veux ! Merci encore

Je reviens vers vous si jamais je n'arrive pas à avancer...

Bonsoir,

Je reviens vers vous pour une nouvelle question ! Je cherche à réaliser utiliser des cases à cocher dans mon fichier, et pour cela j'aurais besoin d'insérer une checkbox à chaque ligne non vide de ma base de donnée.

Seulement j'ai l'impression que ces petites checkboxes ne fonctionnent pas sur Excel 2016 ! Je me trompe ?

En fait, j'ai bien compris comment en créer manuellement, mais j'ai l'impression que dans Virtual Basic version 2016 on n'a plus accès aux commandes de formulaire.

Si quelqu'un a une solution à me proposer je suis on ne peut plus preneur, voilà plus d'une heure que je fais le tour du net pour trouver une réponse à ce soucis...

PS : j'ai préféré reposter ici plutôt que de rouvrir un sujet..

Bonjour,

Je déconseille systématiquement l'utilisation de ces cases à cocher qui finissent inévitablement à poser d'innombrables problèmes.

Utilisez le système en pièce jointe.

Bon dimanche.

Bonjour,

Super cette solution, ça m'évite une étape ! Et puis, si ça peut éviter de futur problèmes, je suis on ne peut plus preneur !

J'ai encore tout à apprendre en VBA, mais je suis heureux de voir qu'il existe des tas de solutions pour se faciliter la vie !

Encore une petite question, juste pour être sûr que cela soit possible et que je ne cherche pas pendant des heures pour rien !

Je peux réussir à trouver une moyen d'ouvrir un userform si une inputbox renvoi une valeur prédéfinie ?

Je m'explique : J'ai utiliser votre première solution pour créer afficher une InputBox si ma cellule contient "A valider", pour l'instant ça ressemble à ça :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim resultat As String
If Target.Count = 1 Then
If Target = "A valider" Then
resultat = InputBox("Nom?", "Recherche") 'La variable reçoit la valeur entrée dans l'InputBox
If resultat <> "" Then 'Si la valeur est différente de "" on affiche le résultat
    Set Trouve = Sheets("Données").Columns(2).Cells.Find(what:=resultat)
     If Trouve Is Nothing Then
            MsgBox "A créer"
        Else
            Trouve.Select
            MsgBox "Déjà existant" & Trouve.Address
        End If
Set Trouve = Nothing

End If
End If
End If
End Sub

Quand le message "A créer" apparaît, je souhaiterai ouvrir un formulaire que j'aurais créer au préalable.

De plus, la macro ne marche pas pour l'instant quand le nom recherché est trouvé, elle me renvoie un message d'erreur. Pouvez-vous m'aider à comprendre pourquoi ? Elle bloque au niveau de Trouve.Select

Lorsque le résultat est trouvé, j'aimerais par la suite que la macro me renvoie sur un autre onglet, mais ça je pourrais me débrouiller seul pour y arriver je pense. Seulement si ça bug déjà, je ne sais pas par où commencer...

Merci d'avance pour votre patience et le temps accorder à mon cas !

EDIT : C'est bon, j'ai réussi à afficher mon formulaire quand je le souhaite.

Mais maintenant j'ai un soucis dans la validation de ce formulaire.. Je l'ai créer, et je souhaiterai maintenant paramétrer le bouton Valider en bas de formulaire. Je l'ai fais comme suit :

Private Sub CommandButton1_Click()

Dim ctrl As Control
Dim Colonne As Integer
Dim derligne As Integer

derligne = Sheets("Données").Range("A65000").End(x1Up).Row + 1

For Each ctrl In Userform1

Colonne = Val(ctrl.Tag)

If Colonne > 0 Then Sheets("Données").Cells(derligne, Colonne) = ctrl

Next
End
End Sub

Mais la macro me renvoie un message d'erreur sur la ligne

derligne = Sheets("Données").Range("A65000").End(x1Up).Row + 1

Vous arrivez à voir ce qui cloche ?

Vous arrivez à voir

.... C'est difficile YFO de bons yeux : Vous avez écrit :

au lieu de

Effectivement, ça marche vachement mieux comme ça...

Merci pour le coup de main !

Par contre, j'ai testé la macro une première fois, elle avait l'air de bien fonctionner et m'ajoutait comme prévu une ligne dans la feuille "Données". Mais maintenant, le formulaire s'ouvre bien, je peux toujours le remplir, MAIS la ligne n'est pas du tout créer dans ma base de donnée.. Je ne crois pas avoir toucher à quoi que ce soit, d'ailleurs je n'ai pas de message d'erreur..

Faut-il que j'ajoute du code pour dire à la macro de m'ajouter une ligne chaque fois que le formulaire est lancer ? Je pensais que c'était "évident" ?

EDIT : J'ai barré la deuxième partie de mon message car j'ai trouvé mon erreur !!

EDIT 2 : Encore une question.. Je suis vraiment désolé de vous en poser autant, d'habitude je sais me débrouiller seul mais là vraiment je galère... Voilà ce que je voudrais faire :

Quand mon InputBox renvoie le résultat "Déjà Existant" j'aimerais que la macro aille chercher le résultat (donc ce que j'ai rentré dans la boite de dialogue : ici un nom) dans une liste déroulante présente en feuille2 et qu'elle séléctionne ce nom dans la liste déroulante (lorsqu'un nom est sélectionné, les infos perso de la personne apparaissent en dessous, ça c'est déjà le cas).

Je ne sais pas si c'est très clair...

Je pense qu'il suffirait d'ajouter une fonction de recherche (partielle car dans ma liste déroulante se trouve une concaténation Nom+Prénom) et une autre d'affichage.

Mais je n'arrive pas à empiler les fonctions dans ma macro.. en fait je ne connais pas assez les fonctions en macro..

Ne pouvant pas partager mon fichier tel quel (problème de confidentialité), j'ai créé un petit fichier TEST où j'ai repris le principe de ce que je cherche à faire.

Je réexplique : Lorsque vous êtes sur la feuille "Accueil", vous pouvez cliquer sur les cellules marquées "A valider". Une boite de dialogue (InputBox) s'ouvre et vous propose de renseigner un nom. Si le nom n'est pas présent dans la base de donnée, un formulaire s'ouvre (ce cas est traité, merci Galopin).

MAIS lorsque le nom existe déjà, l'InputBox renvoie le message "Déjà Existant". J'aimerais que dans ce cas, la macro renvoie à la feuille "Liste déroulante", cherche le nom tapé dans la liste déroulante présente en ligne 2, et sélectionne ce nom dans cette liste (permettant alors de visualiser les infos juste en dessous.

Je ne sais pas du tout s'il est possible d'arriver à ce résultat avec une macro, je ne trouve rien sur le net correspondant à cette requête. Pouvez-vous svp m'indiquer quelle formule serait à insérer dans ma macro ?

De plus, est-il possible de demander à Excel de me retrier ma base de données par ordre alpha à chaque ajout de ligne ?

D'avance merci ! J'apprécie grandement l'entraide présente sur ce forum, j'ai hâte de m'y connaitre suffisamment pour pouvoir à mon tour venir en aide à des débutants comme moi

PS : Désolé pour le double post une nouvelle fois

PS2 : Le fichier a été créé sur Excel 2013

21test.xlsm (21.29 Ko)

Bonsoir,

Désolé mais ce fichier manque décidément de visibilité (ou de crédibilité) pour t'apporter des réponses efficientes.

Ça donne un peu l'impression que tu as envie de réinventer la roue..

A+

Arf, pardon.. Je pensais qu'un aperçu dans ce genre suffirait pour vous faire comprendre ce que je cherchais à faire, je l'ai créer rapidement de telle sorte qu'il reprenne les macro et mise en forme conditionnelle dont je me sert déjà. Désolé du manque de crédibilité.

Avez-vous compris ma problématique ou pas du tout ? Si non, je tâcherai de vous envoyer mon vrai fichier après avoir modifier tous les noms, adresses etc.

Non j'ai bien compris mais... le problème c'est cette impression que vous chercher à réinventer la roue.

Pour moi un Formulaire (UserForm) ça sert à Consulter (Rechercher, Ajouter ou Supprimer une donnée (en ligne dans une table)

C'est le même formulaire qui fait ça pas besoin en plus d'une feuille intermédiaire ni de concaténation pour faire ça...

Donc là vous me demandez de jouer un peu avec vous pour faire des trucs un peu nuls...

En plus il y a cette première feuilles ou vous entrez des dates. (a vérifier oupa...) Pas besoin de marquer "à vérifier" pour que VBA vérifie systématiquement qu'il n'y a pas de doublons dans ses données...

Donc là pour l'instant j'ai pas envie de faire 5 pages d'échanges verbeux sur le forum pour faire une mauvaise soupe...

Si vous avez un fichier vous le mettez . Vous virez presques toutes les lignes en en laissant juste 2 ou 3... changez Pierre par Paul vous changez tous les 1 en 0 et les 3 en 7 plus quelques maquillages facile pour qu'on n'envoie pas des mails idiots à n'importe qui et vous supprimez le logo de votre entreprise, il faut pas 8 jours pour anonymiser un fichier. ..

Après on verra ce qu'on peut faire...

Voilà, j'ai modifier mon fichier, je pense qu'avec ça il sera plus simple de comprendre..

Je réexplique une nouvelle fois le principe en essayant d'être le plus clair et le plus concis possible :

Le but ici, est d'affecter un contrat à un intérimaire. En cliquant sur "A valider" dans la feuille "Page d'accueil", une InputBox s'ouvre et demande de renseigner le nom de l'intérimaire sur lequel affecter le contrat (en fait, la ligne sur laquelle on a cliqué -celle avec la mention "A valider"- va être copiée dans la fiche d'un intérimaire dans la feuille "visualisation des contrats"). Deux résultat possible à l'InputBox :

- Soit l'intérimaire n'existe pas, et à ce moment là un formulaire s'ouvre pour Ajouter cette personne à la BDD (ça normalement, c'est OK).

- Soit il existe déjà, et j'aimerais qu'en cliquant sur OK, la macro nous amène à sa fiche intérimaire.

Donc ce que je cherche à faire, c'est rechercher le nom déjà existant dans ma liste déroulante (Visualisation des contrats - ligne 4) et afficher la fiche, exactement comme si j'étais venu manuellement sélectionner un nom dans cette liste.

Bien sûr il faudra ensuite que je gère la copie des données d'une feuille à l'autre etc. mais ça je pense pouvoir m'en sortir.

Mon principal problème pour l'instant est cette recherche+affichage dans une liste déroulante...

Pensez-vous que cela est possible ? Je pense que je ne connais pas assez les bases pour me rendre compte si comme vous le dites je cherche "à réinventer la roue"...

Encore merci pour votre patience !! En espérant que cette fois, le fichier joint sera utile...

PS: je ne me suis pas encore occupé des boutons sur le coté, je sais qu'ils ne fonctionnent pas. Je commence seulement à "développer" cet outil alors c'est normal si c'est un peu brouillon pour l'instant.. désolé par avance

Modifier la macro comme suit :

      If trouve Is Nothing Then
          MsgBox "Intérimaire à créer"
          Userform1.Show
      Else
          Feuil2.Range("B4") = trouve.Offset(, -1).Value
          Feuil2.Activate
      End If

A+

Je viens de modifier comme vous me l'avez indiqué, et le résultat est exactement celui que je cherchais à obtenir !

Merci beaucoup pour votre aide encore une fois ! Bonne journée

Re-Bonjour,

Dernière question et ensuite je clos le sujet car il est temps que j'arrête de vous embêter, et aussi car je dévie du Titre de ce sujet..

Je pense que celle-ci ne nécessite pas de fichier joint, il doit suffire d'ajouter une mention quelque part mais j'avoue ne pas trouver la bonne réponse tout seul..

J'ai utilisé le code suivant afin de prédéfinir le format d'une date dans une TextBox de mon UserForm (code trouvé sur un forum) :

Private Sub TextBox9_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Dim ind As Long, X As String
    If KeyCode = 8 And Not TextBox9 Like "*0-9*" Then
        KeyCode = 0
        ind = InStr(1, TextBox9, "-")
        If ind = 0 Then
            ind = Len(TextBox9)
        Else
            ind = InStr(1, TextBox9, "-") - 1
            If ind > 0 Then
                If Mid(TextBox9, ind, 1) = "/" Then ind = ind - 1
            End If
        End If
        If ind <> 0 Then
            X = TextBox9.Text: Mid(X, ind, 1) = "-": TextBox9.Text = X
        End If
    End If
    TextBox9.SelStart = IIf(ind <> 0, ind - 1, Len(TextBox9))
End Sub

Private Sub TextBox9_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Dim l As String, ind As Long, X As String
    l = Chr(KeyAscii): KeyAscii = 0
    ind = InStr(1, TextBox9, "-")
    If ind <> 0 Then: X = TextBox9.Text: Mid(X, ind, 1) = l: TextBox9.Text = X
    ind = InStr(1, TextBox9, "-")
    'verification de la validité
    If Left(TextBox9, 2) > 31 Then TextBox9 = "--/--/----"
    If Mid(TextBox9, 4, 2) > 12 Then TextBox9 = Left(TextBox9, 3) & "--/----"
    If Not Left(TextBox9, 6) Like "*-*" Then
        If Not IsDate(Left(TextBox9, 6) & "2017") Then TextBox9 = "--/--/----"
    End If
    'position du curseur
    ind = InStr(1, TextBox9, "-")
    TextBox9.SelStart = IIf(ind <> 0, ind - 1, Len(TextBox9))
End Sub

Le problème est que le texte "--/--/----" n'apparait par directement lorsque je presse la touche Entrée, mais uniquement après avoir tapé un premier caractère.

Si je comprends bien, il faut que je définisse mon "KeyPress" sur la touche que je souhaite c'est bien cela ? Quelque chose qui ressemblerait à ça ?

 Application.OnKey "~", TextBox9
  Application.OnKey "{Enter}", TextBox9

Si c'est bien cela, je n'ai du réussir à positionner ce code au bon endroit..

Désolé pour cette énième question...

EDIT : Après reflexion, l'idéal serait que ce format apparaisse directement à l'ouverture du formulaire. Faudrait-il alors que je passe par un UserForm.Initialize plutôt qu'un TextBox_KeyPress ?

Je vous conseille plutôt un truc comme en pièce jointe.

42saisie-date.xlsm (18.92 Ko)

Bonjour,

Merci pour cette réponse ! Effectivement cette solution est tout aussi bien ! Et le code est beaucoup compréhensible.

Merci encore une fois pour toutes vos réponses, je ferme ce sujet afin de continuer ce projet par moi-même maintenant que vous m'avez bien aiguillé !

Bonne journée,

A bientôt sur le forum

Rechercher des sujets similaires à "macro contient"