Avatar billede gider_ikke_mere Nybegynder
23. september 2004 - 08:52 Der er 17 kommentarer og
1 løsning

Problemer med EOF

Dette er en fortsættelse af http://www.eksperten.dk/spm/540307.
Jeg har en lukket fil jeg skal have rettet i. Filen består af ca 300 linier med 20 tegn på hver linie.
Eksempel:

123456ºººººººººººººº
X1X2ºººººººººººººººº
1234ºººººººººººººººº
2122ºººººººººººººººº
ºººººººººººººººººººº
ºººººººººººººººººººº
ºººººººººººººººººººº
V½=@ºººººººººººººººº
ºººººººººººººººººººº
ºº32ººººººººººº25º3º
203010ºººººººººººººº
20ºº1º0ººººººººººººº
ºººººººººººººººººººº

På et tidspunkt, omkring linie 50 står denne linie:
ºº00ººººººººººººººº

Ved brug af

Do While Not EOF(1)
    <something>
loop

...stopper loopet ved denne linie.

Sletter jeg tegnet  og skriver et andet kører koden filens 300 linier færdig. Rykker jeg tegnet 20 linier længere ned, stopper loopet der!!! Står tegnet på 2. plads eller frem kører koden!!!
Formålet med filrettelsen er at udskifte 2. til 10 tegn i linie 37.
Sætter jeg koden til at køre loop fra 1 til 1000 stopper den akkurat samme sted og melder RT error 62 - Input past end of file.

Koden ser således ud:

Sub UdskriftKarakterer()
Dim strLinie, Nytekst As String
Dim LinieTæller As Integer

    Sti = Range("B1").Value
    Nytekst = Range("B2").Value
    NytekstLngd = Len(Nytekst)
   
    If NytekstLngd < 1 Or NytekstLngd > 8 Then
        Exit Sub
    End If
    NyLngd = 8 - NytekstLngd
    LaegTil = NyLngd
   
    'Boble = "º"
    I = 1
    For I = I To LaegTil
        Boble = (Boble & "º")
    Next
   
    Close #1, #2
    TexName = (Sti & "test.txt")
    newFname = (Sti & "Backup.txt")
    Open newFname For Output As #2
    Open TexName For Input Access Read As #1
    LinieTæller = 0
    Do While Not EOF(1)
        Line Input #1, strLinie
            LinieTæller = LinieTæller + 1
            If LinieTæller = 37 Then
                strLinie = Left(strLinie, Len(strLinie) - 18) & Nytekst & Boble & Right(strLinie, Len(strLinie) - 10)
            End If
        Print #2, strLinie
    Loop
    Close #1, #2
    Kill TexName
    Name newFname As TexName

End Sub
Avatar billede sjap Praktikant
23. september 2004 - 10:51 #1
akyhne > Prøv at kør programmet frem til hvor den inputter problemlinien. Når linien er indlæst skriver du

?Asc(Left(Streng, 1))

i vinduet "Brugerudtryk" og trykker enter. Jeg mener at EOF har ASCII nr. 26, så hvis den skriver 26, så er det altså en EOF markering du har midt i filen.
Avatar billede sjap Praktikant
23. september 2004 - 11:40 #2
Når du sætter en loop fra 1 til 1000, så prøv at sætte følgende ind før loopet:

On Error Resume Next

og efter loopet skriver du

On Error Goto 0

Måske virker det!
Avatar billede gider_ikke_mere Nybegynder
23. september 2004 - 13:23 #3
Hvor finder du "Brugerudtryk"?

Med
On Error Resume Next
On Error Goto 0

sker der bare det at filen bliver kortet ned som sædvanligt. Jeg får bare ingen fejlmeddelelse!
Avatar billede gider_ikke_mere Nybegynder
23. september 2004 - 13:40 #4
Indsætter jeg: Debug.Print Asc(Left(strLinie, 1)) i loopet får jeg som sidste asc nr. 48. Problemet er bare at fejlen opstår på linien før linien med firkanten, og dermed bliver linie 48 hvor firkanten findes ikke indlæst.
Avatar billede sjap Praktikant
23. september 2004 - 16:58 #5
Meningen med "On Error Resume next" var netop at der ikke kommer nogen fejlmeddelelse, men at programmet blot fortsætter.

Vinduet "Brugerudtryk" kan findes i VBA editoren under menuen Vis/Vinduet Brugerudtryk. Så dukker et ekstra lille vindue op hvor man kan afprøve forskellige ting mens koden kører (eller pauses). Debug.Print fungerer lidt efter samme princip, så det gør nok ikke nogen forskel.

Står der noget hmmeligt i filen, eller har du mulighed for sende den, så skal jeg gerne se lidt nærmere på "dyret"  sjap snabela hotmail punktum com
Avatar billede gider_ikke_mere Nybegynder
27. september 2004 - 08:38 #6
SJAP: Fik du filen i sidste uge?
Avatar billede bak Forsker
27. september 2004 - 16:38 #7
akyhne -> sender du ikke lige filen til mig også

excel snabela tbdl.dk
Avatar billede sjap Praktikant
27. september 2004 - 18:52 #8
akyhne > Jeg har ikke modtaget noget.
Avatar billede gider_ikke_mere Nybegynder
28. september 2004 - 09:22 #9
Fil sendt ca. kl 23:15 27-09-04. har I begge modtaget?
Avatar billede bak Forsker
28. september 2004 - 09:27 #10
modtaget..
Avatar billede sjap Praktikant
28. september 2004 - 10:24 #11
Ups, det er min skyld. Jeg kom til at skrive en forkert adresse. Den rigtige er

