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.

10macro-02.xlsm (17.46 Ko)
11020315.zip (17.72 Ko)

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 …

Rechercher des sujets similaires à "extraction donnees txt"