Extraction données txt
Impressionnant
L'import des fichiers txt vraiment génial, je n'en espérais pas tant.
J'ai hâte de voir le changement de mois.
Un très grand merci a vous
Sincérement
Heu … Parles-tu d'une proposition en particulier, des deux ?
Quant au changement de mois tu as dû déjà le constater car comme tes fichiers texte joints
contiennent du février 2000 et du février 2015, si cela ce n'est pas du changement de mois ‼
Bonjour Marc L
Je parle de ta proposition que j'ai retenu. Mais je tenais aussi a remercier FINDRH qui a passé du temps.
En effet pour le changement de mois j'aurais me taire
Bonjour a tous
Désolé de ressortir le fil mais le passage au mois de mars se passe mal.
Le fichier txt daté du 01.03.15 est mal interprété et je retrouve les données comme étant du 03.01.15
Idem pour le fichier du 02.03.15
je joins le classeur et le dernier fichier txt.
Cela tombe bien car entre temps j'ai optimisé le traitement pour encore réduire le temps d'exécution !
T'avais raison pour le changement de mois ! C'est réglé pour les dates (au niveau de QueryTable) mais deux points à éclaircir :
• Conserver les colonnes Date et Heure séparées ou préfères-tu une colonne les regroupant ? Selon tes futurs traitements …
• Si le fichier texte n'est jamais réinitialisé, cela va finir par ramer …
Bonjour
Je préfère date et heure séparé.
Pour la longueur il se trouve que le logiciel d'extraction de données a un "bug" vers environ 2000 lignes, donc je dois réinitialiser l'history.dat et de la le txt
Bonjour
J'ai vu le travail accompli qui est remarquable.
Il n'en demeure pas moins que gérer globalement l'import me parait soumis à risques....
En n'important qu'un jour à la fois on limite les aléas
Réflexion soumise à tout hasard...
Cordialement
FINDRH
A la limite cela coûterait une opération supplémentaire pour n'extraire qu'un jour, autant tout traiter !
J'ai dû être influencé pour le remplacement du point dans la date alors qu'il suffit de juste bien répondre à l'Assistant
d'importation concernant le format des colonnes lors de la création du squelette du code via le Générateur de macros !
La première version utilise une formule dans le critère calculé du filtre avancé pour répartir les données par mois
et s'il y a deux mois à traiter dans le fichier il y a donc un double calcul …
La nouvelle mouture crée la formule dans une colonne annexe une fois pour toute rendant ainsi l'exécution plus véloce !
A enregistrer encore dans un nouveau classeur doté d'une seule feuille de calculs :
Sub Macro2()
Dim Rc As Range, Rg As Range, Rm As Range, Rp As Range
P = ThisWorkbook.Path: If P > "" Then ChDrive P: ChDir P
FICHIER = Application.GetOpenFilename("Fichiers texte,*.txt", , " Import station météo :")
If FICHIER = False Then Exit Sub
With Feuil1
.UsedRange.Clear: .Cells(7).Value = "Import en cours …"
Application.ScreenUpdating = False
With .QueryTables.Add("TEXT;" & FICHIER, .Cells(2))
.AdjustColumnWidth = False
.RefreshStyle = xlOverwriteCells
.TextFileColumnDataTypes = [{1,1,1,1,1,1,1,1,1,1,1,4}]
.TextFileDecimalSeparator = ","
.TextFileParseType = xlDelimited
.TextFilePlatform = 1252
.TextFileTabDelimiter = True
.TextFileTextQualifier = xlTextQualifierNone
.Refresh False
.Delete
End With
FICHIER = Split(FICHIER, "\"): .Name = FICHIER(UBound(FICHIER))
If .Cells(2, 11).Value <> "[mm]" Then Beep: Exit Sub
.Cells(17).Value = "mois"
Set Rg = .Cells(2).CurrentRegion
C& = Rg.Rows.Count
With .Cells(3, 17).Resize(C - 2)
.FormulaR1C1 = "=TEXT(RC[-4],""" & String(3, Application.International(xlMonthCode)) _
& " " & String(4, Application.International(xlYearCode)) & """)"
.Offset(-2).Resize(C).AdvancedFilter xlFilterCopy, , .Offset(-2, -2), True
End With
With Rg
.Columns("A:F").AutoFit: .Columns("H:I").AutoFit
.Rows(1).Resize(, 15).HorizontalAlignment = xlCenter
.Rows("3:" & C).Font.ColorIndex = 47
With .Rows("2:" & C)
Union(.Columns(9), .Columns("K:L")).HorizontalAlignment = xlCenter
With Union(.Columns("A:H"), .Columns(10))
.HorizontalAlignment = xlRight: .IndentLevel = 2: .NumberFormat = "0.0"
End With
End With
End With
Set Rm = .Cells(3, 15).CurrentRegion: P = "{0"
With Rm.Resize(, 2)
.Font.ColorIndex = 47: .HorizontalAlignment = xlRight: .IndentLevel = 1
End With
For Each Rc In Rm
If Evaluate("ISREF('" & Rc.Value & "'!A1)") = False Then
With Worksheets.Add(, Worksheets(Worksheets.Count))
.Name = Rc.Value: Rg.Rows(1).Copy .Cells(2)
End With
End If
P = P & "," & Worksheets(Rc.Value).UsedRange.Rows.Count
Next
F = Evaluate("MAX(" & P & "})")
With .Cells(3, 18).Resize(C - 2)
P = .Address(, , , True)
.FormulaR1C1 = "=SUMPRODUCT((INDIRECT(""'""&RC[-1]&""'!L1:L" & F & _
""")=RC[-6])*(INDIRECT(""'""&RC[-1]&""'!M1:M" & F & """)=RC[-5]))"
.Formula = .Value
F = "=SUMPRODUCT((" & .Offset(, -1).Address(, , xlR1C1) & _
"=RC[-1])*(" & .Address(, , xlR1C1) & "=0))"
End With
If Evaluate("=COUNTIF(" & P & ",0)") Then
With Rm.Offset(, 1): .FormulaR1C1 = F: .Formula = .Value: End With
Union(.Cells(16), .Cells(18)).Value = "import"
.Cells(2, 16).Value = 0
.Rows("1:2").Hidden = True
For Each Rc In Rm
If Rc.Offset(, 1).Value Then
.Cells(2, 15).Value = Rc.Value: Rc.Resize(, 2).Font.ColorIndex = 0
.Cells(17).Resize(C, 2).AdvancedFilter xlFilterInPlace, .[O1:P2]
With Worksheets(Rc.Value)
L& = .UsedRange.Rows.Count: R& = L + 1
Rg.Font.ColorIndex = 0: Rg.Copy .Cells(R, 2)
If L = 1 Then
With .UsedRange
.Columns("A:F").AutoFit: .Columns("H:I").AutoFit
End With
End If
F = .Cells(L, 13).Value
Do
P = F: F = .Cells(R, 13).Value
If F <> P Then
.Rows(R).Resize(3).Insert xlShiftDown
.Cells(R + 3, 13).Copy .Cells(R + 1, 7)
.Cells(R + 1, 7).Font.ColorIndex = 55
End If
Set Rp = .UsedRange.Columns(12).Find(F, .Cells(13), , , , xlPrevious)
If Rp Is Nothing Then Exit Do Else R = Rp.Row + 1
Loop Until .Cells(R, 2).Value = ""
If L = 1 Then
.Activate: .UsedRange.Rows(1).Interior.ColorIndex = 35
.Cells(3, 1).Select: ActiveWindow.FreezePanes = True
End If
End With
End If
Next
.ShowAllData
End If
Union(.[O2:P2], .Cells(17).Resize(C, 2)).Clear
End With
Set Rg = Nothing: Set Rm = Nothing: Set Rp = Nothing
End Sub
Bonjour
A l'exécution de la macro j'ai une "incompatibilité de type", Sans avoir testé le bonus
cdt
Je ne reproduis pas cette erreur en collant le code de mon précédent message dans un nouveau classeur …
Quelle ligne déclenche l'erreur ?
Si le VBE ne l'indique pas, exécuter alors le code en mode pas à pas via la touche F8 …
Ok
jamais fais, mais je vais essayer
l'erreur se produit juste après l'importation a
FICHIER = Application.GetOpenFilename("Fichiers texte,*.txt", , " Import station météo :")
C'est bien avant l'importation, cette ligne étant déjà présente dans la version précédente et n'ayant pas été modifiée ‼ …
Éteindre l'ordinateur, sait-on jamais ? …
bon j'ai eteint l'ordi (sans conviction) et évidemment c'est pareil.
j'ai refait le classeur en recopiant la macro sur le site (s'ait on jamais) idem
C'est après l'importation que l'erreur se produit car les feuilles février et mars sont crées mais la feuille mars est vide !
c'est l'erreur 13 que donne l'aide
Type incompatible (erreur 13)
Voir aussi Particularités
Visual Basic peut convertir et forcer plusieurs valeurs pour effectuer des affectations de type de données qui étaient impossibles dans des versions antérieures. Cependant, cette erreur peut toujours se produire et peut avoir les causes et solutions suivantes :
La variable ou la propriété n'est pas du type approprié. Par exemple, une variable nécessitant une valeur entière ne peut pas accepter de valeur de chaîne sauf si cette valeur peut être reconnue comme un entier.
Essayez d'effectuer des affectations uniquement entre types de données compatibles. Par exemple, un Integer peut toujours être affecté à une variable de type Long, un type Single peut toujours être affecté à une variable de type Double, et n'importe quel type (à l'exception d'un type défini par l'utilisateur) peut être affecté à une variable de type Variant.
Un objet a été passé à une procédure attendant une propriété ou une valeur simple.
Passez la propriété simple appropriée ou appelez une méthode adaptée à l'objet.
Un nom de module ou de projet a été utilisé à l'endroit où une expression était attendue, par exemple :
Debug.Print MyModule
Spécifiez une expression pouvant être affichée.
Vous avez tenté de combiner une gestion d'erreurs Basic traditionnelle avec des valeurs de type Variant ayant le sous-type Error (10, vbError), par exemple :
Error CVErr(n)
Pour générer à nouveau une erreur, vous devez trouver la correspondance à une erreur Visual Basic intrinsèque ou définie par l'utilisateur, puis générer cette erreur.
Une valeur CVErr ne peut pas être convertie en Date. Par exemple :
MyVar = CDate(CVErr(9))
Utilisez une instruction Select Case ou une structure similaire pour mapper le renvoi de CVErr à ce type de valeur.
Au moment de l'exécution, cette erreur indique généralement qu'une variable de type Variant utilisée dans une expression a un sous-type incorrect, ou qu'une variable de type Variant contient un tableau apparaissant dans une instruction Print #.
Pour imprimer des tableaux, créez une boucle affichant chaque élément individuellement.
voici le fichier avec erreur
Cette erreur correspond aux torchons mélangés avec les serviettes ! Mais comme pas ce souci de mon côté …
Et ne pouvant charger les classeurs avec macro …
Tu ne m'as donc pas indiqué la ligne déclenchant l'erreur !
Exécuter le code en mode pas à pas via la touche F8 jusqu'à trouver la ligne fautive …
Sinon je pourrais tester sous une version 2007 au mieux dans la soirée voire en fin de semaine …
J'ai testé sans souci avec les trois fichiers csv joints …
refait plusieurs fois le pas a pas
et plante après avoir executer plusieurs fois la boucle
For Each Rc In Rm
If Evaluate("ISREF('" & Rc.Value & "'!A1)") = False Then
Worksheets.Add(, Worksheets(Worksheets.Count)).Name = Rc.Value
Rg.Rows(1).Copy Cells(2)
End If
Chez toi ca marche ?
Aucun souci de mon côté sinon à quoi bon publier le code ?‼
Et quelle ligne précisément déclenche l'erreur ?
Sachant que cet extrait de code existait aussi déjà dans la version précédente et testée sous la version 2007 !
Sinon je testerais plus tard sous une version 2007 …
Comme je m'y attendais, pas de souci sous Excel 2007 de mon côté …
Donc tu as omis quelque chose et sans chercher la ligne exacte déclenchant l'erreur, je ne pourrais pas remonter la source !
Sinon, une fois un nouveau classeur ouvert avec seulement la feuille 1,
détaille toutes tes manipulations avant même de lancer l'exécution …
j'ouvre un nouveau classeur
je supprime les feuilles 2 et 3
dans la feuille 1 je colle le code
je fais "outils--macro- executer la macro"
l'explorateur s'ouvre
je choisis mon fichier texte---ouvrir et la commence le problème
j'ai réessayé la macro précédente (au cas ou) ca marche toujours
Je vais essayer cette nuit au boulot (si j'ai le temps).
ca ne peut pas être un problème de paramétrage d'Excel ?
Bang Bang ‼ Et voilà :
will60 a écrit :dans la feuille 1 je colle le code
Pourquoi donc dans la feuille 1 ?
As-tu au moins essayé dans un module normal ou même vu le bonus dans celui du classeur ?
Certes non ! D'habitude lorsque j'avertis de coller le code dans un module de classe, souvent j'ai le retour :
« ça marche pas pourtant le code est bien dans un module normal. »
Rien qu'en lisant le début du code : With Feuil1
je ne me serais pas embêté si c'était pour son module …
Mais là tu l'as copié dans le seul endroit où, en l'état, il ne pouvait fonctionner !
Car une instruction désignant une cellule orpheline - c'est à dire sans être précédée d'une référence de feuille - n'a pas le même
effet selon le module : dans un module normal ou celui du classeur, c'est la feuille active
mais dans le module de la feuille c'est de facto cette feuille même si elle n'est pas active !
Et en m'indiquant la ligne déclenchant l'erreur, il ne m'aurait pas fallu cinq minutes …
Fais-le test en déplaçant le code dans le module du classeur par exemple …
Et puis si tu tiens à placer le code dans celui de la feuille, j'ai mis à jour le code en page précédente.
Il devrait y avoir une évolution car grâce au troisième fichier csv joint je me suis rendu compte
d'un possible recul de performance, je dois tenter de simplifier encore un peu, à suivre …