Fonction VBA [Résolu]

Signaler
Messages postés
22
Date d'inscription
mardi 3 avril 2012
Statut
Membre
Dernière intervention
10 mai 2012
-
Messages postés
22
Date d'inscription
mardi 3 avril 2012
Statut
Membre
Dernière intervention
10 mai 2012
-
Bonjour,

Je fais appel à vous car je suis pas très callée en vba.
Je vous explique mon problème:
J'ai dans une feuille excel une liste de matériels comportant chacun un numéro de série (environ 5000). En face, on peut voir où se trouve le matériel ( Magasin, Sortie ou Réparation). J'aimerai dans une autre feuille savoir pour chaque type de matériel (environ 200) combien j'en ai en magasin, combien en réparation, etc...
Je ne sais pas trop comment m'y prendre car je pensais à une macro qui ajouterai +1 à chaque fois qu'un même nom et un même emplacement serait repéré mais cela implique que j'indique dans la macro le nom du type de matériel. Or il pourrait y avoir des nouveaux modèles à l'avenir et le but est de ne plus toucher aux macros par la suite.

Un exemple pour etre plus claire:
x---> magasin
x--->réparation
y--->magasin
x--->réparation

Il faudrait donc une fonction qui m'indique dans une case qu'il y a 1 x en magasin et 2 en réparation.
Pensez-vous que cela soit faisable?
Pouvez-vous me donner des pistes?

Merci d'avance.

14 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Je dois ârler chinois ! ...
Relis-moi donc calmement :
colonne B pour les emplacements (à symboliser 1,2 ou 3)

1, 2 et 3 ne représentent pas les produits, mais leurs emplacements !
Allez ! Je vais dormir car là ...!
Je ne reviendrai que demain en espérant te trouver plus alerte qu'aujourd'hui !
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Bonjour,
Regarde du côté des formules Excel. Intéresse-toi à la fonction SOMME.SI
Ca, d'est depuis Excel lui-même
Si tu veux absolument le faire depuis VBA ===>> intéresse-toi alors à l'utilisation de WorkSheetFunction qui te permet, depuis VBA, d'utiliser les fonctions de Excel. Ouvre ton aide en ligne sur WorkSheetFunction


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Excuses (frappé trop vite).
C'est dans ton cas la fonction NB.SI (et nul besoin de tes x)


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
22
Date d'inscription
mardi 3 avril 2012
Statut
Membre
Dernière intervention
10 mai 2012

Tout d'abord merci pour ta réponse!
Mais en utilisant la fonction nb.si je vais devoir faire une colonne pour chaque type de matériel avec 3 colonnes pour chaque statut non?

Bonjour,

Une idée en l'air, sans trop réfléchir. (C'est l'heure du dîner canadien (12 h 30) et l'estomac perturbe la réflexion.)

Un filtre élaboré. Il peut être fait sans doublons, mais, dans ce cas, il faudrait accepter les doublons.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
C'est avant toute autre chose une question d'organisation de la pensée (comme presque toujours).
Sur la première feuille :
Une colonne (cachée) de cellules concaténant colonne des produits et colonne des emplacements
Imaginons Colonne A pour les produits et colonne B pour les emplacements (à symboliser 1,2 ou 3)
en colonne C (cacher) : formule à étirer : =CONCATENER(A1;B1)
Sur autre feuille de ton choix
en colonne A : les produits, colonne B : emplacement "magasin", en colonne C : emplacement "réparation", en colonne D : emplacement "sortie"
formule à étirer
en colonne B : =NB.SI(Feuil1!C1:C15;A1 & 1)
en colonne C : =NB.SI(Feuil1!C1:C15;A1 & 2)
en colonne D : =NB.SI(Feuil1!C1:C15;A1 & 3)
Je viens de m'y amuser à tester ===>> pas de soucis
Si pas de soucis pour moi (qui ne suis pas intéressé) ===>> pourquoi y en aurait-il pour d'autres ?
Et je n'ai utilisé ici aucun code VBA (mais ai sollicité mon "pois chiche", hein ... et rien d'autre !)
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
22
Date d'inscription
mardi 3 avril 2012
Statut
Membre
Dernière intervention
10 mai 2012

