VBA Excel, tri en fonction de str

Résolu/Fermé
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 - Modifié par Brasiligun le 24/05/2016 à 15:25
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 - 30 juin 2016 à 15:39
Bonjour à tous, je débute en VBA et je bute depuis plus de 2h sur quelque chose qui doit être minime

Sous Excel, je souhaite classer différent objets par famille, par exemple

Une antenne rateau :Antenne
Une parabole: Antenne
Une clé wifi: Antenne
Une lisaison RS232: une liaison
Une lisaison SPI: une liaison
Une Arduino: une carte
Un ATmega: une carte

J'ai commencé avec ce petit bout de code:



Sub RechercheMultiple()
Dim Cible As String

Cible = "Parabole,Rateau,CléWifi"

If InStr(Cible, Range("A1")) = 0 Then
MsgBox "Pas d'Antenne"
Else
Application.Cells(1, 2) = "Antenne"
End If
End Sub



La on est vraiment au cas par cas, mais j'avais un début (et j'étais fier! :p)

J'ai ensuite voulu l'étendre a l'ensemble de mon petit tableau, pour qu'a son lancement, cette macro marque a coté de chaque objet, la famille à la quelle il appartient (Antenne, Liaison ou Carte)

Mais je tourne en rond, dès que j'entreprend une modification pour ne pas etre limiter à ligne par ligne, j'ai des erreurs de type :/

Je débute vraiment en VBA, je suis preneur de tous conseils


Un grand merci

12 réponses

Bonjour,
Avec une petite boucle for et plusieurs critères de recherche :

Sub tri()

Dim I As Variant

For I = 1 To Range("A" & Rows.Count).End(xlUp).Row

If InStr(Cells(I, 1), "Parabole") <> 0 Or InStr(Cells(I, 1), "Rateau") <> 0 Or InStr(Cells(I, 1), "Wifi") <> 0 Then Cells(I, 2) = "Antenne"
Next I
End Sub

Le meme résultat avec la recherche *Like* :

If Cells(I, 1).Value Like "Parabole" Or Cells(I, 1).Value Like "Rateau" Or Cells(I, 1).Value Like "Wifi" Then Cells(I, 2) = "Antenne"

A votre disposition pour d'éventuelles questions
1
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
24 mai 2016 à 21:12
Un énorme merci! je comprend mieux la syntaxe des boucles for du coup!
Je ne trouve pas le VB particulièrement intuitif à l'inverse du C ou du Pyhton mais j'ai l'impression que couplé à Excel il a un potentiel monstrueux

Du coup grâce a ton code en m'en inspirant plus qu’énormément, j'ai pu obtenir ce que je voulais:


Sub tri()

Dim I As Variant

'Antennes'
For I = 1 To Range("A" & Rows.Count).End(xlUp).Row
If InStr(Cells(I, 1), "Parabole") <> 0 Or InStr(Cells(I, 1), "Rateau") <> 0 Or InStr(Cells(I, 1), "Wifi") <> 0 Then Cells(I, 2) = "Antenne"
Next I

'Cartes'
For I = 1 To Range("A" & Rows.Count).End(xlUp).Row
If InStr(Cells(I, 1), "Atmega") <> 0 Or InStr(Cells(I, 1), "Arduino") <> 0 Or InStr(Cells(I, 1), "Polulu") <> 0 Or InStr(Cells(I, 1), "Driver") <> 0 Then Cells(I, 2) = "Carte"
Next I

'Liaisons'
For I = 1 To Range("A" & Rows.Count).End(xlUp).Row
If InStr(Cells(I, 1), "BusCAN") <> 0 Or InStr(Cells(I, 1), "RS232") <> 0 Or InStr(Cells(I, 1), "LI-FI") <> 0 Or InStr(Cells(I, 1), "SPI") <> 0 Or InStr(Cells(I, 1), "I2C") <> 0 Or InStr(Cells(I, 1), "RS512") <> 0 Or InStr(Cells(I, 1), "LI-FI") <> 0 Or InStr(Cells(I, 1), "Bluetooth") <> 0 Or InStr(Cells(I, 1), "Ethernet") <> 0 Then Cells(I, 2) = "Liaison"
Next I


End Sub


