Ma macro fonctionne plusieurs jours puis plante ...

Fermé
Erwin33 Messages postés 5 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 1 septembre 2014 - 29 août 2014 à 15:50
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 - 1 sept. 2014 à 12:14
Bonjour,

J'ai rédigé la macro ci-dessous qui me permet de récupérer des informations sur une page web, de les traiter puis de les charger dans une base de données.

Mon problème est que cette macro fonctionne plusieurs jours puis plante sans que je n'arrive à comprendre pourquoi ...

Je me suis formé sur le tas à VBA et à la programmation en général, il est donc possible de trouver des inepties dans ma macro.

Merci d'avance pour tous vos conseils !

Dim DerniereCelluleRemplie As Integer
Dim i As Integer
Dim nom_station As String
Dim numero_station As String

Dim rs As ADODB.Recordset
Dim oConn As ADODB.Connection


'On retire les caractère "'" par "\'"
Function esc(txt As String)
esc = Trim(Replace(txt, "'", "\'"))
End Function


'Connection à MYSQL
Sub ConnectDB()
Set oConn = New ADODB.Connection
oConn.Open "DRIVER={MySQL ODBC 5.3 ANSI Driver};" & _
"SERVER=localhost;" & _
"DATABASE=xxx;" & _
"USER=xxx;" & _
"PASSWORD=xxx;" & _
"Option=3"
oConn.MaintainConnection = False
End Sub


Sub lancement_macro_synop()

Sheets("cv").Calculate

heure = Sheets("cv").Range("F4")

Application.OnTime TimeValue(heure), "a01_insert_data_station_all"

End Sub


Sub interval_synop()

interval = Sheets("cv").Range("F5")

Application.OnTime Now + TimeValue(interval), "a01_insert_data_station_all"

End Sub


Sub a01_insert_data_station_all()

'Désactivation de la mise à jour visuelle
Application.ScreenUpdating = False

DerniereCelluleRemplie = Sheets("variable").Range("A1").End(xlDown).Row

For i = 2 To DerniereCelluleRemplie

nom_station = Sheets("variable").Range("A" & i)
numero_station = Sheets("variable").Range("B" & i)

date_du_jour = Format(Now, "dd")
mois_du_jour = Format(Now, "mm")
heure_now = Format(Now, "hh")
annee = Format(Now, "yyyy")

Sheets("d_a_st_ex").Select
ActiveSheet.Range("A1:W300").Select
Selection.ClearContents

'Télécharger les données de la station

With ActiveSheet.QueryTables.Add(Connection:= _
"URL;http://www.ogimet.com/cgi-bin/gsynres?ind=" & numero_station & "&lang=en&decoded=yes&ndays=10&ano=" & annee & "&mes=" & mois_du_jour & "&day=" & date_du_jour & "&hora=" & heure_now & "" _
, Destination:=Range("$A$1"))
.Name = _
"gsynres?ind=" & numero_station & "&lang=en&decoded=yes&ndays=10&ano=" & annee & "&mes=" & mois_du_jour & "&day==" & date_du_jour & "&hora=" & heure_now & ""
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "4"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With

If Sheets("d_a_st_ex").Range("AA1").Value <> Sheets("d_a_st_ex").Range("AB1").Value Then

'Suppression de la connexion
ActiveWorkbook.Connections("Connexion").Delete

GoTo Line1

Else

'Suppression de la connexion
ActiveWorkbook.Connections("Connexion").Delete

'Effacer les lignes vides
Sheets("d_a_st_ex").Select
x = Range("A250").End(xlUp).Row
Cells.Range("A1:A" & x). _
SpecialCells(xlCellTypeBlanks).EntireRow.Delete

'Renseigner les cellules de d_b par celle de d_a
Sheets("d_b_st_ex").Range("B1:Z250").Value = Sheets("d_a_st_ex").Range("B1:Z250").Value

End If

Sheets("d_t_g_st_ex").Range("CG7:CW7").Value = Sheets("variable").Range(("G" & i & ":W" & i)).Value

'Insérer les données traités dans la base de données

Set rs = New ADODB.Recordset

ConnectDB

With d_t_g_st_ex

For rowCursor_a = 2 To 39