Merci!Oui en effet c'est une bonne solution. Le seul problème est que l'on doit retaper la formule s'il y a de nouveaux types de produits car la formule comprend le nom et on m'a demandé un fichier où les futurs utilisateurs n'auraient pas à toucher aux formules. Cependant on ne peut pas faire de miracle et je pense donc opter pour cette solution!
Encore merci de ta réponse!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
En aucun cas !
Il suffit que la feuille 2 contiennent tes produits en colonne A. ET tu peux y ajouter autant de produits nouveaux que tu veux ! Même s'ils n'existent pas sur la feuille 1 (0 y sera alors affiché dans les 3 colonnes BV, C et D).
Et les formules n'ont pas à être tripotées par l'utilisateur ! Il suffit de les étirer vers le bas, une fois pour toutes, au besoin dur toute la hauteur de chaque colonne ! Que racontes-tu donc là ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
J'espère que tu sais manipuler les formules et exprimer les adresses "fixes" et les "relatives"
je vais le faire pour toi, tiens.
Sur la seule feuille2 :
en colonne B : =NB.SI(Feuil1!C$1:C$60000;A1 & 1)
en colonne C : =NB.SI(Feuil1!C$1:C$60000;A1 & 2)
en colonne D : =NB.SI(Feuil1!C$1:C$60000;A1 & 3)
à mettre en 1ère ligne des colonnes B, C et D
Etirer ensuite vers le bas, sur toute la colonne concernée

Cela te permet de traiter sans faille 60000 lignes de la feuille 1 !
Et l'utilisateur n'a pas à intervenir dans les formules.

Sur Feuille1 :
=CONCATENER(A1;B1)
sans $
est à mettre en colonne C1 puis à étirer vers le bas sur toute la colonne C
Où est ton problème ?
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
22
Date d'inscription
mardi 3 avril 2012
Statut
Membre
Dernière intervention
10 mai 2012

Ok je comprend mieux. Donc il faut que chaque type de produit soit numéroté de 1 à ... pour qu'ils puissent étirer les cellules c'est bien ça? Et si une nouvelle gamme de produits apparait il prend le numero suivant? Car je prenais tes numéros pour des exemples et je remplaçais par le nom du produit et c'est pour cela que je ne voyais pas comment étirer les cellules...
Messages postés
22
Date d'inscription
mardi 3 avril 2012
Statut
Membre
Dernière intervention
10 mai 2012

Bonjour!

Oui j'ai relu la discussion et c'est vrai que j'ai tout confondu! Excuse moi d'avoir abusé de ta patience...En fait je voulais que si de nouveaux produits apparaissent en feuille 1, une nouvelle catégorie apparaisse en Colonne A feuille 2 mais pour cela je ferai une macro je pense.
Merci pour tes précieux conseils !
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Bon...
La voilà donc, ta macro, en récompense de ton effort :

With Sheets("Feuil1")
   derlig = .Cells.SpecialCells(xlCellTypeLastCell).Row
   Dim plage As Range, c As Range, coll As New Collection
   Set plage = .Range("A2:A" & derlig).SpecialCells(xlCellTypeConstants)
   If Not plage Is Nothing Then
       Sheets("Feuil2").Range("A2:A" & Rows.Count).ClearContents
       For Each c In plage
         On Error Resume Next
         coll.Add "", c.Value
         If Err = 0 Then
           derlig = Sheets("Feuil2").Range("A" & Rows.Count).End(xlUp).Row + 1
           Sheets("Feuil2").Range("A" & derlig).Value = c.Value
         End If
         On Error GoTo 0
       Next
   End If
 End With

Elle sera à lancer chaque fois que nécessaire.

et voilà un autre cadeau (pour rendre plus propres tes deux feuilles) :
en Feuil1, colonne C, à étirer jusqu'en bas :
=SI(A2<>"";CONCATENER(A2;B2);"")

En commençant à la ligne 2 : on garde la ligne 1 pour les titres.
On ne fait la concaténation que si quelque-chose en colonne A

Idem pour les colonnes B,C et D de feuil2 :
en B : =SI(A2<>"";NB.SI(Feuil1!C$2:C$60000;A2 & 1);"")
en C : =SI(A2<>"";NB.SI(Feuil1!C$2:C$60000;A2 & 2);"")
en D : =SI(A2<>"";NB.SI(Feuil1!C$2:C$60000;A2 & 2);"")

Etirer vers le bas jusqu'à plus soif
mettre les titres en ligne 1
produits-------magasin-----réparation------sortie
Voilà tout
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
22
Date d'inscription
mardi 3 avril 2012
Statut
Membre
Dernière intervention
10 mai 2012

J'en attendais pas autant
Merci beaucoup en tout cas! Je vais tester ça tout de suite.
Messages postés
22
Date d'inscription
mardi 3 avril 2012
Statut
Membre
Dernière intervention
10 mai 2012

BOnjour!

C'est encore moi!

J'ai testé la macro et elle ne fait qu'effacer le contenu de la colonne dans ma deuxième feuille. J'essaye de comprendre comment la macro est construite mais j'ai du mal à voir où est le problème... D'ailleurs je ne vois pas trop à quoi correspond le c dans la formule.

Pourriez-vous m'aider à nouveau?