Bonjour à tous,
Bon après avoir perdu bon nombre d'heures à me pencher sur le problème en vain et avoir épluché pas mal de discussions, je me décide à vous demander de l'aide parce que j'ai un problème très étrange avec la méthode Find (.Find(what:= etc) et je bloque.
Je ne peux poster ni fichier ni code complet car je pense que ça embrouillerait tout le monde d'avoir le projet complet, le code est assez long et écrit bizarrement sans doute.
Je tente donc de l'expliquer le plus clairement possible au niveau conceptuel:
Le problème se pose dans une base de données, composée de:
- Colonne 1: Un numéro qui s'étend sur plusieurs lignes [appelons le range "numéro"], qui passe ensuite à un autre numéro sur plusieurs lignes à son tour.
- Colonne 2: Une lettre allant de A à Z (appelons le range [lettre], à l'intérieur du range(numéro).
- Colonne 3,4 jusque 10, des données quelconques qui doivent être déplacées.
Nous avons donc un range "numéro" de 75 lignes (par exemple), à l'intérieur duquel se succède en colonne 2 donc un range "lettre" A (15 lignes), ensuite B (15 lignes) etc etc.
Ce qui donne (en très simplifié):
Et ainsi de suite, les numéros vont jusqu'à 40, et il y a jusque 20 lettre différentes à l'intérieur d'un range "numéro".
A côté de ces deux colonnes se trouvent des données associées quelconques (qui ne servent pas à identifier).
L'idée c'est que le script aille chercher dans le database si le numéro cherché est présent (ex:1), une fois trouvé, il définit un Range de la première à la dernière ligne contenant ce numéro, et ira ensuite chercher à l'intérieur de ce range la lettre choisie (ex:B, à l'intérieur de 1). La raison de ces étapes et que je ne veux pas qu'il trouve B dans range(2) mais B dans range(1) et prendre ces données là précisemment. C'est la raison pour laquelle une premier range est préalablement définit, pour ensuite y effectuer une recherche avec Find(whatetc.
Mon problème est le suivant:
Je définit le range(numéro), imaginons de 2 à 450. A l'intérieur duquel on trouve le range(lettres) qui est plus courts, exemple: range(1B = ligne 2 jusque 10, 1C = ligne 11 jusque 26) et ainsi de suite.
Mais en définissant ce second range, il semble que la recherche démarre après le première cellule du range (si le range démarre à B250, la première occurence trouvée sera minimum B251, même si en B250 la donnée y est également.
Constatant cela, j'ai décalé le début de la recherche à Range(ligne - 1), afin qu'il démarre la recherche sur la première ligne du range.
Cela fonctionne jusque...à ce qu'on arrive à la dernière lettre cherchée, qui est également la lettre présente dans Range(ligne - 1)! (les séquences de lettres se succèdent dans le même ordre, donc après 1Z, on trouvera 2A, et ainsi de suite). Le script cherchant Z, il le trouve dans Range(ligne - 1) et me colle donc les données ici.
Je pense avoir trouvé la raison mais elle est incensée! Quand le script se met à chercher, il cherche à partir de la ligne 2 en gros, mais s'il ne trouve rien, il revient quand même à la ligne 1 et là trouve ma donnée. Pourquoi cela ne fonctionnait pas avec le premier cas ? Car en cherchant dès la ligne 2, il trouve la donnée! (la lettre va de ligne 1 à ligne 5 par exemple) donc se dit 'ok j'ai trouvé' et n'a donc pas besoin de venir checker en arrière. Or pour la dernière lettre (1Z), il ne la trouve pas et revient sur Range(ligne - 1) et là la trouve (mais elle est hors-range!).
Ma question est donc: y'a-t-il un moyen de définir un range, de commencer à chercher dès la première ligne du range, sans avoir recours au ligne-1 qui le fait sortir du range ?
Est-ce si illogique que ça de vouloir chercher dès la première ligne du range ?
Je sais je pourrai faire un controle à côté de la lettre pour voir si le numéro correspond mais cela me semble absurde qu'aucun code ne fonctionne sans ce controle qui n'a pas de sens.
D'avance merci à vous qui avez pris la peine de lire, j'espère avoir un minimum expliquer mon problème...j'ai essayé d'être le plus clair possible.
En espérant vous lire
LeSmoox
Partager