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 :

Erreur définie par l'application ou par l'objet [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Homme Profil pro
    Technical Account Manager
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technical Account Manager

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Billets dans le blog
    1
    Par défaut Erreur définie par l'application ou par l'objet
    à tous

    Amis programmeur de VBA, voici un nouveau mystère à résoudre.
    Dans le cadre d'un projet, je dois créer un tableau de résultat.
    Je souhaite saisir les valeurs d'un classeur dans un nouveau classeur qui contiendra mon tableau de résultat.

    Voici le code que j'ai créer :

    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
    43
    44
    45
    46
    Private Sub Saisie_Click()
        'Déclaration du fichier Excel de l'axe choisi
        Dim Wb As Workbook
        Set Wb = GetObject("C:\Users\9404915j\Documents\MacroComptage\MacroTest.xlsm")
        Wb.Windows(1).Visible = True
        'Déclaration des variables utilisées pour le code. l et c sont les variables des lignes et des colonnes
        'i le numéro de feuille du classeur, le compteur permet de gérer le cas des montées / descentes
        'd s'occupe de décaler les valeurs pour chaque date et r s'occupe du test sur le rang
        Dim l, c, i, compteur, d, r As Integer
        d = 0
        r = 0
        'Boucle for i parcourant toute les feuilles du classeur
        'For i = 2 To 7
        'Boucle for c parcourant les colonnes de la fiche horaire
            For c = 3 To 50
                compteur = 0
                'Boucle for l parcourant les lignes de la feuille de comptage
                For l = 2 To 10000
                    'On ajoute la date dans sa ligne correspondante dans le tableau de résultats
                    Wb.Worksheets(1).Cells(23, c + d) = Worksheets(1).Cells(l, 14)
                    'Si la date de la ligne suivante n'est pas égale à la date actuelle alors
                    'on incrémente de 1 la variable d et on réiniatilise la variable r à 1
                    If Not (Worksheets(1).Cells(l, 14) = Worksheets(1).Cells(l + 1, 14)) Then
                        r = 0
                        d = d + 1
                    End If
     
     
     
                    'Si le numéro de train du classeur comptage est le même que celui présent dans la fiche horaire alors
                    'le compteur récupère sa valeur + 2 et on ajoute les valeurs des montées et des descentes
                    'dans le tableau de résultats
                    If Worksheets(1).Cells(l, 1) = Wb.Worksheets(1).Cells(3, c) Then
                        compteur = compteur + 2
                        If Worksheets(1).Cells(l, 10) = Wb.Worksheets(1).Cells(25 + compteur + r, 2) Then
                            r = r + 1
                            Wb.Worksheets(1).Cells((26 + compteur + r) - 2, c + d) = Worksheets(1).Cells(l, 6)
                            Wb.Worksheets(1).Cells(25 + compteur + r, c + d) = Worksheets(1).Cells(l, 7)
                        End If
     
                    End If
     
                Next l
            Next c
        'Next i
    End Sub
    Excel m'affiche le message d'erreur suivant : "Erreur définie par l'application ou par l'objet" et me pointe la ligne suivante Wb.Worksheets(1).Cells(23, c + d) = Worksheets(1).Cells(l, 14).

    Cependant, il y a 3 jours mon code fonctionnait avec le même code. Alors je ne comprends pas du tout mon erreur .

    Quelqu'un peut-il m'éclairer s'il vous plait ?

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Bonjour,

    ce n'est pas parce qu'un code a fonctionné qu'il n'est pas exempt d'erreur de conception ‼
    En trois jours, le contexte a certainement changé !

    Pour trouver la boulette c'est simple : placer un point d'arrêt sur la ligne de code fautive
    puis lancer l'exécution et contrôler enfin la fenêtre des Variables locales

    ______________________________________________________________________________________________________
    Je suis Charlie, Bardo, Sousse

  3. #3
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour xela57, Marc,

    Quelques petites remarques :
    • Lorsque tu écris Dim l, c, i, compteur, d, r As Integer, tu déclares "r" en tant que Interger et les autres variables en tant qu'Object.
    • Lorsque tu parcours tes lignes et tes colonnes avec For c = 3 To 50 ou For l = 2 To 10000, n'y aurait-il pas un moyen d'optimiser en allant, par exemple, jusqu'à la dernière colonne/ligne non-vide ?
    • La logique est correcte mais If Not (Worksheets(1).Cells(l, 14) = Worksheets(1).Cells(l + 1, 14)) Then peut être remplacer par If Worksheets(1).Cells(l, 14) <> Worksheets(1).Cells(l + 1, 14) Then, d'après moi plus lisible et compréhensible, non ?
    • Connais-tu la propriété .Offset(nb_ligne, nb_col) ? Parce que tes Cells((26 + compteur + r) - 2, c + d) sont assez indigestes... Revient voir ton code dans 1 mois, je pense que tu vas galérer !

    Enfin, je suis d'accord avec Marc. Ton classeur a dû changer entre temps. A voir quelles variables sont retournées lorsque l'erreur intervient est ta seule manière de trouver le pourquoi du comment !
    Je reste disponible cependant !

    Cordialement,
    Kimy

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    En fait il y a au moins trois sources d'erreur possibles !

    Je n'en ai évoqué qu'une car c'est le B-A-BA du développeur de contrôler les variables.

    A suivre …

  5. #5
    Membre expérimenté

    Homme Profil pro
    Technical Account Manager
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technical Account Manager

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Billets dans le blog
    1
    Par défaut
    Merci pour vos réponses pertinentes

    Kimy j'ai corrigé mon code comme tu me l'as suggéré et cela me semble être un code plus propre. J'ai juste pas compris comment se servir de la propriété offset. Cela s'utilise comme Cells ?
    Marc j'ai mis un point d'arrêt à la ligne de code fautive. Ce qui fait que quand je clique sur le bouton il ne se passe plus rien même après avoir enlevé le point d'arrêt...

    Pour info rien n'avait été changé en 3 jours sur la feuille de calcul. Le contexte n'a pas changé non plus.

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut



    Si ni le contexte ni le code n'ont changé , alors c'est l'ordinateur : l'éteindre ou le redémarrer.

    Si cela recommence, vérifier le contenu des variables soit via un point d'arrêt soit en mode pas à pas (F8) …

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ERREUR 1004-erreur défini par l'application ou par l'objet
    Par zineb87 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/02/2010, 16h40
  2. Réponses: 2
    Dernier message: 20/10/2009, 16h59
  3. Erreur 1004 définie par l'application ou par l'objet
    Par GreatDeveloperOnizuka dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/12/2007, 09h33
  4. [VBA-E]erreur définie par l'application ou par l'objet
    Par vivelesgnous dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/02/2006, 14h51

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