Vba: erreur 91, variable non défini ou variable de bloc with [Résolu/Fermé]

Signaler
Messages postés
5
Date d'inscription
lundi 28 juillet 2014
Statut
Membre
Dernière intervention
28 juillet 2014
-
Messages postés
23418
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
7 août 2020
-
Bonjour,

Première apparition pour ma part sur un forum. Je pratique un peu le vba depuis quelques temps et je suis complètement bloqué.

Actuellement, je travaille sur la mise en place d'une gestion de stock par l'intermédiaire de vba. J'ai 2 fichiersexcels , l'un est le stock register (rassemble une page par type de matériel) et l'autre me permet de créer des "voucher" ou "commande" pour ce stock.
Lorsque je créer une commande à partir d'un format type (page excel), je l'enregistre sous un nouveau nom et doit par la suite faire suivre les informations sur le fichier principal.

Mon problème est que lorsque je clique sur le pushbuton, la macro indique l'erreur "91", cependant, si je vais dans la macro et l'exécute pas à pas, cela se passe niquel.. Je bloque depuis plusieurs jour et ne comprends pas le comment du pourquoi ?

Voici mon code :

Sub Search()

Dim numbersheet3 As String
Dim numvoucher2 As String
Dim issued1 As Integer
Dim returned1 As Integer
Dim derlign3 As Integer
Dim quantity4 As String
Dim Vouch As String, nom3 As String
Dim Num As String
Dim Nulig1 As Integer
Dim celluletrouvee As Variant

Vouch = Range("C5").Value
Num = Range("D5").Value
nom3 = ActiveWorkbook.Name
numbersheet3 = Workbooks(nom3).Sheets(1).Range("D8").Value
numvoucher2 = Workbooks(nom3).Sheets(1).Range("D5").Value
issued1 = Workbooks(nom3).Sheets(1).Range("H8").Value
returned1 = Workbooks(nom3).Sheets(1).Range("I8").Value
derlign3 = Workbooks("Inventory tool.xlsm").Sheets(numbersheet3).Range("H" & Rows.Count).End(xlUp).Row + 1
quantity4 = Workbooks("Inventory tool.xlsm").Sheets(numbersheet3).Range("H65000").End(xlUp)

With Workbooks("Inventory tool.xlsm").Sheets(numbersheet3).Columns("C:C")
Set celluletrouvee = .Find(Workbooks(nom3).Sheets(1).Range("D5").Value, LookIn:=xlValues, Lookat:=xlWhole)
End With

On Error GoTo saut

Nulig1 = celluletrouvee.Row

Workbooks("Inventory tool.xlsm").Sheets(numbersheet3).Range("C" & Nulig1) = numvoucher2
Workbooks("Inventory tool.xlsm").Sheets(numbersheet3).Range("E" & Nulig1) = issued1
Workbooks("Inventory tool.xlsm").Sheets(numbersheet3).Range("F" & Nulig1) = returned1
Workbooks("Inventory tool.xlsm").Sheets(numbersheet3).Range("A" & Nulig1) = Date
Workbooks("Inventory tool.xlsm").Sheets(numbersheet3).Range("H" & Nulig1) = quantity4 - issued1 + returned1

GoTo saut2

saut:

Workbooks("Inventory tool.xlsm").Sheets(numbersheet3).Range("C" & derlign3) = numvoucher2
Workbooks("Inventory tool.xlsm").Sheets(numbersheet3).Range("E" & derlign3) = issued1
Workbooks("Inventory tool.xlsm").Sheets(numbersheet3).Range("F" & derlign3) = returned1
Workbooks("Inventory tool.xlsm").Sheets(numbersheet3).Range("A" & derlign3) = Date
Workbooks("Inventory tool.xlsm").Sheets(numbersheet3).Range("H" & derlign3) = quantity4 - issued1 + returned1

saut2:

End Sub

Je pense que c'est une histoire de lien entre les 2 fichiers.. (les deux sont ouverts dans une même instance pourtant.

Je vous remercie par avance pour votre aide.

4 réponses

Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
41
Bonjour

Pourquoi tu utilises un With ici ?

With Workbooks("Inventory tool.xlsm").Sheets(numbersheet3).Columns("C:C")
Set celluletrouvee = .Find(Workbooks(nom3).Sheets(1).Range("D5").Value, LookIn:=xlValues, Lookat:=xlWhole)
End With
Messages postés
5
Date d'inscription
lundi 28 juillet 2014
Statut
Membre
Dernière intervention
28 juillet 2014

Bonjour skk,

