Microsoft 365 erreur 91 variable objet

phil66

XLDnaute Junior
Bonjour,

Je fais appel à l'équipe car je ne comprends pas ce qui arrive...

Pour info, les classeurs originaux contenant des données confidentielles, j'ai créé ceux ci-dessous qui ont exactement la même structure, sauf que j'ai 250 lignes environ au lieu des 5 lignes ici.

J'ai un classeur appelé ici "liste marchandises 2021 problème" dans lequel je faisais régulièrement
une mise à jour des prix de la feuille "Base" en collant dans la feuille "jour" des données provenant d'un autre classeur appelé ici "base 2021 problème" .

Le classeur joint fonctionne bien, la date se met à jour ainsi que les prix dans "Base".

Si je fais la même chose dans le classeur d'origine, j'obtiens le message : erreur d'exécution 91 Variable objet ou
variable de bloc With non définie. Je joins une image du code tel que me l'indique le message d'Excel.
Les fichiers sont joints également.

Pouvez-vous m'aider et , si possible, m'expliquer d'où proviendrait cette erreur afin que je puisse m'en sortir mieux une autre fois.

D'avance un grand merci.

Phil
 

Pièces jointes

  • erreur 91.PNG
    erreur 91.PNG
    28.1 KB · Affichages: 30
  • LISTE MARCHANDISES 2021 problème.xlsm
    52.4 KB · Affichages: 4
  • BASE 2021 problème.xlsm
    21 KB · Affichages: 4
Solution
Bonjour,

Dans "Listes marchandise 2021 problème" ci-joint, cela fonction, après plusieurs tests.
J'ai rajouté pour gérer les erreurs au cas où le produit ne serait pas trouvé sur la feuille base.

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim lig As Long, Cel As Range, Plg As Range, maplage As Range, dl As Long
    dl = Me.Range("A" & Rows.Count).End(xlUp).Row
    Set maplage = Me.Range("A1:D" & dl)
    If Intersect(Target, maplage) Is Nothing Then Exit Sub
    Set Plg = Intersect(Target, maplage)
    On Error Resume Next
    For Each Cel In Plg
        With ThisWorkbook.Sheets("BASE")
            Err.Clear
            '
            ' Si le produit n'est pas trouvé, une erreur sera levée
            lig =...

Lolote83

