Ma macro fonctionne plusieurs jours puis plante ...
Erwin33
Messages postés
5
Date d'inscription
Statut
Membre
Dernière intervention
-
eriiic Messages postés 24603 Date d'inscription Statut Contributeur Dernière intervention -
eriiic Messages postés 24603 Date d'inscription Statut Contributeur Dernière intervention -
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 !
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:
- Ma macro fonctionne plusieurs jours puis plante ...
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Compte facebook suspendu 180 jours - Guide
- Compte instagram suspendu 180 jours - Guide
- Plante - Guide
- Nombre de jours entre deux dates excel - Guide
10 réponses
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".
Dans la fenêtre du message d'erreur, si tu fais "debugger", tu peux voir quelle ligne cause le "plantage".
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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
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.
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.
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...
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...
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
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
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
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