VBA - importer des données depuis des fichiers Textes

R@chid

XLDnaute Barbatruc
Bonjour @ tous,

Je joins un fichier Excel et 4 fichiers Texte pour que ce soit plus clair.
Lien DropBox

les fichiers textes sont des bases de données issues d'un serveur, et qui donnent la température Tmin ou Tmax journalière sur plusieurs stations (Villes) sur 2 scénarios et tout cela depuis 01/01/1961 au 2098.

Je voudrais bien que vous m'aidiez à faire une macro qui récupère les données à partir de 01/01/2000 jusqu'à 31/12/2025 et qui fait la moyenne par jour sur les 21 stations que j'ai (soit 84 fichiers) et les faire comme sur le fichier onglet "Base"

Les fichiers se nomment de la même façon (Tmin ou Tmax)-GCM-Station_1-(A2 ou B2).


https://www.dropbox.com/s/pqy76sslh79d894/Station_Agadir.zip?dl=0


Merci
 

R@chid

XLDnaute Barbatruc
Re : VBA - importer des données depuis des fichiers Textes

Bonjour @ tous,

@ mapomme :
merci cher ami pour ce fichier et ces codes qui m'ont sauvé la vie, c'est génial ;) cooooooooooooooooooool
Merci Merci, je vais tester pour la station d'Agadir que j'ai faite manuellement et je te tiendrai au courant.

@ néné06 :
merci à toi également pour ton fichier et ton code, je le teste aussi et je te tiendrai au courant toi aussi :)

@ Marc L :
merci pour ta contribution et tes conseils cher ami.

@ tous les membres de ce forum :
Merci vous êtes vraiment des supers héros.


le fait de faire cela manuellement c'est tuant, mais avec le VBA c'est en clin d’œil.


Merci
 

R@chid

XLDnaute Barbatruc
Re : VBA - importer des données depuis des fichiers Textes

Re,
Salut CISCO :)

@ mapomme : testé et approuvé 5/5
@ néné06 : testé et approuvé sauf que le code est un peu lent à comparaison avec le code de mapomme. 5/5


Merci à tous
 

Docmarti

XLDnaute Occasionnel
Re : VBA - importer des données depuis des fichiers Textes

Salut R@chid, Tous

Je complète ma suggestion :

Code:
Sub Meteo()

duree = Timer

Dim wbf As Worksheet

Set dest = ThisWorkbook.Worksheets("Feuil1")

dest.Cells.Clear
 
chemin = "C:\Users\client\Downloads\Station_Agadir\"

fich = Dir(chemin & "*-GCM-*.txt", vbNormal)
While fich <> ""
 fichier = chemin & fich
 
    Workbooks.OpenText Filename:= _
        fichier, Origin:= _
        xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote _
        , ConsecutiveDelimiter:=True, Tab:=True, Semicolon:=False, Comma:=False _
        , Space:=True, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), Array _
        (3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array( _
        10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1), Array(15, 1), Array(16, 1), _
        Array(17, 1), Array(18, 1), Array(19, 1), Array(20, 1), Array(21, 1)), _
        TrailingMinusNumbers:=True
         
    Set wbf = ActiveWorkbook.Worksheets(1)
    
    debut = 14245: fin = 23741
    Set r = wbf.Cells(debut, 2).Resize(fin - debut + 1, 21)
 
    t = r.Value
     
  wbf.Parent.Close False
  
  dest.Parent.Activate
   
  dern = dest.Cells(dest.Rows.Count, 5).End(xlUp).Row + 1
  
  If dern < 2 Then dern = 2
   
  dest.Cells(dern, 5).Select
  dest.Cells(dern, 5).Resize(UBound(t, 1), UBound(t, 2)).Value = t
   
  dest.Cells(dern, 1).Select
   
'  placer les moyennes dans l'onglet "Base" en colonne D
'  insérer les dates dans la colonne A
'  le nom de la station dans la colonne B
'  Tmax ou Tmin dans la colonne C

 dest.Cells(dern, 1).Value = "2000-01-01"
  
 dest.Cells(dern, 1).AutoFill Destination:=dest.Cells(dern, 5).Resize(UBound(t, 1), UBound(t, 2)).Columns(-3), Type:=xlFillDefault
  

 strRng = "E" & dern & ":X" & dern
 formule = "=AVERAGE(" & strRng & ")" '"=AVERAGE(E2:X2)"
  
 dest.Cells(dern, "D").Formula = formule
  
 dest.Cells(dern, "D").AutoFill Destination:=dest.Cells(dern, 5).Resize(UBound(t, 1), UBound(t, 2)).Columns(-0), Type:=xlFillDefault
  
 nn = InStrRev(fich, ".")
 dest.Cells(dern, "E").Resize(UBound(t, 1), UBound(t, 2)).Columns(-2).Value = Split(fich, "-")(2) & Mid(fich, nn - 3, 3)

 dest.Cells(dern, "E").Resize(UBound(t, 1), UBound(t, 2)).Columns(-1).Value = Split(fich, "-")(0)
  
  
 fich = Dir
Wend

dest.Cells(1, "D").Value = "Moyenne"
dest.Cells(1, "D").Select

duree = Timer - duree

Debug.Print duree & " sec"

End Sub
 

Marc L

XLDnaute Occasionnel
Peut-être un peu plus rapide ? …

Sinon voir du côté d'ADODB.
Prérequis : classeur enregistré dans le dossier contenant les fichiers sources .txt …

Avec une présentation initiale digne de ce nom, j'aurais directement proposé ceci :