Demain j'essayerai de modifier ça pour avoir sur une autre feuille, tous les objets disponibles avec la famille à la quelle ils appartiennent (comme une base de données). Et lorsque que sur une autre feuille sélectionnée, en présence de quelques objets issus de cette base de données mais qui n'ont pas encore été trier, au lancant de la macro, elle ira vérifier cette base de données pour trouver ces même produits déjà triés, et donc leurs donner leurs famille. Je ne sais pas si c'est possible en VB mais c'est la petite idée que j'ai en tête et que je souhaite réaliser

En tout cas encore merci! Et bonne soirée
0
Content que ça vous ait aidé :-)
Oui c'est faisable, je vous prépare ces quelques lignes et vous me direz si ça vous convient. Je reviens vers vous ce soir ou demain en fin de matinée.
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
24 mai 2016 à 21:49
Surtout ne vous embêtez pas trop :p Je m'y remet demain matin, je me permettrais de vous montrer mon ébauche de code

En tout cas merci de votre aide, et une bonne soirée à vous


Thomas
0
Bonjour,
dans une feuille nommée liste matériel remplissez les colonnes A et B avec la base de données (en A les produits et B les familles)

Option Explicit

Sub tri()

Dim I As Variant, J As Variant
Dim cible1 As String, cible2 As String, nomfeuille As String

nomfeuille = ActiveSheet.Name
Range(Cells(1, 2), Cells(Range("A" & Rows.Count).End(xlUp).Row, 2)).ClearContents
Sheets("liste matériel").Activate
For I = 1 To Range("A" & Rows.Count).End(xlUp).Row
cible1 = Cells(I, 1).Value
cible2 = Cells(I, 2).Value
Sheets(nomfeuille).Activate
For J = 1 To Range("A" & Rows.Count).End(xlUp).Row
If Cells(J, 1) <> "" Then
If InStr(Cells(J, 1), cible1) <> 0 And Cells(J, 2) <> "" Then
Cells(J, 1).Select
MsgBox "Attention " & cible1 & " fait déjà partie de la famille " & cible2
End If
If InStr(Cells(J, 1), cible1) <> 0 And Cells(J, 2) = "" Then Cells(J, 2) = cible2
End If
Next J
Sheets("liste matériel").Activate
Next I
Sheets(nomfeuille).Activate

End Sub


J'espère que c'est ce que vous vouliez faire...
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
Modifié par Brasiligun le 25/05/2016 à 14:25
En fait, j'ai un petit projet à faire, je dois créer une macro pour Excel pour pouvoir traiter les familles d'une multitude de référence d'objets

Le code que vous m'avez fourni fonctionne parfaitement! Je ne connaissais pas l'option Explicit, c'est super, franchement! je vais continuer de peaufiné ça mais je vais énormément avancer aujourd'hui grave à vous

Un énorme merci! je vous payerai bien une bière ou un café (au choix) :p


Cordialement
0
Content d'avoir pu aider!
Il commence à faire beau donc plus une bière ^^

Non sérieusement c'était avec plaisir et n'hésitez pas si vous avez besoin d'aide pour autre chose (si c'est dans mes compétences évidemment).

Bonne continuation,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
Modifié par Brasiligun le 25/05/2016 à 15:45
je viens juste de penser à un petit cas d'erreur, si le produit n'est pas présent ou référencé dans la Base de donnée, puis-je utiliser un Else ou un autre test quelconque pour afficher une MsgBox "Un produit n'est pas présent dans la BDD" ou même pour cibler le produit en question "Ce produit n'est pas présent dans la BDD"

Si ce n'est pas possible t'en pis mais je viens juste d'y penser

En tout cas, grâce à toi j'ai presque fini o/
0
oui mettez ces quelques lignes à la fin avant le End sub :

For I = 1 To Range("A" & Rows.Count).End(xlUp).Row
If Cells(I, 2) = "" And Cells(I, 1) <> "" Then
Cells(I, 1).Select
MsgBox "ATTENTION ce produit n'est pas présent dans la BDD"
End If
Next I
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1 > Stif
25 mai 2016 à 22:08
J'ai tenté de l'ajouter, mais que toutes les pièces soient comprises dans la BDD ou à l'inverse aucune, il affiche toujours le message ATTENTION ce produit n'est pas présent dans la BDD"

J'ai cherché le pourquoi, et j'ai l'impression que c'est une erreur de lecture de la colonne A de la BDD. J'ai essayé de la corrigé ce soir mais sans succès, je ré-attaque demain

