Problème macro excel

Davidounet23 -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour, j'ai une petite base de donnée à traiter ; mon algorithme tourne correctement (jusqu'à preuve du contraire) et quand j'ai enfin fini de coder tout ça en macro VB, excel plante lors de l'exécution ou me trouve des erreurs que je ne vois pas. (je programme bcp en lader, grafcet et en C, ducoup le VB c un peu flou niveau langage^^)
Si quelqu'un de familier avec ce langage pouvais me dire ce qui ne tourne pas rond là dedans ça serait gentil! Merci!

Voici la routine qui attaque une base sur deux colonnes représentant un intervalle de dates:

Sub anal()

Dim deb_int As Long
Dim fin_int As Long
Dim ent As Long
Dim sor As Long

deb_int = 39006
fin_int = 40184
ent = 0
sor = 0
date_anal = "datedeb"
cpt_pers = 0
cpt_max = 0
date_max = 0
j = 0
Sheets("Feuil1").Select
Range("A2").Select

For date_anal = deb_int To fin_int
cpt_pers = 0

For j = 1 To 171
ActiveCell.Offset(0, 4).Select
ent = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
sor = ActiveCell.Value
ActiveCell.Offset(1, -5).Select

If (ent <= date_anal) Then
If (sor >= date_anal) Then
cpt_pers = cpt_pers + 1
End If
End If

Next j

If cpt_pers <= cpt_max Then
cpt_max = cpt_pers
date_max = Max
End If

Next date_anal

mess = "nombre maximum cpt_max au date_max"
style1 = vbYes
titre1 = "resultat de l'anal"
MsgBox mess, style1, titre1

End Sub

4 réponses

  1. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Bonjour,

    Si on pouvait avoir le ou les messages d'erreur (en passant en mode débogage la ligne en erreur est surlignée en jaune), on pourrait peut être te venir en aide.

    Merci
    0
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,
    Salut Polux,
    Oui, les lignes qui "plantent" nous seraient grandement utiles. Ou à défaut une description de ta bdd et ce que tu souhaites que fasse la macro.
    0
  3. Bernard Rey Messages postés 578 Statut Contributeur 219
     
    Difficile en effet de donner une réponse avec aussi peu de précisions. On peut toutefois (après quelques essais) noter que rien ne ramène le curseur en début de plage (sur "A2") après l'instruction Next date_anal. Il serait donc peut-être judicieux de placer l'instruction Sheets("Feuil1").Select Range("A2").Select juste après la ligne For date_anal = deb_int To fin_int (au lieu de juste avant) pour éviter que la macro ne "descende" à chacune des boucles.

    Au passage, tu pourrais d'ailleurs l'écrire Sheets("Feuil1").Range("A2").Select

    D'ailleurs, tu peux probablement t'économiser quelques autres .Select qui ralentissent l'exécution sans intérêt évident. Par exemple en remplaçant ça :

    ActiveCell.Offset(0, 4).Select
    ent = ActiveCell.Value
    ActiveCell.Offset(0, 1).Select
    sor = ActiveCell.Value
    ActiveCell.Offset(1, -5).Select


    par ça :

    ent = ActiveCell.Offset(0, 4).Value
    sor = ActiveCell.Offset(0, 1).Value
    ActiveCell.Offset(1, 0).Select


    (pour faire très vite, car on pourrait encore optimiser ça différemment) tu obtiendrais le même résultat.
    0
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour à tous,,

    offset(1,-5) sort de la feuille "inférieur" à colonne A

    Une instruction est incalculable
    date_max= max
    max de quoi? peut-être sor ?

    mess a des petites fautes de syntaxe

    proposition de code:

    Sub anal()
    
    Dim deb_int As Long, fin_int As Long, ent As Long, sor As Long, date_anal As Long, date_max As Long
    Dim cpt_pers As Byte, cptr_max As Byte
    
    deb_int = 39006
    fin_int = 40184
    
     With Sheets("Feuil1")
        For date_anal = deb_int To fin_int
            For j = 2 To 172
                sor = .Cells(j, 2)
                ent = .Cells(j, 5)
                If ent <= date_anal And sor >= date_anal Then
                    cpt_pers = cpt_pers + 1
                End If
            Next
    
            If cpt_pers <= cpt_max Then
                cpt_max = cpt_pers
                date_max = Max ' ???
            End If
        Next
    End With
    
    mess = "nombre maximum " & cpt_max & " au " & Format(date_max, "dd/mm/yy")
    style1 = vbYes
    titre1 = "resultat de l'anal"
    MsgBox mess, style1, titre1
    
    End Sub
    


    Procédure non testée...
    0