Problème macro excel

Fermé
Davidounet23 - 11 janv. 2010 à 13:50
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 11 janv. 2010 à 15:05
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
A voir également:

4 réponses

Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
11 janv. 2010 à 13:55
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
11 janv. 2010 à 14:03
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
Bernard Rey Messages postés 565 Date d'inscription samedi 2 janvier 2010 Statut Contributeur Dernière intervention 31 décembre 2010 219
11 janv. 2010 à 14:23
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
11 janv. 2010 à 15:05
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