Microsoft 365 erreur 91 variable objet

  • Initiateur de la discussion Initiateur de la discussion phil66
  • Date de début Date de début

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 !

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

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 =...
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😀29 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

Dernière édition:
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
 
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
 
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
 
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
 
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

Dernière édition:
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
 
- 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
3
Affichages
780
Retour