sjap9000 snabela hotmail punktum com

Håber ikke du har fået for mange beskidte mails, fordi du har sendt til en anden.
Avatar billede bak Forsker
28. september 2004 - 13:17 #12
Som jeg kan se denne fil er det en binær fil og ikke en sekventiel fil.
Dette betyder at jeg ikke kan lede efter linienummer og placering.
Jeg kan sagtens lede efter en specifik tekst og udskifte dette, men hvad skal jeg lede efter?
Avatar billede gider_ikke_mere Nybegynder
28. september 2004 - 15:26 #13
BAK: I linie 37 skal 3. til 10. tegn udskiftes (pga. 8.3 format). Dataene kommer fra en celle hvor der måske kun står 5 tegn. De sidste 3 tegn skal så udfyldes med º.

Hvis teksten på linie 37 er: ººINDEXSTDººº1aººººº , er nuværende tekst INDEXSTD.
Står der i celle B1 HAPPY og koden køres skal linien se således ud: ººHAPPYºººººº1aººººº
Alt dette har jeg til at virke! Problemet er at alt fra linie 48 og frem bliver slettet fordi Excel tror at denne linie er sidste linie.
Avatar billede bak Forsker
28. september 2004 - 17:12 #14
Sub tester()
Dim file1 As String, file2 As String, stAllText As String
Dim x As Long, n As Long, n1 As Long
'******************
Sti = Range("B1").Value
nytekst = Range("B2").Value
NytekstLngd = Len(nytekst)

If NytekstLngd < 1 Or NytekstLngd > 8 Then
    Exit Sub
End If
NyLngd = 8 - NytekstLngd
LaegTil = NyLngd

I = 1
For I = I To LaegTil
    boble = (boble & "º")
    Next
nytekst = nytekst & boble
'***************************
file1 = "c:\test.txt"
file2 = "c:\test1.txt"
n = FreeFile

Open file1 For Binary As #n
n1 = FreeFile

Open file2 For Binary As #n1
y = 0
'hent hele teksten ind på een gang
stAllText = Input(LOF(n), #n)
'tæller antal linieskift
For x = 1 To 36
    y = InStr(y + 1, stAllText, vbCr)
Next
'erstat 8 karakterer i linie 37 med nytekst
Mid(stAllText, y + 4, 8) = nytekst
Put #n1, , stAllText
Close #n
Close #n1
End Sub
Avatar billede bak Forsker
28. september 2004 - 18:30 #15
virker måske lidt bedre

Sub UdskriftKarakterer()
Dim Nytekst As String, stAllText As String
Dim TexName As String, newFname As String
Dim Boble As String, Sti As String
Dim LinieTæller As Long, n As Long, lCharCount As Long
Dim NytekstLngd As Long, Laegtil As Long, I As Long

    Sti = Range("B1").Value
    Nytekst = Range("B2").Value
    NytekstLngd = Len(Nytekst)
    If NytekstLngd < 1 Or NytekstLngd > 8 Then Exit Sub
    Laegtil = 8 - NytekstLngd
    'Boble = "º"
    I = 1
    For I = I To Laegtil
        Boble = (Boble & "º")
    Next
    Nytekst = Nytekst & Boble
   
    TexName = (Sti & "test.txt")
    newFname = (Sti & "Backup.txt")
   
    'hent hele teksten ind på een gang
    n = FreeFile
    Open TexName For Binary As #n
    stAllText = Input(LOF(n), #n)
    Close #n
    'tæller antal linieskift
    lCharCount = 0
    For LinieTæller = 1 To 36
        lCharCount = InStr(lCharCount + 1, stAllText, vbCr)
    Next
    'erstat 8 karakterer i linie 37 med nytekst
    Mid(stAllText, lCharCount + 4, 8) = Nytekst
   
    'indsæt hele strengen i ny fil
    n = FreeFile
    Open newFname For Binary As #n
    Put #n, , stAllText
    Close #n
   
    Kill TexName
    Name newFname As TexName

End Sub
Avatar billede bak Forsker
28. september 2004 - 19:15 #16
en gang til og med kun een fil :-)

Sub UdskriftKarakterer1()
Dim Nytekst As String, stAllText As String, TexName As String
Dim stBoble As String, Sti As String
Dim LinieTæller As Long, n As Long, lCharCount As Long

    Sti = Range("B1").Value
    Nytekst = Range("B2").Value
    If Len(Nytekst) < 1 Or Len(Nytekst) > 8 Then Exit Sub
    stBoble = String$(8, "º")
    Mid(stBoble, 1, Len(Nytekst)) = Nytekst
       
    TexName = (Sti & "test.txt")
    'hent hele teksten ind på een gang
    n = FreeFile
    Open TexName For Binary As #n
    stAllText = Input(LOF(n), #n)
       
    'tæller antal linieskift
    lCharCount = 0
    For LinieTæller = 1 To 36
        lCharCount = InStr(lCharCount + 1, stAllText, vbCr)
    Next
   
    'erstat 8 karakterer i linie 37 med nytekst
    Mid(stAllText, lCharCount + 4, 8) = stBoble
   
    Put #n, 1, stAllText
    Close #n
   
End Sub
Avatar billede gider_ikke_mere Nybegynder
30. september 2004 - 12:38 #17
Bak: Det virker godt! lægger du et svar.
Avatar billede bak Forsker
30. september 2004 - 16:39 #18
jeps :-)
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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