Si tu met le doigt dessus avant moi merci d'avance, mais quoi qu'il en soit ne te dérange pas trop tu m'as déjà bien sorti du caca :3


L'amateur de bière au soleil, encore merci et bonne soirée :p
0
Ah étonnant.. Envoies moi ton fichier via le site http://www.cjoint.com et j'y jete un œil
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
26 mai 2016 à 14:19
J'ai bidouillé un peu, il y a du mieux, mais de petites nouvelles erreurs sont apparues par exemple, il dit que certains objets sont déjà présent dans une certaine famille (alors que ces objets apparaissent une seule fois), mais bon c'est minime et ça ne gêne pas il suffit de retirer la MsgBox, et au moins quand les objets sont dans la BDD il ne dit plus rien donc nickel!

Alors maintenant pour les objets manquants, le truc bizarre c'est qu'il dit le nombre d'objets manquant +1. Pour l'exemple je t'ai donné 2 feuilles:

https://drive.google.com/open?id=0ByykuPoanvBmOE0xLWo0U1dFVGM

- une ou tous les objets sont présent, donc il ne dit rien (parfait)
- dans le second fichier il manque 3 objets, il dit donc 4 fois via MsgBox qu'un objet n'est pas présent dans la BDD sans dire le quel, (ça serrait top s'il disait objet xxx non présent à chaque fois qu'il rencontre un objet qui n'est pas dans la BDD).

Après j'ai encore pensé a quelque chose, j'essaye de le mettre en place depuis ce matin mais j'ai l'impression que ce n'est pas possible car trop de va et vient dans l'écriture des fichiers), ça serrait qu'à chaque objet non présent dans le fichier besoin_client (colonne A), il propose de l'ajouter à la BDD et qu'il nous demande sa famille d'appartenance

