Microsoft 365 Remplacer double clic par choix dans combobox

cgpa

XLDnaute Occasionnel
Bonjour le Forum :),

J'ai deux problème dans mon fichier d'inventaire.

1. Je cherche à remplacer un appel de macro par double clic (qui fonctionne très bien) par un choix dans un combobox afin d'éviter le double clic imprévu. Le combobox est créé avec la sélection des données. Mais je ne parviens pas à associer la macro existante (celle appelée par le double clic) au combobox (sur la feuille "sortie"). Pouvez-vous m'aider?

2. Nettement moins important. Lorsque je crée une "vente" à partir de la feuille "vente", les données sont renvoyées sur la feuille "sortie" (cette étape est essentielle pour pouvoir calculer automatiquement la quantité d'articles restant sur la feuille d'inventaire). Ensuite, à partir de la feuille "sortie", je double clic en colonne I sur le numéro de la vente pour envoyer vers la facture. J'ai créé un petit userform une fois la vente validée, afin de pouvoir créer une nouvelle vente ou partir sur une autre feuille. Cela fonctionne bien. Mais j'aimerais qu'à partir de ce userform, je puisse directement envoyer les données de la vente qui vient d'être validée et appeler la macro qui renvoie vers la facture sans passer par l'étape manuelle de la feuille "sortie".

Merci beaucoup pour votre aide!
 

Pièces jointes

  • inventaire horticulture v1.10 allégé.xlsm
    88.3 KB · Affichages: 18
C

Compte Supprimé 979

Guest
Bonjour CGPA

Je rigole quand je lis "afin d'éviter le double clic imprévu" 😂
Faut le faire quand même le double-clic 😉

Perso je le laisserai tel quel en revanche je poserai la question si on veut bien faire la facture.
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Dim der&, ID, ligID
  '
 der = Application.CountA(Columns("a:a")) '?
  With Sheets("facture") ' sur la feuille facture
    .Range("a11:h" & Rows.Count).Resize(der).ClearContents 'nettoie les cellules a11 à colonne h(données du tableau)
    .Range("f1:f3,g1,b8,g1,g8").ClearContents 'nettoie le contenu de ces cellules (coordonnées client)
  End With

  If Target <> "" And Target.Column = Range("I1").Column And Target.Row > 1 And Target.Row <= der Then 'détermine la colonne I de la feuille ventes comme cible
  ' Petite question avant de faire la facture
  If MsgBox("Voulez-vous faire une facture pour la vente : " & Target.Value & " ?", _
    vbQuestion + vbYesNo, "FACTURATION...") = vbNo Then Exit Sub
  ' Si la réponse est OUI on y va
    Range("a1:k" & der).AutoFilter Field:=9, Criteria1:=Target.Value '? sélectionne colonnes A à K et filtre sur la colonne 9 = colonne I
    ID = Me.Cells(Rows.Count, "j").End(xlUp).Value '?
    With Sheets("facture") 'sur la feuille facture
      Me.Range("a1:k" & der).Resize(, 8).SpecialCells(xlCellTypeVisible).Copy .Range("a10") '? ' prends les résultats du filtre des colonnes A à K et colle les 8 colonnes sélectionnées
      If Me.FilterMode Then Me.ShowAllData
      On Error Resume Next: ligID = Application.Match(ID, Sheets("clients").Columns(2), 0): On Error GoTo 0 '?
      If Not IsError(ligID) Then
        .Range("f1") = Sheets("clients").Cells(ligID, 3) 'implémente le nom en F1
        .Range("g1") = Sheets("clients").Cells(ligID, 4) 'implémente le prénom en G1
        .Range("f2") = Sheets("clients").Cells(ligID, 5) 'implémente l'adresse en F2
        .Range("f3") = Sheets("clients").Cells(ligID, 6) & "   " & Sheets("clients").Cells(ligID, 7) 'implémente cp + espace + ville en F3
      End If
      .Range("g8") = Date 'implémente la date en G6
      .Range("b8") = Target.Value 'implémente la cible (le numéro de vente) en B8
      'Application.Goto .Range("a1"), True 'se place en A1 en fin de macro
      .Range("A1").Select ' c'est mieux ;-)
    End With
  End If
  Call mise_en_forme_tableau
End Sub

@+
 
Dernière modification par un modérateur:
C