strSQL = "INSERT IGNORE INTO archive_station_" & nom_station & " (" & _
"date_heure_loc_ms_archive_station_" & nom_station & ", " & _
"date_heure_loc_txt_archive_station_" & nom_station & ", " & _
"vitesse_vent_archive_station_" & nom_station & ", " & _
"vitesse_rafale_archive_station_" & nom_station & ", " & _
"press_atmo_archive_station_" & nom_station & ", " & _
"temp_air_archive_station_" & nom_station & ", " & _
"precipitation_archive_station_" & nom_station & ", " & _
"duree_vent_faible_archive_station_" & nom_station & ", " & _
"duree_vent_offshore_archive_station_" & nom_station & ", " & _
"dir_vent_archive_station_" & nom_station & ") " & _
"VALUES ('" & esc(.Cells(rowCursor_a, 1)) & "', " & _
"'" & esc(.Cells(rowCursor_a, 2)) & "', " & _
"'" & esc(.Cells(rowCursor_a, 3)) & "', " & _
"'" & esc(.Cells(rowCursor_a, 4)) & "', " & _
"'" & esc(.Cells(rowCursor_a, 5)) & "', " & _
"'" & esc(.Cells(rowCursor_a, 6)) & "', " & _
"'" & esc(.Cells(rowCursor_a, 7)) & "', " & _
"'" & esc(.Cells(rowCursor_a, 8)) & "', " & _
"'" & esc(.Cells(rowCursor_a, 9)) & "', " & _
"'" & esc(.Cells(rowCursor_a, 10)) & "')"

rs.Open strSQL, oConn, adOpenDynamic, adLockOptimistic

Next

End With

'Insertion données vent graphique station

Set rs = New ADODB.Recordset

ConnectDB

With d_t_g_st_ex

For rowCursor_b = 2 To 11

strSQL = "INSERT IGNORE INTO dir_vent_graph_station_" & nom_station & " (" & _
"date_heure_loc_ms_dir_vent_graph_station_" & nom_station & "," & _
"date_heure_loc_txt_dir_vent_graph_station_" & nom_station & "," & _
"NO_16_dir_vent_graph_station_" & nom_station & "," & _
"NNO_15_dir_vent_graph_station_" & nom_station & "," & _
"N_14_dir_vent_graph_station_" & nom_station & "," & _
"NNE_13_dir_vent_graph_station_" & nom_station & "," & _
"NE_12_dir_vent_graph_station_" & nom_station & "," & _
"ENE_11_dir_vent_graph_station_" & nom_station & "," & _
"E_10_dir_vent_graph_station_" & nom_station & "," & _
"ESE_9_dir_vent_graph_station_" & nom_station & ","
strSQL = strSQL & _
"SE_8_dir_vent_graph_station_" & nom_station & "," & _
"SSE_7_dir_vent_graph_station_" & nom_station & "," & _
"S_6_dir_vent_graph_station_" & nom_station & "," & _
"SSO_5_dir_vent_graph_station_" & nom_station & "," & _
"SO_4_dir_vent_graph_station_" & nom_station & "," & _
"OSO_3_dir_vent_graph_station_" & nom_station & "," & _
"O_2_dir_vent_graph_station_" & nom_station & "," & _
"ONO_1_dir_vent_graph_station_" & nom_station & ") " & _
"VALUES ('" & esc(.Cells(rowCursor_b, 13)) & "', " & _
"'" & esc(.Cells(rowCursor_b, 14)) & "', " & _
"'" & esc(.Cells(rowCursor_b, 15)) & "', " & _
"'" & esc(.Cells(rowCursor_b, 16)) & "', " & _
"'" & esc(.Cells(rowCursor_b, 17)) & "', " & _
"'" & esc(.Cells(rowCursor_b, 18)) & "', " & _
"'" & esc(.Cells(rowCursor_b, 19)) & "', " & _
"'" & esc(.Cells(rowCursor_b, 20)) & "', "
strSQL = strSQL & _
"'" & esc(.Cells(rowCursor_b, 21)) & "', " & _
"'" & esc(.Cells(rowCursor_b, 22)) & "', " & _
"'" & esc(.Cells(rowCursor_b, 23)) & "', " & _
"'" & esc(.Cells(rowCursor_b, 24)) & "', " & _
"'" & esc(.Cells(rowCursor_b, 25)) & "', " & _
"'" & esc(.Cells(rowCursor_b, 26)) & "', " & _
"'" & esc(.Cells(rowCursor_b, 27)) & "', " & _
"'" & esc(.Cells(rowCursor_b, 28)) & "', " & _
"'" & esc(.Cells(rowCursor_b, 29)) & "', " & _
"'" & esc(.Cells(rowCursor_b, 30)) & "')"

rs.Open strSQL, oConn, adOpenDynamic, adLockOptimistic

Next

End With

Line1:

Next

