Page 1 sur 1

[Résolu][Calc] Compléter les lignes manquantes

Publié : 06 déc. 2018 18:53
par guy8572
Bonjour,
Pour "LibreOffice"
Jusque là, je n'ai pas trouvé de solution.

1) J'ai une station météo qui récupère les données de plusieurs sondes (Pression, température, humidité, vent, soleil).
2) Ces données, sont récupérées toutes les minutes par un logiciel : "Xnet_Meteo".
3) Les données récupérées par ce logiciel vont dans un fichier qui s'appelle : "Xnet_Meteo.csv
4) Tous les jours, je récupère donc 1440 données, pour un mois =44640 lignes.
5) MAIS, il y a (colonne B) des minutes qui n'apparaissent pas, donc, il manque des lignes complètes.

C'est ces lignes qu'il faut que j'ajoute , pas facile de les trouvées.
Je les trouvent avec la formule simple : =SI(B3-B2=100;"";"manque")
Quand la ligne est repérée, je copie soit celle d'avant ou celle d'après que j'insère entre les deux, et je change le texte de la colonne B.
Cette méthode est trop longue, pour une dizaine lignes, ça va, mais pour 1440 lignes par jour, c'est compliqué



Si vous pouviez m'aider, ça m'arrangerais
Merci
Cordialement

Re: Compléter les lignes manquantes

Publié : 06 déc. 2018 19:19
par Oukcha
Bonjour,
  • Image

    Cette section a des règles très précises que vous devez obligatoirement suivre pour obtenir de l'aide. C'est indiqué dans le cadre rouge en haut de la page.

    Il est demandé aux auteurs de faire précéder le titre de leur question d'une balise adéquate. Ce balisage est extrêmement important car il permet d'avoir une base de connaissance optimum en cas de recherche. Avez-vous remarqué comment étaient les autres questions postées ?

    Lisez ce fil pour savoir quelle balise utiliser : http://user.services.openoffice.org/fr/ ... html#27295

    N'oubliez pas que le terme "Macro" ou "OpenOffice" ne doit pas être employé car il est implicite. Essayer de synthétiser au mieux ce que vous cherchez à faire.

    Un titre accrocheur vous permettra d'une part d'être aidé plus rapidement et d'autre part, d'enrichir notre base de connaissances.

    Nous l'avons fait pour vous cette fois-ci mais lors de votre prochaine question, nous vous remercions de le faire vous-même sous peine de voir votre sujet verrouillé.
  • Vous avez illustré votre question avec des fichiers en provenance d'un site tiers. Or, souvent ces sites n'assurent aucune pérennité sur les données qu'ils hébergent.

    C'est pour cela que nous préférerons que vous utilisiez notre service de pièce-jointe dont le lien est mentionné en bas lorsque vous écrivez votre message : -comment-joindre-un-fichier-sur-ce-forum.html

    Veuillez corriger votre message en utilisant le bouton "Editer" (situé à droite) et en mettant en ligne votre fichier correctement.

    Vous en remerciant par avance.
Merci de votre collaboration.

Re: [Calc]Compléter les lignes manquantes

Publié : 06 déc. 2018 20:31
par guy8572
Bonsoir
N'oubliez pas que le terme "Macro" ou "OpenOffice"
Si je ne mets pas "LibreOffice", on ne peux pas savoir de quelle logiciel je parle ?
Lisez ce fil pour savoir quelle balise utiliser
Comme je ne suis pas habitué, effectivement, j'ai oublié (merci de l'avoir fait)
Vous avez illustré votre question avec des fichiers en provenance d'un site tiers
J'ai pourtant cherché, mais apparemment pas assez.
D'ailleurs, c'est bien plus simple comme ça.

Merci
Cordialement

Re: [Calc]Compléter les lignes manquantes

Publié : 07 déc. 2018 01:32
par Piaf
Bonsoir
Les copies d'écran c'est bien mais ça ne remplace pas un fichier :roll:
Comme je n'ai pas le courage de recopier les données de la copie d'écran, un petit exemple à tester et à adapter à ton fichier.

Code : Tout sélectionner

Global Valeur as Long,i as Long

Sub Main
Dim oDoc as Object, maFeuille as Object, oCurseur as Object, maZone as Object
Dim y as Long
	oDoc = thisComponent
	maFeuille = oDoc.CurrentController.ActiveSheet
	oCurseur = maFeuille.createCursor
	oCurseur.gotoEndOfUsedArea(False)
	y = oCurseur.RangeAddress.EndRow
	maZone = maFeuille.getCellRangeByPosition(1,0,1,y)
	For i = UBound(maZone.DataArray) To 0 Step - 1
		If i > 0 then
		Valeur = maZone.dataArray(i - 1)(0)
			If (maZone.dataArray(i)(0) - Valeur) > 100 Then
				Trouver(maZone, maZone.dataArray(i)(0))
			End If
		End If	
	Next i
End Sub

Sub Trouver(Zone as Object,val)
Dim Cherche As Object, zSrc as Object, zDest as Object, maFeuille as Object
Dim trouv As Variant
	Cherche = Zone.createSearchDescriptor
	With Cherche
		.SearchString = val
	End With
	trouv = Zone.findFirst(Cherche)
	Zone.Rows.insertByIndex(trouv.CellAddress.Row,1)
	maFeuille = thisComponent.CurrentController.ActiveSheet
	zSrc = maFeuille.getCellRangeByPosition(trouv.CellAddress.Column -1,trouv.CellAddress.Row,trouv.CellAddress.Column,trouv.CellAddress.Row)
	zDest = maFeuille.getCellRangeByPosition(trouv.CellAddress.Column -1,trouv.CellAddress.Row -1,trouv.CellAddress.Column,trouv.CellAddress.Row - 1)
	zDest.DataArray = zSrc.DataArray
	maFeuille.getCellByPosition(trouv.CellAddress.Column,trouv.CellAddress.Row - 1).Value = val - 100
End Sub
Cliquez pour l'animation
Cliquez pour l'animation
A+

Re: [Calc]Compléter les lignes manquantes

Publié : 07 déc. 2018 07:28
par guy8572
Bonjour,

Merci pour ta réponse.
J'ai essayé, mais rien ne fonctionne. J'avoue que je ne connais rien à "LibreOffice".
Voici une image du message que j'ai quand je veux exécuter la macro.
Que faut-il faire ?

Je ne vois pas ou est le code.
Voici mon fichier avec l'extension ods, alors que moi, je l'utilise avec l'extension csv.

Cordialement

Re: [Calc]Compléter les lignes manquantes

Publié : 07 déc. 2018 10:06
par joel275
Bonjour,

pour ton message d'erreur, lis ce tuto (jusqu'au bout) https://forum.openoffice.org/fr/forum/v ... 39&t=50996
pour trouver la macro fournie par Piaf avec son document, tu ouvres le doc et tu vas dans le menu Outils --> Macros --> Gérer les macros --> Libre Office basic... puis dans la boîte de dialogue, tu développes "guy8572.ods" et tu verras apparaitre la macro dans un éditeur de textes qui te permet de la modifier à volonté ou de la recopier dans un autre document.

Pour que les macros puissent s'exécuter, n'oublie pas de diminuer leur sécurité:
Outils --> Options développe "LibreOffice", clique sur "Sécurité" bouton "Sécurité des macros...." , clique sur "Niveau moyen", puis redémarre Libre Office.

A plus.

Re: [Calc]Compléter les lignes manquantes

Publié : 08 déc. 2018 08:42
par Jurassic Pork
hello,
voici ce que je te propose :

