Avatar billede x-masman Nybegynder
16. oktober 2002 - 09:53 Der er 19 kommentarer og
1 løsning

Den hænger når makroen kører.

Hej Eksperter.

Jeg sidder lidt i saksen! Den her makro jeg kører får excell til at gå ned. Hvad er der galt i den? Den er meget tung og kræver helt vildt meget. hvis det er det der er problemet, er der så en smartere måde at gøre det på?

Sub Dantextfil()

    Dim XLws As Object
    Dim FileXLS As String
    Dim FileCSV As String
    Dim FileCSV2 As String
    Dim i As Integer
   
    Set XLws = workbooks("Tilpasningsark til modelporteføljer.xls").Worksheets("CSV")
    FileXLS = "I:\Portman\Modelporteføljer\Tekstfiler\Pfhld.xls"
   
    Sheets("CSV").Select
    workbooks.Add
    ChDir "I:\Portman\Modelporteføljer\Tekstfiler"
   
    If FileExist(FileXLS) = True Then Kill FileXLS
   
    ActiveWorkbook.SaveAs FileName:= _
        FileXLS, FileFormat:=xlNormal, _
        Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
        CreateBackup:=False
    Windows("Tilpasningsark til modelporteføljer.xls").Activate
    Sheets("CSV").Copy After:=Sheets(3)
    XLws.Select
   
    XLws.Rows(2).Delete
    XLws.Rows(1).Delete
   
    i = 1
    While LCase(XLws.Cells(i, 1).Value) <> "slut"
        Select Case XLws.Cells(i, 1).Text
        Case ""
            XLws.Rows(i).Delete
        Case Else
            i = i + 1
        End Select
    Wend
   
    XLws.Rows(i).Delete
       
    XLws.Select
    Sheets("CSV").Move After:=workbooks("Pfhld.xls").Sheets(3)
   
    FileCSV = InputBox("Skriv navnet på den fil du gerne vil gemme:", "Navngivning på fil")
   
    FileCSV2 = "I:\Portman\Modelporteføljer\Tekstfiler\" & FileCSV
                 
    ActiveWorkbook.SaveAs FileName:=FileCSV2, FileFormat:=xlCSV, CreateBackup:=False
    ActiveWindow.Close savechanges:=False
    Sheets("CSV (2)").Select
    Sheets("CSV (2)").Name = "CSV"
    Sheets("Tilpasningsark").Select
    Range("B9").Select
   
    MsgBox ("Tekstfil dannet på I:\Portman\Modelporteføljer\Tekstfiler\" & FileCSV)
   
End Sub
Avatar billede x-masman Nybegynder
16. oktober 2002 - 09:54 #1
Ved godt det er ekstremt grimt programmering, men det er optaget i excell. :)
Avatar billede x-masman Nybegynder
16. oktober 2002 - 09:57 #2
jeg tror den går galt her:

ActiveWorkbook.SaveAs FileName:= _
        FileXLS, FileFormat:=xlNormal, _
        Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
        CreateBackup:=False
    Windows("Tilpasningsark til modelporteføljer.xls").Activate
    Sheets("CSV").Copy After:=Sheets(3)
    XLws.Select
Avatar billede martin_moth Mester
16. oktober 2002 - 10:05 #3
Hvad med at bruge lidt debugging til at lokaklisere fejlen?
Avatar billede x-masman Nybegynder
16. oktober 2002 - 10:13 #4
det ville jeg gerne, men excell går ned - altså hænger - når jeg kører makroen. Jeg skal altså lukke excell med taskmanager.
Avatar billede x-masman Nybegynder
16. oktober 2002 - 10:15 #5
Det skal tilføjes at makroen har virket før, hvor den kun gik ned hver anden gang.
Avatar billede martin_moth Mester
16. oktober 2002 - 10:53 #6
Derfor kan du vel godt debugge alligevel - sæt et par breakpoints ind, og se hvor det går galt. Alternativt smid en msgbox ind i hveranden linie - og norter hvilken msgbox der blev den sidst viste, inden excel crasher. Derudfra finder du linien hvor den fejlskabende kode er
Avatar billede tubber Juniormester
16. oktober 2002 - 11:39 #7
tror det er i din while wend den ligger, det lydder som om den ikke stopper