Compte Supprimé 979

Guest
Re,

Etre plusieurs utilisateurs n'empêche pas un minimum d'attention 😉
je vous ai mis le code pour la question

Pour l'USF, je laisse faire un des membres qui saura vous le faire

@+
 

cgpa

XLDnaute Occasionnel
Re,

Etre plusieurs utilisateurs n'empêche pas un minimum d'attention 😉
je vous ai mis le code pour la question

Pour l'USF, je laisse faire un des membres qui saura vous le faire

@+
Merci pour l'adaptation du code. C'est vrai que poser la question avant l'envoi est plus sympa. Cela fonctionne bien. Mais avant, le double clic n'était possible que sur la colonne I pour appeler la macro. Maintenant il fonctionne sur n'importe quelle colonne mais le code n'est valable que pour la colonne I. Mais je tente quand même d'appeler la facture à partir du combobox au lieu du double clic et là je coince. toujours.
 
Dernière édition:

cgpa

XLDnaute Occasionnel
Bonjour CGPA

Je rigole quand je lis "afin d'éviter le double clic imprévu" 😂
Faut le faire quand même le double-clic 😉

Perso je le laisserai tel quel en revanche je poserai la question si on veut bien faire la facture.
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Dim der&, ID, ligID
  ' Petite question avant de faire la facture
  If MsgBox("Voulez-vous faire une facture pour la vente : " & Target.Value & " ?", _
    vbQuestion + vbYesNo, "FACTURATION...") = vbNo Then Exit Sub
  '
  ' Si la réponse est OUI on y va
  der = Application.CountA(Columns("a:a")) '?
  With Sheets("facture") ' sur la feuille facture
    .Range("a11:h" & Rows.Count).Resize(der).ClearContents 'nettoie les cellules a11 à colonne h(données du tableau)
    .Range("f1:f3,g1,b8,g1,g8").ClearContents 'nettoie le contenu de ces cellules (coordonnées client)
  End With

  If Target <> "" And Target.Column = Range("I1").Column And Target.Row > 1 And Target.Row <= der Then 'détermine la colonne I de la feuille ventes comme cible
    Range("a1:k" & der).AutoFilter Field:=9, Criteria1:=Target.Value '? sélectionne colonnes A à K et filtre sur la colonne 9 = colonne I
    ID = Me.Cells(Rows.Count, "j").End(xlUp).Value '?
    With Sheets("facture") 'sur la feuille facture
      Me.Range("a1:k" & der).Resize(, 8).SpecialCells(xlCellTypeVisible).Copy .Range("a10") '? ' prends les résultats du filtre des colonnes A à K et colle les 8 colonnes sélectionnées
      If Me.FilterMode Then Me.ShowAllData
      On Error Resume Next: ligID = Application.Match(ID, Sheets("clients").Columns(2), 0): On Error GoTo 0 '?
      If Not IsError(ligID) Then
        .Range("f1") = Sheets("clients").Cells(ligID, 3) 'implémente le nom en F1
        .Range("g1") = Sheets("clients").Cells(ligID, 4) 'implémente le prénom en G1
        .Range("f2") = Sheets("clients").Cells(ligID, 5) 'implémente l'adresse en F2
        .Range("f3") = Sheets("clients").Cells(ligID, 6) & "   " & Sheets("clients").Cells(ligID, 7) 'implémente cp + espace + ville en F3
      End If
      .Range("g8") = Date 'implémente la date en G6
      .Range("b8") = Target.Value 'implémente la cible (le numéro de vente) en B8
      'Application.Goto .Range("a1"), True 'se place en A1 en fin de macro
      .Range("A1").Select ' c'est mieux ;-)
    End With
  End If
  Call mise_en_forme_tableau
End Sub

@+
Bonjour BrunoM45,
Merci pour ce code:).
Mais comment lui indiquer que le double clic ne peut être valable que sur la colonne I car ici il lance la question à partir de n'importe quelle colonne et la macro ne fonctionne que pour la colonne I?
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour cgpa, Brunom45, le forum

comment lui indiquer que le double clic ne peut être valable que sur la colonne I

en ne prenant en compte le double clic que sur la colonne I

Bien cordialement

VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  If Not Intersect(Target, Columns("I:I")) Is Nothing Then
      Dim der&, ID, ligID
      ' Petite question avant de faire la facture
      If MsgBox("Voulez-vous faire une facture pour la vente : " & Target.Value & " ?", _
        vbQuestion + vbYesNo, "FACTURATION...") = vbNo Then Exit Sub
      '
      ' Si la réponse est OUI on y va
      der = Application.CountA(Columns("a:a")) '?
      With Sheets("facture") ' sur la feuille facture
        .Range("a11:h" & Rows.Count).Resize(der).ClearContents 'nettoie les cellules a11 à colonne h(données du tableau)
        .Range("f1:f3,g1,b8,g1,g8").ClearContents 'nettoie le contenu de ces cellules (coordonnées client)
      End With
   
      If Target <> "" And Target.Column = Range("I1").Column And Target.Row > 1 And Target.Row <= der Then 'détermine la colonne I de la feuille ventes comme cible
        Range("a1:k" & der).AutoFilter Field:=9, Criteria1:=Target.Value '? sélectionne colonnes A à K et filtre sur la colonne 9 = colonne I
        ID = Me.Cells(Rows.Count, "j").End(xlUp).Value '?
        With Sheets("facture") 'sur la feuille facture
          Me.Range("a1:k" & der).Resize(, 8).SpecialCells(xlCellTypeVisible).Copy .Range("a10") '? ' prends les résultats du filtre des colonnes A à K et colle les 8 colonnes sélectionnées
          If Me.FilterMode Then Me.ShowAllData
          On Error Resume Next: ligID = Application.Match(ID, Sheets("clients").Columns(2), 0): On Error GoTo 0 '?
          If Not IsError(ligID) Then
            .Range("f1") = Sheets("clients").Cells(ligID, 3) 'implémente le nom en F1
            .Range("g1") = Sheets("clients").Cells(ligID, 4) 'implémente le prénom en G1
            .Range("f2") = Sheets("clients").Cells(ligID, 5) 'implémente l'adresse en F2
            .Range("f3") = Sheets("clients").Cells(ligID, 6) & "   " & Sheets("clients").Cells(ligID, 7) 'implémente cp + espace + ville en F3
          End If
          .Range("g8") = Date 'implémente la date en G6
          .Range("b8") = Target.Value 'implémente la cible (le numéro de vente) en B8
          'Application.Goto .Range("a1"), True 'se place en A1 en fin de macro
          .Range("A1").Select ' c'est mieux ;-)
        End With
      End If
      Call mise_en_forme_tableau
    End If
End Sub
 
Dernière édition:

cgpa

XLDnaute Occasionnel
Bonour cgpa, Brunom45, le forum



en ne prenant en compte le double clic que sur la colonne I

Bien cordialement

VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  If Not Intersect(Target, Columns("I:I")) Is Nothing Then
      Dim der&, ID, ligID
      ' Petite question avant de faire la facture
      If MsgBox("Voulez-vous faire une facture pour la vente : " & Target.Value & " ?", _
        vbQuestion + vbYesNo, "FACTURATION...") = vbNo Then Exit Sub
      '
      ' Si la réponse est OUI on y va
      der = Application.CountA(Columns("a:a")) '?
      With Sheets("facture") ' sur la feuille facture
        .Range("a11:h" & Rows.Count).Resize(der).ClearContents 'nettoie les cellules a11 à colonne h(données du tableau)
        .Range("f1:f3,g1,b8,g1,g8").ClearContents 'nettoie le contenu de ces cellules (coordonnées client)
      End With
   
      If Target <> "" And Target.Column = Range("I1").Column And Target.Row > 1 And Target.Row <= der Then 'détermine la colonne I de la feuille ventes comme cible
        Range("a1:k" & der).AutoFilter Field:=9, Criteria1:=Target.Value '? sélectionne colonnes A à K et filtre sur la colonne 9 = colonne I
        ID = Me.Cells(Rows.Count, "j").End(xlUp).Value '?
        With Sheets("facture") 'sur la feuille facture
          Me.Range("a1:k" & der).Resize(, 8).SpecialCells(xlCellTypeVisible).Copy .Range("a10") '? ' prends les résultats du filtre des colonnes A à K et colle les 8 colonnes sélectionnées
          If Me.FilterMode Then Me.ShowAllData
          On Error Resume Next: ligID = Application.Match(ID, Sheets("clients").Columns(2), 0): On Error GoTo 0 '?
          If Not IsError(ligID) Then
            .Range("f1") = Sheets("clients").Cells(ligID, 3) 'implémente le nom en F1
            .Range("g1") = Sheets("clients").Cells(ligID, 4) 'implémente le prénom en G1
            .Range("f2") = Sheets("clients").Cells(ligID, 5) 'implémente l'adresse en F2
            .Range("f3") = Sheets("clients").Cells(ligID, 6) & "   " & Sheets("clients").Cells(ligID, 7) 'implémente cp + espace + ville en F3
          End If
          .Range("g8") = Date 'implémente la date en G6
          .Range("b8") = Target.Value 'implémente la cible (le numéro de vente) en B8
          'Application.Goto .Range("a1"), True 'se place en A1 en fin de macro
          .Range("A1").Select ' c'est mieux ;-)
        End With
      End If
      Call mise_en_forme_tableau
    End If
