Etant amateur débutant en vba, je me suis penché sur une macro pour le travail mais je bloque sur une partie.
Je souhaiterais faire une boucle qui à partir d'une donnée d'un classeur, retrouve dans un second classeur la ligne où se trouve cette valeur afin d'effacer un élément sur cette ligne.
J'ai simulé mon code sur un seul et même classeur et aucun erreur n'apparait. Cependant dès que je passe au deux classeurs séparés cela m'affiche l'erreur dans le titre de mon message. J'en déduis donc que le problème vient de l'identification du classeur mais je ne trouve pas comment le résoudre.
Si quelqu'un avait une solution pour moi, il/elle serait le/la bienvenu(e)
Voici mon code:
Sub effacer()
Dim CD As Workbook 'Classeur Destination
Dim OD As Worksheet 'Onglet Destination
Dim CS As Workbook 'Classeur Source
Dim OS As Worksheet 'Onglet source
Dim LIGNE As Long
Dim LI As Long 'N° de ligne où effacer
Dim CBS As Variant 'Valeur à retrouver
Dim R As Range 'Recherche
Set CD = ActiveWorkbook
Set OD = CD.Worksheets(1)
Set CS = Application.Workbooks.Open(" 'Classeur en question' ")
Set OS = CS.Worksheets(1)
LIGNE = 2
Do While LIGNE <= 41
CBS = OS.Cells(LIGNE, 3).Value
Set R = OD.Columns(34).Find(CBS, , xlValues, xlWhole)
LI = R.Row 'ERREUR
OD.Cells(LI, 32).Delete
LIGNE = LIGNE + 1
Loop
J'ai fait un test pour retrouver avec une boucle qui teste OD.Range("AH" & nLig) = CBS et ça fonctionne, donc visiblement le souci vient de l'utilisation du Find.
Ensuite j'ai testé si je remplace Columns(34) par ("AH1:AH10000"), et ça fonctionne. Visiblement c'est l'objet Columns qu'il n'aime pas.
Tu devrais définir ta plage avec un objet Range plutôt qu'une colonne du coup. Je n'ai pas trouvé d'explication à ce pourquoi ça réagit comme ça.
Est-ce que ça ne planterait pas plutôt lorsque la valeur cherchée est introuvable ? Parce que Set un Range = Nothing (Find renvoie vide lorsqu'il ne trouve pas l'élément) ça risque de générer une erreur.
Bonjour @ocon et bienvenu sur le forum.
Il est toujours plus simple d'avoir un petit fichier annonyme représentatif pour pouvoir tester avant de répondre.
En première lecture ; si R n'existe pas (si il n'y a pas CBS en colonne 34 de la ligne LIGNE), ça plante
Essai quelque chose comme ça :
VB:
If Not R is nothing then
LI = R.Row
OD.Cells(LI, 32).Delete
End If
Cordialement
EDIT : Bonjour à tous, suis en retard moi, mais nous sommes tous d'accord
Bonjour vgendron et xUpsilon,
Merci pour votre réponse, effectivement en utilisant la ligne avec la msgbox, cela me renvoie que le valeur n'est pas trouvée.
Cela me parait pourtant étrange car en vérifiant à la main je trouve bien la valeur dans la colonne 34.
La recherche ne se ferait-elle pas dans l'onglet source? Auquel cas la colonne 34 est effectivement vide.
Je ne pense malheureusement pas pouvoir partager le fichier à cause d'informations confidentielles
Pour savoir ce que tu as dans tes variables, lorsque tu es dans la fenêtre VBA, clique sur Affichage -> Fenêtre Variables Locales :
Ainsi, en exécutant ton code step by step, tu pourras suivre les valeurs que prennent tes différentes variables, et notamment suivre la valeur stockée dans CBS.
N.B : tout fichier transmis doit être anonymisé/rempli avec des valeurs bidons. Mais tout fichier rempli avec des valeurs bidons nous permet de comprendre ce que tu cherches, pourquoi, et comment, afin de pouvoir t'aider au mieux. C'est donc un support très appréciable et apprécié par toutes les personnes qui aident ici
Bonjour @ocon et bienvenu sur le forum.
Il est toujours plus simple d'avoir un petit fichier annonyme représentatif pour pouvoir tester avant de répondre.
En première lecture ; si R n'existe pas (si il n'y a pas CBS en colonne 34 de la ligne LIGNE), ça plante
Essai quelque chose comme ça :
VB:
If Not R is nothing then
LI = R.Row
OD.Cells(LI, 32).Delete
End If
Cordialement
EDIT : Bonjour à tous, suis en retard moi, mais nous sommes tous d'accord
Bonjour,
Effectivement j'ai finalement fait le classeur sans les informations a divulguer.
C'est sur que c'est mieux avec le fichier sous les yeux; les voici.
Bien, voici ce que j'ai lors de l'exécution :
Je cherche donc 20003-29 dans la colonne AH, qui contient les valeurs de 1 à 1211 (listes d'entiers de 1 à 1211). Donc ça me parait normal que la macro plante, la valeur n'est pas là.
Où est l'erreur ? Ne devons nous pas chercher 20003-29, ou ne devons nous pas chercher dans la colonne AH ?
Bien, voici ce que j'ai lors de l'exécution : Regarde la pièce jointe 1150687
Je cherche donc 20003-29 dans la colonne AH, qui contient les valeurs de 1 à 1211 (listes d'entiers de 1 à 1211). Donc ça me parait normal que la macro plante, la valeur n'est pas là.
Où est l'erreur ? Ne devons nous pas chercher 20003-29, ou ne devons nous pas chercher dans la colonne AH ?
Ce que je ne comprend pas c'est que R garde comme valeur "nothing" alors que lorsque j'effectue la macro sur un seul classeur cela fonctionne correctement.
cf pièce jointe
Efgé, effectivement j'ai vérifié et je ne trouve pas de différence d'écriture entre les deux
J'ai fait un test pour retrouver avec une boucle qui teste OD.Range("AH" & nLig) = CBS et ça fonctionne, donc visiblement le souci vient de l'utilisation du Find.
Ensuite j'ai testé si je remplace Columns(34) par ("AH1:AH10000"), et ça fonctionne. Visiblement c'est l'objet Columns qu'il n'aime pas.
Tu devrais définir ta plage avec un objet Range plutôt qu'une colonne du coup. Je n'ai pas trouvé d'explication à ce pourquoi ça réagit comme ça.
J'ai fait un test pour retrouver avec une boucle qui teste OD.Range("AH" & nLig) = CBS et ça fonctionne, donc visiblement le souci vient de l'utilisation du Find.
Ensuite j'ai testé si je remplace Columns(34) par ("AH1:AH10000"), et ça fonctionne. Visiblement c'est l'objet Columns qu'il n'aime pas.
Tu devrais définir ta plage avec un objet Range plutôt qu'une colonne du coup. Je n'ai pas trouvé d'explication à ce pourquoi ça réagit comme ça.
xUpsilon Merci beaucoup pour ta réponse, effectivement je pense que la solution est là !
Cependant cela m'affiche l'erreur que la méthode Range de l'objet Worksheet a échoué