jeg har et bud men ved ikke helt om det er det.......

i = 1
    While LCase(XLws.Cells(i, 1).Value) <> "slut"
        Select Case XLws.Cells(i, 1).Text
        Case ""
            XLws.Rows(i).Delete
            i = i + 1
        Case Else
            i = i + 1
        End Select
    Wend
Avatar billede bak Forsker
16. oktober 2002 - 11:44 #8
Et sted det ihertilfælde går galt er linien med filexist (med mindre det er en funktion du selv har lavet)
FileExist er et Filesystemobject og kan ikke bruges som du skriver.
Hvis du skal bruge det skal du indsætte denne linie
Set FS = CreateObject("Scripting.FileSystemObject")
og ændre
If FS.FileExist(FileXLS) = True Then Kill FileXLS

En anden ide er i stedet for at kill filen så overskriv uden advarsel.:

Application.DisplayAlerts = False
ActiveWorkbook.SaveAs FileName:= _
        FileXLS, FileFormat:=xlNormal, _
        Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
        CreateBackup:=False
Application.DisplayAlerts = true
Avatar billede bak Forsker
16. oktober 2002 - 11:51 #9
Tubber har sikkert ret i at løkken vil køre helt i bund dvs til række 65536.
Det kan ske fordi cellen med slut bliver sprunget over. Hvis vi antager at cellen med slut ligger i række 100 og rækken lige før slettes så bliver rækken med slut til række 99, men din tæller i vil være 100 og række 100 chekkes istedet for 99.
Skal du slette linier så start fra bunden istedet for.
Avatar billede martin_moth Mester
16. oktober 2002 - 14:58 #10
Bare for at være ireterende - man må altså kunne finde fejlen ved debugning. (Breakpoints, watches osv. de rigtige steder.. :o)
Avatar billede tubber Juniormester
16. oktober 2002 - 15:08 #11
det er rigtigt martin det kan man :O)

Bare for også at være ireterende - Han spørger vist ikke om hvordan man debugger, men om hvad fejlen er :OP

jeg ved ikke om det her virker i VBA, men det gør i VB, men i VB er der en der hedder Debug.Print, den udskriver det man vil have udskrevet i et debug vindue....

/Tubber
Avatar billede x-masman Nybegynder
16. oktober 2002 - 18:42 #12
Hej med jer.

Der var temmeligt travlt efter jeg skrev dette indlæg, så jeg nåede ikke at kigge mere på det idag. Jeg løste problemet midlertidigt med at finde en gammel gemt kopi af arket frem. Så virkede det igen, men crashede hver tredje gang. Derfor er jeg stadig interesseret i at få løst problemet.

FileExist har jeg kodet selv, så det er ikke der fejlen ligger. Den anden ide er rimelig sandsynlig, da det er omkring der problemet opstår.(Det ville debugging selvfølgelig afsløre, men det har jeg ikke tid til lige foreløbig.:) Måske en gang i næste uge).

Der vil jeg også prøve det med løkken, men jeg tror ikke det er der fejlen er. For det første virker makroen nogle gange. For det andet går det så langsomt i Excell, at man kan se hvad der sker løbende, og det er før den begynder og slette noget at den går ned.

Det at makroen virker nogle gange, får mig måske til at tro at det er fordi at den kræver så meget (for den er MEGET tung at køre) at systemet ikke helt kan håndterer den.

Den kører med 100% af CPU'en i cirka 8 sekunder.

Jeg får ikke prøvet alt det her af, før i næste uge, men jeg håber i har tålmodiged og løbende kan hjælpe.

MVH
Jens
Avatar billede bak Forsker
16. oktober 2002 - 22:28 #13
Der ligger umiddelbart ingenting i den første del af koden der skulle gøre at kører langsomt. hvordan ser din fileexist ud?
Avatar billede x-masman Nybegynder
17. oktober 2002 - 10:06 #14
Function FileExist(ByVal FileName As String) As Boolean
    FileExist = (Len(Dir(FileName)) > 0)
End Function

Jeg tror grunden til at den er så langsom, er at det ark som den skriver fra og til er kæmpe stort. Det tager godt og vel fem sekunder at gemme.
Avatar billede x-masman Nybegynder
17. oktober 2002 - 10:28 #15
bak>> Hvad gør den der kill og hvad er det at du forslår?
Avatar billede x-masman Nybegynder
30. oktober 2002 - 23:42 #16
Hej... håber i stadig er der. Her i næste uge får jeg tid til at kigge på problemet. Jeg har arbejdet en del med arket i denne og sidste uge og det var ikke kill kommandoen den var gal med.
Det går ned ca. hver tredje gang makroen kører, men hvis man lukker arket ned efter anden gang og så åbner det igen, virker det igen to gange. Hvorefter man så kan lukke det ned osv.
Derfor tror jeg det er fordi den fylder et eller andet i cachen eller rammen som den ikke sletter bagefter. Lyder det ikke sandsynligt? derfor ville jeg hører om der er en kommando i VB som på en måde flusher rammen, som jeg så kunne putte ind til sidst i makroen.

Håber i stadig er der og kan hjælpe

Mvh
Jens
Avatar billede x-masman Nybegynder
05. november 2002 - 11:48 #17
er i der stadig? er der ingen der kan hjælpe mig?
Avatar billede x-masman Nybegynder
05. november 2002 - 14:44 #18
Det er her den går galt:

Sheets("CSV").Copy After:=Sheets(3)

Jeg tror stadig at det er fordi der er fyldt op i hukommelsen.
Avatar billede x-masman Nybegynder
07. november 2002 - 11:43 #19
Jeg har selv klaret problemet. Jeg skrev makroen om så den kom til at se således ud:

Sub Dantextfil()

 
    Dim FileXLS As String
    Dim FileCSV As String
    Dim FileCSV2 As String
    Dim i As Integer
   
   
    FileXLS = "I:\Portman\Modelporteføljer\Tekstfiler\Pfhld.xls"
   
    Sheets("CSV").Select
    Range("A1:BH80").Select
    Selection.Copy
    workbooks.Add
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False
   
   
    Sheets("sheet1").Select
   
    ChDir "I:\Portman\Modelporteføljer\Tekstfiler"
   
    Rows(2).Delete
    Rows(1).Delete
   
    i = 1
    While LCase(Cells(i, 1).Value) <> "slut"
        Select Case Cells(i, 1).Text
        Case ""
            Rows(i).Delete
        Case Else
            i = i + 1
        End Select
    Wend
   
    Rows(i).Delete
       
         
    FileCSV = InputBox("Skriv navnet på den fil du gerne vil gemme:", "Navngivning på fil")
   
    FileCSV2 = "I:\Portman\Modelporteføljer\Tekstfiler\" & FileCSV
                 
                   
    ActiveWorkbook.SaveAs FileName:=FileCSV2, FileFormat:=xlCSV, CreateBackup:=False
    ActiveWindow.Close savechanges:=False
    Sheets("Tilpasningsark").Select
   
   
 
   
    MsgBox ("Tekstfil dannet på I:\Portman\Modelporteføljer\Tekstfiler\" & FileCSV)
   


End Sub

Function FileExist(ByVal FileName As String) As Boolean
    FileExist = (Len(Dir(FileName)) > 0)
End Function
Avatar billede x-masman Nybegynder
07. november 2002 - 11:44 #20
svar
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
Kurser inden for grundlæggende programmering

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