VB:
Sub Demo()
    Const ZERO = #12/31/1960#, DEB = #1/1/2000#, FIN = #12/31/2025#
    Dim oDb As Object, VA(DEB - ZERO To FIN - ZERO, 1 To 5), SP$(), FIC$, L&, R&, T!, D%, N#, V
    T = Timer
    L = 2
    Feuil2.UsedRange.Offset(1).Clear
    Application.ScreenUpdating = False
    For R = LBound(VA) To UBound(VA):  VA(R, 1) = ZERO + R:  Next
    Set oDb = CreateObject("ADODB.Stream")
        oDb.Charset = "UTF-8"
         FIC = Dir(ThisWorkbook.Path & "\Tm??-*.txt")
Do Until FIC = ""
    SP = Split(Split(FIC, ".txt")(0), "-")
     R = 1
        oDb.Open
        oDb.LoadFromFile ThisWorkbook.Path & "\" & FIC
    Do Until oDb.EOS Or R > UBound(VA)
        If R < LBound(VA) Then
            oDb.SkipLine
        Else
            VA(R, 2) = SP(2)
            VA(R, 3) = SP(0)
            VA(R, 4) = SP(3)
            D = 0: N = 0
'            VA(R, 5) = Evaluate("AVERAGE(" & _
                       Replace(Application.Trim(oDb.ReadText(-2)), " ", ",") & ")")
' ou         VA(R, 5) = Evaluate("(" & Replace(oDb.ReadText(-2), "  ", "+") & ")/20")
                 For Each V In Split(Application.Trim(oDb.ReadText(-2)))
                   N = N + Val(V):  D = D + 1
                Next
            VA(R, 5) = N / D
        End If
                   R = R + 1
    Loop
        oDb.Close
    If R > LBound(VA) Then
        Feuil2.Cells(L, 1).Resize(R - LBound(VA), 5).Value = VA
          L = L + R - LBound(VA)
    End If
        FIC = Dir
Loop
    Set oDb = Nothing
    With Feuil2.Cells(1).CurrentRegion.Offset(1).Columns
            .Item(1).NumberFormat = "* d/mm/yyyy "
            .Item(2).NumberFormat = "_J@"
        .Item("C:D").NumberFormat = "_W_A@"
            .Item(5).NumberFormat = "* 0.00 _W"
    End With
    Application.ScreenUpdating = True
    MsgBox "Exécutée en " & Format(Timer - T, "0.000s"), , "   Demo"
End Sub
_______________________________________________________________________________
Merci de cliquer sur J'aime ce post en bas à gauche de chaque message ayant aidé …

_______________________________________________________________________________
Je suis Paris, Charlie, …



Edit : gain de temps en remplaçant Evaluate au profit d'une boucle classique pour la moyenne …

Pour le coup en ligne par ligne, cette méthode ne surclasse pas la manière classique …
 
Dernière édition:

saoud.az

XLDnaute Nouveau
Re : VBA - importer des données depuis des fichiers Textes

Bonjour le forum

Je ne sais pas est ce que c’est possible ou non
J’ai un tableau de suivi de traitement de pièces , et je souhaiterai trouver une méthode (macro ,Visual Basic) qui va me permettre de calculer combien des pièces sont livrée c'est note dans la colonne k(y a plus plusieurs statut livrée ,en cours …)par personne par jour ,où semaine où par mois (sachant que y 8 personne qui travaillent sur les pièces 9heure par jour )

La date est noté dans la colonne L (a partir de 12-11-2015 jusqu'au aujourd'hui

Vous trouverez en piece jointe un exemple
J en ai besoin de vous svp

Je vous remercie pour votre réponse :)

Cordialement
 

saoud.az

XLDnaute Nouveau
Re : VBA - importer des données depuis des fichiers Textes

voici l'exemple en pièce jointe
merci de votre compréhension
bonne soirée
 

Pièces jointes

  • Nouveau Feuille Microsoft Office Excel.xlsx
    19.3 KB · Affichages: 19
  • Nouveau Feuille Microsoft Office Excel.xlsx
    19.3 KB · Affichages: 24

Modeste

XLDnaute Barbatruc
Re : VBA - importer des données depuis des fichiers Textes

Bonjour souad.az,

Il aurait mieux valu ouvrir une nouvelle discussion (ta demande n'a pas de lien avec cette discussion-ci).
D'autre part, il faudrait préciser ce que tu cherches à obtenir (les personnes seraient renseignées en colonne R :confused:)
Y a-t-il un lien entre les infos qui figureraient dans les 9 premières colonnes et les 9 suivantes?? (si oui, pourquoi une colonne vide entre les deux tableaux?

Tu as déjà pensé à utiliser un Tableau Croisé Dynamique ?
 

saoud.az

XLDnaute Nouveau
Re : VBA - importer des données depuis des fichiers Textes

Bonjour Modeste
Je suis desole j etais pas clair
J ai utilise le tableau croise ,il est parfais je vous remercie
Est ce que vous avez une formule qui me permet d avoir les jours de la semaine a partir de numero semaine svp?
Exemple
Je tape 10 (ca veux dire S10)
J aurai les jours de la semaine sans le week end
Merci pour votre comprehesion
 

Modeste

XLDnaute Barbatruc
Re : VBA - importer des données depuis des fichiers Textes

Bonjour,

Je reste persuadé qu'une nouvelle discussion aurait été préférable. Tu pourrais également y joindre un fichier un peu moins "dépouillé" que ton premier exemple.

Pour ta question (si je l'ai comprise!?) il faut peut-être simplement utiliser le bouton "Actualiser" qui devrait être accessible dans l'onglet "Options" des "Outils de tableau croisé dynamique" ou via un clic droit dans le TCD lui-même
 

Discussions similaires

Statistiques des forums

Discussions
312 198
Messages
2 086 114
Membres
103 121
dernier inscrit
SophieS