'Active la mise à jour visuelle
Application.ScreenUpdating = True

Application.Run "interval_synop"

End Sub
A voir également:

10 réponses

PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26
29 août 2014 à 16:36
Quand çà "plante", quel est le message d'erreur.

Dans la fenêtre du message d'erreur, si tu fais "debugger", tu peux voir quelle ligne cause le "plantage".
0
Erwin33 Messages postés 5 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 1 septembre 2014
29 août 2014 à 16:37
Je n'ai pas de message d'erreur car Excel se bloque et je dois le fermer...
0
PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26
29 août 2014 à 16:45
For i = 2 To DerniereCelluleRemplie

J'ai le feeling que tu boucles à l'infini dans ce coin la.

J'ai pas trouver ton next pour ce For, mais j'suis a court de café ce matin.
0
Erwin33 Messages postés 5 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 1 septembre 2014
29 août 2014 à 16:49
Malheureusement il existe, il est à 5 lignes de la fin ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26
Modifié par PlacageGranby le 29/08/2014 à 19:25
Si tu vas dans ton code et que tu mets des point d'arrêt au début de chacun de tes macro et exécute le code. Est-ce qu'il en exécute une partie ?

C'est sur que faire du pas à pas c'est pénible, mais tu peux peut-être cerner quelle partie du code cause problème
0
bonjour,
c'est vrai que c'est pénible mais faire le mode pas à pas et utiliser des éspions, il n'y a rien d'assi efficace pour débugger. par contre ce qui est etonnant c'est que ca ne marche pas alors que c'est marchait avant.
0
Erwin33 Messages postés 5 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 1 septembre 2014
29 août 2014 à 21:21
Quand j'utilise le mode pas à pas tout va bien, ma macro déroule tranquille !

Quand je lance la macro cette dernière fonctionne entre 2 et 5 jours voir plus sans problème sachant qu'elle se lance toutes les 15 minutes (temps de traitement environ 3 minutes) et d'un coup d'un seul Excel se fige, je ne peux plus rien faire à par forcer la fermeture du logiciel. Je relance le logiciel en suivant, j'ouvre mon fichier et je relance ma macro qui va fonctionner pendant plusieurs jours avant un nouveau plantage.

Ma première question est de savoir si la rédaction de ma macro respecte les règles de l'art ? Est ce que certaines améliorations peuvent être apportées ?

A savoir que cette macro tourne sur un serveur (Online) et que je lance 10 fois Excel de manière indépendante afin d'ouvrir 10 fichiers avec des macros similaires (les sources d'informations provenant de site web différents) ce qui me permet d'avoir plusieurs macros qui tournent en parallèle. Je n'ai pas de problème de mémoire vive et certaines de ces macros qui ont la même architecture fonctionnement depuis plusieurs mois sans avoir subit un seul plantage...
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 211
30 août 2014 à 00:02
Bonjour,

un peu imbuvable à lire...
Est-ce que tu attends bien la confirmation que les données soient chargées avant de continuer le code ?
Il y a des instructions pour ça.
Sinon un petit retard te met tout en l'air.

eric

0
Erwin33 Messages postés 5 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 1 septembre 2014
1 sept. 2014 à 10:26
Salut Eriiic,

Effectivement il doit me manquer une confirmation du chargement des données.

J'ai essayé de rajouter DoEvents à la suite de mon code de chargement des données mais je ne dois pas avoir la bonne syntaxe... Quelle est la bonne manière d'intégrer un DoEvents dans mon code ?

Merci d'avance

'Télécharger les données de la station

With ActiveSheet.QueryTables.Add(Connection:= _
"URL;http://www.ogimet.com/cgi-bin/gsynres?ind=" & numero_station & "&lang=en&decoded=yes&ndays=10&ano=" & annee & "&mes=" & mois_du_jour & "&day=" & date_du_jour & "&hora=" & heure_now & "" _
, Destination:=Range("$A$1"))
.Name = _
"gsynres?ind=" & numero_station & "&lang=en&decoded=yes&ndays=10&ano=" & annee & "&mes=" & mois_du_jour & "&day==" & date_du_jour & "&hora=" & heure_now & ""
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "4"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With

DoEvents
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 211
1 sept. 2014 à 12:14
Bonjour,

non, ce n'est pas d'un do events que tu as besoin même s'il ne fait pas de mal.
Sur une interaction avec IE tu as une propriété IE.ReadyState qui permet de savoir quand la récupération est terminée. Tu as peut-être l'équivalent sur ADO.
Je ne pratique pas assez pour te guider plus.

eric

0