Mais c'est encore du chipotage au moins mon projet tourne grâce a toi :p
(les exemples ne sont pas top c'était pour y voir clair et chercher les eventuels dépassements)
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
Modifié par Brasiligun le 26/05/2016 à 15:37
Le probleme de l'objet manquant +1 semble se corriger en faisant:


'Gestion de présence dans la BDD'

For I = 2 To Range("A" & Rows.Count).End(xlUp).Row
If Cells(I, 2) = "" And Cells(I, 1) <> "" Then
Cells(I, 1).Select
MsgBox "ATTENTION un produit n'est pas présent dans la BDD"
End If
Next I
</code

Donc avec I=2 au lieu de I=1, j'ai fais des essais, ça semble marcher mais à confirmer à la longue avec des exemples plus compliqué

Et pour indiquer le produit manquant j'ai fait:

<code>For I = 2 To Range("A" & Rows.Count).End(xlUp).Row
If Cells(I, 2) = "" And Cells(I, 1) <> "" Then
Cells(I, 1).Select
MsgBox "ATTENTION " & cible1 & " n'est pas présent dans la BDD"
End If
Next I


Mais j'ai des décalage de valeur. Imaginons qu'il me manque 3 pièces par rapport a la BDD, il va m'afficher 3 MsgBox mais en ne disant pas le bon nom d'article

J'avance o/
0
Voilà testes ces quelques lignes / dernière boucle For I à remplacer par :

Sheets(nomfeuille).Activate
For I = 1 To Range("A" & Rows.Count).End(xlUp).Row
If Cells(I, 2) = "" And Cells(I, 1) <> "" Then
cible1 = Cells(I, 1).Value
Cells(I, 1).Select
MsgBox "ATTENTION " & cible1 & " n'est pas présent dans la BDD"
If MsgBox("Voulez-vous rajouter cet objet dans la BBD", vbYesNo, "Demande de confirmation") = vbYes Then
cible2 = InputBox("Quelle est la famille de cet objet?", "Rensignez la famille de cet objet")
Sheets("BDD").Activate

For J = 2 To Range("A" & Rows.Count).End(xlUp).Row + 1
Sheets("BDD").Activate
cible3 = Cells(J, 2).Value
If UCase(cible3) <> cible3 Then
cible2 = StrConv(cible2, vbProperCase)
Else: cible2 = UCase(cible2)
End If


If cible2 = cible3 And Cells(J, 2) <> "" Then
Range(Cells(J, 1), Cells(J, 2)).Select
Selection.Copy
Selection.Insert Shift:=xlDown
Cells(J, 1) = cible1
Sheets(nomfeuille).Activate
Exit For
End If
If Cells(J, 1) = "" And Cells(J, 2) = "" Then
cible2 = StrConv(cible2, vbProperCase)
Cells(J, 1) = cible1
Cells(J, 2) = cible2
Sheets(nomfeuille).Activate
Exit For
End If
Next J
End If
End If
Next I
If MsgBox("Voulez-vous relancer l'analyse?", vbYesNo, "Demande de confirmation") = vbYes Then Call tri
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
27 mai 2016 à 10:14
Monstrueux, franchement respect :p Ecoute encore une fois merci!

Je vais maintenant essayer d'ajouter une 3ieme colonne "constructeur" à la bdd et appliquer les mêmes conditions mais je devrais savoir me débrouiller :p Je te contacte encore une fois si je bute sur un point mais ça devrait rouler

Franchement juste merci!
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
Modifié par Brasiligun le 27/05/2016 à 14:05
Une nouvelle modif va tomber
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
Modifié par Brasiligun le 27/05/2016 à 14:15
Hum, le problème c'est que maintenant j'ai reçu une liste beaucoup plus complexe avec beaucoup de produit qui ne sont pas encore référencé (environ 15 000 réf pour seulement 3000 connus), et la c'est la douleur du coup

Alors j'ai modifié ton code pour qu'il ajoute systématiquement les nouveaux objets dans la BDD sans demander quelles sont leurs familles, il marque automatiquement "?" dans la famille pour que l'utilisateur le renseigne lui même après. C'est moins cool que la fenêtre qui demande mais c'est vrai que c'est plus rapide du coup


La nouvelle étape qui m'a été demandé c'est d'ajouté deux catégories supplémentaires, la 3ième qui correspond à si le produit est fabriqué par nous ou si elle est sous-traité et la 4ieme le nom des société qui achèteront ce matériel ou sont clientes

Pour ces nouvelles catégories je pense pouvoir réutiliser ton tri et l'appliquer aux catégories

genre
- tri1: famille produit
- tri2: tri production
- tri3: tri acheteur

Je me suis permis de remettre à jours les fichiers que je t'avais partagé pour que tu me donnes ton avis sur le système que la BDD ajoute les nouveautés d'elle même, si tu pouvais me dire ce que tu en penses ou si c'est pas top

https://drive.google.com/open?id=0ByykuPoanvBmOE0xLWo0U1dFVGM

Merci bien :p
0
Stif > Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019
29 mai 2016 à 00:37
Je regarde ça Lundi matin no souci ;)
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
30 mai 2016 à 09:17
ça roule merci
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
Modifié par Brasiligun le 3/06/2016 à 10:37
Re-bonjour, j'aurais une petite question a te poser, j'ai une date dans une colonne de type JJ/MM/AAAA, et dans une colonne je dois mettre que l'année, l'autre que le mois, la troiseme le numero de la semaine

Donc pas de probleme imagine =ANNEE(), =MOIS(), =NO.SEMAINE
Avec l’enregistreur ça marche très bien, mais le probleme c'est que si un jour le fichier ne fait plus 1500 lignes mais 3000, bah les dates n'iront pas jusqu'au bout. Donc je me demandais avec programmation, comment faire un peu comme pour les tri, générer les dates en fonction de la colonne JJ/MM/AAAA pour qu'il y ait toujours le bon nombre de données. J'ai essayé mais ça merdouille

1) En A il faut convertir la date en jj.mm.aaaa en date, donc onglet convertir et pas de probleme, mais je me demande si un jour j'ai un tableau énorme est-ce qu'il y aura conversion jusqu'au bout

2) En B sortir l'année de cette date (la c'est sur qu'en cas de grand tableau, à cause de enregistreur ça pose un gros pb)

3) En C le mois (idem)

4) En D le n°semaine (idem)

Je voudrais que 2-3-4 soient fait en fonction de A comme pour le tri, et pas sur une plage fixe à cause de l’enregistreur

Tu verras j'ai fais un petit exemple ou comme des données ne sont pas en A, il y à une plage d'erreur

https://drive.google.com/open?id=0ByykuPoanvBmOXF3eDlQMXhFWVE

Merci beaucoup! :p
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
3 juin 2016 à 11:27
Résolu! J'ai créé une variable derniereLigne qui prend comme référence la colonne précédente, pour que la taille s'adapte toujours

