Correction d'erreur base de données + incrémentation de lign
Bonjour,
Je dois traiter des données météo relevées toutes les 10 minutes des 8 dernières années, ce qui fait énormément de données.
Mon problème est que cela peut arriver qu'il n'est pas de relevé de données durant 1 ou 2 voir 3 ou 4 heures, la valeur de l'heure passe donc de 04:00:00 a 07:00:00 directement par exemple.
Ce que je souhaiterai faire c'est lorsqu'il manque des données: ajouter une ligne ou plusieurs selon la quantité de données qu'il manque en incrémentant l'heure et en copiant la donnée météo précédente.
Je voudrais que cela se fasse automatiquement.
Si quelqu'un peut m'aider, mon fichier est en copie.
Merci beaucoup
Bonjour,
Allège ton fichier à moins de 300 Ko pour joindre au message.
Voila le fichier, je pensais l'avoir mi dans le précédent mail.
Désolé.
Bonjour,
Une solution :
Sub galopin()
Dim i&, ii&, k&, kk&, HF As Date, HD As Date, Diff As Date
Application.ScreenUpdating = False
ii = [A1].CurrentRegion.Rows.Count
For i = ii To 3 Step -1
k = Cells(i, 2).Value * 24 - Cells(i - 1, 2).Value * 24
If k > 1 Then
For kk = 1 To k - 1
Rows(i).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Cells(i, 2).Value = Cells(i - 1, 2).Value: Cells(i, 3).Value = Cells(i - 1, 3).Value
Next
End If
Next
End SubA+
Merci beaucoup Galopin,
Ça marche vraiment bien, il manque juste un petit point pour que ce soit parfait, c'est que lorsque la ou les lignes sont ajoutées, la valeur de l'humidité précédente est bien copiée, mais la date ne s’incrémente pas, elle est simplement copiée. Mais ce n'est pas un problème en réalité.
Par contre, j’étudie un autre format de donnée. Il s'agit de données météo qui sont relevées toutes les 10 minutes, le format est un peu différent du précédent:
. format précédent (données horaires) : 00:00:00
01:00:00
02:00:00
. nouveau format (données toutes les 10 minutes): 00:00:00
00:10:00
00:20:00
Avec le nouveau format les erreurs ne sont pas corrigées. J'imagine qu'il doit avoir un petit truc a changer dans la macro, mais j'ai un niveau proche du néant en VBA.
A l'aide
PS: j'ai mi en copie le fichier avec le nouveau format.
bonsoir,
A tester...
Sub galopin2()
Dim i&, ii&, k%, kk%
Application.ScreenUpdating = False
ii = [A1].CurrentRegion.Rows.Count
For i = ii To 3 Step -1
If Cells(i, 2).Value = Cells(i - 1, 2).Value Then
MsgBox "Données incohérentes !"
End
End If
Next
For i = ii To 3 Step -1
k = CInt((Cells(i, 2).Value - Cells(i - 1, 2).Value) * 1440)
If k > 10 Then
For kk = 10 To k - 10 Step 10
Rows(i).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Cells(i, 2).Value = Cells(i - 1, 2).Value
Cells(i, 3).Value = Cells(i - 1, 3).Value
Cells(i, 4).Value = Cells(i - 1, 4).Value
Next
End If
Next
End SubAttention cette macro ne doit être lancé qu'une seule fois ! Sinon elle s'interrompt avec un message d'erreur.
[Nota] Il faudrait sans doute modifier aussi la première macro pour empêcher aussi un double traitement.
En fait il s'agit de rajouter ( après ii = [A1].CurrentRegion.Rows.Count ) :
For i = ii To 3 Step -1
If Cells(i, 2).Value = Cells(i - 1, 2).Value Then
MsgBox "Données incohérentes !"
End
End If
NextA+
Merci encore Galopin,
Les deux fonctionnent, mais parce que encore un dernier "mais", lorsqu'il manque une valeur entre 23:00:00 et 01:00:00 (qu'il manque donc le 00:00:00), l'erreur n'est pas corrigée. J'imagine qu'il y a une ligne de code a rajouter pour ce cas précis.
Pour le fichier de relevés toutes les 10 minutes, l'erreur ce produit également lorsqu'il manque une valeur après le 23:50:00 (qu'il manque donc le 00:00:00 également).
Merci par avance, je pense que c'est le dernier beug, après quoi tu m'auras fait gagner environ 1 a 2 ans de recherche d'erreur et ça je t'en remercie infiniment.
bonjour,
J'avais en effet un peu perdu de vue ce détail !
Je dois pas être loin du compte maintenant.
Option Explicit
Sub galopin()
Dim i&, ii&, k&, kk&, x%
Application.ScreenUpdating = False
ii = [A1].CurrentRegion.Rows.Count
For i = ii To 3 Step -1
If Cells(i, 2).Value = Cells(i - 1, 2).Value Then
MsgBox "Données incohérentes !"
End
End If
Next
For i = ii To 3 Step -1
k = (Cells(i, 2).Value - Cells(i - 1, 2).Value) * 24
x = IIf(k < 0, 1, 0)
k = (Cells(i, 2).Value - Cells(i - 1, 2).Value + x) * 24
If k > 1 Then
For kk = 1 To k - 1
Rows(i).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Cells(i, 2).Value = Cells(i - 1, 2).Value: Cells(i, 3).Value = Cells(i - 1, 3).Value
Next
End If
Next
End Sub
Sub galopin2()
Dim i&, ii&, k%, kk%, x%
Application.ScreenUpdating = False
ii = [A1].CurrentRegion.Rows.Count
For i = ii To 3 Step -1
If Cells(i, 2).Value = Cells(i - 1, 2).Value Then
MsgBox "Données incohérentes !"
End
End If
Next
For i = ii To 3 Step -1
k = CInt((Cells(i, 2).Value - Cells(i - 1, 2).Value) * 1440)
x = IIf(k > 0, 0, 1)
k = CInt((Cells(i, 2).Value - Cells(i - 1, 2).Value + x) * 1440)
If k > 10 Then
For kk = 10 To k - 10 Step 10
Rows(i).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Cells(i, 2).Value = Cells(i - 1, 2).Value
Cells(i, 3).Value = Cells(i - 1, 3).Value
Cells(i, 4).Value = Cells(i - 1, 4).Value
Next
End If
Next
End SubA+
Alors la, c'est parfait !
Merci beaucoup beaucoup beaucoup, tu m'as enlevé une énorme épine du pied.
Merci pour la réactivité.
Je vais pouvoir triller mes 640.000 données en deux clics. C'est juste genial.
Bonne continuation