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

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...

sylvanu

XLDnaute Barbatruc
Supporter XLD
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

  • test (20).xlsm
    51.5 KB · Affichages: 2

Piksaw

XLDnaute Junior
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
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
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

  • test (21).xlsm
    51.9 KB · Affichages: 3

Piksaw

XLDnaute Junior
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
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
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

  • test (22).xlsm
    52.1 KB · Affichages: 7

Piksaw

XLDnaute Junior
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
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
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
 

Piksaw

XLDnaute Junior
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 :)
 

Discussions similaires

Statistiques des forums

Discussions
315 131
Messages
2 116 571
Membres
112 790
dernier inscrit
Benead