Voila le résultat:


Sub DateMacro()


Dim DernLigne As Long

DernLigne = Range("A" & Rows.Count).End(xlUp).Row



Columns("A:A").Select
Application.CutCopyMode = False
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 4), TrailingMinusNumbers:=True
Selection.NumberFormat = "dd/mm/yy;@"
Range("B2").Select
ActiveCell.FormulaR1C1 = "=YEAR(RC[-1])"
Range("C2").Select
ActiveCell.FormulaR1C1 = "=MONTH(RC[-2])"
Range("D2").Select
ActiveCell.FormulaR1C1 = "=WEEKNUM(RC[-3])"
Range("D3").Select

Range("B2").AutoFill Destination:=Range("B2:B" & DernLigne)
Range("C2").AutoFill Destination:=Range("C2:C" & DernLigne)
Range("D2").AutoFill Destination:=Range("D2:D" & DernLigne)


End Sub
0
Désolé l'ami soucis perso... De retour lundi je te bip les macros et regarde les derniers messages
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
3 juin 2016 à 13:40
Rien de grave j’espère :/ En tout cas te prend pas le choux, je me suis débrouillé pour la grande majorité des problèmes :p Il ne restera plus qu'a trouver le moyen d'appeler cette BDD et ça va etre nickel

Un bon weekend et bon courage alors
0
Stif > Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019
8 juin 2016 à 19:54
Avec un peu de retard... J'espère que ça te servira quand même
http://www.cjoint.com/c/FFirY2xeKKO
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
9 juin 2016 à 11:34
Franchement énorme! Merci! J'ai réadapté aux nouveautés de ces dernières semaines mais franchement je n'aurais jamais su faire ce type de ciblage! Vraiment chapeau-bas! :p
0
Ah super si ça t'a aidé même avec le décalage horaire :-)
C'est rentre dans l'ordre pour moi donc hésites pas si tu as besoin d'autre chose et que c'est dans mes cordes
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
9 juin 2016 à 21:01
Je n'osais pas te demander si ça aller mieux, nickel si ça roule maintenant :p

La dernière modification éventuelle que je n'ai pas encore fait, (ni essayé), c'est une dernière macro indépendante qui s’appellerait "Sauvegarde_BDD" par exemple, qui justement après que le fichier a été traité, et la base de donnée mise à jour avec les inconnus éventuels, sauvegarde uniquement la BDD, (que la feuille BDD.xls ou .xlsx)

Parce que dans l'état actuel des choses, il faut re-séparer besoin_client et la BDD pour save que la BDD

Ce qui faciliterait grandement la MàJ :3

Mais grâce à toi et tes indications dès le début, j'ai pu carrément beaucoup avancer dans mon coin, j'ai choppé le truc, et pour ça vraiment merci!
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
14 juin 2016 à 14:55
J'ai une nouvelle colle si ça intéresse :p

Chaque produit est associé une date, elle peut-être passée/aujourd'hui/futur

En cas de date passé, pour tout les articles, il faut que la date des articles passé soit mise à la date du dernier jours du mois précédent

Par exemple aujourd'hui 14/06/2016
Tout les articles <14/06/2016 doivent prendre la date du 31/05/2016

Demain idem, les articles du 14/06/2016 -> 31/05/2016

Ce qui implique, une fonction d'excel qui donne surement à une variable le jour d'aujourd'hui. Et surement un petit test qui regarde si la date des articles est inférieur ou égale à la valeur de cette variable

je vais m'y mettre, si tu trouves avant moi tiens moi au jus :p

Un grand merci
0
Essaies quelque chose comme ça :

Dim dernierjour As Date

dernierjour = DateAdd("d", -1, CDate("1/" & Format(Date, "mm/yyyy")))
If Range("A6") < Date And Range("A6") <> "" Then Range("A6") = dernierjour

Dans ce cas ça teste la cellule A6 donc à adapter avec une petite boucle par exemple.
Dis moi si ça te va
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
Modifié par Brasiligun le 15/06/2016 à 08:17
C'est exactement ça merci :p Mais c'est de ma faute il y a eu une petite modification (sinon c'est pas marrant)

Alors il faut que pour le mois en cours les dates ne bougent pas, mais toutes les dates inférieurs au mois en cours, par exemple les date de février, mars, avril, mai prennent toutes la valeur du dernier jour du dernier mois précédent, en l’occurrence le 31 mai pour ce mois-çi


Concrètement un exemple, aujourd'hui 15 Juin 2016

28/02/2016 - > 31/05/2016
14/04/2016 -> 31/05/2016
20/05/2016 - > 31/05/2016
31/05/2016 - > 31/05/2016
01/06/2016 - > 01/06/2016
13/06/2016 - > 13/06/2016
15/06/2016 - > 15/06/2016
25/06/2016 - > 25/06/2016

Je m'y colle directement, te te tiens au jus si je m'en sors :p

Pour que ça te parle plus, voila le fichier, il n'y a que la colonne H qui nous intéresse:

https://drive.google.com/file/d/0ByykuPoanvBmTGdWMmMzdHZXS2s/view?usp=sharing
0
Stif > Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019
15 juin 2016 à 13:12
Essaies avec ça et dis moi :

Dim dernierjour As Date
If Range("A6") <> "" Then
dernierjour = DateAdd("d", -1, CDate("1/" & Format(Date, "mm/yyyy")))
If Month(Range("A6")) < Month(Date) And Year(Range("A6")) = Year(Date) Then Range("A6") = dernierjour
If Year(Range("A6")) < Year(Date) Then Range("A6") = dernierjour
End If
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
Modifié par Brasiligun le 15/06/2016 à 15:42
Parfait! Bien joué :p Plus qu'a le mettre dans une petite boucle pour qu'il parcourt toute la colonne. J'essayerai avec le truc que j'avais bidouillé dans ce genre la, pour parcourir une colonne qui peut-etre amenée a grandir


Dim DernLigne As Long

DernLigne = Range("A" & Rows.Count).End(xlUp).Row

Columns("A:A").Select
Application.CutCopyMode = False
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 4), TrailingMinusNumbers:=True
Selection.NumberFormat = "dd/mm/yy;@"
Range("B2").Select
ActiveCell.FormulaR1C1 = "=YEAR(RC[-1])"
Range("C2").Select
ActiveCell.FormulaR1C1 = "=MONTH(RC[-2])"
Range("D2").Select
ActiveCell.FormulaR1C1 = "=WEEKNUM(RC[-3])"
Range("D3").Select

Range("B2").AutoFill Destination:=Range("B2:B" & DernLigne)
Range("C2").AutoFill Destination:=Range("C2:C" & DernLigne)
Range("D2").AutoFill Destination:=Range("D2:D" & DernLigne)


J'espère pouvoir essayer avant ce soir, je te dis quoi et merci :p

EDIT: j'ai regardé vite fait, mais j'ai pas encore su la lancer sur une colonne complète
0
Tu parles pour les lignes que je t'ai envoyé ? Si c'est ça je peux te préparer une petite boucle si tu me dis la colonne ou seront les dates
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
24 juin 2016 à 13:33
Si tu es toujours d'attaque, j'ai un morceau encore plus gros :p
0
Yes avec plaisir l'ami
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
25 juin 2016 à 12:16
Mais la honnêtement c'est un sacré morceau :p J'ai terminé toute ma partie grâce à toi, mais du coup quelqu'un d'un autre service m'a demandé si je pouvais faire un truc pour lui

J'ai regardé et je suis lui ai carrément dit que c'était hardcore :p Mais il me reste une semaine après je suis liiiiiiiiiiiiiiiiiiiiiiiiiibre (je ne chanterais pas :3)

En fait, tout les jours il a une liste, avec les retards d'envois ou le bon respect de délai de différentes commandes client, et tous les jours, qu'elles soient en retards ou non, il doit envoyé l'état de ces commandes aux clients

Mais, j'ai déjà une macro qui permet d'envoyer a chaques clients en cochant leurs noms, un mail de rappel, (j'ai déjà la feuille avec les noms et les mails correspondants, ainsi que la feuille à cocher pour l'envois, et la macro qui fait ce mail de rappel, le tout fonctionnel)

Il faudrait donc l'adapté à la fiche d'état des commandes, pour scinder cette feuille et envoyer l'état des commandes aux bon clients correspondants et non à tout le monde la même feuille

J'ai conscience que c'est pas super claire :p Et que ça va être plus compliqué, je récupère ce que j'ai déjà fait et qui fonctionne lundi je te l'enverrais, ça sera plus claire

En tout cas un bon weekend à toi et merci de ta bonne volonté