XLDnaute Barbatruc
Bonjour Phil66,
L'erreur est certainement due au fait que la ligne en question recherche (d'après ce que j'ai compris) quelque chose et n'est pas trouvée.
Regarde vite fait le classeur joint.
Inscrit en cellule H3, une valeur de la colonne D puis clic sur le bouton (pas d'erreur)
Inscrit une valeur n'appartenant pas à la liste en D4:D29 puis clic sur le bouton (Erreur 91)
Je pense donc que cela vient de là.
J'ai donc dans cet exemple fait que reproduire l'erreur.
Maintenant, sur le 2ème bouton, une boucle sur 6 mots recherchés avec information pour chaque mot. (Gestion de l'erreur)
 

Pièces jointes

  • Copie de PHIL66 - Erreur exécution 91.xlsm
    18.5 KB · Affichages: 4
Dernière édition:

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Souvent, lorsqu'il s'agit de travail sur plusieurs classeur, les macros dont les 'Range' les références au classeur ne sont pas pleinement qualifiées, ça plante, car à un instant T le classeur et la feuille active ne sont pas forcément ceux auxquels appartient la macro en exécution.

Je vous propose donc de qualifier pleinement vos références aux classeur et feuilles.
Dans les lignes ci-dessous le mot-clef 'Me' représente la feuille qui contient la macro évènementielle. Cette feuille connait son parent (classeur).
Pour la ligne problématique, si elle intervient alors que le classeur actif est l'autre classeur, Sheets("Base") fait référence à une feuille inexistante puisque l'autre classeur n'en a pas.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim lig As Long, Cel As Range, Plg As Range, maplage As Range, dl As Long
    dl = Me.Range("A" & Rows.Count).End(xlUp).Row
    Set maplage = Me.Range("A1:D" & dl)
    If Intersect(Target, maplage) Is Nothing Then Exit Sub
    Set Plg = Intersect(Target, maplage)
    For Each Cel In Plg
       '
       ' Travailler sur la feuille Base de CE classeur et cette feuille (Me)
        With ThisWorkbook.Sheets("BASE")
            lig = .Columns(4).Cells.Find(Me.Range("A" & Cel.Row), lookat:=xlWhole).Row
            If lig > 0 Then
                .Sheets("BASE").Range("F" & lig) = Me.Range("C" & Cel.Row)
                .Sheets("BASE").Range("G" & lig) = Me.Range("D" & Cel.Row)
                .Sheets("BASE").Range("H" & lig) = Date
            End If
        End With
    Next
End Sub

Cel connait son parent (feuille) qui connait son parent (classeur) idem pour Target et plg

cordialement
 

phil66

XLDnaute Junior
Bonjour à tous deux,

Tout d'abord, merci de vous pencher sur mon problème !
Deux infos complémentaires :
-Dans mon classeur original, lorsque je colle mes données dans la feuille "jour",
il n'y a que la première ligne de celle-ci qui se met à jour (la date change bien) dans la feuille base. Le message d'erreur est celui cité dans mon message initial.
-Le code m'avait été donné par un membre du forum (j'en suis bien incapable), et le pire c'est que cela a fonctionné au début...

Pour Lolote, mes connaissances en matière de codage étant assez limitées (le mot est faible), la solution proposée m'échappe totalement...

Pour Roblochon, le fameux mot-clé "Me" doit-être remplacé par quoi exactement car j'ai tenté plusieurs solutions avec des résultats d'erreurs différents. Est-ce le nom de la feuille "Jour" (dans laquelle je colle les données venant de l'autre classeur "Base 2021 problème) ou autre chose ?

Désolé , mais comme je l'ai dit, j'essaie de m'en sortir avec mes faibles connaissances.

Merci d'avance

Phil
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Dans votre demande initiale :
J'ai un classeur appelé ici "liste marchandises 2021 problème" dans lequel je faisais régulièrement
une mise à jour des prix de la feuille "Base" en collant dans la feuille "jour" des données provenant d'un autre classeur appelé ici "base 2021 problème" .

Le classeur joint fonctionne bien, la date se met à jour ainsi que les prix dans "Base".

Si je fais la même chose dans le classeur d'origine, j'obtiens le message : erreur d'exécution 91 Variable objet ou
variable de bloc With non définie. Je joins une image du code tel que me l'indique le message d'Excel.
Les fichiers sont joints également.

Le classeur "Liste MARCHANDISES 2021" a une feuille base et une feuille "Jour". Il est possible de copier/coller de la feuille Base vers la feuille Jour de ce classeur

"Si je fais la même chose dans le classeur d'origine, ..." c'est à dire ?
Quel est le classeur que vous appelez d'origine ?

Le classeur "Base 2021 problème" n'a pas de feuille "jour" ni de feuille "Base"

Soyez plus précis ?

Dites-vous que nous ne pouvons deviner les choses, les supputer sans doute...

cordialement
 

phil66

XLDnaute Junior
Je vais tenter d'être plus clair en effet :

Ce que j'appelle "classeur d'origine", est un classeur contenant des données confidentielles que je ne peux joindre ici. J'ai donc créé le classeur identique en tout point que j'ai appelé "liste marchandises 2021 problème" que j'ai donc posté au début. Idem pour le classeur "Base 2021 problème". Mes classeurs d'origine ont le même nom, mais sans le mot "problème".

L'opération que je dois faire et qui ne fonctionne plus (car elle a fonctionné) est celle-ci (bien entendu dans mon fameux "classeur d'origine car avec celui que j'ai recréé ici cela fonctionne) :

Je copie les données qui sont dans le classeur "Base 2021". Ensuite je les colle dans la feuille jour du classeur "Listes marchandises 2021" . Normalement cela doit me mettre à jour la feuille "Base" du même classeur, en modifiant les prix et la date de mise à jour.
Hors je n'ai que la première ligne des données collées qui se met à jour et rien d'autre. Et le message d'erreur cité au début apparait.
Je précise encore que les données collées dans la feuille "Jour" ne sont pas systématiquement dans le même ordre (dans la colonne A) que dans la feuille "Base".

J'espère avoir été plus précis comme cela...

Merci d'avance,

Phil
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Dans "Listes marchandise 2021 problème" ci-joint, cela fonction, après plusieurs tests.
J'ai rajouté pour gérer les erreurs au cas où le produit ne serait pas trouvé sur la feuille base.

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim lig As Long, Cel As Range, Plg As Range, maplage As Range, dl As Long
    dl = Me.Range("A" & Rows.Count).End(xlUp).Row
    Set maplage = Me.Range("A1:D" & dl)
    If Intersect(Target, maplage) Is Nothing Then Exit Sub
    Set Plg = Intersect(Target, maplage)
    On Error Resume Next
    For Each Cel In Plg
        With ThisWorkbook.Sheets("BASE")
            Err.Clear
            '
            ' Si le produit n'est pas trouvé, une erreur sera levée
            lig = .Columns(4).Find(Me.Range("A" & Cel.Row), lookat:=xlWhole).Row
            If Err > 0 Then
                Me.Range("E" & Cel.Row) = "Produit non trouvé dans la feuille BASE"
            Else
                .Range("F" & lig) = Me.Range("C" & Cel.Row)
                .Range("G" & lig) = Me.Range("D" & Cel.Row)
                .Range("H" & lig) = Date
            End If
        End With
    Next
    On Error GoTo 0
End Sub

PS : il n'y a pas à remplacer Me par quoique ce soit. 'Me' est une référence à la feuille qui contient la macro (ici la feuil4 'Jour')

Vous avez Excel 365, L'importation des données dans la feuille 'Jour' pourrait être réalisée par requête PowerQuery (inclus dans votre version ).

La mise à jour de la feuille 'Base' du même classeur pourrait-être faite par macro sur rafraîchissement de la requête.


Cordialement
 

Pièces jointes

  • BASE 2021 problème.xlsm
    21.1 KB · Affichages: 4
  • LISTE MARCHANDISES 2021 problème.xlsm
    53.6 KB · Affichages: 4
Dernière édition:

phil66

XLDnaute Junior
Cela fonctionne parfaitement, et le petit plus qui me signale le produit non trouvé, c'est la cerise sur le gâteau.
Quand je vais retrouver un peu de temps je vais m'intéresser de près à ce fameux "power query" qui a l'air bien pratique... mais qui va piano va sano !

Un tout grand merci pour votre patience.

Cordialement,

Phil
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa