Avatar billede zarthax Nybegynder
22. januar 2007 - 13:56 Der er 27 kommentarer og
1 løsning

Hente data fra text fil ?

Hvordan vil jeg kunne hente data ind i en celle, fra en text fil der er placeret i en anden mappe på computeren ?
EXEL filen ligger i dokument mappen
Data filen ligger på :\Programmer\CCP\EVE\capture\Marketlogs\Derelik - Megacyte - 2007.01.22 124915.txt )
Datafilen kan have samme navn, med undtagelse af dato, og tid (124915 <<--tid "12:49:15)

Textfilen indeholder en række data, separeret med et komma ( , ):

price,volRemaining,typeID,range,orderID,volEntered,minVolume,bid,issued,duration,stationID,regionID,solarSystemID,jumps,
3850.0,5303.0,40,32767,355836012,25303,1,False,2007-01-22,90,60012124,10000001,30000005,12,
3895.0,12.0,40,32767,354360820,12,1,False,2007-01-20,90,60014452,10000001,30000112,14,
3899.0,2317.0,40,32767,355043580,3000,1,False,2007-01-21,90,60013030,10000001,30000025,14,
3956.56,6254.0,40,32767,355316293,6254,1,False,2007-01-21,90,60012550,10000001,30000109,9,
3975.98,8426.0,40,32767,355316718,8426,1,False,2007-01-21,1,60012550,10000001,30000109,9,
3999.0,16059.0,40,32767,355441281,32000,1,False,2007-01-21,90,60012127,10000001,30000007,11,

Den første linje er overskriften for hver kolonne, adskilt med et komma.
Jeg skal nu have cellen til at hente det tal, der står under typeID, linje 4 (Det er "40"). Denne info, skal ind i en celle i EXEL.

En anden celle, skal tage alle tal under price, og finde gennemsnittet. dvs, EXEL skal tælle antallet af linjer, og dividere den samlede værdi, med antallet af linjer, og derefter vise gennemsnittet i den angivne celle.

Antallet af rækker vil være meget varierende.

Er det noget der er muligt ?? :S
Avatar billede kabbak Professor
22. januar 2007 - 14:26 #1
Public Sub HentData()
    Dim Fil As String, Pris() As Variant, X As Long, ID As Long, Str As String
    Fil = "\Programmer\CCP\EVE\capture\Marketlogs\Derelik - Megacyte - 2007.01.22 124915.txt"
 
    Open Fil For Input As #1
    Line Input #1, Str
    X = 0
    Do
        Line Input #1, Str
        ReDim Preserve Pris(X)
        Pris(X) = Val(Split(Str, ",")(0))
        ID = Split(Str, ",")(2)
        X = X + 1
    Loop Until EOF(1)
    Close #1
    [A1] = ID
    [A2] = Application.WorksheetFunction.Sum(Pris) / X

End Sub
Avatar billede zarthax Nybegynder
22. januar 2007 - 14:41 #2
og alt dette skal stå i selve cellen ? :S
Avatar billede zarthax Nybegynder
22. januar 2007 - 14:41 #3
hov, kan ikke kommentere mere før i morgen... komer ikke hjem før engang i nat :S Surt at være chauffør i dette vejr :(

(Ja, Det sner sgu i Maribo )
Avatar billede aidan Nybegynder
22. januar 2007 - 15:09 #4
Hvis brugeren skal vælge mellem hvilken fil der skal hentes data fra, skal der måske være en dialog som åbnes, som viser filer fra mappen \Programmer\CCP\EVE\capture\Marketlogs\, eller er det kun det seneste fil der er interessante?
Avatar billede kabbak Professor
22. januar 2007 - 21:14 #5
Det skal ikke stå i cellen, det er en makro, den skal sættes ind i et modul
ALT + F11
vælg Insert module

sæt koden ind der

når koden køres, skriver den i det aktive ark,  celle A1 og A2
Avatar billede zarthax Nybegynder
23. januar 2007 - 17:59 #6
Det er den sidste nye fil der skal bruges. (de hedder nøjagtig det samme, med undtagelse af dato og tidsangivelsen...)

Tester nu koden :)
(har endelig fået tid, efter et par ture til fyn med lidt paller :S MAND hvor drøjt :P )
Avatar billede zarthax Nybegynder
23. januar 2007 - 18:12 #7
ok, tror da på at den virker :)

Har så også fundet ud af, at det stump kode der generer tallet "40", ikke skal bruges alligevel :S Hvordan fjerner jeg denne ?

Og hvordan får jeg den til altid at hente den nyeste fil i mappen ? :S
Avatar billede zarthax Nybegynder
23. januar 2007 - 18:41 #8
hov, så en fejl jeg selv havde lavet :S
Den skal kun finde gennemsnittet af prisen, ud af de rækker hvor
"bid" er "false" ... min bøf, undskyld :(
(Der er kun én "False" i her linje...)
Avatar billede kabbak Professor
23. januar 2007 - 19:42 #9
Public Sub HentData()
'price,volRemaining,typeID,range,orderID,volEntered,minVolume,bid,issued,duration,stationID,regionID,solarSystemID,jumps,
'  0      1          2      3      4      5          6        7    8    9        10      11        12          13
    Dim Fil As String, Pris() As Variant, X As Long, ID As Long, Str As String
    ' Fil = "\Programmer\CCP\EVE\capture\Marketlogs\Derelik - Megacyte - 2007.01.22 124915.txt"
      Open Fil For Input As #1
    Line Input #1, Str
    X = 0
    Do
        Line Input #1, Str
        If Split(Str, ",")(7) = "False" Then
            ReDim Preserve Pris(X)
            Pris(X) = Val(Split(Str, ",")(0))
            X = X + 1
        End If
    Loop Until EOF(1)
    Close #1

    [A2] = Application.WorksheetFunction.Sum(Pris) / X ' skriver gennemsnit i aktiveark celle A2

End Sub
Avatar billede zarthax Nybegynder
23. januar 2007 - 19:48 #10
.....du er styg.... :P

Lurer den :)
Avatar billede zarthax Nybegynder
23. januar 2007 - 19:55 #11
:(

"Runtime Error '75':
Path/File access error"

trykker jeg på "Debug", bliver "Open Fil For Input As #1" lyst op i gult...
Avatar billede kabbak Professor
23. januar 2007 - 19:55 #12
et svar ;-))
Avatar billede kabbak Professor
23. januar 2007 - 19:56 #13
eksisterer din fil ??
Avatar billede kabbak Professor
23. januar 2007 - 20:00 #14
Denne kode tjekker om filen er der

Public Sub HentData()
'price,volRemaining,typeID,range,orderID,volEntered,minVolume,bid,issued,duration,stationID,regionID,solarSystemID,jumps,
'  0      1          2      3      4      5          6        7    8    9        10      11        12          13
    Dim Fil As String, Pris() As Variant, X As Long, ID As Long, Str As String
    Fil = "\Programmer\CCP\EVE\capture\Marketlogs\Derelik - Megacyte - 2007.01.22 124915.txt"
      If Dir(Fil) <> "" Then
        Open Fil For Input As #1
        Line Input #1, Str
        X = 0
        Do
            Line Input #1, Str
            If Split(Str, ",")(7) = "False" Then
                ReDim Preserve Pris(X)
                Pris(X) = Val(Split(Str, ",")(0))
                X = X + 1
            End If
        Loop Until EOF(1)
        Close #1

        [A2] = Application.WorksheetFunction.Sum(Pris) / X    ' skriver gennemsnit i aktiveark celle A2
    Else
        MsgBox " Filen findes ikke"
    End If
End Sub
Avatar billede zarthax Nybegynder
23. januar 2007 - 20:07 #15
Nice :)
Ved ikke hvad du gjorde, men det virker.
Vil den nu selv finde den nyeste version af filen ?

