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).Row

Elle 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 je le fais et je te tiens au jus!

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

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!

Rechercher des sujets similaires à "macro vba"