Macro VBA
Sinon si tu repasses par ici...
J'ai fait une maccro utilisant des tableaux sur VBA pour te faire le même boulot, tu peux changer l'organisation de pertinence comme bon te semble tant que tu gardes la logique du "le plus petit est le plus prioritaire, le plus grand le moins prioritaire".
Il te suffit d'appuyer sur le bouton Synthèse et ça te fait le travail rapidement
J'ai choisis de faire le résultat dans une feuille exemple pour garder les données initiales mais il suffira de changer le dernier Sheets().select à la fin du programme pour que ça le fasse dans BASE LIVRAISON
Je te laisse voir le résultat :
Merci infiniment; juste pour issa par exemple lorsque je clic sur synthèse j'ai le statut annulé qui s'affiche pourtant le statut le plus pertinent c'est en cours! comment faire???
Rebonjour,
Il s'agit d'un oubli de ma part, dans le programme quand je trouve le même code cde entre les tableaux résultat et base_livraison, je compare les valeurs de code statut et si celui de base_livraison est plus petit, on remplace celui du tableau résultat, mais j'avais oublié de remplacer également le statut!
J'ai appliqué ce correctif et ça renvoie bien en cours maintenant!
Je te remercie d'avoir vérifié ça
Voici le résultat :
OHHhhhh merciiii beaucouppppppppppppp t'es génial!
Bonjour,
J'ai bien reçu ton message privé, malheureusement sans savoir quel code d'erreur te renvoie VBA, à quelle ligne ça t'arrête, et quelles adaptations tu as fait, c'est impossible de te répondre
Si tu peux me fournir ces informations je pourrai sûrement t'aider, je serais presque prêt à parier que c'est un problème de référence ou de tableau
slt! ok pas de soucis je vais copier le code avec les principaux changement fait dessus en espérant que tu comprennes!
Sub Synthèse()
Application.ScreenUpdating = False
Dim base_livraison()
Dim pertinence()
Dim resultat()
nb_lig_resultat = 1 'pour éviter de chercher dans les lignes vides de résultat
der_lig = Range("A" & Rows.Count).End(xlUp).Row
der_col = Range(Cells(1, Columns.Count).Address).End(xlToLeft).Column
base_livraison() = Range(Cells(2, 1).Address, Cells(der_lig, der_col).Address)
Sheets("pertinence").Select
Range("A1", Range("A1").End(xlDown).End(xlToRight).Address).Select
pertinence() = Selection 'enregistrement des codes de statut
'enregistrement des codes statuts dans base_livraison
ReDim Preserve base_livraison(1 To UBound(base_livraison, 1), 1 To UBound(base_livraison, 2) + 1) 'ajout d'une colonne pour stocker les codes de statut
'affectation d'un code à chaque statut
For e = 1 To UBound(base_livraison, 1) 'on regarde toutes les lignes de base_livraison
For x = 1 To UBound(pertinence, 1) 'on cherche le même code dans pertinence
If base_livraison(e, 21149) = pertinence(x, 1) Then 'si on trouve le code
base_livraison(e, 21150) = pertinence(x, 2) 'on affecte le code qui va avec
End If
Next x
Next e
ReDim resultat(1 To UBound(base_livraison, 1), 1 To 21150) 'on redimensionne résultat avec le même nombre de lignes que base_livraison
'on enregistre la première ligne
For i = 1 To UBound(base_livraison, 2)
resultat(1, i) = base_livraison(1, i)
Next i
'puis on regarde chaque ligne de base_livraison sauf la première ligne qui est déjà enregistrée
For i = 2 To UBound(base_livraison, 1)
trouve = "non" 'on initialise la variable trouve
For e = 1 To nb_lig_resultat 'pour chaque ligne remplie du tableau résultat
If base_livraison(i, 21148) = resultat(e, 21149) Then 'si on trouve le code cde dans résultat
If base_livraison(i, 21150) < resultat(e, 21150) Then 'on compare les statuts
resultat(e, 21150) = base_livraison(i, 21150) 'et on remplace si celui das base_livraison est plus petit
resultat(e, 21149) = base_livraison(i, 21149) 'et on remplace le statut qui va avec!
End If
trouve = "oui" 'on enregistre le fait qu'on ait trouvé la valeur
Exit For 'on arrête de la chercher dans résultat
End If
Next e
If trouve = "non" Then 'si on ne trouve pas le code cde
nb_lig_resultat = nb_lig_resultat + 1 'on enregistre le fait qu'on ajoute une ligne
For x = 1 To UBound(resultat, 2)
resultat(nb_lig_resultat, x) = base_livraison(i, x) 'et on ajoute la ligne
Next x
End If
Next i
'On remet résultat dans base LIVRAISON j'utilise une feuille exemple
Sheets("exemple").Select
Range("A2", Range("A2").End(xlDown).End(xlToRight).Address) = "" 'on vide la feuille en gardant les en-têtes
'et on reremplis
For i = 1 To nb_lig_resultat 'pour toutes les lignes
For j = 1 To UBound(resultat, 2) - 1 'pour toutes les colonnes sauf le code statut dont on a plus besoin (d'où le -1)
Cells(1 + i, j) = resultat(i, j)
Next j
Next i
Application.ScreenUpdating = True
End Sub
quand j'exécute il est écrit erreur d'exécution '9'
'indice n'appartient pas à la sélection
voila! merciii de ta dispo
Bonjour,
Vu le code d'erreur et ce que tu as fait dans le programme, je vois vite pourquoi ça débloque
Tu as remplacé des valeurs par 21149 et 21150, je ne sais pas pourquoi d'ailleurs
Du coup si on lit la première ligne où il y a un problème :
If base_livraison(e, 21149) = pertinence(x, 1) Then 'si on trouve le code
Je doute que ton tableau base livraison ait 21149 colonnes
à mon avis l'erreur vient de là, tu demandes la valeur qui se trouve dans la ligne e et la colonne 21149 du tableau base_livraison, si cette case du tableau n'existe pas, ça plante.
Pourquoi voulait tu ajouter ces valeurs?
slt! ah je vois en fait mon tableau a 21150 lignes et dans la colonne E j'ai le statut! du coup j'aurais pas du changer alors si je comprends bien?????
Rebonjour,
Tu veux dire que ton tableau, ton vrai n'est pas le même que celui mis en exemple?
Si c'est le cas voici les valeurs qu'il faut changer :
le 8 il faut le remplacer par le numéro de colonne qui contient ton statut
le 9 il faut le remplacer par le nombre de colonnes que contient ton tableau + 1
Le 8 va chercher la colonne statut, le 9 va chercher la dernière colonne du tableau dans laquelle tu as enregistré les code de statut via le programme, sachant qu'on doit rajouter une colonne au tableau d'origine pour enregistrer cette information, d'où le +1
EDIT:
Quand au nombre de lignes, il n'y a rien besoin de changer
Cette ligne s'occupe de ça :
der_lig = Range("A" & Rows.Count).End(xlUp).RowElle part de la dernière ligne du classeur et s'arrête à la première ligne remplie dans la colonne A en partant vers le haut et enregistre son numéro de ligne, elle renverra toute seule la valeur 21150, et le reste du programme s'y adaptera
Ah d'accord j'ai compris merciiiii beaucoup
salut!
If base_livraison(h, 5) = pertinence(x, 1) Then 'si on trouve le code
base_livraison(h, 25) = pertinence(x, 2) 'on affecte le code qui va avec
j'ai encore eu le même message d'erreur et du coup j'ai cliqué sur débogage il m'a surligné ce qui est au dessus!
alors mon tableau a 24 colonnes normalement et le statut se trouve à la 5ième colonne de mon tableau!
du coup je ne vois pas trop ou est l'erreur si tu peux m'aider à le trouver! car comme tu l'as dit le 5 doit indiquer le numero de la colonne statut, et le 24 nombre de colonne +1 donc normalement je dois avoir 25 colonnes! du coup j'ai mis 25
Merciiiiiiiiiiiiiiiiii
bonjour!
je viens de me pencher encore sur mon tableau et j'ai essayer de rentrer les valeurs tel que tu l'as indiqué! cependant, le message d'erreur qui s'affiche est "l'indice n'appartient pas à la sélection"! que dois je comprendre de ce message s'il te plait? :bof
merciii d'avance!
Rebonjour!
Question un peu bête mais on ne sait jamais :
Tu as bien mis for h au lieu de for e ?
Comme tu cherches à la ligne h
Sinon tu parles de la ligne du dessus...
Est ce que tu peux soit transmettre ton fichier ou bien me remettre le code que tu as actuellement en spoiler
comme ceci
et la ligne de code où ça bloque?
Parce que je peux difficilement deviner où ça bloque, quand je suis en débogage, c'est facile de suivre les valeurs, mais se les imaginer...
J'ai du mal à t'aider pour cette raison
bonjour!
Sub Synthèse()
Application.ScreenUpdating = False
Dim base_livraison()
Dim pertinence()
Dim resultat()
nb_lig_resultat = 1 'pour éviter de chercher dans les lignes vides de résultat
der_lig = Range("A" & Rows.Count).End(xlUp).Row
der_col = Range(Cells(1, Columns.Count).Address).End(xlToLeft).Column
base_livraison() = Range(Cells(2, 1).Address, Cells(der_lig, der_col).Address)
Sheets("pertinence").Select
Range("A1", Range("A1").End(xlDown).End(xlToRight).Address).Select
pertinence() = Selection 'enregistrement des codes de statut
'enregistrement des codes statuts dans base_livraison
ReDim Preserve base_livraison(1 To UBound(base_livraison, 1), 1 To UBound(base_livraison, 2) + 1) 'ajout d'une colonne pour stocker les codes de statut
'affectation d'un code à chaque statut
For h = 1 To UBound(base_livraison, 1) 'on regarde toutes les lignes de base_livraison
For x = 1 To UBound(pertinence, 1) 'on cherche le même code dans pertinence
If base_livraison(h, 5) = pertinence(x, 1) Then 'si on trouve le code
base_livraison(h, 24) = pertinence(x, 2) 'on affecte le code qui va avec
End If
Next x
Next h
ReDim resultat(1 To UBound(base_livraison, 1), 1 To 24) 'on redimensionne résultat avec le même nombre de lignes que base_livraison
'on enregistre la première ligne
For i = 1 To UBound(base_livraison, 2)
resultat(1, i) = base_livraison(1, i)
Next i
'puis on regarde chaque ligne de base_livraison sauf la première ligne qui est déjà enregistrée
For i = 2 To UBound(base_livraison, 1)
trouve = "non" 'on initialise la variable trouve
For h = 1 To nb_lig_resultat 'pour chaque ligne remplie du tableau résultat
If base_livraison(i, 4) = resultat(h, 5) Then 'si on trouve le code cde dans résultat
If base_livraison(i, 24) < resultat(h, 24) Then 'on compare les statuts
resultat(h, 24) = base_livraison(i, 24) 'et on remplace si celui das base_livraison est plus petit
resultat(h, 5) = base_livraison(i, 5) 'et on remplace le statut qui va avec!
End If
trouve = "oui" 'on enregistre le fait qu'on ait trouvé la valeur
Exit For 'on arrête de la chercher dans résultat
End If
Next h
If trouve = "non" Then 'si on ne trouve pas le code cde
nb_lig_resultat = nb_lig_resultat + 1 'on enregistre le fait qu'on ajoute une ligne
For x = 1 To UBound(resultat, 2)
resultat(nb_lig_resultat, x) = base_livraison(i, x) 'et on ajoute la ligne
Next x
End If
Next i
'On remet résultat dans base LIVRAISON j'utilise une feuille exemple
Sheets("exemple").Select
Range("A2", Range("A2").End(xlDown).End(xlToRight).Address) = "" 'on vide la feuille en gardant les en-têtes
'et on reremplis
For i = 1 To nb_lig_resultat 'pour toutes les lignes
For j = 1 To UBound(resultat, 2) - 1 'pour toutes les colonnes sauf le code statut dont on a plus besoin (d'où le -1)
Cells(1 + i, j) = resultat(i, j)
Next j
Next i
Application.ScreenUpdating = True
End Sub
voila en gros le code que j'ai modifié compte tenu des infos que j'ai! je te transmets aussi en pj le tableaux avec les différents titres! j'espère que avec ca tu pourras m'aider!
désolée j'ai rajouté un infos sur ce fichier!
merciiiii d'avance pour ton aide
Alors alors...
J'ai repris le code et l'ai modifié un peu :
Les sheets.select sont remplacés par des with sheets, ça fait la même chose mais sans avoir à changer de feuille.
Tu n'as plus besoin de renseigner 5 et 25 partout, seulement 5 dans la variable col_statut, un des problèmes que tu avais c'est que tu avais raté des valeurs dans le programme par exemple, car c'était tout fixe (des 4, des 8...). Je pensé que ça t'a posé problème à un moment car tu ne travaillais pas avec les bonnes colonnes.
Autre chose à noter :
J'avais mis une feuille exemple pour tester le programme, maintenant j'ai directement dis de mettre le résultat dans base_livraison. Une fois le résultat mis, j'efface les cellules qui sont encore remplies avec les anciennes données et qui n'ont pas été écrasées lors du programme.
Voici le résultat :
Je te laisse tester comme je n'ai pas pu
J'espère que ça marchera cette fois!
Autre chose importante :
Il faut au moins une ligne remplie en plus de l'en tête pour que ça ne plante pas.
salut merci de ta dispo! du coup je vais essayer et je te dis si ca fonction!
SLT
alors je te mets en pj le fichier et j'ai rempli juste deux colonnes qui sont pour moi importante! j'espère que avec ca on pourra aboutir à un résultat concrèt!
merci encore pour le temps que tu m'accordes!
Rebonjour,
C'est normal tu comparais par exemple à valider à : à VALIDER qui n'est pas pareil, ou encore ANNULER à : annulé,
j'ai encore modifié des choses et maintenant ça fonctionne :
Bonjour Ausecour,
merci pour ton aide cela fonction! merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii merciiiiiiiiiiiiiiiiiiii!