le principe :
1 - On copie toutes les données (plage nommée Data) de la feuille données (Données XNet-Meteo) dans une matrice (zdata) pour accélérer les traitements.
2 - On balaie les lignes dans la matrice
3 - Pour chaque ligne on l'écrit dans une nouvelle matrice (zdata2).
3 - Si la différence entre les temps de la ligne courante et celle de la ligne suivante est différente de 100 ou 24 heures (cas du passage à minuit) on considère qu'il y a un problème :
on duplique alors la ligne , on ajoute 1 minute au temps et on écrit cette nouvelle ligne dans la nouvelle matrice. On mémorise aussi la ligne posant problème dans un tableau (LignesLouches)
4 - A la fin du balayage, on met un marqueur sur les lignes posant problème et on affiche ces lignes dans une fenêtre d'avertissement.
5 - On copie la matrice de sortie dans la feuille 2 (Correction des données).
Voici le code :

Code : Tout sélectionner

Sub CorrigerData()
Dim oDoc As Object, sh1 As Object, sh2 As Object
Dim zone As Object, Cible As Object
Dim zdata As Variant, zLigne As Variant
Dim x as integer,n as integer, DiffTemps as integer
Dim monTemps as date, monTempsSuivant as date
Dim LignesLouches(1000) As Integer
Dim AffLig As String
oDoc = ThisComponent
sh1 = oDoc.Sheets.getByName("Données XNet_Meteo")
sh2 = oDoc.Sheets.getByName("Correction des données")
zone = sh1.getCellRangeByName("Data")
zdata = zone.getDataArray
Dim zdata2((Ubound(zdata)+ 1000)) As Object
    n=0
    cplig = 0
    On Error Goto ErrorHandler
    for x = 0 to UBound(zdata) - 1        
         zdata2(n) = zdata(x)
         rem monTemps = TimeValue(Format(zdata(x)(1),"00:00:00"))
         rem monTempsSuivant =  TimeValue(Format(zdata(x+1)(1),"00:00:00"))
         rem  DifTemps = DateDiff("s",monTemps,monTempsSuivant)
         rem  if DifTemps <> 60 and DifTemps<> -86340 then
         monTemps = zdata(x)(1)
         monTempsSuivant = zdata(x+1)(1)
         DifTemps = monTempsSuivant - monTemps         
             if DifTemps <> 100 and DifTemps <> -235900 then
             rem print x
             LignesLouches(cplig) = x+2
             cplig = cplig + 1
             zligne = DuplicateArray(zdata(x))
             zligne(1) = zligne(1) + 100
             zdata2(n+1) = zligne
             n=n+1
          end if        
    n = n+1
    next x
zdata2(n) = zdata(x)
For x=0 to cplig - 1
    AffLig = Afflig + LignesLouches(x) + " "
    sh1.getCellByPosition(1,LignesLouches(x)-1).CellBackColor = &HFFe7c6
Next x
print cplig & " Lignes louches :" & AffLig
redim preserve zdata2(n)
Cible = sh2.getCellRangeByPosition(0,1,Ubound(zdata(0)),n+1)
Cible.ClearContents(com.sun.star.sheet.CellFlags.VALUE + _
      com.sun.star.sheet.CellFlags.DATETIME + _
      com.sun.star.sheet.CellFlags.STRING)
Cible.setDataArray(zdata2)
Exit Sub
 ErrorHandler: 
 print "Erreur à la ligne : " + x
End sub 

Code : Tout sélectionner

Function DuplicateArray(Source)
Dim x as Integer
Dim Dupli(UBound(Source))
For x = 0 to Ubound(Source)
Dupli(x) = Source(x)
next x
DuplicateArray = Dupli
End Function
Ami calmant, J.P

Re: [Calc]Compléter les lignes manquantes

Publié : 08 déc. 2018 18:59
par Churay
Bonsoir,

Préférant les codes compacts, je me permets d'interviens pour pondérer
Jurassic Pork a écrit :hello,
1 - On copie toutes les données (plage nommée Data) de la feuille données (Données XNet-Meteo) dans une matrice (zdata) pour accélérer les traitements.
2 - On balaie les lignes dans la matrice
Si le .csv ne contient qu'une journée, il a au plus 1440 lignes, qui peuvent se balayer directement dans la feuille sans gréver le temps de traitement.
Sur cette bécane qui n'est pas une bête de compétition, une quinzaine d'insertions (parmi 1431 lignes utiles) prend 140 systemTicks, soit moins d'une seconde. Par contre le code est plus compact :P