Thomas
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
27 juin 2016 à 08:27
Voila les fichiers, il y a un début qui s'appliquait à un autre fichier, mais j'aurais besoin qu'en cochant les cases correspondantes dans le fichier "relance", la macro envoie par mail l'état du fichier OTD aux client des lignes correspondantes, par exemple si on coche client1 et client3, client1 recevra les lignes correspondante au client1 du fichier OTD, et idem client3

les adresses mails et les noms serront dans le fichier _Fournisseurs_

Merci de ton aide, je t'avoue que je me casse vraiment les dents dessus :/

J'aurais pas du devoir le faire mais comme j'ai fini ma partie ils m'ont demandé de regarder :p

Un grand merci l'ami!
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
27 juin 2016 à 11:11
Edit: ça ira vachement mieux avec ça :p

https://drive.google.com/folderview?id=0ByykuPoanvBmQ05yX3NFVkYyMUE&usp=sharing
0
Salut l'ami je regarde ça dès demain je devrais avoir un peu de temps !
Je te tiens au jus..
Bonne soirée
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
28 juin 2016 à 08:05
Ça marche merci, mais c'est un sacré morceau la :p
0
Bonjour,
Voici qui devrait te donner une bonne base de départ pour ta demande.

http://www.cjoint.com/c/FFCmfvQdfgG

N'oublies pas de changer les chemins des fichiers à ouvrir dans les macro.

Pour le corp du mail qui s'envoie automatiquement je te laisse marquer ce que tu veux... là "Veuillez trouver ci-joint le fichier des lignes de commandes en attente d'Accusé Réception. (6 lignes) " avec le nombre de lignes qui se calcule en fonction des cellules vides colonne T du fichier OTD (pour le client en question évidemment)

Tiens mi au courant si ça te va

Ps : moi aussi c'est Thomas ;)
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
Modifié par Brasiligun le 28/06/2016 à 15:03
Une invasion de Thomas! Des Thomas, des Thomas paaaaaartout!

Non plus sérieusement un énorme merci à toi, la franchement, pour faire un peu de poésie, ça me trou le cul :p C'est exactement le rendu que j'avais besoin, j'ai galéré dessus pourtant surtout sur la partie découper le fichier OTD

Franchement, merci! J'ai une question cependant, peut-on travailler sur uns des fichiers OTD découpé avant qu'il soit envoyé? Lui appliqué un formule Excel toute bête? Ou le fichier est "scellé" pour l'envoie?

Et a quoi sert le testclient = 2?

Par exemple pour chaque OTD par client, lui appliqué un moyenne par exemple?

En tout cas, cher homonyme: Respect et Robustesse!
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1
30 juin 2016 à 11:24
Ah non il reste un problème, mais c'est peut-etre moi qui est mal intégré ton code regarde:


Public classeur2 As String
Public classeur3 As String
Public mailclient As String
Public lignesenretard As Integer
Public OTDcible As String
Public nomODTcible As String

Option Explicit




Sub Envoi_OTD()
Dim a As Variant, b As Variant
Dim classeur1 As String
Dim I As Variant, J As Variant
Dim clienta As String, clientb As String
Dim testclient As Integer
testclient = 2

MsgBox ("Séléctionner le fichier OTD:")
ChDrive "K:" ' Choix du lecteur
ChDir "K:\Systeme_D-info\PIC\archive\Macro TJ\Mail OTD" 'Choix du répertoire
a = Application.GetOpenFilename("fichier excel (*.xlsx), *.xlsx", _
, "Quel sera le PJ à renseigner ?", , True)

Select Case TypeName(a)
Case Is = "Boolean"
Exit Sub
Case Else
For b = LBound(a) To UBound(a)
Workbooks.Open a(b)
Next
End Select
nomODTcible = ActiveWorkbook.Name
OTDcible = ActiveWorkbook.FullName
Windows(nomODTcible).Close False

classeur1 = ActiveWorkbook.Name
Application.ScreenUpdating = False