End Sub
Merci beaucoup Yeahou 😊 !
 

cgpa

XLDnaute Occasionnel
Bonjour à tous,

Ma version avec une combobox...
😊 Merci Mapomme, cela fonctionne très bien à partir de la feuille "sortie". C'est exactement ce que je désirais pour le 1er problème: remplacer le double clic par un combobox. Je vais pouvoir combiner avec la solution proposée par BrunoM45 (poser la question si on veut une facture) complétée par Yeahou. Serait-ce abuser de voir si vous avez une solution pour le 2ème questionnement?

2. Nettement moins important. Lorsque je crée une "vente" à partir de la feuille "vente", les données sont renvoyées sur la feuille "sortie" (cette étape est essentielle pour pouvoir calculer automatiquement la quantité d'articles restant sur la feuille d'inventaire). Ensuite, à partir de la feuille "sortie", je double clic en colonne I sur le numéro de la vente pour envoyer vers la facture. J'ai créé un petit userform une fois la vente validée, afin de pouvoir créer une nouvelle vente ou partir sur une autre feuille. Cela fonctionne bien. Mais j'aimerais qu'à partir de ce userform, je puisse directement envoyer les données de la vente qui vient d'être validée et appeler la macro qui renvoie vers la facture sans passer par l'étape manuelle de la feuille "sortie".

En tous cas, grand merci pour votre aide précieuse sur ce fichier.
 

cgpa

XLDnaute Occasionnel
Bonjour à tou.te.s,

Avant tout, je remercie Mapomme, BrunoM45, Yeahou et toutes les personnes qui m'ont aidé pour la réalisation de cet inventaire avec facture. Voici jointe la version épurée. Si elle peut être utile à quelqu'un...

Le fichier fonctionne très bien.

Pour le parfaire, il me reste le 2ème problème évoqué ci-avant. Si quelqu'un a une idée pour lancer directement la facture à partir de l'userform qui s'ouvre à la validation de la vente, elle est la bienvenue.

Excellente journée à tou.te.s
 

Pièces jointes

  • inventaire horticulture v1.12 allégé.xlsm
    90.7 KB · Affichages: 5

cgpa

XLDnaute Occasionnel
Bonjour à tous,

Ma version avec une combobox...
A nouveau merci! J'apprends petit à petit... comme je l'ai indiqué ci-avant, cela répond parfaitement à la demande.
J'ai dupliqué la combobox de la feuille "sortie" sur la feuille "facture", ce qui me semble finalement utile si je dois imprimer des factures les unes à la suite des autres. J'ai essayé de comprendre le code et l'ai adapté en faisant référence aux données de la feuille "sortie" puisque le code semble filtrer ces données (enfin, si j'ai bien compris). Cela fonctionne, mais seulement pour les 3 premiers numéros de vente. Dès la quatrième vente, le tableau ne se remplit plus (seules les données du client et le numéro de vente sont toujours correctement renvoyées, mais pas le résultat du code relatif au filtre). J'ai vraisemblablement une erreur dans mon adaptation du code, mais je ne vois pas où cela fâche. Accepteriez-vous de me corriger ou m'indiquer ce qui ne va pas? Merci beaucoup!
 

Pièces jointes

  • inventaire horticulture v1.12 allege prob.xlsm
    104.4 KB · Affichages: 6

Discussions similaires

Statistiques des forums

Discussions
314 653
Messages
2 111 579
Membres
111 207
dernier inscrit
max008