Code : Tout sélectionner

Option Explicit

Sub Main
Dim oSheet AS Object, oCursor AS Object, aDatas()
Dim nRow AS Long, nRowMax AS Long, nColMax AS Long, nDelta AS Long
	oSheet = thisComponent.Sheets.getByName("Données XNet_Meteo")
	oCursor = oSheet.createCursor : oCursor.gotoEndOfUsedArea(False)
	nRowMax = oCursor.RangeAddress.EndRow
	nColMax = oCursor.RangeAddress.EndColumn
	aDatas = oSheet.getCellRangeByPosition(1, 0, 1, nRowMax).DataArray
	
	FOR nRow = nRowMax TO 1 STEP -1
		nDelta = oSheet.getCellByPosition(1, nRow).Value - oSheet.getCellByPosition(1, nRow-1).Value
		IF nDelta > 100 AND nDelta <> 4100 THEN
			oSheet.Rows.insertByIndex(nRow, 1) 
			oSheet.getCellRangeByPosition(0, nRow, nColMax , nRow).setDataArray(oSheet.getCellRangeByPosition(0, nRow+1, nColMax , nRow+1).DataArray)
			oSheet.getCellByPosition(1, nRow).Value = oSheet.getCellByPosition(1, nRow+1).Value - 100
			' Pour repérer l'insertion, activer la ligne suivante
			' oSheet.getCellByPosition(1, nRow).CellBackColor = 16776960
			nRow = nRow+1
		ENDIF
	NEXT nRow 
End Sub

Re: [Calc]Compléter les lignes manquantes

Publié : 09 déc. 2018 12:23
par guy85
Le fichier csv contient de 1 jour à 31 jours

Re: [Calc]Compléter les lignes manquantes

Publié : 09 déc. 2018 13:05
par guy85
Le problème dans la macro, c'est qu'elle prend en compte (par exemple 125900 et 130000 (la différence est normal e) donc elle ne doit pas s'en occuper.

Re: [Calc]Compléter les lignes manquantes

Publié : 11 déc. 2018 15:19
par guy8572
pour ton message d'erreur, lis ce tuto (jusqu'au bout) viewtopic.php?f=39&t=50996
Ça c'est fait.

Re: [Calc]Compléter les lignes manquantes

Publié : 11 déc. 2018 15:26
par guy8572
Je ne sait pas si ça peu aider ??, voici le code que j'ai si je récupère le fichier csv avec Excel (ça fonctionne).
Mais je ne peux pas le réenregistrer dans mon logiciel météo (il n'accepte les fichiers .csv que venant de "LibreOffice"
Là le fichier s'appel "Recuperation_des_données"

Code : Tout sélectionner

ub Rétablir_LignesManquantes()
    Dim lgn, n&, i&, j%, k%, t&, dt&
    With Worksheets("Recuperation_des_donnees")
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        t = (.Cells(n, 2) \ 100) Mod 100 + (.Cells(n, 2) \ 10000) * 60
        Application.ScreenUpdating = False
        For i = n To 3 Step -1
            t = (1440 + t - 1) Mod 1440
            dt = (.Cells(i - 1, 2) \ 100) Mod 100 + (.Cells(i - 1, 2) \ 10000) * 60
            If dt <> t Then
                j = t - dt - 1: lgn = .Cells(i - 1, 1).Resize(, 62).Value
                .Range(.Cells(i, 1), .Cells(i + j, 1)).EntireRow.Insert
                For k = 0 To j
                    .Cells(i + k, 1).Resize(, 62).Value = lgn
                    .Cells(i + k, 2) = (((dt + k + 1) \ 60) * 100 + (dt + k + 1) Mod 60) * 100
                Next k
                t = dt
            End If
        Next i
    End With
End Sub

La modération vous a écrit: 4 messages à la suite c'est 3 de trop.
Merci d'arrêter votre monologue. Vous disposez d'un bouton Éditer en haut à droite de chaque message et d'un autre bouton ajout si vous désirez ajouter un complément lorsqu'il n'y a pas de réponse.


Re: [Calc]Compléter les lignes manquantes

Publié : 26 déc. 2018 18:46
par Dude
guy8572 a écrit :il n'accepte les fichiers .csv que venant de "LibreOffice"
A priori, personne ne comprend rien à ce que tu exposes.
guy8572 a écrit :Les données récupérées par ce logiciel vont dans un fichier qui s'appelle : "Xnet_Meteo.csv
Mets donc en ligne ce CSV (que tu encapsuleras dans un ZIP) qu'on puisse comprendre.

Re: [Calc]Compléter les lignes manquantes

Publié : 01 janv. 2019 17:38
par guy8572
Bonjour,
Meilleurs vœux à tous.
Voici le fichier.

Ce fichier est créé par le logiciel "Xnet_Meteo".
Si j'ouvre ce logiciel plusieurs fois par jours (pour mettre à jours le logiciel météo "GraphWeather"), il manque des lignes.
Voir le lien de mon site:
meteofloralies.free.fr
Si je ne l'ouvre pas pendant plusieurs jours, il n'y a pas de lignes manquantes.
A part les 11 premières lignes (les mois précédents, voir colonne A (sauf pour 2019)), je dois replacer les lignes manquantes, en prenant, soit celles du dessus ou du dessous pour qu'il ne manque pas une minute (c'est ce que je fais tous les jours).

