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 :

Débogage complexe (Explication de l'erreur.)


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 205
    Par défaut Débogage complexe (Explication de l'erreur.)
    Bonjour,
    La macro ci-jointe s'exécute (presque) correctement à ceci près que sur la dernière ligne j'ai une erreur du type :
    "Erreur définie par l'application ou par l'objet"
    Si j'insiste un petit peu en essayant de relancer avec F8, j'ai alors
    Erreur automation -2147221080 (800401A8)
    En fait il s'agit d'un truc en apparence tout bête :
    Je charge un Array de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Arc = WsC.Range(WsC.Cells(3, 1), WsC.Cells(iLR, iLC)).Value
    Je modifie quelques valeur dans cet Array
    puis je restitue l'Array dans la feuille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WsC.Range(WsC.Cells(3, 1), WsC.Cells(iLR, iLC)) = Arc
    Un tiers environ du transfert se fait bien mais cette dernière ligne (46) est surlignée. et il est impossible d'afficher les dernières valeurs de l'Array.
    J'ai vérifié dans la fenêtre d'exécution quelques-unes des valeurs manquantes : Elles sont bien affichés preuve que l'Array à bien été chargé avec les valeurs exactes jusqu'à sa dernière ligne, mais refusent de s'afficher sur la feuille cible au-delà de la ligne 497 (sur les quelques 1580 que comporte l'Array)
    Le code de la macro :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    Option Explicit
     
    Sub Galopin()
          Dim WsS As Worksheet, WsC As Worksheet, Dico, Dec%, iiR%, iLR%, iMR%, iC%, iR%, iLC%, i%, j%, Arr, Ref, Arc
    1         Application.ScreenUpdating = False
    2         Set WsS = Worksheets("GENERAL")                               'Feuille Source
    3         Sheets.Add After:=Worksheets("GENERAL")
    4         Set WsC = Worksheets(ActiveSheet.Name)                        'Feuille Cible
    5         WsS.Rows("1:2").Copy WsC.Range("A1")
    6         iLC = WsS.Cells(1, Columns.Count).End(xlToLeft).Column + 2
    7         iLR = 0
    8         For i = 2 To iLC
    9             iLR = Application.Max(iLR, WsS.Cells(WsS.Rows.Count, i).End(xlUp).Row)
    10        Next i
    11        iLR = iLR - 1                         'les totaux ne nous intéressent pas
    12        iMR = iLR                             'IMR mémorise la dernière ligne de la Source
    13        Set Dico = CreateObject("Scripting.Dictionary")
    14        For j = 2 To iLC - 2 Step 4
    15          If WsS.Cells(3, j) = "Analyse" Or WsS.Cells(3, j) = "" Then 'Suppression des Analyse/Nombre
    16            Range(WsS.Cells(3, j), WsS.Cells(3, j + 2)).Delete Shift:=xlUp
    17          End If
    18          For i = 3 To iLR
    19             Dico(KDic(WsS.Cells(i, j).Text)) = ""
    20          Next i
    21        Next j
    22        WsC.Range("A3").Resize(Dico.Count, 1) = Application.Transpose(Dico.keys)
    23        iLR = WsC.Range("A" & WsC.Rows.Count).End(xlUp).Row          'iLR fait désormais référence à la feuille Cible (WsC)
                'Tri sur Clef primaire et suppression de la clef
    24          WsC.Range("A3").Resize(Dico.Count, 1).Sort Key1:=WsC.Range("A3"), Order1:=xlAscending, Header:=xlNo
    25          Ref = WsC.Range(WsC.Cells(3, 1), WsC.Cells(iLR, 1)).Value
    26          For i = 1 To UBound(Ref)
    27            Ref(i, 1) = Mid(Ref(i, 1), 2)
    28          Next i
    29          WsC.Range(WsC.Cells(3, 1), WsC.Cells(iLR, 1)) = Ref
    30          If WsC.Range("A3") = "" Then WsC.Rows(3).Delete
    31          iLR = WsC.Cells(WsC.Rows.Count, 1).End(xlUp).Row
    32          Arr = WsS.Range(WsS.Cells(3, 1), WsS.Cells(iMR, iLC)).Value          'Arr Source
    33          Arc = WsC.Range(WsC.Cells(3, 1), WsC.Cells(iLR, iLC)).Value          'Arr Cible
    34          For iiR = 1 To UBound(Arc)               'Pour chaque ligne de ArC (colonne 1)
    35             For iC = 2 To iLC - 2 Step 4  'Pour chaque colonne de Arr (source)
    36                For iR = 1 To UBound(Arr)          'On parcoure toutes les lignes pour trouver la même Référence
    37                   If Trim(Arr(iR, iC)) = Arc(iiR, 1) Then
    38                      Arc(iiR, iC) = Arc(iiR, 1)
    39                      Arc(iiR, iC + 1) = Arr(iR, iC + 1)
    40                      Arc(iiR, iC + 2) = Arr(iR, iC + 2)
    41                   Exit For
    42                   End If
    43                Next
    44             Next
    45           Next
    46          WsC.Range(WsC.Cells(3, 1), WsC.Cells(iLR, iLC)) = Arc 'une partie de l'affichage s'effectue avant le plantage
    End Sub
     
    Private Function KDic(S$) 'Pour insertion d'un caractère de tri primaire
    Dim P$
    Select Case Left(S, 1)
    Case "#": P = ChrW(50)
    Case "+": P = ChrW(51)
    Case "_": P = ChrW(53)
    Case "{": P = ChrW(54)
    Case "}": P = ChrW(55)
    Case "~": P = ChrW(56)
    Case Else: P = ChrW(52)
    End Select
    KDic = P & Trim(S)
    End Function
    Et le fichier est disponible ici : (cjoint)
    L'objet de la macro est d'aligner sur la même ligne les critères identiques.

    Nota : A l'exécution la macro est relativement longue à s'exécuter avant de planter (peut-être un douzaine de secondes) mébon... C'est déjà un chouette petit tableau !

    A défaut d'arriver à solutionner l'affichage si quelqu'un est capable d'expliquer le pourquoi du plantage, et fournir une piste pour contourner le problème, ça m'intéresserait.

    Je ne pense pas que ce soit la taille de l'Array qui pose problème... J'en ai déjà chargé de plusieurs dizaine de milliers de lignes sans problème, donc je ne vois pas.

    Merci.

    A+

  2. #2
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonsoir Galopin, bonsoir le forum,

    Absolument pas sûr de mon coup mais j'aurais plutôt écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Arc = WsC.Range(WsC.Cells(3, 1), WsC.Cells(iLR, iLC))
    sans le Value...

    Puis
    :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WsC.Range(WsC.Cells(3, 1), WsC.Cells(iLR, iLC)).Value = Arc
    avec le Value...

  3. #3
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    quelle est la valeur de la cellule correspondant à l'élément de Arc sur lequel ta procédure bute ?

    ta fonction additionnelle manipulant des caractères spéciaux, des "=" ne me surprendraient pas

    pour moi, c'est la source de ton problème, par exemple une cellule qui commence par un "=" et qui ne contient pas une formule valide derrière.
    lors de la copie du tableau vers la plage, la fausse formule est évaluée ce qui bloque le transfert de ton élément et met en échec la méthode de l'application

    La solution étant de remplacer les "=" .... ou de le faire précéder d'une apostrophe


    EDIT : j'avais un doute pour l'apostrophe, après test, cela ne fonctionne pas

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    EDIT : j'avais un doute pour l'apostrophe, après test, cela ne fonctionne pas
    et bien mettre un espace au début.
    Pour afficher " ========>>>TEMPS DE " ça ne gênera pas beaucoup.
    Ou bien formater les colonnes concernée en Texte.
    eric

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Eric il faut concaténer avec "'" & "=valeur"

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 205
    Par défaut
    bonjour,
    Un petit coup de replace en début de proc et c'est juste parfait.
    Merci les gars !
    A+

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    Bonjour,
    Eric il faut concaténer avec "'" & "=valeur"
    Merci pour le scoop.
    Non, j'ai fait comme joe : j'ai testé.
    Et ça ne fonctionne pas dans ce cas.
    eric

  8. #8
    Invité
    Invité(e)
    Par défaut
    Merci pour le scoop
    Moqueur!

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    ;-)

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

Discussions similaires

  1. Explication d'une erreur sur Samba et smb.conf
    Par LinkGun dans le forum Réseau
    Réponses: 3
    Dernier message: 24/07/2012, 23h06
  2. Explication d une erreur dans mon programme sas
    Par bailliblaire dans le forum SAS Base
    Réponses: 1
    Dernier message: 18/01/2012, 17h16
  3. Explication de plusieurs erreurs
    Par ToTo13 dans le forum Android
    Réponses: 4
    Dernier message: 12/10/2010, 16h20
  4. Réponses: 2
    Dernier message: 23/04/2009, 09h28
  5. explication d'une erreur
    Par Khalid.bounouader dans le forum ASP.NET
    Réponses: 8
    Dernier message: 15/09/2008, 17h31

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