formateur informatique

Gérer les articles en cours de commande en VBA Excel

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Gérer les articles en cours de commande en VBA Excel
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :

Abonnez-vous gratuitement à la chaîne Youtube Rossetti Stéphane .
Sujets et formations similaires :


Enlever des articles de la facture

Cette formation VBA Excel est la suite logique des précédentes. Nous poursuivons la conception de notre application de gestion et de facturation des clients. Dans le précédent volet, nous avons développé le code VBA permettant d'alimenter la commande d'un client. Il arrive parfois que des articles soient achetés ou insérés par erreur. L'opérateur doit être en mesure de supprimer une référence désignée, avec réactualisation du montant total, afin de ne pas devoir tout refaire.



Source et présentation de la problématique
Pour continuer ce développement, nous devons tout d'abord réceptionner l'application développée jusqu'alors. Du fait de la sécurité au premier chargement, une erreur VBA peut se déclencher. Dans tous les cas, le code à l'ouverture est neutralisé. Pour pallier ce défaut, nous devons enregistrer le classeur, le fermer et le rouvrir.
  • Fermer le classeur en l'enregistrant, puis le rouvrir,
Désormais, en déployant les listes déroulantes des identifiants clients et articles, vous constatez qu'elles sont chargées de contenu.

Bouton de feuille Excel pour supprimer un article désigné de la commande par liste déroulante grâce au code VBA

Au-dessus de la seconde liste déroulante, celle des codes articles, vous notez la présence d'un nouveau petit bouton. Son intitulé est matérialisé par le tiret du symbole moins. Au clic sur ce dernier, la référence active dans la liste déroulante doit être retirée de la commande. Cela signifie qu'une ligne complète doit être supprimée et que le montant total de la facture doit être recalculé. Cette donnée est fort heureusement stockée en variable publique. Mais cela signifie aussi que l'indice publique de ligne doit être décrémenté pour pourvoir continuer d'alimenter la facture après cette suppression. Enfin et nous le verrons, il s'agira de reconstruire l'alternance de couleurs pour les lignes.

Trouver la référence à supprimer
La ligne de la référence à éliminer doit premièrement être repérée. Comme souvent, l'idée consiste à engager une boucle While parcourant la première colonne de chaque ligne à la recherche d'une correspondance. Et cette boucle doit initier son traitement à partir de la première ligne de la commande, soit la ligne 11.
  • En haut de la fenêtre Excel, cliquer sur l'onglet Développeur pour activer son ruban,
  • Dans la section Contrôles du ruban, cliquer sur le bouton Mode création,
  • Ensuite, sur la feuille, double cliquer sur le bouton du symbole moins (-),
Nous basculons ainsi dans l'éditeur de code VBA Excel, entre les bornes de la procédure Retirer_Click. Son code se déclenchera à chaque clic sur ce bouton.
  • Entre les bornes de la procédure, ajouter les déclarations suivantes :
...
Dim la_ligne As Byte: Dim PUHT As Single

la_ligne = 11
...


La variable la_ligne doit servir à parcourir chaque ligne de la commande en cours de construction. C'est pourquoi elle est ensuite initialisée à l'indice 11, soit la première ligne de la commande. La variable PUHT doit prélever le montant total de l'article à supprimer. C'est ainsi que nous saurons combien déduire du montant total de la commande, après suppression. Elles sont fort naturellement déclarées comme des réels simples (Single).

Les variables étant initialisées, il est temps d'enclencher la boucle de recherche.
  • A la suite du code, ajouter les instructions VBA suivantes :
...
Do While (Range('B' & la_ligne).Value <> '')
If (Ref.Value = Range('B' & la_ligne).Value) Then Exit Do
la_ligne = la_ligne + 1
Loop

MsgBox la_ligne
...


Grâce à la boucle While, nous parcourons chaque ligne de la commande, tant qu'une référence est détectée (Range('B' & la_ligne).Value <> ''). Mais si l'une d'entre elles correspond à la référence recherchée, nous mettons fin à son traitement (Exit Do). Nous serons ainsi positionnés sur l'indice de la ligne à supprimer. Cet indice est effectivement incrémenté à chaque passage dans la boucle While (la_ligne = la_ligne + 1).