Je me demandais donc, si il était possible de le faire avec une macro.
Après avoir fait le remplacement, je formate la colonne B avec 6 chiffes, puis j'enregistre et je recommence le lendemain.
Par contre, il ne faut rien d'autre dans le fichier (pas de formules etc...).

Cordialement

Re: [Calc]Compléter les lignes manquantes

Publié : 02 janv. 2019 16:47
par Dude
guy8572 a écrit :je formate la colonne B avec 6 chiffes
Un nombre avec des zéros non significatifs est une vue de l'esprit.
Si tu veux réellement avec cela lors de l'importation, il suffit de régler l'assistant en mettant ta colonne en Texte.
no_problemo.png

Re: [Calc]Compléter les lignes manquantes

Publié : 02 janv. 2019 18:05
par Jurassic Pork
hello,
bonne année à tous :
avec la macro expliquée dans le message du 8 décembre de cette discussion voilà ce que j'obtiens concernant les lignes qui sont susceptibles de ne pas être bonnes dans ton fichier csv :
XNet_Meteo.png
XNet_Meteo.png (8.83 Kio) Consulté 1950 fois
XNet_Meteo_Calc.png
XNet_Meteo_Calc.png (12.97 Kio) Consulté 1950 fois
Edit : je n'ai traité que les 8000 premières lignes . La macro pour l'instant ne fonctionne pas avec 50000 lignes.
Voilà c'est corrigé en remplaçant les integer par des long dans ma macro :

Code : Tout sélectionner

Dim oDoc As Object, sh1 As Object, sh2 As Object
Dim zone As Object, Cible As Object
Dim zdata As Variant, zLigne As Variant
Dim x as long,n as long, DiffTemps as long
Dim monTemps as date, monTempsSuivant as date
Dim LignesLouches(2000) As Long
Dim AffLig As String
oDoc = ThisComponent
sh1 = oDoc.Sheets.getByName("Données XNet_Meteo")
sh2 = oDoc.Sheets.getByName("Correction des données")
zone = sh1.getCellRangeByName("Data")
zdata = zone.getDataArray
Dim zdata2((Ubound(zdata)+ 2000)) As Object
et voilà toutes les lignes louches :
Xnet_Meteo_Lignes_A_Verifier.png
Ami calmant, J.P

Re: [Calc]Compléter les lignes manquantes

Publié : 24 janv. 2019 08:24
par guy8572
Bonjour,
Merci pour vos réponses
Cordialement