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

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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,
 
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,
 
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

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 ?
 
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

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,
 
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é
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
9
Affichages
382
  • Question Question
Microsoft 365 Question code VBA
Réponses
2
Affichages
386
Réponses
3
Affichages
510
Réponses
7
Affichages
720
Retour