Conversion en heure du tableau enedis linky
re,
sisi le fichier CSV, j'arrive a le généré sur énédis sans soucie, le probleme etant qu'en 1 ans j'ai changé 3 fois de type de visualisation.
actuelement je suis en tranche de 15mn, mais je voulais les voir en heure ( ça je pense que tu la compris du coup ^^ )
ta formule est très bien, mais je ne comprend pas pourquoi elle ne fonctionne pas sur mon dernier essaie ici, regarde les tranches en 30mn ou en 15mn. la moyenne ne se calcule pas :/ je ne sais pas pourquoi
re,
vous savez me joindre le fichier CSV ?
le chiffre dans la 2ième colonne c'est toujours la consommation par heure (et alors la moyenne) même si c'est par quinze minutes ou une demie heure ?
avec quelque suppléments.
Ce zip, c'est celui de ce matin ?
pour la question du document du matin, je ne pourrais pas te dire, a vrai dire, il y en a beaucoup j'en suis a cette version en PJ.
celle ci n'a pas de TDC car je n'en veux pas dans un 1er temps.
a l'ouverture il y a le document tel qu'on le récupère sur enedis ( si j'ouvre le csv avec excel, j'ai 100% la même choses )
puis j'applique la macro que j'ai inclue pour le moment dans ce document ( donc c'est pour ça l'extention xlsm ) avec la combinaison de touche
ctrl shift A
je passe de ça :
a ça :
jusqu'a la ligne 548 du document, enédis me donner les valeurs par heure, le 13 aout 2021, ils ont changer pour me fournir la relève en demis-heure, puis dèrnièrement en quart-d'heure...
dans cette macro qui ce trouve dans la feuille en PJ, j'avais inclue ta formule :
Range("D2").Select
ActiveCell.FormulaR1C1 = _
"=IF(OR(ROW()=2,HOUR([@Heure])<>HOUR(SUM(R[-1]C[-2]))),AVERAGE(OFFSET([@Colonne3],,,SUM(--(HOUR(RC[-2]:R[3]C[-2])=HOUR(RC[-2]))),)),""-"")"
celle çi est très bien car elle fait vraiment la distinction en automatique entre les heures les demis heures et les quart d'heure, par contre
la ou quand toi tu m'a donné la feuille ce matin avec la formule valide, ici dans ma version ( dans laquel j'ai copier collé ta formule ) je n'ai pas les moyennes qui ce font.
je ne sais pas pourquoi.
après de multiple essaie, je suis toujours bloqué sur cette dernière étape de calcule de moyenne.
je n'arrive pas a comprendre pourquoi celle çi ne fait pas la moyenne :/
édit, je pense que c'est les accolade en début et fin de formule, c'est le seul truc qui change que je n'arrive pas a remettre
EDIT 2 : BINGO, c'est bien ce ctrl maj entré a faire a la fin, je vais voir pour refaire la macro au propre en incluant ça
bonjour,
les TCD, ils sont vraiment facile à apprendre et à utiliser !!! https://www.excel-pratique.com/fr/formation-excel/tableau-croise-dynamique
moi, j'ai excel365, on ne voit plus la distinction avec ces formules matricielles.
Ma derniere version avec quelque suppléments
* un bouton pour lire un fichier CSV
* un bouton pour plus ou moins de details par mois (=montrer ou cacher les jours)
Le TCD sur cette feuille montre les moyennes.
Puis une feuille avec les min, moyennes et max par mois.
Puis une feuille avec les max consommations par heure et mois pour voir quand cela ce passe. (pour anticiper au tarif de capacité qu'on pense à créer ici en Belgique). Il y a un tas de curves mais on sait les filtrer avec ces slicers.
La formula en colonne E, elle est matricielle chez vous ?
en effet, sur la formule que tu m'a communiqué hier ( celle ou je n'avais pas les moyennes quand je la copier coller ) j'avais des {} au debut et fin de formule.
je ne connais pas les formule matriciel, je ne sais même pas a quoi ça sert réelement, j'ai fait une recherche google pour trouvé comment l'appliqué.
du coup, j'ai continuer la macro un peu ce matin ( voir la pj )
dans l'idée, je part toujours de la même base ( le csv d'énédis que je C/C pour le moment dans ce classeur qui a la macro )
puis j'applique la macro, a la suite de ça, je continue un peu avec une nouvelle macro, si le résultat et ok, alors j'inclue cette dernière dans la macro principal.
si tu veux un "changelog" :
suite au succès de ta formule, la macro copie tout le tableau dans une nouvelle feuille en mode donnée brut, je perd donc l'affichage des dates, heures, formules.
je réaplique le format de cellule sur les dates/heures, puis je filtre le tableau pour affiché uniquement les valeurs vide ( #N/A ou - de ta formule ) puis je supprime les lignes.
a la suite de ça je fait réaparaitre le tableau en totalité.
c'est maintenant que je vais apprendre a joué avec le TDC ainsi que les filtres.
peut etre entre temps, je vais faire une conversion watts vers kilowatts, je ne sais pas encore.
watt c'est bien pour les valeurs en dessous de 1000, mais en hivers je suis a ~ 60 000 watt, du coup 60kw c'est plus parlant, je ne sais pas ce que je vais faire encore ^^
execution de la macro : ctrl shift A ( comme d'ab )
re, beau boulot pour un dimanche
en VBA, Select et Activate, on essaie à eviter cela, parce que cela ralentit tout, mais ce sont des problèmes pour plus tard ... .
2 corrections, la fomulaArray, il y a un "iferror" pour eviter ce #DIV et il divise le résultat par 1.000 pour les kW et un petit peu plus loin, il change le format et ajoute virtuellement " kW" au chiffre
Selection.FormulaArray = _
"=iferror(IF(OR(ROW()=2,HOUR([@Heure])<>HOUR(SUM(R[-1]C[-2]))),.001*AVERAGE(OFFSET([@colonne3],,,SUM(--(HOUR(RC[-2]:R[3]C[-2])=HOUR(RC[-2]))),)),""-""),""-"")" '>>>>>>>>>>>>>>>>>>>>>>>>>>>>changement 1
Columns("A:D").Select
Selection.Copy
Sheets.Add After:=ActiveSheet
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Application.CutCopyMode = False
ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$D$17858"), , xlYes).Name _
= "Tableau3"
Columns("A:A").Select
Selection.NumberFormat = "[$-F800]dddd, mmmm dd, yyyy"
Columns("B:B").Select
Selection.NumberFormat = "h:mm;@"
Columns("C:C").Select
Selection.Delete Shift:=xlToLeft
Columns("c:c").NumberFormat = "0.00 kW" '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>changement 2
tu sais, je n'ai pas spécialement de talent dans le VBA, j'avais regardé un peu passé un temps, mais j'ai un peu tout oublié.
actuellement j'étais sur la suppression de la page qui devient inutile. ( cette fois ça pris sur le net, pour prendre en compte toutes les feuilles ormis celle en cours, peut importe le nom de la feuille )
après pour tout ce qui a déjà était crée en macro je m'embête pas plus que ça, je fais " enregistrer une macro" c'est pour ça que le code n'est pas beau.
je vais regarder pour inclure la tienne
re,
il est vraiment nécessaire d'apprendre à utiliser des TCD, voir le link plus haut, parce qu'il fait tout le boulot à partir du moment que les données sont en ordre.
Regardez à mes macros, quelque format conditionelles et c'est tout.
tout ce que vous ( les membres ) m'avez envoyé en essaie comporté des TDC, c'est bien que c'est utile ^^
comme vous avez ajouter une feuille après celle ci (Sheets.Add After:=ActiveSheet) et il n'y avait qu'une feuille
If Sheets.Count >1 Then Sheets(1).Delete
merci,
j'avance petit a petit avec du code dégeulasse
je vais essayé d'optimisé cela a la fin, car l'execution est longue ( 15-20sc ~ ) j'ai vue quelques astuce, notament le rafraichissement de l'ecran.
ici, comment je pourrais faire pour faire un range sans valeurs fixe ?
' >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> passer en last row ??? <<<<<<<<<<<<<<<<<<<<<<<<
ActiveChart.SetSourceData Source:=Range("$A$3:$B$377")
car il et certain que je ne finirais pas tout le temps en B377
j'avance a mon ritme, mais je comprend ce que je fais =)
Bonjour
Sur tous les forums, on déconseille fortement de créer un TCD par VBA
Cela ne sert à rien dans 99% des cas
Cette obsession du VBA te fait perdre un temps infini là ou moins de 10 clics donnent un résultat pertinent et facilement évolutif...
bonjour,
78Chris a (de nouveau) raison, on crée des outils une fois et on les recycle à chaque fois. Donc préparez vos donnez et puis vous les collez dans un tableau qui est la source d'un TCB. Ce tableau a l'advantage d'avoir un nom, qu'on utilise comme source, donc cela est dynamique.
je sais que je perd un temps monstre, enfin ça me permet d'apprendre un peu quand même.
l'objectif final c'est aussi la diffusion de la macro pour les gens dans le même cas que moi, c'est pour cela que je veux tout automatisé
a terme ça se passera comme ça :
- ouvrir le csv d'enedis
- appliquer la macro
- terminé
je voulais surtout que ça ce génère automatiquement, mais je vais continuer a me penché dessus
bonjour, pour ouvrir un fichier CSV et récupérer les données, vous pouvez le faire comme çà ...
re,
voila ce que j'ai fais, en dépis de vos avertissements
je croise les doigts pour que ça ne me génère pas de bug a la longue.
mais du coup ça reviens quasiment a ce que je veux, il me manque 2-3 petites choses a faire dessus.
quand j'aurais inclue la macro sur mon pc et non plus sur la feuille, je pourais généré des nouvelle collecte de data, par exemple tout les mois, pour mieux les visualisé
commande macro ctrl+alt+a
BsALV, ton dernier fichier, il est top car je pense qu'il et bien mieux optimisé que le miens, je le voie sur la durée d'execution de la génération du csv sous forme de tableau.
je pense réelement qu'un mix de cette commande avec la macro peut rendre le truc bien plus rapide.
Edit : il est rapide car il convertie pas les demis heures ou les quart d'heure, mais le coup du bouton c'est pas mal pour chargé le CSV aussi.
re,
il n' a pas collé les données pendant l'heure d'hiver = GMT +01:00 au lieu de GMT (Greenwich Mean Time)+02:00, donc à partir du 31/10/21 02:00 jusqu'au 27/3/22 02:00
l'erreur est la partie rouge dans cette ligne, donc effacez la partie rouge de cette ligne
If a(i) Like "####-##-##T##:##:##+02:00*" Then 'si cela commence comme çà, donc date & "T" & heure & le reste
Il y a donc quelque chose à corriger (que je n'ai pas fait) à ce moment là, l'heure d'été est jusqu à 02:59:59 GMT+02:00 et une seconde plus tard c'est 02:00:00 GMT+01:00
été >>> hiver
hiver >>> été = saute de 01:59:59 GMT+01:00 à 03:00:00 GMT+02:00
macro corrigée
Sub Lire_CSV()
'************************************************
'ouvrir un fichier CSV et traduire ces données vers le tableau
'************************************************
Dim File2Open, fileNo As Integer
Set dict = CreateObject("scripting.dictionary") 'dictionaire pour rassembler les données
Set lo = Range("TBL_Données").ListObject '>>> le tableau structuré pour les données
If lo.ListRows.Count Then lo.DataBodyRange.Delete 's'il n'est pas vide, alors vider
File2Open = Application.GetOpenFilename("Text Files (*.csv), *.csv", Title:="Sélectionnez votre CSV-fichier de ENEDIS")
If File2Open = False Then Exit Sub
t = Timer
fileNo = FreeFile 'Get first free file number
Open File2Open For Input As #fileNo 'ouvrir le fichier
a = Split(Input$(LOF(fileNo), fileNo), vbLf) 'lire et séparer les données au "saut de ligne"
Close #fileNo 'fermer le fichier
For i = 0 To UBound(a) 'boucle tout les pièces séparées
If a(i) Like "####-##-##T##:##:##*" Then 'si cela commence comme çà, donc date & "T" & heure & le reste
sp = Split(Replace(Replace(Replace(a(i), "T", "+"), ";", "+"), ";", "+"), "+") 'séparer ce string au charactère "T" et "+"
If UBound(sp) >= 3 Then If Len(sp(3)) Then dict.Add dict.Count, Array(CDbl(DateValue(sp(0))), CDbl(TimeValue(sp(1))), CDbl(sp(3)))
End If
Next
If dict.Count Then lo.ListRows.Add.Range.Range("A1").Resize(dict.Count, 3).Value = Application.Index(dict.items, 0, 0)
MsgBox File2Open & vbLf & vbLf & Format(dict.Count, "#,###") & " lignes lu en " & Format(Timer - t, "0.0\s"), vbInformation, "Ready"
End Sub
salut merci bien pour la modif,
ce matin, j'ai voulu essayer d'optimiser et de rendre propre ce qui était déjà crée c'est un peu un challenge pour moi.
je te montre ce que j'ai fait pour le moment, je pense que c'est déjà plus propre :
Sub enedis()
'
' enedis Macro
'
' Touche de raccourci du clavier: Ctrl+Shift+A
'
'optimisation
Application.ScreenUpdating = False
' selection des 3 lignes du haut pour la supression
Rows("1:3").Select
Selection.Delete Shift:=xlUp
' décalage des valeurs sur la colonne J pour libéré la colonne A
Columns("A:C").Select
Selection.Cut
Columns("J:J").Select
ActiveSheet.Paste
Columns("J:J").Select
' découpage des valeurs que énédis fournis dans le fichier csv de base puis collage en A1
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(10, 1), Array(11, 1), Array(16, 1)), _
TrailingMinusNumbers:=True
' supression des valeurs useless
Range("B:B,D:D,E:E,F:F,G:G,H:H,I:I,J:J").Select
Range("J1").Activate
Selection.Delete Shift:=xlToLeft
' mise en tableau des valeurs restante
Range("A1:B1,C1").Select
Range("C1").Activate
Selection.End(xlDown).Select
Range("A1:C1").Select
Range(Selection, Selection.End(xlDown)).Select
ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$C$17857"), , xlNo).Name = _
"Tableau1"
' format de cellule
Columns("A:A").Select
Selection.NumberFormat = "[$-F800]dddd, mmmm dd, yyyy"
Selection.ColumnWidth = 26.29
Columns("B:B").Select
Selection.NumberFormat = "h:mm;@"
Range("Tableau1[[#Headers],[Colonne1]]").Select
ActiveCell.FormulaR1C1 = "Date"
Range("Tableau1[[#Headers],[Colonne2]]").Select
ActiveCell.FormulaR1C1 = "Heure"
' création d'une nouvelle colonne heure
Range("D2").Select
ActiveCell.FormulaR1C1 = "résultat"
Range("D2").Select
' formule pour crée la colonne de la conssomation en heure
Selection.FormulaArray = _
"=iferror(IF(OR(ROW()=2,HOUR([@Heure])<>HOUR(SUM(R[-1]C[-2]))),.001*AVERAGE(OFFSET([@colonne3],,,SUM(--(HOUR(RC[-2]:R[3]C[-2])=HOUR(RC[-2]))),)),""-""),""-"")"
Columns("A:D").Select
a ça :
Sub enedis()
'
' enedis Macro
'
' Touche de raccourci du clavier: Ctrl+Shift+A
'
' Renomme la feuille en DATA
ActiveSheet.Name = "DATA"
' selection des 3 lignes du haut pour la supression
Rows("1:3").Delete Shift:=xlUp
' décalage des valeurs sur la colonne E pour libéré la colonne A
Range("A:C").Cut Range("E:E")
' découpage des valeurs que énédis fournis dans le fichier csv de base puis collage en A1
Columns("E:E").Select
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(10, 1), Array(11, 1), Array(16, 1)), _
TrailingMinusNumbers:=True
' supression des valeurs useless////////////////////////// voir pour supprimé les 3 d'un coup
Range("E1").EntireColumn.Delete
Range("D1").EntireColumn.Delete
Range("B1").EntireColumn.Delete
' mise en tableau des valeurs restante + creation de la collone resultat final
Range("A1:D1").Select
Range(Selection, Selection.End(xlDown)).Select
ActiveSheet.ListObjects.Add(xlSrcRange, Selection, , xlGuess).Name = _
"TABLE1"
' format de cellule
Columns("A:A").Select
Selection.NumberFormat = "[$-F800]dddd, mmmm dd, yyyy"
Columns("B:B").Select
Selection.NumberFormat = "h:mm;@"
'ARRET ICI NOMAGE DES COLLONE DU TABLEAU A FAIRE !!!!!!!!!!!!
' formule pour crée la colonne de la conssomation en heure
Selection.FormulaArray = _
"=iferror(IF(OR(ROW()=2,HOUR([@Heure])<>HOUR(SUM(R[-1]C[-2]))),.001*AVERAGE(OFFSET([@colonne3],,,SUM(--(HOUR(RC[-2]:R[3]C[-2])=HOUR(RC[-2]))),)),""-""),""-"")"
Columns("A:D").Select
j'ai pas mal d'erreur d'execution a corrigé quand je modifie le code, actuellement, j'en suis au nommage des colonnes de tableau.
je me suis mis une petite note sur la supression des colonnes, car je n’ai pas réussi à supprimer toutes les colonnes en même temps, obligé de le faire une après l'autre.
voila, je suis content de moi pour le moment, je sais que je peu utilisé la feuille quand je veux, la c'est juste du "bonus"
après a mon niveau de débutant, j'ai plus de facilité a lire ce que j'ecrit dans cette macro que ce que tu me propose par exemple plus haut, même si c'est forcément moins optimisé