"Derelik - Megacyte - " delen af filnavnet, vil altid være ens.
"2007.01.22 124915.txt" Vil altid være forskellig... (124915 = 12:29:15 i digital-tid...)

Tro mig, jeg er henrykt, for dette problem har givet mig mange grå hår :) Men, hvis jeg skal hen og rette lidt over 1000 linjer med filnavne, hver gang jeg skal bruge arket... av :(
Avatar billede kabbak Professor
23. januar 2007 - 20:50 #16
har du kun 1 fil i det bibliotek, der starter med
Derelik - Megacyte -
Avatar billede zarthax Nybegynder
23. januar 2007 - 20:54 #17
Der ligger flere filer der hedder det, men der er kun én fil med en given dato og tid på...
Derelik - Megacyte - 2007.01.22 124911.txt
Derelik - Megacyte - 2007.01.23 144901.txt
Derelik - Megacyte - 2007.01.23 122913.txt
Derelik - Megacyte - 2007.01.23 125515.txt
Derelik - Megacyte - 2007.01.23 224910.txt

etc. etc. etc.
Avatar billede kabbak Professor
23. januar 2007 - 21:05 #18
Ok så får du en stifinder, så kan du selv vælge.


Public Sub HentData()
'price,volRemaining,typeID,range,orderID,volEntered,minVolume,bid,issued,duration,stationID,regionID,solarSystemID,jumps,
'  0      1          2      3      4      5          6        7    8    9        10      11        12          13
    Dim Pris() As Variant, X As Long, ID As Long, Str As String, fileToOpen As Variant
    fileToOpen = Application.GetOpenFilename("tekstfiler (*.txt), *.txt")
    If fileToOpen <> False Then
        Open fileToOpen For Input As #1
        Line Input #1, Str
        X = 0
        Do
            Line Input #1, Str
            If Split(Str, ",")(7) = "False" Then
                ReDim Preserve Pris(X)
                Pris(X) = Val(Split(Str, ",")(0))
                X = X + 1
            End If
        Loop Until EOF(1)
        Close #1

        [A2] = Application.WorksheetFunction.Sum(Pris) / X    ' skriver gennemsnit i aktiveark celle A2
    Else
        MsgBox " Filen findes ikke"
    End If
End Sub
Avatar billede zarthax Nybegynder
23. januar 2007 - 21:36 #19
:) Kanon :)
Takker :)
Avatar billede kabbak Professor
23. januar 2007 - 21:39 #20
tak for point
Avatar billede zarthax Nybegynder
23. januar 2007 - 22:15 #21
var så lidt :)
Tror dog at jeg må lede efter det der kan finde den nyeste fil automatisk...
Der vil blive brugt mange hundreder af filer til opdatering af data, så en stifinder til selv at finde den nyeste, vil være noget af en opgave.

Det må vel være muligt på en eller anden måde :S
Avatar billede kabbak Professor
24. januar 2007 - 00:26 #22
Prøv at teste med denne kode, den skulle kunne læse filnavnene og finde den med den nyeste dato tid .


Public Sub HentData()
'price,volRemaining,typeID,range,orderID,volEntered,minVolume,bid,issued,duration,stationID,regionID,solarSystemID,jumps,
'  0      1          2      3      4      5          6        7    8    9        10      11        12          13
    Dim Pris() As Variant, X As Long, ID As Long, Str As String, fileToOpen As Variant
    Open FindFil For Input As #1
    Line Input #1, Str
    X = 0
    Do
        Line Input #1, Str
        If Split(Str, ",")(7) = "False" Then
            ReDim Preserve Pris(X)
            Pris(X) = Val(Split(Str, ",")(0))
            X = X + 1
        End If
    Loop Until EOF(1)
    Close #1

    [A2] = Application.WorksheetFunction.Sum(Pris) / X    ' skriver gennemsnit i aktiveark celle A2

End Sub

