Problème macro excel

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

  • Votes
  • Date
  • Date décroissante
  1. 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
    1. Modérateur
      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.
      1. Contributeur
        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.
        1. Contributeur
          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...