Le programme s'arrête après une itération, sans message d'erreur [Résolu/Fermé]

Signaler
-
 Guillaume -
Bonjour à tous,

Je viens de perdre une bonne partie de ma journée à essayer de résoudre un problème de boucle certainement simple pour la plupart des habitués de VBA.

J'ai créé une macro permettant de mettre en forme un set de données provenant d'un autre programme. Ces données représentent différents bus (environ 150) et le nombre de passagers entrant et sortant à chacune des 34 stations du trajet. Elles sont toutes regroupées dans la feuille "BusOccupancy".

Le but de ma macro est de sélectionner une partie de ces bus (ceux dont le taux d'occupation est sup. à 0.5) et de créer une nouvelle feuille pour chacun d'eux. Voici mon code :


Sub SortAndSet()
'
' SortAndSet Macro

Dim busOccupancy As Worksheet
Set busOccupancy = Worksheets("BusOccupancy")

Dim maxOccupancy As Double
Dim occupancies As range

' Select the data for each bus and create a new sheet with its own data
For i = 0 To 150

With busOccupancy
Set occupancies = range(Cells(i * 35 + 2, 4), Cells(35 * (i + 1), 4))
End With

maxOccupancy = Application.Max(occupancies)

If maxOccupancy > 0.5 Then

' Ici se situe mon code de mise en forme (création de la feuille, de colonnes, ...)

End If

Next

End Sub

Le problème est que seule une feuille est créée, représentant le premier bus répondant aux critères. Aucun message d'erreur n'apparait. A noter encore que mon code fonctionne si j'efface la condition IF (mais je n'ai pas très envie de devoir trier à la main les 150 feuilles crées... :-) )

Merci d'avance

3 réponses

Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
477
Bonjour,

Essaie comme cela
Set occupancies = Range(.Cells(i * 35 + 2, 4), .Cells(35 * (i + 1), 4))

A+
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 56924 internautes nous ont dit merci ce mois-ci

Non, toujours qu'une seule itérattion qui fonctionne. Mais cette fois, j'ai au moins droit à un message d'erreur :

Runtime error '1004':
Method 'Range' of object '_Global' failed

C'est vraiment comme si ma variable 'occupancy' ne pouvait stocker qu'une fois des données, à la 1ère boucle...

Merci beaucoup pour ta réponse
Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
477
Le code fonctionne correctement en l'état.
Il faudrait que tu joignes un fichier exemple pour voir les interactions avec les données ou le reste du programme.

A+
Désolé, je n'aipas trouvé le moyen de joindre le fichier...

Mais le problème vient de tous les cas de cette partie du code. J'ai à nouveau essayé de n'employer que la boucle for, sans IF, et cela a parfaitement fonctionné (tellement que je me suis retrouvé avec 150 nouvelles feuilles... :-) ).

Mais pour ce qui est du fichier de base, il se présente comme suit :

bus1_201
19 45672 45672 0,006993007 0,006993007 1 0
17 45584 45584 0,006993007 0,006993007 1 0
...
8 45188 45188 0,006993007 0,006993007 1 0
bus_Line1_124
19 37170 37173 0,034965035 0,027972028 6 2
...

Les numéros de la 1ère colonne (19, 17, ..., 8) représentent le numéro des stations, et les valeurs qui m'intéressent (le taux d'occupation) est située dans la 4e colonne (0.00699...).

Si nécessaire, je peux t'envoyer par mail le fichier...

Merci encore
Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
477
Un exemple sur 6 itérations pour te montrer que le code fonctionne
https://www.cjoint.com/c/CKbkNk1X7dI

et un lien pour voir comment joindre un fichier.
https://www.commentcamarche.net/faq/29493-utiliser-cjoint-pour-heberger-des-fichiers#q=cjoint&cur=1&url=%2F

A+
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 56924 internautes nous ont dit merci ce mois-ci

Oui, tu as raison, cela fonctionne !

Le problème ne vient donc pas de la, mais de la partie interne de mon code... Je trouve cela fou, sachant qu'il fonctionne sans IF!

Voila donc l'excel en question : http://cjoint.com/?0Kbn1N3142I
Ainsi que la macro : http://cjoint.com/?0Kbn6nAXlWn

J'ai à nouveau tout recontrolé, et je ne trouve pas la faute. Je pense toutefois qu'elle se situe au moment de la création de la nouvelle feuille. Les variables utilisées sont peut-être du mauvais type ou au mauvais endroit...

Merci d'avance
Ah et j'oubliais : j'ai mtn une erreur 1004 qui apparait :

Error 1004 "Application-defined or Object-defined error"
Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
477
Ton programme est conçu pour fonctionner avec un pas de 34.
Tout se passe bien jusqu'à la ligne 1121 de ta feuille BusOccupancy (bus_Line1_324).
Après le pas de 34 n'est plus respecté. Le bus suivant (bus_Line1_32) se trouve à la ligne 1142 alors qu'il devrait se trouver à la ligne 1156 (pas de 20 au lieu de 34).
Il s'agit donc d'un problème de structuration des données.

A+
Donc tout a fonctionné chez toi jusqu'à la ligne 1121 ?!?! Car dans mon cas, avec exactement les mêmes données que celles que je t'ai envoyé, tout s'arrête après la création de la première feuille de bus...

Comment est-ce possible ? Serait-ce un problème de version Excel ? Ou de réglage mal défini ? J'ai en tout cas toujours le message "Error 1004, Application-defined or Object-defined error" qui apparait...

Merci
Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
477
Effectivement, je ne t'ai pas tout expliqué :D

La première correction à apporter était sur ces lignes de code
        '   Create a new sheet with the same name as the bus
With busOccupancy
nom = .Cells(i * 35 + 1, 1).Value
Range(.Cells(i * 35 + 2, 1), .Cells(35 * (i + 1), 7)).Copy
End With
Tu remarques que j'ai indiqué explicitement la référence de la feuille sur laquelle doivent s'appliquer les instructions. Si tu ne fais pas cela, elles s'appliquent sur la feuille active, à savoir la feuille nouvellement créée.

Maintenant, on en revient à l'erreur que j'évoquais dans le précédent post.
Dans l'exemple joint, l'erreur survient sur la ligne de code newsheet.Name = nom (surlignée en jaune).
https://www.cjoint.com/c/CKcjkRpLk4Y
Si tu survoles avec la souris la variable "nom", tu vas t'apercevoir qu'elle vaut 22.
Si tu survoles avec la souris la variable i, tu vas t'apercevoir qu'elle vaut 36.
nom = Cells(i * 35 + 1, 1).Value équivaut donc à nom = Cells(1261, 1).Value ce qui correspond bien à la valeur de la cellule A1261, à savoir 22.
Il se pose la question de savoir pourquoi on va chercher le nom sur cette ligne alors qu'on devrait chercher en 1247 (bus_Line1_20 ) ou 1282 (bus_Line1_70).
En cherchant, tu remarques que le décalage débute à la ligne 1121.

Voila, voila ...

A+
Incroyable ! Merci beaucoup, tout fonctionne à merveille !

Pour le cas du bus à 20 stations (et non 34), cela provient du programme de modélisation routière ayant créé les données, qui s'arrête à un temps donné, sans laisser à ce pauvre bus n°324 le temps de finir son parcours...

Je pense que je vais simplement le supprimer à la main, ou créer une p'tite condition IF supplémentaire... :-)

Encore une fois MERCI, et bon weekend