Parce que je suis novice dans le monde de la macro et lorsque je ne connais pas je vais chercher des bouts de code sur les forums que j'adapte ensuite à mon besoin.

Je viens de tester avec cela :
Set celluletrouvee = Workbooks("Inventory tool.xlsm").Sheets(numbersheet3).Columns("C:C").Find(Workbooks(nom3).Sheets(1).Range("D5").Value, LookIn:=xlValues, Lookat:=xlWhole)

Mais le message d'erreur apparait à nouveau.

En fin de compte j'aimerai rechercher la valeur (Workbooks(nom3).Sheets(1).Range("D5").Value) entre les lignes 8 à 27 de (Workbooks("Inventory tool.xlsm").Sheets(numbersheet3).Columns("C:C")).

Que me conseillerais-tu ?
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
41
Commence par mettre OPTION EXPLICIT au sommet de ton Module.

Ensuite peux-tu me dire quel ligne le débogage t'indique comme éronnée ?
Messages postés
5
Date d'inscription
lundi 28 juillet 2014
Statut
Membre
Dernière intervention
28 juillet 2014

Je l'ai déjà mis, mais la est le problème car il ne me dit pas la ligne et lorsque je fais (fn + f8) pour trouver le bug, ma macro fonctionne normalement :s..

Et le pire, c'est quand recliquant sur le pushbuton la macro fonctionne et fait le résultat escompté...
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
41
Très étrange...

Poste aussi ton message sur www.developpez.net

Peut-être qu'ils auront un solution.
Aah, merci, je pensais que j'étais fou mais non, c'est bien une réaction étrange de la part d'excel...

D'accord, je vais mis inscrire demain.

Bon bah dans tout les cas, je te remercie d'avoir pris le temps de réfléchir sur le sujet.
cordialement,
Koj27
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
41
Pas de soucis.

Insistez bien sur le fait que la procédure ne plante que lorsque qu'elle est lancée directement et pas quand elle est exécutée pas à pas avec le débogueur.

Et si vous trouvez la solution pensez à poster le lien vers votre discution Developpez.net, ici.
Messages postés
23418
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
7 août 2020
6 281
Bonjour à tous,

skk201, c'est n'est pas parce que tu ne trouves pas que personne ne trouveras ici.
Plutôt que de l'aiguiller sur un autre forum tu aurais mieux fait de lui demander un fichier avec le problème, ça aurait été plus intéressant.

koj27, évite (fuis) les goto, à reserver pour les traitements d'erreur.
Préfère :
if celluletrouvee = nothing then
...
else
...
endif
Mais comme apparemment tu fais la même chose dans les 2 cas je doute de l'utilité de la recherche et du test.

Et quand tu poses une question dépose un fichier réduit au minimum sur cjoint.com et colle ici le lien fourni.
Tu gagnes ton temps, nous aussi, et tu es plus sûr d'avoir une réponse adaptée.

eric
Bonjour Eriiic,

Je fais deux fois la même chose avec des variables différentes, si la cellule n'est pas trouvée, création de la ligne dans la dernière ligne vide, si elle existe remplacement des données sur la ligne de la cellule trouvée.

Justement j'utilise les goto car lorsque qu'il ne trouve pas la cellule, il se met en erreur. J'ai testé avec le if mais il me met "utilisation de l'objet incorrect (le nothing)".

Je ne suis pas totalement novice non plus.. Je comprends les codes que j'utilise et sais l'utilité qu'ils ont. (à part pour le with où ça ne servait à rien mais dans le doute je me suis dit que ça me deggugerait). Cependant je me considère novice comparé aux personnes qui maitrisent le language VBA.

