Problème macro excel
Davidounet23
-
michel_m Messages postés 16602 Date d'inscription Statut Contributeur Dernière intervention -
michel_m Messages postés 16602 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
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:
- Problème macro excel
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Déplacer colonne excel - Guide
- Si ou excel - Guide
4 réponses
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
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
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.
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.
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.
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.
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:
Procédure non testée...
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...