IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Application-defined or object-defined error


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Implementation manager
    Inscrit en
    Mai 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Implementation manager

    Informations forums :
    Inscription : Mai 2018
    Messages : 22
    Par défaut Application-defined or object-defined error
    Bonjour la communauté,

    J'ai un petit problème dans un macro. Celui-ci est censé d'abord comparé des données du "transac2.xlsm" avec un autre workbook "Suivi CS_TEST.xlsx" qui lui est partagé et puis rajouter une date dans ce même dossier partagé. L'erreur que je trouve est la suivante:
    Application-defined or object-defined error.

    Le Workbooks("transac2.xlsm") a trois colonnes de base:
    Data (A:A), Date (B:B) et Entreprise (C:C).
    Le Workbooks("Suivi CS_TEST.xlsx") en a plein, dont:
    Data (+ stuff) (E:E), Date (S:S).

    Le code est très brut, car je n'ai pas d'expérience, encore moins de fichier partagé. J'avais fait des tests entre deux fichiers, d'une feuille chacun, non-partagés et ça marchait...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Sub TransacJulien()
    On Error GoTo Errorcatch
    Dim wCPMF2018 As Workbook
    Dim wtransac2 As Workbook
    Set wCPMF2018 = GetObject("G:\Suivi CS_TEST.xlsx")
    Set wtransac2 = Workbooks("transac2.xlsm")
    wCPMF2018.Windows(1).Visible = True
    wCPMF2018.Worksheets("Julien").Select
    Dim a As Integer
    Dim i As Integer
    Dim j As Integer
    a = wtransac2.Worksheets("Macro").Range("a1", Range("a1").End(xlDown)).Count
    'compte le nombre de ligne dans le fichier transac2
    For i = 1 To a
    For j = 1 To 100
    wtransac2.Worksheets("Macro").Cells(j + 1, 20) =Right(Replace(wCPMF2018.Worksheets("Julien").Cells(j + 1, 5), " ", ""), 15)
    'crée une copie des Data du fichier CS_TEST épuré du texte inutile
    Next j
    Next i
    For i = 1 To a
    For j = 1 To 100
    If wtransac2.Worksheets("Macro").Cells(i + 1, 1) = wtransac2.Worksheets("Macro").Cells(j + 1, 20) Then
    'teste les Data ainsi récolté du fichier CS_TEST face aux Data disponible à la base dans le fichier transac2
    wtransac2.Worksheets("Macro").Cells(j + 1, 21) = wtransac2.Worksheets("Macro").Cells(i + 1, 1)
    'si ces données sont identiques, les Data transac2 sont copiées en laissant les espaces adéquats vis-à-vis des données épurées.
    If IsEmpty(wCPMF2018.Worksheets("Julien").Cells(j + 1, 19)) = True And IsEmpty(wtransac2.Worksheets("Macro").Cells(j + 1, 21)) = False Then
    wCPMF2018.Worksheets("Julien").Cells(j + 1, 19) = wtransac2.Worksheets("Macro").Cells(i + 1, 2)
    'copie ainsi la date en fonction de l'ordre ainsi trouvé plus haut en faisant attention que la cellule Date dans CS_TEST soit au préalable vide.
    wtransac2.Worksheets("Macro").Cells(i + 1, 4) = "La date de la première transaction de " & wtransac2.Worksheets("Macro").Cells(i + 1, 3) & " a été copiée dans la feuille de Julien."
    'Un message qui s'affiche pour expliciter quelle feuille a reçu une Date (normalement plusieurs feuilles sont à prévoir.
    Else
    If IsEmpty(wtransac2.Worksheets("Macro").Cells(i, 6)) = True And IsEmpty(wCPMF2018.Worksheets("Julien").Cells(j + 1, 19)) = False Then
    wtransac2.Worksheets("Macro").Cells(i + 1, 4).Value = "La cellule n'est pas vide"
    'ce qui est écrit dans un cas contraire
    End If
    End If
    End If
    Next j
    Next i
    Errorcatch:
    MsgBox Err.Description
    End Sub
    Désolé à ceux qui penserait que je n'ai rien à faire ici. Je ne fait pas exprès.
    Par ailleurs, il y a probablement d'autres erreurs.

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Commence par supprimer "On Error GoTo Errorcatch", histoire de ne pas jouer les yeux bandés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set wCPMF2018 = GetObject("G:\Suivi CS_TEST.xlsx")
    Pourquoi avoir ouvert un fichier Excel avec un GetObject au lieu d'un simple Workbooks.Open ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set wtransac2 = Workbooks("transac2.xlsm")
    Est-ce que ce classeur est déjà ouvert quand tu lances la macro ?

  3. #3
    Membre averti
    Homme Profil pro
    Implementation manager
    Inscrit en
    Mai 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Implementation manager

    Informations forums :
    Inscription : Mai 2018
    Messages : 22
    Par défaut
    Bonjour Menhir,

    Merci pour ta réponse.

    Pour ce qui est du GetObject, c'était simplement une réponse à une autre problème que j'avais et vu que ça marchait, je ne me suis pas intéressé à le changer.

    Pour la deuxième question oui transac2 est ouvert de base.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Pour arrêter tout de même le code sur les erreurs malgré les On Error..., plutôt que les supprimer, je proposerais de modifier temporairement l'option de gestion d'erreur des options du VBE et de choisir Arrêt sur toutes les erreurs... Il suffira de remettre l'option sur Arrêt sur les erreurs non gérées lorsque ce qui pose problème aura été traité

    Nom : error.png
Affichages : 247
Taille : 16,3 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre averti
    Homme Profil pro
    Implementation manager
    Inscrit en
    Mai 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Implementation manager

    Informations forums :
    Inscription : Mai 2018
    Messages : 22
    Par défaut
    Sans le ErrorCatch j'ai une erreur "400".

  6. #6
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Bonjour,

    à quelle ligne de code stp ?

    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  7. #7
    Membre averti
    Homme Profil pro
    Implementation manager
    Inscrit en
    Mai 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Implementation manager

    Informations forums :
    Inscription : Mai 2018
    Messages : 22
    Par défaut
    Quand je passe par F8, il me pose une erreur à cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = wtransac2.Worksheets("Macro").Range("a1", Range("a1").End(xlDown)).Count
    Mais avec ce message.
    Nom : Capture.PNG
Affichages : 212
Taille : 12,5 Ko

  8. #8
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    L'erreur 1004 est souvent liée à un problème de pointage de cellule.

    Essaie avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = wtransac2.Worksheets("Macro").Range("a1", wtransac2.Worksheets("Macro").Range("a1").End(xlDown)).Count
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    tu aurais intérêt à travailler avec des objets définis plutôt que de passer par les collections.

    Dans le code suivant, tu répètes des trucs qui sont tout de même très lourds à écrire et à lire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = wtransac2.Worksheets("Macro").Range("a1", wtransac2.Worksheets("Macro").Range("a1").End(xlDown)).Count

    Le code suivant me semble plus lisible. De plus, comme tu le définis une seule fois, tu évites les erreurs de saisie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dim wsMacro as worksheet
     
    set wsmacro = wtransac2.Worksheets("Macro")
    a = wsmacro.Range("a1", wsmacro.Range("a1").End(xlDown)).Count
    A mon avis, tu devrais d'ailleurs travailler directement avec les objets VBA, au moins pour ce qui est côté Transac.

    Pour le problème de lourdeur, il me semblerait utile que tu nous définisses ta situation de départ et ce à quoi tu veux arriver.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Membre averti
    Homme Profil pro
    Implementation manager
    Inscrit en
    Mai 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Implementation manager

    Informations forums :
    Inscription : Mai 2018
    Messages : 22
    Par défaut
    Merci Pierre,
    Le code est plus court en passant par un objet et du coups plus lisible, je prends.
    Pour ce qui est de la lourdeur, déjà en enlevant le partage je reviens à un niveau normal.
    Du coups, je pense qu'il n'est pas possible de faire mieux. Si ce n'est un VLookUP (probablement) intégrant Right(Replace).

    Pour ce qui est de mon but c'est de faire en sorte que les dates de première transactions soit recopier d'un Excel (transac2) à l'autre (CS_TEST). les contrats sont (représentés par la donnée Data) mais sont dans une cellule mélangée avec d'autres données.

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    De toute façon, un classeur partagé, c'est beurk beurk...

    Pour un RECHERCHEV sur la droite, tu peux utiliser un joker...

    Nom : 2018-05-28_180308.png
Affichages : 199
Taille : 7,2 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Membre averti
    Homme Profil pro
    Implementation manager
    Inscrit en
    Mai 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Implementation manager

    Informations forums :
    Inscription : Mai 2018
    Messages : 22
    Par défaut
    Le problème ici c'est que je suis obligé de passer par un SUBSTITUE pour enlever les potentiels espaces. Je n'arrive pas à faire marcher RECHERCHEV (VLookUP) et SUBSTITUE (Replace). J'avoue que le joker je ne sais pas l'utiliser correctement.

    M'enfin mon soucis de base étant corrigé, je pense qu'on peut marquer cette discussion comme résolu. J'irai chercher des info sur VLookUP x Replace de mon côté.

    Merci pour votre aide.

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/06/2014, 15h55
  2. [XL-2010] Run time error 1004 Application defined or object defined
    Par AmbreM dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/09/2013, 18h00
  3. Application-defined or object-defined error
    Par Vivi127 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/09/2011, 12h42
  4. Réponses: 1
    Dernier message: 20/02/2010, 08h03
  5. [XL-2003] Error 1004 - Application-defined or object-defined
    Par DaRisK dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/05/2009, 19h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo