XL 2010 Variable Object ou variable de bloc With non définie

ocon

XLDnaute Nouveau
Bonjour à toutes et à tous,

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

End Sub
 
Solution
Bonjour,

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.

Bonne journée,

Ta réponse était bien la solution je t'en remercie.
Apres avoir revu ma syntaxe j'en suis arrivé au code suivant qui finalement fonctionne.
VB:
Sub suppr()

Dim CD As Workbook 'Classeur Destination'
Dim OD As Worksheet 'Onglet Destination'
Dim CS As Workbook...

Efgé

XLDnaute Barbatruc
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 ;)
 

ocon

XLDnaute Nouveau
Bonjour

peut etre que cette ligne ne renvoie rien..?
mais sans tes fichiers, impossible à dire

Set R = OD.Columns(34).Find(CBS, , xlValues, xlWhole)
if R is nothing then msgbox ("Valeur non trouvée")
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

Merci,
 

xUpsilon

XLDnaute Accro
Pour savoir ce que tu as dans tes variables, lorsque tu es dans la fenêtre VBA, clique sur Affichage -> Fenêtre Variables Locales :

1664196845330.png


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 ;)

Bonne journée,
 

ocon

XLDnaute Nouveau
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.
 

Pièces jointes

  • CLASSEUR DESTINATION.xlsx
    169.8 KB · Affichages: 4
  • FICHIER ERREUR.xlsx
    12.2 KB · Affichages: 3

xUpsilon

XLDnaute Accro
Bien, voici ce que j'ai lors de l'exécution :
1664200381373.png

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 ?
 

ocon

XLDnaute Nouveau
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 ?
Décidemment je fais pas mal d'étourderies dans la précipitations, j'en suis désolé.

J'ai remplacé les mauvaises données pour vous partager les fichier, vous trouverez normalement les bons ci joint cette fois.

Lors de mon précédent essai j'avais effectivement la valeur 20003-29 dans la colonne AH mais l'erreur etait tout de même présente
 

Pièces jointes

  • CLASSEUR DESTINATION.xlsm
    182.5 KB · Affichages: 2
  • fichiererreur.xlsx
    12.1 KB · Affichages: 2

ocon

XLDnaute Nouveau
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
 

Pièces jointes

  • CLASSEUR_UNIQUE.xlsm
    177 KB · Affichages: 0

xUpsilon

XLDnaute Accro
Bonjour,

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.

Bonne journée,
 

ocon

XLDnaute Nouveau
Bonjour,

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.

Bonne journée,
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é
 

Discussions similaires

Réponses
9
Affichages
342
Réponses
2
Affichages
348

Statistiques des forums

Discussions
315 093
Messages
2 116 120
Membres
112 666
dernier inscrit
Coco0505