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 :

Diffèrence de résultat entre pas à pas et immédiat [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Mars 2011
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôleur de Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 312
    Points : 144
    Points
    144
    Par défaut Diffèrence de résultat entre pas à pas et immédiat
    Bonjour,

    Je reviens vers vous car j'ai un problème de retour de résultante.
    Lorsque j'eefectue le code qui suivre le retour s'effectue à 99 lignes

    et Pas à pas 157 lignes (résulat que j'attends)

    est ce que cela est lié au temps traitement qui demandrait une temporisation pour recalculer les nombre de lignes dans les variables :

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    Sub AjBnc()
    Dim i As Long, j As Long, k As Long, l As Long, m As Long, n As Long
    Dim Trouve As Boolean
    Dim Wb As Workbook
    Dim Ws As Worksheet
     
    For Each Wb In Application.Workbooks
        If Wb.Name Like "Suivi bnc*" Then
            Trouve = True
            Exit For
        End If
    Next Wb
     
    If Trouve Then
        Set Ws = Wb.Worksheets(1)
        i = Ws.Cells(Ws.Rows.Count, 1).End(xlUp).Row
     
        Application.ScreenUpdating = False
     
     
        With Ws
     
        .Rows("1:2").Delete
        .Range("A2:A" & i).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
        .Rows(Range("B65536").End(xlUp).Row).Delete
        .Range("A2:A" & i).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
        .Columns("D").Copy
        .Columns("J").PasteSpecial xlPasteValues
        .Columns("A:B").Copy
        .Columns("F:G").PasteSpecial xlPasteValues
        .Range("L:N,E:E,B:B").Delete
        .Range("A2:A" & i).Replace What:="*", Replacement:="BNC", LookAt:=xlWhole
        .Range("G2:G" & i).Replace What:="*", Replacement:="", LookAt:=xlWhole
        .Range("J2:J" & i).Replace What:="*", Replacement:=0, LookAt:=xlWhole
        l = Ws.Cells(Ws.Rows.Count, 1).End(xlUp).Row
        .Range("K2:K" & l).Formula = "=SUMIFS($I:$I,$D:$D,D2,$H:$H,2)"
        .Columns("K").Copy
        .Columns("K").PasteSpecial xlPasteValues
        .Columns("A:J").Copy
        .Columns("L").PasteSpecial xlPasteValues
        .Range("V2:V" & l).Formula = "=SUMIFS($I:$I,$D:$D,D2,$H:$H,3)"
        .Columns("V").Copy
        .Columns("V").PasteSpecial xlPasteValues
        .Range("G2:G" & l).Replace What:="*", Replacement:="Manquant", LookAt:=xlWhole
        .Range("H2:H" & l).Replace What:="*", Replacement:=2, LookAt:=xlWhole
        .Range("R2:R" & l).Replace What:="*", Replacement:="Inversion", LookAt:=xlWhole
        .Range("S2:S" & l).Replace What:="*", Replacement:=3, LookAt:=xlWhole
        .Range("E2:E" & l).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
        .Columns("K").Copy
        .Columns("I").PasteSpecial xlPasteValues
        .Range("I1").Value = "Nb de ligne de BNC"
        .Columns("V").Copy
        .Columns("T").PasteSpecial xlPasteValues
        m = Ws.Cells(Ws.Rows.Count, 1).End(xlUp).Row
        .Range("A" & m + 1 & ":J" & m + m - 1).Value = Range("L2:U" & m).Value
        .Columns("K:V").Delete
        .Range("I2:I" & m + m - 1).Replace What:=0, Replacement:="", LookAt:=xlWhole
        .Range("I2:I" & m + m - 1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
        n = Range("A" & Rows.Count).End(xlUp).Row
        .Range("K2:K" & n).Formula = "=Month((B2))"
        .Range("K2:K" & n).Copy
        .Range("B2:B" & n).PasteSpecial xlPasteValues
        .Columns("B").NumberFormat = "0"
        .Columns("K").Delete
     
     
         End With
     
          k = Ws.Cells(Ws.Rows.Count, 1).End(xlUp).Row
     
     
     
                With ThisWorkbook.Worksheets("MPH")
                j = .Cells(.Rows.Count, 1).End(xlUp).Row
     
     
                .Range("L" & j + 1).Formula = "=IFERROR(VLOOKUP(H" & j + 1 & ",BD!$A:$B,2,FALSE),0)"
                .Range("M" & j + 1).Formula = "=IFERROR(I" & j + 1 & "/L" & j + 1 & ",0)"
                .Range("K" & j + 1 & ":M" & j + 1).Copy
                .Range("K" & j + 1 & ":M" & j + k - 1).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
                    False, Transpose:=False
                .Range("A" & j + 1 & ":J" & j + 1 + k).Value = Ws.Range("A2:J" & k + 2).Value
                .Range("N" & j + 1).Formula = "=IFERROR(INDEX($C$2:$D$" & j & ",MATCH(D" & j + 1 & ",$D$2:$D$" & j & ",0),1),0)"
                .Range("N" & j + 1).Copy
                .Range("N" & j + 1 & ":N" & j + k - 1).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
                    False, Transpose:=False
                .Range("N" & j + 1 & ":N" & j + k - 1).Copy
                .Range("C" & j + 1 & ":C" & j + k - 1).PasteSpecial xlPasteValues
                .Range("N" & j + 1).Formula = "=IFERROR(VLOOKUP(D" & j + 1 & ",$D$2:$F$" & j & ",2,FALSE),"""")"
                .Range("N" & j + 1).Copy
                .Range("N" & j + 1 & ":N" & j + k - 1).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
                    False, Transpose:=False
                .Range("N" & j + 1 & ":N" & j + k - 1).Copy
                .Range("E" & j + 1 & ":E" & j + k - 1).PasteSpecial xlPasteValues
                .Range("N" & j + 1).Formula = "=IFERROR(VLOOKUP(D" & j + 1 & ",$D$2:$F$" & j & ",3,FALSE),"""")"
                .Range("N" & j + 1).Copy
                .Range("N" & j + 1 & ":N" & j + k - 1).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
                    False, Transpose:=False
                .Range("N" & j + 1 & ":N" & j + k - 1).Copy
                .Range("F" & j + 1 & ":F" & j + k - 1).PasteSpecial xlPasteValues
                .Range("N:N").Delete
     
                End With
         Application.ScreenUpdating = True
            Else
            MsgBox "L'importation des données que vous essayez d'effectuer ne peut être effectuée pour l'une des 4 raisons :" _
            & vbCrLf & vbCrLf & "1 - Le fichier Suivi bncxxx n'est pas ouvert" & vbCrLf & _
            "2 - Le fichier a un nom diffèrent de Suivi bncxxx" & vbCrLf & _
            "3 - Le nom de la requête Infolog a été renommé dans ce cas modifier le nom dans la macro" & vbCrLf & _
            "4 - Vous avez ouvert l'application Excel plusieurs fois - N'en ouvrir qu'une seule"
     
            'Etape de Libération d'espace mémoire sur  Ws et Wb
                Set Ws = Nothing
                Set Wb = Nothing
            'Correspond au End If de If trouve
            End If
    End Sub


    Après moultes essais la problématique ne se déclare pas quand j'execut sur le fichier externe soit Ws
    Elle est effective où se situe le module
    Merci de votre aide

  2. #2
    Membre expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 869
    Points : 3 442
    Points
    3 442
    Billets dans le blog
    1
    Par défaut
    Salut,

    j'avoue que j'ai pas lu tout ton code

    Mais tu as dis
    est ce que cela est lié au temps traitement qui demandrait une temporisation pour recalculer les nombre de lignes dans les variables :
    et dans ton début de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ...
    For Each Wb In Application.Workbooks
        If Wb.Name Like "Suivi bnc*" Then
            Trouve = True
            Exit For
        End If
    Next Wb
    ...
    du coup j'ai penser à la fonction DoEvents dont je t'ai copier l'aide en ligne d'excel
    Je me suis permis de souligner ce qui dervrait t'inresser

    DoEvents, fonction

    Arrête momentanément l'exécution afin que le système d'exploitation puisse traiter d'autres événements.

    Syntaxe
    DoEvents( )

    Remarques

    La fonction DoEvents renvoie une valeur de type Integer représentant le nombre de feuilles ouvertes dans les versions autonomes de Visual Basic (Visual Basic Édition professionnelle, par exemple). DoEvents renvoie un zéro dans toutes les autres applications.

    DoEvents passe la main au système d'exploitation jusqu'à ce que ce dernier ait terminé de traiter les événements de sa file d'attente et que tous les codes de la file d'attente SendKeys aient été transmis.

    La fonction DoEvents est particulièrement indiquée pour les opérations simples que l'utilisateur veut annuler juste après les avoir lancées, comme par exemple la recherche d'un fichier. Pour les opérations nécessitant une exécution plus longue, l'opérateur pourra plus aisément rendre la main au processeur s'il a recours à un contrôle Timer ou à un composant EXE ActiveX. Dans ce cas, la tâche s'effectue de manière complètement indépendante, hors de votre application, le système d'exploitation gérant à la fois le multitâche et le partage du temps.
    Or il me semble que c'est ce que tu cherche

    Tu dis

    @+
    Ils ne savaient pas que c'était impossible ... du coup ils l'ont fait (Mark Twain)

    n'oubliez pas de si les messages vous aide ou sont pertinents et de mettre quand cela est !

  3. #3
    Membre habitué
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Mars 2011
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôleur de Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 312
    Points : 144
    Points
    144
    Par défaut
    Merci pour ta réponse Igloobel

    Lorsque j'ai saisi Do events comme pour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    .Range("L:N,E:E,B:B").Delete
        .Range("A2:A" & i).Replace What:="*", Replacement:="BNC", LookAt:=xlWhole
        .Range("G2:G" & i).Replace What:="*", Replacement:="", LookAt:=xlWhole
        .Range("J2:J" & i).Replace What:="*", Replacement:=0, LookAt:=xlWhole
        Do events
        l = Ws.Cells(Ws.Rows.Count, 1).End(xlUp).Row
        .Range("K2:K" & l).Formula = "=SUMIFS($I:$I,$D:$D,D2,$H:$H,2)"
        .Columns("K").Copy
    Et avant chaque définition de variable
    J'ai ce message suivant :

    Attendu Do While, until ou fin d'instruction
    Par contre ou alors je me leurre lorsque je rajoute .activate à With:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With ThisWorkbook.Worksheets("MPH")
                j = .Cells(.Rows.Count, 1).End(xlUp).Row
                .Activate
    Et je n'ai pas le souci ou alors c'est un énorme coup de chance.

    Pourtant je l'ai testé une dizaine de fois.

    Si c'est réellement cela. J'aimerais bien savoir pourquoi

    Merci encore

  4. #4
    Membre expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 869
    Points : 3 442
    Points
    3 442
    Billets dans le blog
    1
    Par défaut
    Salut,

    c'est "DoEvents" et pas "Do Events"

    Pourtant je l'ai écrit pas mal de fois et je t'ai même rapporté l'aide en ligne !

    .activate active l'objet, le classeur, la feuille ...

    donc peut-être que cela suffit, mais regarde bien l'aide en ligne et les 2 phrases que je t'ai souligné dans mon premier post !
    Ils ne savaient pas que c'était impossible ... du coup ils l'ont fait (Mark Twain)

    n'oubliez pas de si les messages vous aide ou sont pertinents et de mettre quand cela est !

  5. #5
    Membre habitué
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Mars 2011
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôleur de Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 312
    Points : 144
    Points
    144
    Par défaut
    Ok Ok Ok Igloobel

    Je prends bonne note
    Je l'ai inclus dans ma procédure

    Par contre je ne l'ai pris en temps que fonction mais comme process

    like DOEvents sans les ()

    Merci encore

    Et sache Igloobel que
    « La colère repose de l'amertume. »
    de Claire de Lamirande

  6. #6
    Membre expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 869
    Points : 3 442
    Points
    3 442
    Billets dans le blog
    1
    Par défaut
    Eh si j'ai mis un smiley diablotin qui s'amuse c'est juste une boutade pour décompresser l'atmosphère rien de plus

    Et je suis très très très loin d'être en colère

    et suis vraiment désolé de t'avoir froissé ce n'était pas du tout mon intention

    Ceci dis as tu toujours besoin d'un coup de main je suis près à t'aider si tu le souhaites

    amicalement

    Igloobel
    Ils ne savaient pas que c'était impossible ... du coup ils l'ont fait (Mark Twain)

    n'oubliez pas de si les messages vous aide ou sont pertinents et de mettre quand cela est !

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

Discussions similaires

  1. [AC-2000] Différence de résultat entre acpreview et Print d'un état
    Par riri2938 dans le forum IHM
    Réponses: 0
    Dernier message: 20/02/2010, 16h50
  2. [Débutant] Différences de résultats entre MATLAB 6.5 et 7.8
    Par Caps59 dans le forum MATLAB
    Réponses: 21
    Dernier message: 16/03/2009, 16h04
  3. graphique : résultat différent en pas à pas
    Par westeban29 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/10/2008, 14h43
  4. Différence de résultat entre MATLAB et Scilab
    Par ABN84 dans le forum MATLAB
    Réponses: 1
    Dernier message: 10/05/2008, 23h53
  5. Différence de résultats entre requêtes SQL et Criteria
    Par titoudemtl dans le forum Hibernate
    Réponses: 3
    Dernier message: 07/08/2006, 10h30

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