J'ai voulu mettre un lien sur cjoint.com après avoir observé comment vous fonctionnez sur les forums (car j'y vais régulièrement chopper des bouts de codes) mais je suis sur un réseau entreprise qui me bloque la page et a plusieurs milliers de kilomètres de chez moi et n'est pas d'autres possibilités pour me connecter :/... (village un peu reculé d'Inde)

J'aimerais en faite déclarer le lien entre les deux fichiers à leur ouverture mais ne trouve pas comment..
Explication: lorsque je rentre dans la fenêtre VBA je pense qu'excel arrive à reconnaitre l'emplacement "virtuel" des deux fichiers et arrive à faire le lien à partir de ce moment. Est-il possible de créer une discussion entre les deux fichiers directement à l'ouverture ?

Je te remercie pour ton aide en tout cas Eriiic.
Koj27
SOLUTION TROUVEE !!!

Tout d'abord merci à tous pour votre aide !

En fait le problème était assez vicieux.
J'ai du créer une macro pour appeler ma macro et maintenant ça fonctionne.

Encore merci pour votre temps.
Koj 27
Messages postés
23418
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
7 août 2020
6 281
Bonjour,

il me met "utilisation de l'objet incorrect (le nothing)"
Evidemment, j'ai écrit n'importe quoi.
C'est :
if c is nothing then ' c non trouvé

lorsque je rentre dans la fenêtre VBA je pense qu'excel arrive à reconnaitre l'emplacement "virtuel" des deux fichiers et arrive à faire le lien à partir de ce moment.
Pas bien compris la question...

eric
Salut Eriiic,

J'avais un virus qui me bloqué le débuggeur, du coup j'ai pris tes conceils, et voici le code bon.

Sub addinform()

Dim name10 As String
Dim numsheet10 As String
Dim cellfound As Variant
Dim numvouch10 As String
Dim issued10 As String
Dim returned10 As String
Dim lastlign10 As String
Dim numlign10 As String
Dim quantity10 As String
Dim i As Variant

For i = 8 To 27

name10 = ActiveWorkbook.Name
numsheet10 = Workbooks(name10).Sheets(1).Range("D" & i).Value
numvouch10 = Workbooks(name10).Sheets(1).Range("D5").Value
issued10 = Workbooks(name10).Sheets(1).Range("H" & i).Value
returned10 = Workbooks(name10).Sheets(1).Range("I" & i).Value
lastlign10 = Workbooks("Inventory tool.xlsm").Sheets(numsheet10).Range("H" & Rows.Count).End(xlUp).Row + 1

On Error GoTo Finish

quantity10 = Workbooks("Inventory tool.xlsm").Sheets(numsheet10).Range("H65000").End(xlUp)
numlign10 = Workbooks("Inventory tool.xlsm").Sheets(numsheet10).Range("H65000").End(xlUp).Row

Set cellfound = Workbooks("Inventory tool.xlsm").Sheets(numsheet10).Columns("C:C").Find(numvouch10, LookIn:=xlValues, Lookat:=xlWhole)

If cellfound Is Nothing Then

Workbooks("Inventory tool.xlsm").Sheets(numsheet10).Range("C" & lastlign10) = numvouch10
Workbooks("Inventory tool.xlsm").Sheets(numsheet10).Range("E" & lastlign10) = issued10
Workbooks("Inventory tool.xlsm").Sheets(numsheet10).Range("F" & lastlign10) = returned10
Workbooks("Inventory tool.xlsm").Sheets(numsheet10).Range("A" & lastlign10) = Date
Workbooks("Inventory tool.xlsm").Sheets(numsheet10).Range("H" & lastlign10) = quantity10 - issued10 + returned10

Else

Workbooks("Inventory tool.xlsm").Sheets(numsheet10).Range("C" & numlign10) = numvouch10
Workbooks("Inventory tool.xlsm").Sheets(numsheet10).Range("E" & numlign10) = issued10
Workbooks("Inventory tool.xlsm").Sheets(numsheet10).Range("F" & numlign10) = returned10
Workbooks("Inventory tool.xlsm").Sheets(numsheet10).Range("A" & numlign10) = Date
Workbooks("Inventory tool.xlsm").Sheets(numsheet10).Range("H" & numlign10) = quantity10 - issued10 + returned10

End If

Next i

Finish:

End Sub

Merci pour tes bon conseils ;)
Messages postés
23418
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
7 août 2020
6 281
Bonjour,

Le On Error GoTo Finish est une très mauvaise idée.
Si une erreur non prévue survient ta macro retournera n'importe quoi et ça ne sera détecté peut être que plusieurs mois plus tard. Bonjour les dégats...
Soit une erreur est connue, acceptée, traitée spécifiquement et le contrôle d'erreur est rétabli après la ligne en cause. Soit elle est inattendue et on débogue.

.Sheets(1)
Là tu t'adresses à l'index de la feuille, pas à son nom. C'est à dire à sa position dans le classeur : la 1ère feuille.
Si tu la déplaces elle change d'index et tu t'adresseras à une autre feuille. C'est vraiment ce que tu veux ?

name10 = ActiveWorkbook.Name
numsheet10 = Workbooks(name10).Sheets(1).Range("D" & i).Value

Comme tu t'adresses au classeur actif c'est superflu de le citer.
numsheet10 = Sheets(1).Range("D" & i).Value est suffisant.
Si c'est pour éclairer le code tu peux définir la feuille dans une variable et t'en servir tout au long du code après. Ex :
Dim shSource As Worksheet
Set shSource = ActiveWorkbook.Worksheets("Feuil1")
...
numvouch10 = shSource.Range("D5").Value


eric