Function FindFil()
    Dim NO As Long, strFilNavn() As Variant, MyPath As String, Dato() As Date
    Dim Tid As String, i As Long, Nyeste As Date
    NO = 1
    MyPath = "\Programmer\CCP\EVE\capture\Marketlogs\"
    ReDim Preserve strFilNavn(NO)
    strFilNavn(NO) = Dir(MyPath & "Derelik - Megacyte*.txt")  ' Hent den første filnavn.
    Do While strFilNavn(NO) <> ""  ' Start løkken
        If strFilNavn(NO) <> "." And strFilNavn(NO) <> ".." Then
            NO = NO + 1
            ReDim Preserve strFilNavn(NO)
        End If
        strFilNavn(NO) = Dir    ' Hent næste filnavn.
    Loop
    NO = NO - 1
    ReDim Dato(NO)
    For i = 1 To NO
        Tid = Left(Right(strFilNavn(i), 21), 17)
        Dato(i) = DateSerial(Left(Tid, 4), Mid(Tid, 6, 2), Mid(Tid, 9, 2)) _
                + TimeSerial(Mid(Tid, 12, 2), Mid(Tid, 14, 2), Right(Tid, 2))
    Next
    Nyeste = SortArray(Dato)
    For i = 1 To NO
        If Dato(i) = Nyeste Then
            FindFil = MyPath & strFilNavn(i)
            Exit Function
        End If
    Next
End Function
Function SortArray(RankArray As Variant)
    Dim Temp As Variant, N As Long, i As Integer, j As Integer
    Dim swap As Boolean, Col As Integer
    N = UBound(RankArray)
    ReDim Temp(Col)
    swap = True
    Do While swap
        swap = False
        For i = 1 To N - 1
            For j = i To N
                If RankArray(i) > RankArray(j) Then
                    Temp = RankArray(i)
                    RankArray(i) = RankArray(j)
                    RankArray(j) = Temp
                    swap = True
                End If
            Next
        Next
    Loop
    SortArray = RankArray(UBound(RankArray))
End Function
Avatar billede zarthax Nybegynder
24. januar 2007 - 20:56 #23
Din kode virker dælme :)
...Havd da heller ikke regnet med andet, når man kigger rundt på alle de svar dugiver hist og her :)

Nu kan jeg så begynde at bygge op kan jeg se..
Skal jeg gentage hele ovenstående macro for hver fil der skal hentes ? Eller er der blot en bid der skal kopieres så den passer til et andet filnavn ?

(Derelik er en region, der kan variere, og megacyte er ét mineral af mange :S )

Hvis ikke, hopper jeg slavisk i båden :)
Kanon :)))
Beklager de sene og underlige svartider, men dagen er sgu lang i dette vejr :(
Avatar billede zarthax Nybegynder
24. januar 2007 - 21:16 #24
underligt...
Gemmer jeg exel arket inde i EVE mappen, og ændrer
MyPath = "\Programmer\CCP\EVE\capture\Marketlogs\"
Til
MyPath = "\capture\Marketlogs\" eller MyPath = "capture\Marketlogs\"

Duer det ikke... hvad gør jeg galt ?
Avatar billede kabbak Professor
24. januar 2007 - 22:04 #25
når en sti starter med en \

betyder det start fra roden af det aktuelle drev, så hele stien skal altid med
Avatar billede kabbak Professor
24. januar 2007 - 22:06 #26
og man kan selvfølgelig også gøre sådan

MyPath = ThisWorkbook.Path & "\capture\Marketlogs\"
Avatar billede kabbak Professor
24. januar 2007 - 22:16 #27
Hvis datoTid altid står med start 21 tegn fra højre,
som i

Derelik - Megacyte - 2007.01.22 124911.txt

Skal du bare rette

Derelik - Megacyte
i
Dir(MyPath & "Derelik - Megacyte*.txt")

til de andre filnavne
Avatar billede zarthax Nybegynder
27. januar 2007 - 20:22 #28
Vums, det virker :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester