Probléme d'impression et de filtre automatique
Bonjour,
J'ai créé une petite application de gestion de stock, j'ai deux soucis de macro le premier que j'ai déjà mis sur le forum ce matin mais sans aucun retour et un second pour une question d'impression.
1er problème :
Je souhaite grâce avec le tableau "ENTRÉE ou SORTIR produit :" ajouter ou sortir des produits de mon stock Par exemple, après avoir filtré, c'est la ligne 2 qui apparait en premier dans mon onglet "référence" je souhaite sélectionner la colonne E2 pour pouvoir modifier. Mais le filtre automatique de la cellule change constamment cela peut être E4 mais aussi E250 ou E500.
Je cherche une formule pour remplacer : Range("E2").Select qui permet de sélectionné la cellule de la colonne E...
2nd problème :
Je souhaite imprimer seulement les stock insuffisant, dans la feuille base colonne k si on a "OUI" on imprime et si on a "NON" on imprime pas cette ligne.
Merci d'avance,
Cordialement,
Bonjour,
Ton 2e problème, si j'ai bien compris, tu filtres sur "OUI" et tu imprimes, il n'y aura que les lignes oui à l'impression...
Ton 1er problème : si je comprends bien, à partir de ton Menu 'Entrer et sortir' tu mets à jour le stock dans ta base pour la référence indiquée...
A quoi bon se déplacer sur la feuille base, filtrer, insérer une formule l'écraser par copie-collage valeurs, recoller dans une autre colonne...
Il suffit de chercher la ligne de la référence dans la colonne, d'affecter la nouvelle valeur en faisant la soustration ou l'addition, de réaffecter cette valeur à la seconde cellule qui l'attend, et sans se déplacer ni filtrer.
Je te propose donc :
Sub AJOUTER_PRODUIT()
Dim q%, ln%, ref$, bb
With ActiveSheet
ref = .Range("F6"): q = .Range("F2")
End With
If ref = "" Then Exit Sub
If Not IsNumeric(q) Then Exit Sub
With Sheets("BASE")
If .FilterMode Then .ShowAllData
ln = .Range("B" & .Rows.Count).End(xlUp).Row
bb = .Range("B1:B" & ln).Value
On Error Resume Next
ln = WorksheetFunction.Match(ref, bb, 0)
If Err.Number <> 0 Then
MsgBox "Référence non trouvée dans la base !", vbCritical, "Erreur"
End If
On Error GoTo 0
.Cells(ln, 5) = .Cells(ln, 5) + q
.Cells(ln, 9) = .Cells(ln, 5)
End With
MsgBox "Stock mis à jour.", vbInformation, "Entrée ou sortie"
ActiveSheet.Range("F2:F10").ClearContents
End SubL'effacement du tableau d'entrée-sortie à la fin est une sécurité pour la cas où tu appuierais plusieurs fois sur le bouton... On peut agrémenter tout ça si tu veux d'autres infos, qu'on t'indique l'état du stock, etc.
Mais tu as là une procédure qui s'exécute sans déplacement (plus de Select !) ni copier-coller inutiles.
Cordialement.
HEY !!!
Super ton programme marche à merveille, pourrais tu me commenter chaque ligne pour que je comprenne comment tu as fait
2nd problème :
Je souhaite faire une macro me permettant d'imprimer la ligne si le stock est en dessous du stock mini.
Ps: j'apprécie que l'on m'explique pour pouvoir le réaliser moi même après
cordialement,
Je te remets une version avec commentaires (pas mis en forme particulièrement, j'espère que c'est lisible).
Cela m'a de voir un petit problème au début, concernant le contrôle de la saisie, et une omission de commande à rajouter sur la gestion d'erreur. Je l'ai signalé dans les commentaires, tu retrouveras donc les modifications...
Sub AJOUTER_PRODUIT()
Dim q%, ln%, ref$, bb 'déclaration de variables: %=As Integer, $=AsString,
' non typé=type Variant
With ActiveSheet 'on place la référence à la feuille sous bloc With, toutes
' les expressions précédées d'un point, dans le bloc, s'y réfèrent
ref = .Range("F6") 'affectation référence à une variable
If IsNumeric(.Range("F2")) Then q = .Range("F2") 'affectation quantité à
' une variable, si la valeur est numérique
'(j'ai modifié cette ligne car le test suivant aurait été sans effet,
' q étant toujours numérique, si la saisie ne l'était pas il y aurait
' une erreur sur cette ligne)
End With
If ref = "" Then Exit Sub 'vérification qu'on a saisi une référence
If q = 0 Then Exit Sub 'vérification qu'on a saisi une quantité non nulle
' (si une valeur non numérique a été saisie, q sera égal à 0)
With Sheets("BASE") 'on place la feuille sous bloc With, on ne répète plus
' le nom pour s'y référer, code plus court et plus rapide aussi...
If .FilterMode Then .ShowAllData 'si feuille en mode Filtre, on affiche
' toutes les lignes (toujours préférable de ne pas opérer sur feuille filtrée)
ln = .Range("B" & .Rows.Count).End(xlUp).Row 'on récupère l'index de dernière
' ligne en col. B
bb = .Range("B1:B" & ln).Value 'on affecte la col. B utilisée (ses valeurs)
' à une variable (Variant), on obtient un tableau des valeurs de la plage
On Error Resume Next 'on initie une gestion d'erreur éventuelle dans les
' lignes suivantes
ln = WorksheetFunction.Match(ref, bb, 0) 'on utilise la fonction EQUIV
' d'Excel pour renvoyer la ligne où se trouve la référence
'(On pouvait utiliser directement la plage sans la mettre préalablement
' en tableau, mais comme il était préférable de la dimensionner, le faire
' simplifie l'écriture)
If Err.Number <> 0 Then 'si la référence n'est pas trouvée EQUIV renvoie
' une erreur, qu'Excel répercute sur VBA, et que l'on intercepte avec notre
' gestion d'erreur
MsgBox "Référence non trouvée dans la base !", vbCritical, "Erreur" 'si
' erreur on le signale à l'utilisateur
Exit Sub 'ligne que j'ai oubliée, à ajouter car si on n'a pas de référence
' trouvée, il faut sortir...
End If
On Error GoTo 0 'on met fin à la gestion d'erreur (sinon on ne verrait plus
' d'erreur ultérieure qui pourrait se produire sans qu'on le sache
.Cells(ln, 5) = .Cells(ln, 5) + q 'on fait l'opération sur la cellule concernée :
' valeur cellule=valeur cellule + q (VBA peut le faire)
.Cells(ln, 9) = .Cells(ln, 5) 'on affecte la nouvelle valeur à l'autre cellule
'(ce type d'affectation de valeur, que l'on peut aussi réaliser entre 2 plages
' ou en affectant un tableau à un plage n'est pas réalisable manuellement,
' c'est pourquoi on ne le verra pas dans du code enregistré. Il convient de
' privilégier cette méthode nettement plus rapide, quand on le peut)
End With
MsgBox "Stock mis à jour.", vbInformation, "Entrée ou sortie" 'on informe l'utilisateur...
' Ne bougeant plus, il ne voit rien, si le message apparaît c'est que l'opération est
' réalisée avec succès, s'il n'apparaît pas, elle n'est pas faite (référence non saisie
' ou quantité...)
' (Si réf non trouvée, il aura été prévenu...)
ActiveSheet.Range("F2:F10").ClearContents 'effacement du tableau
End SubJ' ai un peu arrangé pour que ce soit lisible, sans scroller...
Je te remets les rectifications à faire :
ref = .Range("F6"): q = .Range("F2")est à remplacer par :
ref = .Range("F6")
If IsNumeric(.Range("F2")) Then q = .Range("F2")NB- Les deux-points dans la ligne à remplacer constituent un séparateur permettant d'écrire plusieurs lignes de code sur la même ligne physique (non repris dans le remplacement car la ligne serait longue...)
If Not IsNumeric(q) Then Exit Subest à remplacer par :
If q = 0 Then Exit SubEn effet, j'avais été un peu vite, q est déclarée comme variable Integer, si dans la cellule on a mis du texte VBA va rugir qu'il ne peut l'affecter à une variable numérique. Et le test ultérieur était sans effet, l'erreur se produisant avant ! Si l'on a omis de saisir, la cellule vide va renvoyer 0, que q va prendre (mais c'est déjà sa valeur par défaut du fait de la déclaration), et là le test était inopérant puisque 0 est une valeur numérique.
D'où : on ne récupère pas la valeur si ce n'est pas un nombre, on aura alors 0 si la saisie est omise ou non conforme, et on teste si la valeur de la variable est nulle.
Ligne à ajouter après celle : MsgBox "Référence non trouvée(...) :
Exit Subcar si on ne sort pas après avoir signalé l'erreur, il y en aura une ensuite puisqu'on n'a pas de ligne où faire l'opération (tout de même moins grave que si ça la faisait sur une ligne fausse...
Cordialement.
Bonjour,
Je n'ai pas encore eu le temps de vous remercier MFERRAND, je continue aujourd'hui a l’amélioration de ce fichier et je vous en ferais part du fichier une fois terminer.
Encore merci pour votre aide!!
Cordialement,
RE,
Je rencontre a nouveau un soucis au niveau du boutons "ENTRÉE ou SORTIR produit", en effet après avoir sélectionné la "marque" et le "type" dans mon tableau je souhaite que dans le menu déroulant "référence" ne s'affiche que les outil de la "marque" et du "type" que j'ai choisi. Je connais bien un moyen pour réaliser ce que je souhaite, en faisant des listes et des listes....mais il y a peut être un autres moyens ?
Bonjour,
Ce n'était pas la question posée...
Essaie ceci :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim PlgB As Range, crit(1, 1), n%, plV$
If Target.Address = "$F$3" Or Target.Address = "$F$5" Then
Me.[F6].ClearContents
If Me.[F3] = "" Or Me.[F5] = "" Then Exit Sub
crit(0, 0) = "Marque": crit(0, 1) = "Type"
crit(1, 0) = Me.[F5]: crit(1, 1) = Me.[F3]
With Worksheets("BASE")
Set PlgB = .Range("A1").CurrentRegion.Resize(, 3)
.Range("AA1:AB2").Value = crit
PlgB.AdvancedFilter xlFilterCopy, .Range("AA1:AB2"), .Range("AC1:AE1"), False
With .Range("AA1").CurrentRegion
n = .Rows.Count
Set PlgB = .Cells(1, 4).Resize(n)
.Cells(1, 8).Resize(n).Value = PlgB.Value
plV = "=BASE!" & .Cells(2, 8).Resize(n - 1).Address
.Clear
End With
Me.[F6].Validation.Modify Formula1:=plV
End With
End If
End SubC'est à placer dans le module de la feuille MENU.
A partir du choix Marque et Type, cela compose une liste de référence (en colonne AH de BASE) et cela modifie la liste de validation de F6.
J'ai que la liste de F3 (Type) était dépendante de la Marque, mais attention, tes listes de LISTE ne sont pas à jour.
Cordialement.
RE,
J'ai faits des modifications sur mon fichier pour faciliter l'utilisation donc certaines cellules ont changé d'endroit.
Je ne comprends pas : ou dois-je mettre ces lignes de code ? et vous me dite que mes listes ne sont pas à jour ?
Je vous joins le nouveau fichier pour faciliter ma compréhension.
Je suis désolé de ne pas être aussi rapide que vous pour comprendre tout cela
Et encore merci du temps que vous m'accordez !
Cordialement,
La proc. était à sa place.
Il fallait modifier les références de cellules en fonction de tes modifications !
Re,
Malheureusement ça ne marche que pour la "marque" SANDVIK et "type" PLAQUETTE GRAND FORMAT.
Cordialement,
Faisons un petit point !
1) D'abord le fichier transmis était initialisé avec SANDVIK et PLAQUETTE POUR FORET.
Cela fonctionne donc également pour ce type !
Cela ne fournit rien pour FORET et FORET A PLAQUETTE parce qu'il n'y en a pas dans la Base !
Cela ne peut fonctionner pour PLAQUETTE, parce qu'il n'est pas dans la liste !
Et cela fonctionne pour PLAQUETTE GRAND FORMAT par double erreur qui fait que l'on a des espaces parasites identiques dans la liste et dans la base.
2) J'avais commencé à coder un élément destiné à fiabiliser, que j'ai supprimé après avoir pris conscience de la dimension du problème !
3) Il convient de passer au peigne fin la Base pour supprimer toutes espaces parasites.
Même chose pour les listes.
4) Il convient de mettre à jour les listes : supprimer les types inexistants pour chacune des marques et ajouter les types manquants de chacune des marques également.
5) Utiliser des noms de plages dynamiques (ou des tableaux Excel) pour les listes, afin d'éliminer cette horreur de listes composées en majorité d'éléments vides !
Ensuite, ensuite seulement
RE;
Merci de votre réponse, je vais réaliser toutes les tâches que vous m'avez conseillées :
1)supprimer tous les espaces parasites dans la base et dans liste
2)Mettre à jour les listes
3)Utiliser des plages dynamiques
Je reviendrais ensuite vers vous une fois ces taches réalisées.
Cordialement,
Me revoilà;
En effet après avoir réalisé ces 3 étapes ça marche
Je vous joins le fichier pour vous permettre de voir le résultat de notre travail (enfin plus dû vôtre
Dites-moi ce que vous en pensez et si vous voyez des pistes d'amélioration
Cordialement,
C'est rapide ! Mais sur LISTE, la plupart des noms listés sont affublés d'une espace finale, et il y en a pas mal sur BASE en colonne C.Tu joues encore à la loterie, tu auras toutes les références Marque-Type où il y a accord entre la Base et les Listes, mais certaines seront manquantes...
Cordialement.
Bonjour,
J'ai supprimé tous les espaces finales dans la colonne C de la feuille "BASE", normalement je ne devrais pas avoir de soucis ?
Il me reste plus qu'a réaliser le bouton imprimer, je souhaite avoir une impression au format PDF de toutes les plaquettes qui sont sous le seuil de leur stock mini pour que je puisse en recommander rapidement.
Cordialement,
Bonjour,
Pour l'impression, soit filtrage sur 'oui' de la Base afin d'extraire la liste (par export pdf) des références au-dessous du stock mini (filtre auto ou filtre avancé sur place, le choix est indifférent),
soit filtrage avec copie sur une autre feuille prévue pour l'impression (filtre avancé)...
Au choix ! Pas de difficulté particulière...
Re,
Ok, merci pour tout.
cdlt,