For I = 2 To Range("B" & Rows.Count).End(xlUp).Row
If Cells(I, 1) <> "" Then
'clienta = Cells(I, 2)
clienta = StrConv(Cells(I, 2).Value, vbProperCase)
'Cells(I, 2) = StrConv(Cells(I, 2).Value, vbProperCase)
'clienta = Cells(I, 2).Value
Workbooks.Open ("K:\Systeme_D-info\PIC\archive\Macro TJ\Mail OTD\OTD.xlsx")
classeur2 = ActiveWorkbook.Name
Windows(classeur2).Activate
ChDir "K:\Systeme_D-info\PIC\archive\Macro TJ\Mail OTD"
ActiveWorkbook.SaveAs Filename:="OTD_" & clienta & classeur2
classeur2 = ActiveWorkbook.Name
Windows(classeur2).Activate
Do While Cells(testclient, 2) <> ""
If Cells(testclient, 2) = "" Then Exit Do
If clienta <> StrConv(Cells(testclient, 2), vbProperCase) Then Cells(testclient, 2).EntireRow.Delete
If clienta = StrConv(Cells(testclient, 2), vbProperCase) Then testclient = testclient + 1
Loop
'lignesenretard
For J = 2 To Range("B" & Rows.Count).End(xlUp).Row
If Cells(J, 20) = "" And Cells(J, 2) <> "" Then lignesenretard = lignesenretard + 1
Next J


Columns("T:T").Select
Selection.TextToColumns Destination:=Range("T1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(0, 1), TrailingMinusNumbers:=True

Dim DernLigne As Long
DernLigne = Range("A" & Rows.Count).End(xlUp).Row

Rows("1:1").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

'Nb de lignes
Range("M1").Select
ActiveCell.FormulaR1C1 = "Nb de lignes:"
Range("N1").Select
ActiveCell.FormulaR1C1 = (DernLigne - 1)

'Nb cellule non vides
Range("P1").Select
ActiveCell.FormulaR1C1 = "Lignes non vides:"
Range("Q1").Select
ActiveCell.FormulaR1C1 = "=COUNTA(R[2]C[3]:R[199]C[3])"

Range("S1").Select
ActiveCell.FormulaR1C1 = "OTD:"

'Cellule non vides/Nb de ligne
Range("T1").Select
ActiveCell.FormulaR1C1 = "=RC[-3]/RC[-6]"


Range("A1").Select
Windows(classeur2).Close True


Workbooks.Open ("K:\Systeme_D-info\PIC\archive\Macro TJ\Mail OTD\Fournisseurs\_Fournisseurs_.xls")
classeur3 = ActiveWorkbook.Name
Windows(classeur3).Activate
For J = 2 To Range("A" & Rows.Count).End(xlUp).Row
If clienta = StrConv(Cells(J, 1), vbProperCase) Then
If Cells(J, 2) = "" Then
MsgBox "ATTENTION aucun Email Fournisseur n'est renseigné pour le client" & clienta
ChDir "K:\Systeme_D-info\PIC\archive\Macro TJ\Mail OTD"
Kill classeur2
Exit Sub
Else:
mailclient = Cells(J, 2).Value
Call mail
ChDir "K:\Systeme_D-info\PIC\archive\Macro TJ\Mail OTD"
Kill classeur2
End If
End If

Next J
Windows(classeur3).Close False
End If

lignesenretard = 0
testclient = 2
Windows(classeur1).Activate

Next I


MsgBox ("Mail(s) envoyé(s)")


Application.ScreenUpdating = True
End Sub

Sub mail()
Dim OutApp As Object
Dim OutMail As Object
Dim strbody As String
Dim olFormatHTML As String






Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
With OutMail
.To = mailclient
.Subject = "OTD"
.Body = "Veuillez trouver ci-joint le fichier ODT" & vbCrLf & vbCrLf & "Cordialement"
.Attachments.Add "K:\Systeme_D-info\PIC\archive\Macro TJ\Mail OTD\" & classeur2
.Send
End With
Set OutApp = Nothing
End Sub



Il reste ce morceau "Workbooks.Open ("K:\Systeme_D-info\PIC\archive\Macro TJ\Mail OTD\OTD.xlsx")" qui fait que le fichier ne lit pas en fait l'OTD qu'on lui a donné, mais toujours celui par défaut
0
oui remplace la ligne Workbooks.Open ("K:\Systeme_D-info\PIC\archive\Macro TJ\Mail OTD\OTD.xlsx" par Workbooks.Open OTDcible et ca devrait fonctionner
0
Brasiligun Messages postés 122 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 4 mars 2019 1 > Stif
30 juin 2016 à 15:39
Nickel nickel! Un grand merci et bonne fin d'après-midi

Thomas
0