Microsoft 365 créer une macro de validation avec un bouton

  • Initiateur de la discussion Initiateur de la discussion Piksaw
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Piksaw

XLDnaute Junior
Bonsoir tous ,j'aurai besoin de vos compétences en matière de VBA 🙂)

j’ai une base de donnée avec plein de devis sur chaque ligne j’ai le numéro de devis en colonne À et ensuite j’ai l’adresse, le nom de la personne et le montant et j’ai une une cellule qui s’appel en cours en cellule D et quand un devis et adjugé j’écris manuellement « validé » et si il est refusé j’écris « refuser » manuellement très basique. Mais je dois chaque fois aller rechercher le devis en question parmi plein d’autre et j’aimerais automatiser ça

J’aimerais créer une macro toute simple avec un bouton

Exemple j’écris le numéro du devis dans une cellule et à côté, j’aurai le bouton, je clique sur le bouton et il m’écrit automatiquement validé dans la bonne cellule en fonction du numéro de devis taper préalablement et je recommence avec un autre devis

Et si il est refusé j’aurai le même bouton mais qui écrit refusé

Il faudrai d’après ce que j’ai pu lire que je puisse mettre une sorte de fonctions de recherchv qui va chercher le numéro du devis pour ensuite coller le mot « validé » dans la bonne cellule en tant que valeur fixe.
 
Solution
Normal, j'avais une chance sur deux.
je testais qu'un N° de devis en forme de nombre.
En PJ je traite les nombres et les chaines.
Le souci vient du fait que un textbox ne remonte qu'une chaine de caractère qu'on ne peut pas tester par rapport à des nombres. Donc il faut faire la conversion chaine nombre. Mais ça ne marche plus si le N° est une chaine.
VB:
Private Sub Cherche(Numéro, Statut)
    Dim Ind%, a
    On Error Resume Next        ' Test si N° de devis est une chaine
    Ind = Application.Match(CStr(Numéro), Sheets("Liste Devis").[B:B], 0)
    If Err > 0 Then
        On Error Resume Next    ' Test si N° de devis est un nombre
        Ind = Application.Match(Val(Numéro), Sheets("Liste Devis").[B:B], 0)
    End If
    If Err = 0...
Re,
un premier jet en PJ avec l'userform StatutDevis et les macros associées :
VB:
Private Sub CommandButton1_Click()
    Dim Ind%
    On Error Resume Next
    Ind = Application.Match(Val(StatutDevis.Devis), Sheets("Liste Devis").[B:B], 0)
    If Err = 0 Then
        Sheets("Liste Devis").Cells(Ind, "M") = "Refusé"
        Unload StatutDevis
    Else
        MsgBox "N° de devis non trouvé."
        StatutDevis.Devis = ""
    End If
End Sub
Private Sub CommandButton2_Click()
    Dim Ind%
    On Error Resume Next
    Ind = Application.Match(Val(StatutDevis.Devis), Sheets("Liste Devis").[B:B], 0)
    If Err = 0 Then
        Sheets("Liste Devis").Cells(Ind, "M") = "Validé"
        Unload StatutDevis
    Else
        MsgBox "N° de devis non trouvé."
        StatutDevis.Devis = ""
    End If
End Sub
A tester. 😉
 

Pièces jointes

Re,
un premier jet en PJ avec l'userform StatutDevis et les macros associées :
VB:
Private Sub CommandButton1_Click()
    Dim Ind%
    On Error Resume Next
    Ind = Application.Match(Val(StatutDevis.Devis), Sheets("Liste Devis").[B:B], 0)
    If Err = 0 Then
        Sheets("Liste Devis").Cells(Ind, "M") = "Refusé"
        Unload StatutDevis
    Else
        MsgBox "N° de devis non trouvé."
        StatutDevis.Devis = ""
    End If
End Sub
Private Sub CommandButton2_Click()
    Dim Ind%
    On Error Resume Next
    Ind = Application.Match(Val(StatutDevis.Devis), Sheets("Liste Devis").[B:B], 0)
    If Err = 0 Then
        Sheets("Liste Devis").Cells(Ind, "M") = "Validé"
        Unload StatutDevis
    Else
        MsgBox "N° de devis non trouvé."
        StatutDevis.Devis = ""
    End If
End Sub
A tester. 😉
Whaaa c'est génial comme ça merci beaucoup😍

un petite détail que j'ai oublier de préciser c'est que parfois le numéro de devis peut comporter une lettre par exemple A3

j'ai essayer mais ça ne marche pas
 
Le même mais avec une macro plus maintenable, avec un seul module d'analyse.
VB:
Private Sub CommandButton1_Click()
    Cherche Val(StatutDevis.Devis), "Refusé"
End Sub
Private Sub CommandButton2_Click()
    Cherche Val(StatutDevis.Devis), "Validé"
End Sub
Private Sub Cherche(Numéro, Statut)
    Dim Ind%
    On Error Resume Next
    Ind = Application.Match(Numéro, Sheets("Liste Devis").[B:B], 0)
    If Err = 0 Then
        Sheets("Liste Devis").Cells(Ind, "M") = Statut
        Unload StatutDevis
    Else
        MsgBox "N° de devis non trouvé."
        StatutDevis.Devis = ""
    End If
End Sub
 

Pièces jointes

Le même mais avec une macro plus maintenable, avec un seul module d'analyse.
VB:
Private Sub CommandButton1_Click()
    Cherche Val(StatutDevis.Devis), "Refusé"
End Sub
Private Sub CommandButton2_Click()
    Cherche Val(StatutDevis.Devis), "Validé"
End Sub
Private Sub Cherche(Numéro, Statut)
    Dim Ind%
    On Error Resume Next
    Ind = Application.Match(Numéro, Sheets("Liste Devis").[B:B], 0)
    If Err = 0 Then
        Sheets("Liste Devis").Cells(Ind, "M") = Statut
        Unload StatutDevis
    Else
        MsgBox "N° de devis non trouvé."
        StatutDevis.Devis = ""
    End If
End Sub
ça fonctionne aussi parfaitement, mais si le numéro du devis est par exemple A5 il ne le prends pas
 
Normal, j'avais une chance sur deux.
je testais qu'un N° de devis en forme de nombre.
En PJ je traite les nombres et les chaines.
Le souci vient du fait que un textbox ne remonte qu'une chaine de caractère qu'on ne peut pas tester par rapport à des nombres. Donc il faut faire la conversion chaine nombre. Mais ça ne marche plus si le N° est une chaine.
VB:
Private Sub Cherche(Numéro, Statut)
    Dim Ind%, a
    On Error Resume Next        ' Test si N° de devis est une chaine
    Ind = Application.Match(CStr(Numéro), Sheets("Liste Devis").[B:B], 0)
    If Err > 0 Then
        On Error Resume Next    ' Test si N° de devis est un nombre
        Ind = Application.Match(Val(Numéro), Sheets("Liste Devis").[B:B], 0)
    End If
    If Err = 0 Then             ' Si pas d'erreur
        Sheets("Liste Devis").Cells(Ind, "M") = Statut
        Unload StatutDevis
    Else
        MsgBox "N° de devis non trouvé."
        StatutDevis.Devis = ""
    End If
End Sub
( d'où l'intérêt de n'avoir qu'un module en cas de modif. quand je parlais de maintenance ... )
 

Pièces jointes

Normal, j'avais une chance sur deux.
je testais qu'un N° de devis en forme de nombre.
En PJ je traite les nombres et les chaines.
Le souci vient du fait que un textbox ne remonte qu'une chaine de caractère qu'on ne peut pas tester par rapport à des nombres. Donc il faut faire la conversion chaine nombre. Mais ça ne marche plus si le N° est une chaine.
VB:
Private Sub Cherche(Numéro, Statut)
    Dim Ind%, a
    On Error Resume Next        ' Test si N° de devis est une chaine
    Ind = Application.Match(CStr(Numéro), Sheets("Liste Devis").[B:B], 0)
    If Err > 0 Then
        On Error Resume Next    ' Test si N° de devis est un nombre
        Ind = Application.Match(Val(Numéro), Sheets("Liste Devis").[B:B], 0)
    End If
    If Err = 0 Then             ' Si pas d'erreur
        Sheets("Liste Devis").Cells(Ind, "M") = Statut
        Unload StatutDevis
    Else
        MsgBox "N° de devis non trouvé."
        StatutDevis.Devis = ""
    End If
End Sub
( d'où l'intérêt de n'avoir qu'un module en cas de modif. quand je parlais de maintenance ... )
tu es incroyable, ça fonctionne nickel 🙂)

question bête, comment je fais pour transférer ton travail sur mon projet officiel
 
1- Vous ouvrez mon fichier et le votre, puis Alt+F11 pour ouvrir l'éditeur VBA.
2- Vous Cliquez dans mon fichier sur StatutDevis puis vous faites glisser dans votre fichier
3- Vous Cliquez dans mon fichier sur LanceStatutDevis puis vous faites glisser dans votre fichier
Normalement c'est tout. C'est opérationnel.
Dans votre fichier vous créez un bouton et avec clic droit "Affecter une macro" vous accrochez la macro Lance.

Avant Après

1646430782325.png
1646430862025.png
 
1- Vous ouvrez mon fichier et le votre, puis Alt+F11 pour ouvrir l'éditeur VBA.
2- Vous Cliquez dans mon fichier sur StatutDevis puis vous faites glisser dans votre fichier
3- Vous Cliquez dans mon fichier sur LanceStatutDevis puis vous faites glisser dans votre fichier
Normalement c'est tout. C'est opérationnel.
Dans votre fichier vous créez un bouton et avec clic droit "Affecter une macro" vous accrochez la macro Lance.

Avant Après

Regarde la pièce jointe 1132742Regarde la pièce jointe 1132743
Merci beaucoup j'ai fait depuis windows car sur Excel depuis un Mac on n'arrive pas a glisser les fichiers bizarre entour cas tout fonctionne niquel vraiment merci beaucoup pour ton aide 🙂
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
32
Affichages
566
Réponses
18
Affichages
546
Réponses
1
Affichages
251
Retour