Avatar billede mira96ac Praktikant
15. juni 2010 - 11:13 Der er 4 kommentarer

Excel fryser

Hey

Jeg har nedenstående kode i mit Excel ark (Excel 2002 SP3 DK).

Det går ud på at jeg bare vil hente oplysninger om klientnavn og timekode ud fra nogle lister i nogle andre Excel ark.
Det virker også fint.

Men problemet er at Excel nogle gange fryser fuldstændig og bruger sindsygt CPU kraft på et eller andet - isæt hvis jeg copy/paster noget har jeg lagt mærke til.

Er der nogen som kan se om koden/makroerne er helt af helvede til og står og laver ulovligheder i baggrunden ?
..............................

Kode på hvert ark:
Private Sub worksheet_change(ByVal Target As Excel.Range)
   
    Dim C As Range, I As Long
    Dim D As Range, I2 As Long
    Dim Fundet As Boolean
    Dim Fundet2 As Boolean
  If Not Intersect(Target, Range(kundeNrindtastes)) Is Nothing Then
        If RW = 0 Then HentData    ' tjekker om data er indlæst, hvis ikke hentes de
        Application.EnableEvents = False
        Application.ScreenUpdating = False
        For Each C In Target.Cells
            Fundet = False
            If Len(C) > 0 Then
                For I = 1 To RW
                    If Data(I, 0) = C.Value Then
                        Cells(C.Row, C.Column + 1) = Data(I, 1)
                        Fundet = True
                        Exit For
                    End If
                Next
                If Not Fundet Then
                    MsgBox ("Kundernr. " + CStr(C.Value) + " kunne ikke findes!")
                    Range(Cells(C.Row, C.Column), Cells(C.Row, C.Column + 1)) = ""
                End If
            Else
                Range(Cells(C.Row, C.Column), Cells(C.Row, C.Column + 1)) = ""
            End If
        Next
    End If
    If Not Intersect(Target, Range(timekodeindtastes)) Is Nothing Then
        If RW2 = 0 Then HentData2    ' tjekker om data er indlæst, hvis ikke hentes de
        Application.EnableEvents = False
        Application.ScreenUpdating = False
        For Each D In Target.Cells
            Fundet2 = False
            If Len(D) > 0 Then
                For I2 = 1 To RW2
                    If Data2(I2, 0) = D.Value Then
                        Cells(D.Row, D.Column + 1) = Data2(I2, 1)
                        Fundet2 = True
                        Exit For
                    End If
                Next
                If Not Fundet2 Then
                    MsgBox ("Timekode " + CStr(D.Value) + " kunne ikke findes!")
                    Range(Cells(D.Row, D.Column), Cells(D.Row, D.Column + 1)) = ""
                End If
            Else
                Range(Cells(D.Row, D.Column), Cells(D.Row, D.Column + 1)) = ""
            End If
        Next
    End If
...........................................
Kode i et module:
Public Const kildeSti = "H:\SHEETS\SR\Klientliste.xls"
Public Const kildeSti2 = "H:\SHEETS\SR\Timekoder.xls" 'tilpasses
Public kXLS, kildeRækker, Rækker As Integer
Public kildeRækker2, Rækker2 As Integer
Public RW As Long
Public RW2 As Long
Public Data() As Variant
Public Data2() As Variant
Public Const kundeNrindtastes = "C10:C100,J10:J100"
Public Const timekodeindtastes = "E10:E100,L10:L100"
Function HentData()
    Set kXLS = CreateObject("Excel.application")
    Dim Sh As Worksheet
    Dim Temp As Variant
    With kXLS
        .Workbooks.Open kildeSti
        For Each Sh In .Worksheets    'NY
            With Sh
                .Activate
                kildeRækker = kildeRækker + .Range("A65536").End(xlUp).Row    ' tæller hvor mange data rækker, der er ialt
            End With
        Next
        ReDim Data(kildeRækker, 5)    ' klargør arrayet til at indeholde data, med 6 kolonner i
        RW = 0                        ' første kolonne hedder 0
        For Each Sh In .Worksheets
        With Sh
            Rækker = .Range("A65536").End(xlUp).Row
            Temp = .Range("A1:E" & Rækker)
                For R = 1 To Rækker
                If IsNumeric(Temp(R, 1)) Then
                    RW = RW + 1
                    For I = 1 To 5
                        Data(RW, I - 1) = Temp(R, I) ' lægger data ind i array
                    Next
                    End If
                Next
            End With
        Next
    End With
    lukObject
End Function

Function HentData2()
    Set kXLS = CreateObject("Excel.application")
    Dim Sh As Worksheet
    Dim Temp2 As Variant
    With kXLS
        .Workbooks.Open kildeSti2
        For Each Sh In .Worksheets    'NY
            With Sh
                .Activate
                kildeRækker2 = kildeRækker2 + .Range("A65536").End(xlUp).Row    ' tæller hvor mange data rækker, der er ialt
            End With
        Next
        ReDim Data2(kildeRækker2, 5)    ' klargør arrayet til at indeholde data, med 6 kolonner i
        RW2 = 0                        ' første kolonne hedder 0
        For Each Sh In .Worksheets
        With Sh
            Rækker2 = .Range("A65536").End(xlUp).Row
            Temp2 = .Range("A1:E" & Rækker2)
                For R = 1 To Rækker2
                If IsNumeric(Temp2(R, 1)) Then
                    RW2 = RW2 + 1
                    For I2 = 1 To 5
                        Data2(RW2, I2 - 1) = Temp2(R, I2) ' lægger data ind i array
                    Next
                    End If
                Next
            End With
        Next
    End With
    lukObject
End Function

Public Sub lukObject()
    With kXLS
        .ActiveWorkbook.Close
        .Application.Quit
    End With
    Set kXLS = Nothing
End Sub
Avatar billede newbieatphp Nybegynder
15. juni 2010 - 11:46 #1
Prøv evt. at debugge.... Du kan bruge F8 til at tage et skridt af gangen, og på den måde se om den tager et voldsomt loop.
Avatar billede mira96ac Praktikant
15. juni 2010 - 12:39 #2
Det ved jeg sgu ikke lige hvordan man gør
Avatar billede newbieatphp Nybegynder
15. juni 2010 - 12:50 #3
Hvis du går ind hvor du har lavet dine makroer og stiller markøren i starten af en makro, så trykker du blot F8 for at sætte den igang, også kan du trykke F8 for at tage et skridt af gangen.

På den måde vil du kunne se, om den kører den samme kode alt for mange gange udfra hvad hensigten var med din kode :)
Avatar billede mira96ac Praktikant
15. juni 2010 - 14:50 #4
Det kan man ikke - den starter ikke noget som helst
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