VBA : comparer des couples de cellules

Bonjour tout le monde,

Je suis nouveau en VBA (et en codage en general), et j'aurais besoin d'un coup de pousse (un gros !).

Mon objectif est de savoir si l'un des pays, traversé par le transporteur, est férié ou non (si non, écrire PDI en colonne A, si oui, ne rien faire).

Ainsi, je voudrais travailler avec des couples de cellules.

Par exemple, j'essaye de retrouver le couple A-B (feuil1 : (C5;H5)) dans les colonnes C et J de la feuil 2 (ce couple est en (C3;J3).

Puis regarder si, lors de ce circuit entre pays A et pays B, le transporteur passe par un pays ayant un jour férié (les pays de transit pour ce couple sont C et F (feuil2), or il y a un jour férié dans le pays F (feuil1).

Ainsi, il, j'aimerais ne rien marquer dans la colonne A de la feuil1, et passer au couple suivant (C6;H6) de la feuil1.

J'essaye d'être le plus clair possible, mais je sais que ca ne l'est pas vraiment...

Si quelqu'un comprend, pourriez vous m'aiguiller, svp ?????

Merci d'avance

PS : j'ai essayé avec des IF, While, Until, VlookUp, ... je suis complètement perdu !

Bonjour,

Alors tout d'abord, abordons le sujet de la présentation des données et des explications, car si tu n'arrives pas à t'en sortir, c'est peut-être aussi car le problème est mal posé / organisé, mais il devrait être réalisable via quelques boucles imbriquées.

De ce que je comprends, tu veux déterminer si il y a un jour férié dans le pays dans lequel passe un transporteur lors de son trajet entre "l'exportateur" et "l'importateur" ?

Pour commencer, je présume qu'il doit y avoir des jours fériés dans pratiquement tous les pays, du coup, savoir si ce pays possède un jour férié, ne t'avancerait pas tellement, c'est en fait de savoir si le jour où tu y passes, si celui-ci est férié non ?

Donc déjà, une des premières tables que tu devrais renseigner, c'est la liste des pays que tu peux potentiellement traverser, avec pour chacun d'entre eux, la liste des jours fériés, avec les noms de pays en abscisse et sous chaque, les dates des jours (sous le format jj/mm par exemple) => en gros refaire ton tableau "jours fériés".

Ensuite concernant ton tableau sur les trajets prévus, à quoi correspondront tous ces "blabla" ?

Concernant ton tableau sur les régions de transit, pas spécialement de remarque, à part une seule : tous ces pays sont "traversables" en combien de temps ?

En effet, un petit pays comme la Suisse, tu le traverse en quelques heures, pour traverser la Chine ou la Russie, cela peut prendre plusieurs jours. Il s'agit donc pour moi d'une donnée importante, en effet, si il te faut un temps X pour traverser un pays / une région qui est supérieur au temps Y qu'à le droit de rouler le chauffeur, cela signifie que pour une étape donnée, il faut vérifier si le jour même mais aussi peut-être le lendemain est férié.

Il y a aussi une notion d'heure de départ et d'arrivée, si ton chauffeur doit transiter par 3 ou 4 pays, suivant le moment où il part / arrive dans chacun d'entre eux, il faudra peut-être vérifier sur plusieurs jours si ceux-ci sont fériés ou non, etc etc.

Enfin bref, même si je me doute que tu as "simplifié" les informations transmises pour ne pas trop nous embrouiller, je pense qu'il en manque tout de même un certain nombre, et qu'il va être difficile de solutionner ton problème en l'état.

Je te conseillerais donc de bien reprendre ta problématique à plat, de voir si ton fichier contient effectivement tous les informations nécessaires à sa résolution, et les y incorporer le cas échéant. Et seulement ensuite, si tu n'arrives pas à aboutir au niveau du code, nous pourrons t'aider à corriger tes erreurs à partir du code que tu auras essayé de faire.

Cordialement,

Bonjour Zirak,

Merci pour ta réponse !

Comme tu le dis, il y a des pays plus long à traverser, et chaque trajet a son propre temps de route. (et il y a environ 2500 trajets!).

C'est pourquoi j'aimerais tout d'abord me focaliser sur les trajets ne traversant pas des pays ayant de jours fériés. En effet, lorsqu'un trajet passé par un pays ayant un jour férié, il y a une analyse à faire et à adapter au contexte (qui me semble un peu compliqué à automatiser, du moins à mon niveau).

Du coup, mon objectif est juste de savoir si, pour chaque circuit et dans les jours à venir (souvent, 30j), il y a un jour férié dans les pays traversés par le transporteur (si oui, ne rien faire, ca sera le boulot de mes collègues, si non, leur simplifier la tâche en leur disant qu'aucune analyse n'est nécessaire).

J'ai simplifié mon Excel, pour essayer de render le probleme plus clair, et aussi car je travaille pour une grosse entreprise (donc données potentiellement confidentielles :s).

Merci pour tes conseils, je vais creuser la piste et retravailler mon tableau de "circuits généraux" en y integrant directement les jours fériés, et repartir de là !!

Bien cordialement

Abeaupere a écrit :

Du coup, mon objectif est juste de savoir si, pour chaque circuit et dans les jours à venir (souvent, 30j), il y a un jour férié dans les pays traversés par le transporteur (si oui, ne rien faire, ca sera le boulot de mes collègues, si non, leur simplifier la tâche en leur disant qu'aucune analyse n'est nécessaire).

Dans ce cas là, pour cette première étape, prévoir comme je le préconisais une refonte du tableau des jours fériés, (que l'on ait bien la liste de tous les jours fériés pour chaque pays).

Ensuite, il faut que dans ton tableau sur les trajets prévus, il y ait l'information de la date de départ pour chaque trajet ou chacun d'entre eux sera effectué dans les jours à venir et tu comptes 30 jours à partir de la date d'utilisation du fichier (chaque trajet étant forcément effectué d'ici là) ? Dans le 2ème cas, cela sera encore plus simple puisqu'il suffira de boucler sur ta liste de jours fériés puisque tu garderas la même variable de date pour toutes tes comparaisons.

Voilà comment je vois la chose (je ne le précise pas à chaque fois, mais chaque boucle est imbriquée dans la précédente):

  • une boucle qui va passer sur chacun de tes trajets prévus, afin d'identifier le couple départ / arrivée.
  • pour chaque couple trouvé, une boucle cherche ce couple dans ton tableau de circuit.
  • une fois le couple trouvé, une boucle horizontale cette fois, pour passer sur chaque pays composant le trajet.
  • pour chaque pays identifié, via une recherche horizontale, ou une fonction MATCH, ou une boucle, il faudra retrouver la bonne colonne du pays dans ton tableau de jours fériés.
  • enfin, une dernière boucle qui pour chaque jour férié potentiel, vérifie si il a lieu pendant ton trajet ou non (par exemple si jour férié > date du jour et jour férié < date du jour +30 alors férié = vrai)

Si lorsque tu as bouclé sur tous tes pays pour un trajet donné, si ta variable "férié" est toujours "fausse", alors ce trajet est ok et tu peux passer au trajet suivant.

N'hésites pas à revenir avec ton début de code si jamais tu bloques sûr un point précis.

Cordialement,

Alors, j'ai commence à faire un code, mais il est biiiieeen trop lourd (je ne savais pas que c'était possible :p).

Je dois donc faire des boucles, mais je suis un peu perdu.

Si la cellule C3 contient l'un des mots des cellules de (D3 à D27), alors ...

Si la cellule C4 contient l'un des mots des cellules de (D3 à D27), alors ...

Si la cellule C5 contient l'un des mots des cellules de (D3 à D27), alors ...

etc...... (pour l'instant, jusqu'a C99, mais ce chiffre va augmenter...)

Any help ??

Merci d'avance !!

(suite du message precedent)

En gros, il faudrait que je boucle ça :

If InStr(1, Range("C3"), Worksheets("jours fériés").Range("D2")) > 0 _

or InStr(1, Range("C3"), Worksheets("jours fériés").Range("D3")) > 0 _

or ............. (etc jusqu'à D27)

Then

Range("L3") = ""

Else: Range("L3") = "PDI"

End If

if InStr(1, Range("C4"), Worksheets("jours fériés").Range("D2")) > 0 _

or InStr(1, Range("C4"), Worksheets("jours fériés").Range("D3")) > 0 _

or ............. (etc jusqu'à D27)

Then

Range("L4") = ""

Else: Range("L4") = "PDI"

End If

...... (etc jusqu'à C99...)

Any idea ? :p

Bonjour,

sans fichier que représente la réalité non.

eric

Bonjour,

Je ne peux pas vous donner le fichier d'origine, qui est confidentiel, et realiser un fichier de demo me prendrait trop de temps.

Merci de votre aide !!

Pas de soucis...

Bonne chance

Il te faut passer par des boucles imbriquées, typiquement ta première boucle (vu que tu parles de C3, C4, C5, etc etc) :

si ta première ligne commence donc en C3 :

Dim ligne as long

ligne = 3

do while Range("C" & ligne) <> ""
      'suite du code

    ligne = ligne+1
loop

Déjà tu n'as pas à répéter 99 fois ou plus ton appel.

Ensuite, c'est dans la partie 'suite du code, que le travail se fait, tu peux par exemple concaténer ton pays de départ et d'arrivé dans une variable, que tu rechercherais dans ton tableau des trajets.

Tableau des trajets que tu pourrais construire ainsi (liste des en-tête dans l'ordre) :

"concaténation" / "pays départ" / "pays intermédiaire 1" / "pays intermédiaire 2" / etc / etc / "pays d'arrivée"

Du coup, une simple fonction match(= EQUIV en formule fr), sur la première colonne, te retournerait la ligne du trajet à vérifier.

Une fois que tu connais le numéro de la ligne, tu peux faire une boucle horizontale sur cette ligne pour passer sur chaque cellule du pays de départ au pays d'arrivé. Si le contenu est vide, tu ne fais rien, sinon tu parcours la liste des jours fériés du pays indiqué dans la cellule.

Si tu fais cette dernière boucle de la façon indiquée dans mon message précédent :

- enfin, une dernière boucle qui pour chaque jour férié potentiel, vérifie si il a lieu pendant ton trajet ou non (par exemple si jour férié > date du jour et jour férié < date du jour +30 alors férié = vrai)

Si la variable est vrai ou fausse, tu mets "PDI" dans Range("L" & ligne) de ta première boucle.

Honnêtement, je n'ai ni le temps, ni l'envie de te fournir le code complet (d'une part car sans le fichier originel, c'est très difficile et puis surtout, tu n'apprendrais pas autant), mais tu peux obtenir le résultat désiré avec des boucles imbriquées, sans devoir copier / coller 99 fois les mêmes traitements.

Dès que j'ai le temps, j'essai de te poster un exemple d'imbrication de 2 ou 3 boucles, pas forcément avec du code utilisable directement, peut-être plus sous forme d'algo, histoire que tu comprenne comment ça marche et que tu essais tout de même d'y arriver par toi-même (tu n'en seras que plus content ).

Bonjour,

Donc je reviens sur mes boucles, mais je tiens à préciser, que pour te faciliter la tâche dans ce genre d'exercice, tu devrais écrire l'algorithme de ton traitement, en simple français, pour pouvoir déterminer comment va s'architecturer ton code.

Par exemple, partons de l'énoncé (je vais le faire avec du vrai code pour gagner du temps, mais si tu ne connais pas un minimum les différentes fonctions existantes il vaut mieux le faire de façon plus verbeuse au départ) :

Tu as besoin, pour chaque trajet d'une liste, de vérifier si pour chaque pays traversé lors du trajet, il y aura un jour férié dans les 30 jours à venir .

Pour chaque trajet => il te faut donc une boucle qui, ligne à ligne va traiter le trajet indiqué :

(je me base sur les lignes / colonnes de ton fichier exemple de ton 1er message, sur lequel je n'ai fais qu'ajouter en colonne B de ton tableau de circuit, la concaténation du pays de départ et du pays d'arrivé, comme identifiant, comme suggéré dans mon message précédent).

Sub test()

Dim ligne As Long

ligne = 5

'Boucle Do While qui va parcourir la liste de tes trajets à venir.
Do While Worksheets("trajets prévus").Range("C" & ligne) <> ""

    'futur code
    'futur code
    'futur code

    ligne = ligne + 1
Loop

End Sub

Tu as donc ta première boucle, qui part de la 1ère ligne, effectuera le futur code, puis on incrémente la variable de la ligne pour passer à la suivante, et on retourne au début de la boucle pour effectuer le futur code sur cette nouvelle ligne, etc etc.

Quand tu es sur ton 1er trajet (puis chacun des trajets suivants), tu dois, pour pouvoir aller vérifier chaque pays concerné, identifier le circuit de la ligne et le retrouver dans ton tableau.

Sub Bouton1_Cliquer()

Dim ligne As Long, ligne_circuit As Long
Dim trajet As String

ligne = 5

'Boucle Do While qui va parcourir la liste de tes trajets à venir.
Do While Worksheets("trajets prévus").Range("C" & ligne) <> ""

    'Concaténation du pays de départ, et du pays d'arrivé comme identifiant.
    trajet = Worksheets("trajets prévus").Range("C" & ligne) & Worksheets("trajets prévus").Range("H" & ligne)

    'Recherche de cet identifiant dans le tableau des circuits.
    'On ajoute +2 à la ligne trouvée, car notre tableau ne commence pas à la ligne 1 de l'onglet mais à la ligne 3.
    ligne_circuit = Application.WorksheetFunction.Match(trajet, Worksheets("circuits généraux").Range("B3:B18"), 0) + 2

    'affichage du n° de la ligne de l'onglet "circuits généraux" contenant le trajet recherché
    MsgBox "Le trajet " & trajet & " se situe ligne " & ligne_circuit & " du tableau des circuits généraux."

    'futur code
    'futur code
    'futur code

    ligne = ligne + 1
Loop

End Sub

Si tu test le fichier joint (ton fichier modifié), et que tu utilises le bouton sur le 1er onglet, cette macro va t'afficher un message avec le numéro de ligne de chaque circuit, trajet par trajet.

Il faut continuer ainsi, en décortiquant bien, étape par étape, les différentes actions à réaliser pour arriver à ton but.

Par exemple, maintenant que tu sais sur quelle ligne se trouve le circuit à vérifier, il faut que tu imbrique une 2ème boucle (à la place du 'futur code), qui va aller de ta colonne "C" à ta colonne "J", sur la ligne trouvée.

Dans cette nouvelle boucle, il faudra vérifier si la cellule est vide ou non (la première et la dernière contiennent forcément un pays mais pas les intermédiaires, donc c'est mieux d'ajouter ce test, un simple IF suffisant).

Si la cellule est vide, tu ne fais rien, et tu passes à la colonne suivante.

Si la cellule contient un pays, tu imbriqueras dans cette branche du test IF, la partie de code allant vérifier les dates de ce pays en particulier.

Etc. Etc.

Tu as la, le début de ton traitement, tu devrais pouvoir réussir à terminer tout seul, il n'y a pas spécialement besoin de fonctions très compliquées ou méconnues pour le faire.

Cordialement.

Bonjour,

Merci pour la réponse.

Comme tu me l'as conseillé, j'ai concaténé les pays, et fait une boucle pour savoir lesquels étaient intéressant ou pas.

Maintenant, je suis face à la seconde partie du probleme :p (forcément, ca serait trop facile sinon).

j'essaye de faire des codes (j'en essaye plein, je bidouille comme je peux), mais je ne comprends pas pourquoi ca ne fait pas la boucle que je desire).

Je vous mets les données simplifiées en PJ.

Je desire donc chercher, pour chaque cellule à partir de "J16" et jusqu'en bas, la valeur égale, situé dans "B3:B99" du second doc. Ensuite, copier la valeur correspondante ("PDI" ou "0", ligne "L") (tjr dans le second doc), et la coller dans le doc 1 en ligne "A".

Ca n'est pas très clair, donc je donne un exemple :

chercher le couple "A-B" (J16) dans la colonne du doc 2 (en l'occurence, il est en "B3"). Puis copier la cellule "L3" (celle correspondant à "B3"), et la copier en "A16".

Puis faire ca pour toutes les cellules de "J16" jusqu'en bas.

Voici le code que j'ai écrit, mais il s'arrête après la premiere operation, avec une erreur (surlignée).

Workbooks("PTE FEVRIER brouillon").Activate

Next

Cette erreur est du, je pense, au fait que la cellule active n'est plus à 9cellules à droite de la où je veux coller mes données.

Le soucis, c'est que je n'arrive pas à rectifier ca correctement.

Si quelqu'un a une idée, ca serait genial. C'est un peu compliqué, donc je me perds cmplt !!

Merci d'avance

PS : je sais, pour les "activate" et "select", mais je fais au plus simple pour moi, je verrais ca après !

Le document en pièce jointe n'est pas passé, surement car trop volumineux (ou il a été oublié).

Ah ! oui, en effet, c'est genant !!

A vrai dire, j'ai bien avancé, en continuant à bidouiller.

Le soucis, c'est que ma Macro s'arrête à la ligne 2015 (alors qu'il y en a 2041 pour le moment...) :

Wend


et apparemment l'erreur vient de la ligne :

curcell1.select

(ce qui n'a aucun sens, à mon avis :p)

7exemple.xlsx (9.40 Ko)

Alors déjà, tes "curcell" devrait être déclaré comme des Range et non pas comme des Object.

Je pense que tu t'embête avec les "ActiveCell", tu as déjà des variables correspondant à tes cellules en cours (curcell1 et curcell2), pourquoi tu ne t'en sert pas ?

Idem, même si il doit surement y avoir une raison, pourquoi passer par un 2ème classeur ?

Par contre , je ne comprend pas ce que tu essais de faire par rapport à ton énoncé de départ.

La pour un circuit donné, tu vas directement mettre PDI ou non, mais comment tu peux le savoir, puisque tu ne fais aucun test ni rien en fonction des dates ??

Pour le

curcell1.Select

, essaie en remplaçant Select par Activate au pire. Mais si cela fonctionne pour 2014 ligne, il n'y a pas de raison que cela ne fonctionne plus à la 2015. Cela bloque sur cette instruction, mais ce n'est pas forcément l'instruction elle-même qui pose problème.

Après comme je n'ai pas le classeur de départ, je ne peux de toutes façons pas tester la macro en direct, le classeur fourni en exemple ne contient aucun code, et le code que tu essais de faire, correspond à tes vraies données et pas à la mise en page de ton classeur exemple (je ne peux donc même pas simplement copier / coller le code, il faut que je le réadapte...).

Sachant que même si je réadapte le code, comme tu me dis qu'il fonctionne sur 2000 lignes et bug 30 lignes avant la fin, je ne vais pas aller très loin avec mon classeur exemple avec 5/10 lignes.

Donc soit ton énoncé de départ est toujours le bon, et la tu essais de faire je ne sais quoi qui n'y correspond pas. Soit l'énoncé a changé ou n'était pas complet, et dans ces il faut un vrai jeu d'essai qui correspond à la réalité des données, que l'on puisse tester directement (aidant lors des creux dans mon propre temps de travail, je ne peux pas non plus y passer des heures. )

Alors, mon code a completement arrêté de fonctionner. Du coup, j'ai redémarré mon ordi, et réessayé. Maintenant, ma macro fonctionne jusqu'au bout (et ne s'arrête plus à la ligne 2015). Je ne comprends absolument pas la logique, la dedans...

Oui, je suis oblige d'utiliser plusieurs classeurs, car, l'un servira a bien d'autres choses après, tandis que l'autre n'est qu'une petite étape dans le process. (c'est surtout un choix de ma hiérarchie).

Les tests en fonction des dates ne seront à faire que sur les circuits où il n'est pas indiqué PDI (donc 10x moins de boulot, maintenant). Sachant qu'il faut faire des analyses et des adaptation en fonction des dates.

Merci encore de m'avoir aider, j'apprécie énormément, surtout que ca prend pas mal de temps !!!

Abeaupere a écrit :

Alors, mon code a completement arrêté de fonctionner. Du coup, j'ai redémarré mon ordi, et réessayé. Maintenant, ma macro fonctionne jusqu'au bout (et ne s'arrête plus à la ligne 2015). Je ne comprends absolument pas la logique, la dedans...

Ce n'est pas de la logique, c'est Excel de Microsoft...

Cela n'a pas fini de t'arriver de tomber sur des bizarreries de ce genre, crois moi.

Abeaupere a écrit :

Merci encore de m'avoir aider, j'apprécie énormément, surtout que ca prend pas mal de temps !!!

De rien, on est la pour ça !

Rechercher des sujets similaires à "vba comparer couples"