Grâce à la fonction MsgBox, nous allons pouvoir réaliser un essai afin de vérifier que le développement est correct.
  • Enregistrer les modifications et basculer sur la feuille Facture,
  • Dans le ruban développeur, cliquer sur le bouton Mode création pour le désactiver,
  • Sur la feuille, choisir un identifiant client avec la première liste déroulante,
  • Choisir un code article avec la deuxième liste déroulante,
  • Saisir une quantité en cellule I7 puis cliquer sur le bouton +Com,
  • Selon le même procédé, ajouter plusieurs produits à la commande,
  • Avec la deuxième liste déroulante, choisir alors l'une des références ajoutées,
  • Puis, cliquer sur le bouton au symbole moins (-),
Message de confirmation VBA Excel sur indice pour article à enlever de la commande

Aussitôt, la boîte de message programmée apparaît. Elle repère sans équivoque la position de l'article à éliminer de la commande.



Enlever un article de la commande
C'est par cet indice clairement identifié que nous allons pouvoir engager la suppression totale de la ligne, afin de retirer l'article demandé. Cette suppression va avoir pour conséquence de remonter toutes les lignes du dessous. Donc, pour que l'implémentation de la commande puisse se poursuivre, nous devons décrémenter la variable publique ligne. De même, cette action va saboter l'alternance des couleurs sur les lignes de la commande. Nous engagerons un traitement indépendant pour la réhabiliter. N'oublions pas enfin que nous devons actualiser le montant total de la commande en lui soustrayant le total de l'article supprimé.
  • Valider la boîte de message en cliquant sur le bouton Ok,
  • Revenir dans l'éditeur de code VBA Excel (ALT + F11),
  • Préfixer la ligne du MsgBox d'une apostrophe (') pour la passer en commentaire,
  • A la suite du code de la procédure événementielle, ajouter les instructions suivantes :
...
If (Range('B' & la_ligne).Value = Ref.Value) Then
If (la_ligne = 11 And ligne = 12) Then
MsgBox 'Ajoutez d'autres articles avant de supprimer le premier'
Else
PUHT = Range('J' & la_ligne).Value
THT = THT - PUHT
Range('J' & ligne + 1).Value = THT
Range('B' & la_ligne).EntireRow.Delete
ligne = ligne - 1
If (couleur = True) Then
couleur = False
Else
couleur = True
End If
alterner
End If
End If
...


Nous engageons une première instruction conditionnelle pour nous assurer que la référence de la ligne en cours est bien celle cherchée. Rien n'empêche en effet l'utilisateur de désigner une référence qui n'a pas été ajoutée. Dans ce cas, la boucle poursuit son traitement jusqu'à la dernière ligne.

Ensuite,nous engageons une deuxième instruction conditionnelle avec un double critère. S'il s'agit de la première ligne de la commande (11), elle vérifie qu'il ne s'agit pas du seul article. Souvenez-vous, cette ligne est effectivement utilisée comme modèle pour répliquer les formats sur les lignes du dessous. Dans ce contexte, nous empêchons donc sa suppression tant qu'un nouveau produit n'a pas été ajouté.

Dans le cas contraire, nous prélevons tout d'abord le total de l'article. Puis, nous le retranchons au total de la commande, mémorisé dans la variable publique THT. Nous actualisons ce nouveau montant sur la feuille (Range('J' & ligne + 1)). Puis, nous supprimons la ligne de la référence. Souvenez-vous, c'est la propriété EntireRow d'un objet de type Range qui permet de désigner l'intégralité de la ligne d'une cellule. Dès lors, sa méthode Delete fait le reste.

Ensuite, nous n'oublions pas de décrémenter la variable publique ligne, du fait de la suppression. Pour la même raison, nous recalons l'indicateur de couleur à l'inverse de son état en cours. Enfin et par anticipation, nous appelons la procédure alterner qui n'existe pas encore. Elle aura pour mission de reconstruire les jeux de couleurs, une ligne sur deux.

Pour effectuer des essais, nous devons au moins créer cette procédure alterner, même vierge.
  • Sous la procédure événementielle Retirer_Click, créer la procédure alterner, comme suit :
Private Sub alterner()

End Sub
  • Enregistrer les modifications et basculer sur la feuille Facture,
  • Fermer le classeur puis le rouvrir,
En effet, les variables publiques sont toutes initialisées à l'ouverture.
  • Choisir un identifiant client avec la première liste déroulante,
  • Puis, ajouter des articles avec des quantités associées,
  • Avec la deuxième liste, sélectionner l'une des références ajoutées,
  • Puis, cliquer sur le bouton au symbole moins (-),
Aussitôt, la ligne de la référence spécifiée est supprimée. L'article est donc bien retiré de la commande. De plus, la montant total est parfaitement actualisé. Mais comme vous pouvez le voir, l'alternance de couleurs est cassée, ce qui est fort logique. C'est pourquoi, la procédure alterner que nous avons prévue, est absolument nécessaire.

Si vous éliminez une autre référence, vous constatez que le procédé est parfaitement fonctionnel. Si vous ajoutez un nouvel article à la facture, la construction de la commande reprend naturellement, grâce à l'actualisation de la variable publique ligne notamment.

Actualisation facture client après suppression article en cours de commande par erreur

Le code VBA complet du bouton de suppression est donc le suivant :

Private Sub Retirer_Click()
Dim la_ligne As Byte: Dim PUHT As Single

la_ligne = 11

Do While (Range('B' & la_ligne).Value <> '')
If (Ref.Value = Range('B' & la_ligne).Value) Then Exit Do
la_ligne = la_ligne + 1
Loop

'MsgBox la_ligne

If (Range('B' & la_ligne).Value = Ref.Value) Then
If (la_ligne = 11 And ligne = 12) Then
MsgBox 'Ajoutez d'autres articles avant de supprimer le premier'
Else
PUHT = Range('J' & la_ligne).Value
THT = THT - PUHT
Range('J' & ligne + 1).Value = THT
Range('B' & la_ligne).EntireRow.Delete
ligne = ligne - 1
If (couleur = True) Then
couleur = False
Else
couleur = True
End If
alterner
End If
End If

End Sub


  • Revenir dans l'éditeur de code Visual Basic Excel,
  • Entre les bornes de la procédure alterner, saisir le code VBA suivant :
Dim la_ligne As Byte: Dim la_couleur As Boolean

la_ligne = 11: la_couleur = False

While Range('B' & la_ligne).Value <> ''
If (la_couleur = True) Then
Range('B' & la_ligne & ':J' & la_ligne).Interior.ColorIndex = 15
Range('B' & la_ligne & ':J' & la_ligne).Font.ColorIndex = 2
la_couleur = False
Else
Range('B' & la_ligne & ':J' & la_ligne).Interior.ColorIndex = 2
Range('B' & la_ligne & ':J' & la_ligne).Font.ColorIndex = 16
la_couleur = True
End If
la_ligne = la_ligne + 1
Wend


Nous déclarons la variable la_ligne pour parcourir toutes les lignes de la commande. La variable booléenne la_couleur est destinée à fournir l'indication de couleur alternée à appliquer. Grâce à la boucle While, nous parcourons toutes les références de la facture, tant qu'une cellule non vide n'est pas trouvée. Lorsque le booléen vaut True, nous affectons les couleurs associées et les autres lorsqu'il vaut False. Dans les deux cas, nous basculons ensuite sa valeur, pour poursuivre l'alternance jusqu'au bout de la commande. Nous n'oublions pas d'incrémenter la variable de boucle (la_ligne), pour poursuivre le traitement.
  • Enregistrer les modifications et basculer sur la feuille Facture,
  • Fermer le classeur en l'enregistrant puis le rouvrir,
Désormais, vous pouvez construire une commande, retirer des articles, reprendre la construction de la commande. Toutes les lignes sont alternées et le montant total s'adapte parfaitement à la situation.

 
Sur Facebook
Sur G+
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Google+
Partager sur Twitter
Partager sur LinkedIn