Avatar billede steensommer Praktikant
06. januar 2005 - 23:29 Der er 67 kommentarer og
1 løsning

Forbedring af langsom kode

Hej

Jeg har nedenstående kode der kaldes fra Worksheet_Change. Daa hentes og skrives til Access. Den skal farve en kalenders dato grøn, gul eller rød afhængig af antal daglige besøg. Koden fungerer fint men er meget langsommelig - kan den trimmes?

Vh Steen

Sub AntalLBesøg()
On Error Resume Next
    Dim rsData As ADODB.Recordset
    Dim szConnect As String
    Dim szSQL As String
    Dim sPath As String
    Dim Tlfno As String
    Dim Dato As Date, CRange As Range, C As Range, R As Range
   
    Set R = Array("C8:G13", "C18:G23", "C28:G33")
    Set CRange = ActiveWorkbook.Sheets("1. Kvartal").Range("Datoer")
   
    For Each C In CRange
        If C.Interior.ColorIndex <> xlNone Then
       
                Dato = C.Value
             
                Tlfno = ActiveWorkbook.Sheets("1. Kvartal").Range("H2").Value
                sPath = ActiveWorkbook.Path & "\"
               
                szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source =" & sPath & "gps.mdb;"
           
                szSQL = "SELECT * FROM LKalender WHERE Tlf = '" & Tlfno & "' AND Dato = '" & Dato & "' AND Tekst1 <> '""'"
               
                Set rsData = New ADODB.Recordset
                rsData.Open szSQL, szConnect, adOpenForwardOnly, adLockReadOnly, adCmdText
               
                RecordCount = 0
                rsData.MoveFirst
                Do Until rsData.EOF
                RecordCount = RecordCount + 1
                rsData.MoveNext
               
                Count = (RecordCount / 2)
         
                If Count > 2 Then
                    C.Interior.ColorIndex = 3
                ElseIf Count > 0 And Count < 3 Then
                    C.Interior.ColorIndex = 6
                Else
                    C.Interior.ColorIndex = 4
                End If
                Loop
           
                Set rsData = Nothing
        End If
    Next C

End Sub
Avatar billede Slettet bruger
06. januar 2005 - 23:37 #1
Nu er jeg ikke helt ovenpå Excel vs. Access, men du ville muligvis kunne spare
noget ved at genbruge din database forbindelse.

Du opretter, bruger og lukker en ny forbindelse inden i en løkke, det må kunne gøres
anderledes.

Jeg lytter indtil videre bare med. :-)
Avatar billede steensommer Praktikant
06. januar 2005 - 23:39 #2
Ja det lyder da rigtigt - en eller anden må vel kunne gøre det ;0)
Avatar billede Slettet bruger
06. januar 2005 - 23:42 #3
Kig evt lidt på dette her eksempel:
http://www.exceltip.com/st/Import_data_from_Access_to_Excel_(ADO)_using_VBA_in_Microsoft_Excel/427.html
Avatar billede Slettet bruger
07. januar 2005 - 00:06 #4
Prøv evt. med denne her.

----------------
Sub AntalLBesøg()
On Error Resume Next
   
    Dim rsData As ADODB.Recordset
    Dim szConnect As String
    Dim szSQL As String
    Dim sPath As String
    Dim Tlfno As String
    Dim Dato As Date, CRange As Range, C As Range, R As Range
   
    Set R = Array("C8:G13", "C18:G23", "C28:G33")
    Set CRange = ActiveWorkbook.Sheets("1. Kvartal").Range("Datoer")
   
    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
       
    ' Opret forbindelse til DB
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source =" & sPath & "gps.mdb;"
    cn.Open szConnect
       
    ' Opret en Recordset
    Set rsData = New ADODB.Recordset
   
    For Each C In CRange
        If C.Interior.ColorIndex <> xlNone Then
            Dato = C.Value
            Tlfno = ActiveWorkbook.Sheets("1. Kvartal").Range("H2").Value
            sPath = ActiveWorkbook.Path & "\"
           
            szSQL = "SELECT * FROM LKalender WHERE Tlf = '" & Tlfno & "' AND Dato = '" & Dato & "' AND Tekst1 <> '""'"
           
            ' Åben en ny cursor på den eksisterende recordset
            rsData.Open szSQL, cn, adOpenForwardOnly, adLockReadOnly, adCmdText
             
            RecordCount = 0
            rsData.MoveFirst
           
            Do Until rsData.EOF
                RecordCount = RecordCount + 1
                rsData.MoveNext
         
                Count = (RecordCount / 2)
   
                If Count > 2 Then
                    C.Interior.ColorIndex = 3
                ElseIf Count > 0 And Count < 3 Then
                    C.Interior.ColorIndex = 6
                Else
                    C.Interior.ColorIndex = 4
                End If
            Loop
        End If
        rsData.Close
    Next C
   
    Set rsData = Nothing

End Sub

------------------
Avatar billede Slettet bruger
07. januar 2005 - 00:11 #5
Rettelse:
' Åben en ny cursor på den eksisterende recordset

Til:
' Åben en ny cursor på resultatet af szSQL sætningen
Avatar billede steensommer Praktikant
07. januar 2005 - 00:13 #6
Det giver en uoprettelig loop?
Avatar billede Slettet bruger
07. januar 2005 - 00:26 #7
Ok, det kan være det var for drastisk at hive oprettelsen af recordset ud af løkken
Prøv med:

-----------
Sub AntalLBesøg()
On Error Resume Next
   
    Dim szConnect As String
    Dim szSQL As String
    Dim sPath As String
    Dim Tlfno As String
    Dim Dato As Date, CRange As Range, C As Range, R As Range
   
    Set R = Array("C8:G13", "C18:G23", "C28:G33")
    Set CRange = ActiveWorkbook.Sheets("1. Kvartal").Range("Datoer")
   
    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
       
    ' Opret forbindelse til DB
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source =" & sPath & "gps.mdb;"
    cn.Open szConnect
       
    ' Opret en Recordset
    Dim rsData As ADODB.Recordset
   
    For Each C In CRange
        If C.Interior.ColorIndex <> xlNone Then
            Dato = C.Value
            Tlfno = ActiveWorkbook.Sheets("1. Kvartal").Range("H2").Value
            sPath = ActiveWorkbook.Path & "\"
           
            szSQL = "SELECT * FROM LKalender WHERE Tlf = '" & Tlfno & "' AND Dato = '" & Dato & "' AND Tekst1 <> '""'"
           
            ' Åben en ny cursor på resultatet af szSQL sætningen
            Set rsData = New ADODB.Recordset
            rsData.Open szSQL, cn, adOpenForwardOnly, adLockReadOnly, adCmdText
             
            RecordCount = 0
            rsData.MoveFirst
           
            Do Until rsData.EOF
                RecordCount = RecordCount + 1
                rsData.MoveNext
         
                Count = (RecordCount / 2)
   
                If Count > 2 Then
                    C.Interior.ColorIndex = 3
                ElseIf Count > 0 And Count < 3 Then
                    C.Interior.ColorIndex = 6
                Else
                    C.Interior.ColorIndex = 4
                End If
            Loop
        End If
       
        ' Luk cursoren
        rsData.Close
        Set rsData = Nothing
    Next C
End Sub
---------------------
Avatar billede steensommer Praktikant
07. januar 2005 - 00:28 #8
Tilsvarende løkke men nu ikke uoprettelig - fejl ved End if under C.Interior.Colorindex = 4
Avatar billede Slettet bruger
07. januar 2005 - 00:42 #9
Prøv at erstatte den sidste del med:

---------
          Do Until rsData.EOF
                RecordCount = RecordCount + 1
                rsData.MoveNext
         
                Count = (RecordCount / 2)
   
                If Count > 2 Then
                    C.Interior.ColorIndex = 3
                ElseIf Count > 0 And Count < 3 Then
                    C.Interior.ColorIndex = 6
                Else
                    C.Interior.ColorIndex = 4
                End If
            Loop
           
            ' Luk cursoren
            rsData.Close
            Set rsData = Nothing
           
        End If
    Next C
   
    ' Luk DB forbindelse
    cn.Close
    Set cn = Nothing
   
End Sub

----------------

Hvad mener du med uoprettelig ?
Avatar billede steensommer Praktikant
07. januar 2005 - 00:43 #10
Jeg var nødt til at lave ctrl+alt+del for at stoppe og herefter genstarte excel
Avatar billede Slettet bruger
07. januar 2005 - 00:48 #11
Prøv evt med denne her:
Jeg opdagede lige at sPath først bliver sat inden i løkken, hvis vi skal oprette forbindelsen udenfor løkken skal sPath følge med ud...

---------------
Sub AntalLBesøg()

On Error Resume Next
    Dim rsData As ADODB.Recordset
    Dim szConnect As String
    Dim szSQL As String
    Dim sPath As String
    Dim Tlfno As String
    Dim Dato As Date, CRange As Range, C As Range, R As Range
   
    Set R = Array("C8:G13", "C18:G23", "C28:G33")
    Set CRange = ActiveWorkbook.Sheets("1. Kvartal").Range("Datoer")
   
    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
       
    sPath = ActiveWorkbook.Path & "\"
       
    ' Opret forbindelse til DB
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source =" & sPath & "gps.mdb;"
    cn.Open szConnect
   
    For Each C In CRange
        If C.Interior.ColorIndex <> xlNone Then
       
                Dato = C.Value
                Tlfno = ActiveWorkbook.Sheets("1. Kvartal").Range("H2").Value

                szSQL = "SELECT * FROM LKalender WHERE Tlf = '" & Tlfno & "' AND Dato = '" & Dato & "' AND Tekst1 <> '""'"
               
                Set rsData = New ADODB.Recordset
                rsData.Open szSQL, cn, adOpenForwardOnly, adLockReadOnly, adCmdText
               
                RecordCount = 0
                rsData.MoveFirst
                Do Until rsData.EOF
                RecordCount = RecordCount + 1
                rsData.MoveNext
               
                Count = (RecordCount / 2)
         
                If Count > 2 Then
                    C.Interior.ColorIndex = 3
                ElseIf Count > 0 And Count < 3 Then
                    C.Interior.ColorIndex = 6
                Else
                    C.Interior.ColorIndex = 4
                End If
                Loop
           
                Set rsData = Nothing
        End If
    Next C

End Sub

-----------------
Avatar billede steensommer Praktikant
07. januar 2005 - 00:51 #12
Så er den der. Det var dejligt . Svar så får du point.
Egentlig burde det være unødvendigt at køre hele det loop der tæller records idet blot én dato anvendes for hver C. Kan du se en måde dette kan løses på?
Avatar billede Slettet bruger
07. januar 2005 - 00:53 #13
For en god ordens skyld må vi hellere tilføje

-------
    ' Luk DB forbindelse
    cn.Close
    Set cn = Nothing
   
End Sub
-----------------

...til sidst
Avatar billede Slettet bruger
07. januar 2005 - 01:01 #14
Dvs. for hver celle i CRange er der en tilhørende unik dato.
Så tæller du antal hits på den dato, og farver cellerne derefter ?
Avatar billede steensommer Praktikant
07. januar 2005 - 01:04 #15
Præcis det er sådan den bør fungere!
Avatar billede Slettet bruger
07. januar 2005 - 01:07 #16
Hvis du kun ønsker et antal hits, kan du ændre SQL sætningen til:
szSQL = "SELECT COUNT(*) FROM LKalender WHERE Tlf = '" & Tlfno & "' AND Dato = '" & Dato & "' AND Tekst1 <> '""'"

I det tilfælde skal der så tilføjes lidt ekstra kode for at få fat i den returnerede værdi. Du vil så slippe for selv at skulle tælle resultatrækkerne op.
Avatar billede steensommer Praktikant
07. januar 2005 - 01:09 #17
Det ser da godt ud men hvordan får jeg så fat i værdien?
Avatar billede Slettet bruger
07. januar 2005 - 01:13 #18
Vi kan lige lave et lille eksperiment med.

Hvis det virker efter hensigten vil du se en MessageBox med det korrekte antal for den pågældende dato.

---------
Sub AntalLBesøg()
On Error Resume Next
   
    Dim szConnect As String
    Dim szSQL As String
    Dim sPath As String
    Dim Tlfno As String
    Dim Dato As Date, CRange As Range, C As Range, R As Range
   
    Set R = Array("C8:G13", "C18:G23", "C28:G33")
    Set CRange = ActiveWorkbook.Sheets("1. Kvartal").Range("Datoer")
   
    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
       
    ' Opret forbindelse til DB
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source =" & sPath & "gps.mdb;"
    cn.Open szConnect
       
    ' Opret en Recordset
    Dim rsData As ADODB.Recordset
   
    ' Opret en Recordset Field
    Dim fld As ADODB.Field
   
    For Each C In CRange
        If C.Interior.ColorIndex <> xlNone Then
            Dato = C.Value
            Tlfno = ActiveWorkbook.Sheets("1. Kvartal").Range("H2").Value
            sPath = ActiveWorkbook.Path & "\"
           
            szSQL = "SELECT * FROM LKalender WHERE Tlf = '" & Tlfno & "' AND Dato = '" & Dato & "' AND Tekst1 <> '""'"
           
            ' Åben en ny cursor på resultatet af szSQL sætningen
            Set rsData = New ADODB.Recordset
            rsData.Open szSQL, cn, adOpenForwardOnly, adLockReadOnly, adCmdText
           
            Set fld = rsData.Fields.Item(ix)
           
          MsgBox C.Value & " : " & fld.Value
             
            RecordCount = 0
            rsData.MoveFirst
           
            Do Until rsData.EOF
                RecordCount = RecordCount + 1
                rsData.MoveNext
         
                Count = (RecordCount / 2)
   
                If Count > 2 Then
                    C.Interior.ColorIndex = 3
                ElseIf Count > 0 And Count < 3 Then
                    C.Interior.ColorIndex = 6
                Else
                    C.Interior.ColorIndex = 4
                End If
            Loop
           
            ' Luk cursoren
            rsData.Close
            Set rsData = Nothing
           
        End If
    Next C
   
    ' Luk DB forbindelse
    cn.Close
    Set cn = Nothing
   
End Sub

----------
Avatar billede Slettet bruger
07. januar 2005 - 01:14 #19
rettelse:
Set fld = rsData.Fields.Item(ix)

til:
Set fld = rsData.Fields.Item(0)
Avatar billede steensommer Praktikant
07. januar 2005 - 01:14 #20
Så er vi tilbage til fejl ved: end if :0(
Avatar billede steensommer Praktikant
07. januar 2005 - 01:16 #21
Efter rettelsen nåede den kun til:
Recordcount = Recordcount 0 + 1
Avatar billede Slettet bruger
07. januar 2005 - 01:17 #22
Version med rettelsen:
---------
Sub AntalLBesøg()
On Error Resume Next
   
    Dim szConnect As String
    Dim szSQL As String
    Dim sPath As String
    Dim Tlfno As String
    Dim Dato As Date, CRange As Range, C As Range, R As Range
   
    Set R = Array("C8:G13", "C18:G23", "C28:G33")
    Set CRange = ActiveWorkbook.Sheets("1. Kvartal").Range("Datoer")
   
    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
       
    ' Opret forbindelse til DB
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source =" & sPath & "gps.mdb;"
    cn.Open szConnect
       
    ' Opret en Recordset
    Dim rsData As ADODB.Recordset
   
    ' Opret en Recordset Field
    Dim fld As ADODB.Field
   
    For Each C In CRange
        If C.Interior.ColorIndex <> xlNone Then
            Dato = C.Value
            Tlfno = ActiveWorkbook.Sheets("1. Kvartal").Range("H2").Value
            sPath = ActiveWorkbook.Path & "\"
           
            szSQL = "SELECT COUNT(*) FROM LKalender WHERE Tlf = '" & Tlfno & "' AND Dato = '" & Dato & "' AND Tekst1 <> '""'"
           
            ' Åben en ny cursor på resultatet af szSQL sætningen
            Set rsData = New ADODB.Recordset
            rsData.Open szSQL, cn, adOpenForwardOnly, adLockReadOnly, adCmdText
           
            Set fld = rsData.Fields.Item(0)
           
            MsgBox C.Value & " : " & fld.Value
             
            RecordCount = 0
            rsData.MoveFirst
           
            Do Until rsData.EOF
                RecordCount = RecordCount + 1
                rsData.MoveNext
         
                Count = (RecordCount / 2)
   
                If Count > 2 Then
                    C.Interior.ColorIndex = 3
                ElseIf Count > 0 And Count < 3 Then
                    C.Interior.ColorIndex = 6
                Else
                    C.Interior.ColorIndex = 4
                End If
            Loop
           
            ' Luk cursoren
            rsData.Close
            Set rsData = Nothing
            Set fld = Nothing
           
        End If
    Next C
   
    ' Luk DB forbindelse
    cn.Close
    Set cn = Nothing
   
End Sub

----------
Avatar billede steensommer Praktikant
07. januar 2005 - 01:18 #23
Fejl ved: End if
Avatar billede Slettet bruger
07. januar 2005 - 01:22 #24
OK, prøv:

-----------
Sub AntalLBesøg()
On Error Resume Next
   
    Dim szConnect As String
    Dim szSQL As String
    Dim sPath As String
    Dim Tlfno As String
    Dim Dato As Date, CRange As Range, C As Range, R As Range
   
    Set R = Array("C8:G13", "C18:G23", "C28:G33")
    Set CRange = ActiveWorkbook.Sheets("1. Kvartal").Range("Datoer")
   
    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
       
    ' Opret forbindelse til DB
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source =" & sPath & "gps.mdb;"
    cn.Open szConnect
       
    ' Opret en Recordset
    Dim rsData As ADODB.Recordset
   
    ' Opret en Recordset Field
    Dim fld As ADODB.Field
   
    For Each C In CRange
        If C.Interior.ColorIndex <> xlNone Then
            Dato = C.Value
            Tlfno = ActiveWorkbook.Sheets("1. Kvartal").Range("H2").Value
            sPath = ActiveWorkbook.Path & "\"
           
            szSQL = "SELECT COUNT(*) FROM LKalender WHERE Tlf = '" & Tlfno & "' AND Dato = '" & Dato & "' AND Tekst1 <> '""'"
           
            ' Åben en ny cursor på resultatet af szSQL sætningen
            Set rsData = New ADODB.Recordset
            rsData.Open szSQL, cn, adOpenForwardOnly, adLockReadOnly, adCmdText
           
            Set fld = rsData.Fields.Item(0)
           
            'MsgBox C.Value & " : " & fld.Value
       
            With fld
                If .Value > 2 Then
                    C.Interior.ColorIndex = 3
                ElseIf .Value > 0 And .Value < 3 Then
                    C.Interior.ColorIndex = 6
                Else
                    C.Interior.ColorIndex = 4
                End If
            End With
           
            ' Luk cursoren
            rsData.Close
            Set rsData = Nothing
            Set fld = Nothing
           
        End If
    Next C
   
    ' Luk DB forbindelse
    cn.Close
    Set cn = Nothing
   
End Sub

---------
Avatar billede steensommer Praktikant
07. januar 2005 - 01:23 #25
Nu hvor jeg får tænkt mig om skal den kode der fungerede kaldes fra Worksheet_Activate. Den kode jeg skal kalde fra Worksheet_Change skal blot indholde en datoværdi: Range("O6").
Undskyld forvirringen :0(
Avatar billede Slettet bruger
07. januar 2005 - 01:23 #26
2 sek..

Jeg smed lige en forkert version på...
Avatar billede Slettet bruger
07. januar 2005 - 01:24 #27
Sub AntalLBesøg()
On Error Resume Next
   
    Dim szConnect As String
    Dim szSQL As String
    Dim sPath As String
    Dim Tlfno As String
    Dim Dato As Date, CRange As Range, C As Range, R As Range
   
    Set R = Array("C8:G13", "C18:G23", "C28:G33")
    Set CRange = ActiveWorkbook.Sheets("1. Kvartal").Range("Datoer")
   
    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
       
    sPath = ActiveWorkbook.Path & "\"
   
    ' Opret forbindelse til DB
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source =" & sPath & "gps.mdb;"
    cn.Open szConnect
       
    ' Opret en Recordset
    Dim rsData As ADODB.Recordset
   
    ' Opret en Recordset Field
    Dim fld As ADODB.Field
   
    For Each C In CRange
        If C.Interior.ColorIndex <> xlNone Then
            Dato = C.Value
            Tlfno = ActiveWorkbook.Sheets("1. Kvartal").Range("H2").Value
           
            szSQL = "SELECT COUNT(*) FROM LKalender WHERE Tlf = '" & Tlfno & "' AND Dato = '" & Dato & "' AND Tekst1 <> '""'"
           
            ' Åben en ny cursor på resultatet af szSQL sætningen
            Set rsData = New ADODB.Recordset
            rsData.Open szSQL, cn, adOpenForwardOnly, adLockReadOnly, adCmdText
           
            Set fld = rsData.Fields.Item(0)
           
            'MsgBox C.Value & " : " & fld.Value
       
            With fld
                If .Value > 2 Then
                    C.Interior.ColorIndex = 3
                ElseIf .Value > 0 And .Value < 3 Then
                    C.Interior.ColorIndex = 6
                Else
                    C.Interior.ColorIndex = 4
                End If
            End With
           
            ' Luk cursoren
            rsData.Close
            Set rsData = Nothing
            Set fld = Nothing
           
        End If
    Next C
   
    ' Luk DB forbindelse
    cn.Close
    Set cn = Nothing
   
End Sub
Avatar billede Slettet bruger
07. januar 2005 - 01:25 #28
ok, dvs. datoen kan altid hentes fra O6 ?
Avatar billede steensommer Praktikant
07. januar 2005 - 01:29 #29
Ja i koden der skal aktiveres når der kommer ændringer i arket. Men den kode jeg skrev fungerede som fungerede godt skal kaldes ved aktivering af akret således at alle månedens datoer bliver farvelagt afhængig af Count.
Bortset fra det fungerer den sidste kode OGSÅ og er rimelig hurtig.
Men mon ikke det alligevel er bedst at anvende 2 forskellige koder af hensyn til hastigheden når databasen bliver større?
Avatar billede steensommer Praktikant
07. januar 2005 - 01:29 #30
Ups - jeg staver nærmest som en analfabet
Avatar billede Slettet bruger
07. januar 2005 - 01:32 #31
WS_Activate versionen skal ihvertfald hente en række datoer vha. løkken.
WS_Change kan så bare nøjes med en simpel DB forespørgsel uden en løkke.

Det vil nok være bedst at lave to versioner
Avatar billede steensommer Praktikant
07. januar 2005 - 01:33 #32
Nemlig
Avatar billede Slettet bruger
07. januar 2005 - 01:33 #33
Den seneste jeg smed op kan vel bruges som WS_Activate versionen, med flere datoer.
Avatar billede steensommer Praktikant
07. januar 2005 - 01:34 #34
Indtil nu har jeg anvendt samme kode og det må være uhensigtsmæssigt
Avatar billede steensommer Praktikant
07. januar 2005 - 01:34 #35
Ja den sidste kode fungerede rigtig godt
Avatar billede Slettet bruger
07. januar 2005 - 01:40 #36
Bruger du range variablen 'R' til noget som helst ?
Avatar billede steensommer Praktikant
07. januar 2005 - 01:41 #37
Nej den er en fejl
Avatar billede Slettet bruger
07. januar 2005 - 01:45 #38
Jeg skal lige være helt sikker... :-)

Er det kun feltet i kalenderen der svarer til datoen i O6 der skal opdateres ?
Dvs. kun én celle ?
Avatar billede Slettet bruger
07. januar 2005 - 01:46 #39
...i WS_Change versionen ?
Avatar billede steensommer Praktikant
07. januar 2005 - 01:48 #40
O6 repræsenterer en dato i en dag-kalender. Dagkalenderen viser ved at hø-klikke på datoen i en månedskalender. Det er i dagkalenderen at teksten bliver indført men i månedskalenderen at farveændringerne sker.
Avatar billede Slettet bruger
07. januar 2005 - 01:54 #41
ok, prøv med:


----------
'''''''''''''''''''''
' WS CHANGE version
'''''''''''''''''''''

Sub AntalLBesøg()
On Error Resume Next
   
    Dim szConnect As String
    Dim szSQL As String
    Dim sPath As String
    Dim Tlfno As String
    Dim Dato As Date
    CRange As Range
    C As Range

    Set CRange = ActiveWorkbook.Sheets("1. Kvartal").Range("Datoer")
   
    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
       
    sPath = ActiveWorkbook.Path & "\"
    ' Opret forbindelse til DB
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source =" & sPath & "gps.mdb;"
    cn.Open szConnect
       
    ' Opret en Recordset
    Dim rsData As ADODB.Recordset
   
    ' Opret en Recordset Field
    Dim fld As ADODB.Field
   
    Set Dato = [O6]
   
    For Each C In CRange
        If C.Value = Dato And C.Interior.ColorIndex <> xlNone Then
            Tlfno = ActiveWorkbook.Sheets("1. Kvartal").Range("H2").Value
           
            szSQL = "SELECT COUNT(*) FROM LKalender WHERE Tlf = '" & Tlfno & "' AND Dato = '" & Dato & "' AND Tekst1 <> '""'"
           
            ' Åben en ny cursor på resultatet af szSQL sætningen
            Set rsData = New ADODB.Recordset
            rsData.Open szSQL, cn, adOpenForwardOnly, adLockReadOnly, adCmdText
           
            Set fld = rsData.Fields.Item(0)
           
            With fld
                If .Value > 2 Then
                    C.Interior.ColorIndex = 3
                ElseIf .Value > 0 And .Value < 3 Then
                    C.Interior.ColorIndex = 6
                Else
                    C.Interior.ColorIndex = 4
                End If
            End With
           
            ' Luk cursoren
            rsData.Close
            Set rsData = Nothing
            Set fld = Nothing
           
        End If
    Next C
   
    ' Luk DB forbindelse
    cn.Close
    Set cn = Nothing
   
End Sub
----------
Avatar billede steensommer Praktikant
07. januar 2005 - 01:58 #42
Den laver en compile error: Statement invalid outside type block og fejler ved CRAnge as Range
Avatar billede steensommer Praktikant
07. januar 2005 - 01:59 #43
Nå selvfølgelig
Avatar billede Slettet bruger
07. januar 2005 - 02:00 #44
Der mangler lige nogle 'Dim' foran CRange og C, sorry...
Avatar billede steensommer Praktikant
07. januar 2005 - 02:00 #45
Efter første mindre rettelse fejler den ved Dato = [O6]:  Object required
Avatar billede Slettet bruger
07. januar 2005 - 02:02 #46
Prøv med:
Set Dato = ActiveWorkbook.Sheets("1. Kvartal").Range("O6").Value

istedet for..
Hvis det er den sheet den ligger på.
Avatar billede Slettet bruger
07. januar 2005 - 02:04 #47
Rettelse, der skal ikke bruges 'Set'...
Der skal stå:
Set Dato = ActiveWorkbook.Sheets("1. Kvartal").Range("O6").Value
Avatar billede Slettet bruger
07. januar 2005 - 02:04 #48
Dato = ActiveWorkbook.Sheets("1. Kvartal").Range("O6").Value
Avatar billede Slettet bruger
07. januar 2005 - 02:05 #49
Det er de der hurtige klippe-klistre fejl...
Avatar billede steensommer Praktikant
07. januar 2005 - 02:06 #50
Jeg fejlede på samme måde igen men kørte efter at jeg fjernede: Set.
Det var dejligt - tak for det. Jeg har endnu et tillægsspørgsmål hvis du da ikke er på vej i seng: Jeg kan af en eller anden grund ikke slette Felterne i Dagkalenderen med Delete-knappen (de forbliver i access) mens det går fint ved at anbringe sig i feltet og så anvende pil-til højre?
Avatar billede Slettet bruger
07. januar 2005 - 02:09 #51
Hvad har du af kode tilknyttet din delete knap ?
Er det en knap der ligger på dit Excel ark ?
Avatar billede steensommer Praktikant
07. januar 2005 - 02:11 #52
Nej den kaldes fra Worksheet_Change:

Sub UpdateLKalender()


On Error Resume Next
    Dim rsData As ADODB.Recordset
    Dim szConnect As String
    Dim szSQL As String
    Dim sPath As String
    Dim Tlfno As String
    Tekst = ActiveCell.Offset(-1, 0).Text
    Tlfno = ActiveWorkbook.Sheets("1. Kvartal").Range("R2").Value
    Dato = ActiveWorkbook.Sheets("1. Kvartal").Range("O6").Value
    Tid = Format(ActiveCell.Offset(-1, -1).Value, "hh:mm")
   
    sPath = ActiveWorkbook.Path & "\"
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source =" & sPath & "gps.mdb;"
   
    If Tekst <> "" Then
        szSQL = "UPDATE LKalender SET Tekst1 = ('" & Tekst & "') WHERE Tlf = ('" & Tlfno & "') AND Dato=('" & Dato & "') AND Tid =('" & Tid & "')"
       
        Set rsData = New ADODB.Recordset
        rsData.Open szSQL, szConnect, , adLockOptimistic, adCmdText
       
        Set rsData = Nothing
   
    Else
      szSQL = "DELETE FROM LKalender WHERE LKalender.Tlf = ('" & Tlfno & "') And LKalender.Dato = ('" & Dato & "') And LKalender.Tid = ('" & Tid & "')"
   
   
      Set rsData = New ADODB.Recordset
        rsData.Open szSQL, szConnect, , adCmdText
   
      Set rsData = Nothing
    End If

End Sub
Avatar billede Slettet bruger
07. januar 2005 - 02:20 #53
Nu har jeg ikke så meget erfaring med Access i Excel. Plejer man at kunne slette data i databasen ved at trykke på DELETE knappen ?
Jeg tror ikke det kan lade sig gøre.

Jeg går ud fra du mener keyboard-tasten DELETE og ikke en knap som du selv har placeret på arket.
Avatar billede Slettet bruger
07. januar 2005 - 02:22 #54
Men selvfølgelig, så burde en sletning af en celles data udløse WS_Change makroen.
Avatar billede steensommer Praktikant
07. januar 2005 - 02:22 #55
Ja jeg mener Keyboard-tasten. Men ovenstående kode der kører når teksten ændres burde vel kunne slette posten når tekst-feltet er tomt?
Avatar billede Slettet bruger
07. januar 2005 - 02:25 #56
Umiddelbart kan jeg ikke se noget galt i Update funktionen.
Det skulle lige være at du i den ene del af IF sætningen skriver
      WHERE Tlf = ('" & Tlfno & "')
og i den anden del
      WHERE LKalender.Tlf = ('" & Tlfno & "')

Men det burde ikke have noget at sige
Avatar billede steensommer Praktikant
07. januar 2005 - 02:27 #57
Nej jeg forstår det heller ikke og den lille fejl var et forsøg på at få den til at fungerer. I stedet har jeg nu inaktiveret delete-knappen. Men det er lidt utilfredsstillende at man ikke kan anvende den dertil anvendelige knap
Avatar billede steensommer Praktikant
07. januar 2005 - 02:32 #58
Nå men det behøver du bestemt ikke bruge mere tid på - nu har jeg forsøgt i de sidste 2 dage at får det til at makke ret (uden en tilfredsstillende løsning).
Men igen tak for dit store arbejde. Jeg må sige at du er en ualmindelig hurtig programmør :0)
Avatar billede steensommer Praktikant
07. januar 2005 - 02:32 #59
...og så vil jeg jo gerne af med de point!
Avatar billede Slettet bruger
07. januar 2005 - 02:35 #60
Du får et svar så. :-)

Men, det lille DELETE problem vil nok irritere mig tilstrækkeligt til at jeg må grave lidt mere i sagen imorgen...
Avatar billede Slettet bruger
07. januar 2005 - 02:35 #61
svar.
Avatar billede steensommer Praktikant
07. januar 2005 - 02:36 #62
Du skal være så velkommen :0)
Avatar billede Slettet bruger
08. januar 2005 - 02:03 #63
Jeg tror jeg har en løsning på DELETE problemet.

Der skal tilføjes følgende kode til samme modul som du har din Worksheet_Change kode i.

----------------------------
Dim twice As Boolean

Private Sub Worksheet_Activate()
    Application.OnKey "{DELETE}", "'ActiveWorkbook.Sheets(""1. Kvartal"").Worksheet_Change ActiveCell'"
    twice = False
End Sub

Private Sub Worksheet_Deactivate()
    ' Sørg for at DELETE opfører sig som den plejer
    ' efter du forlader fanebladet
    Application.OnKey "{DELETE}", ""
End Sub

-----------------

Din Worksheet_Change kode skal se sådan ud:

-----------------
Private Sub Worksheet_Change(ByVal Target As Range)

    Dim CRange As Range
    Dim isect As Range
   
    If Not twice Then
        Set CRange = ActiveWorkbook.Sheets("1. Kvartal").Range("Datoer")
        Set isect = Intersect(Target, CRange)
   
        ' Ryd cellens indhold uanset om du er indenfor kalender området
        twice = True
        ActiveCell.Clear
   
        If Not isect Is Nothing Then
            ' Du er indenfor kalender området
            UpdateLKalender
        End If
    Else
        twice = False
    End If
   
   
End Sub

-----------------------

Hvis du kalder flere funktioner end UpdateLKalender kan du skrive dem efter
linien
    UpdateLKalender

Når du trykker DELETE:
Worksheet_Change checker nu om du befinder dig indefor kalender området. Hvis du gør så slettes den aktive celle og UpdateLKalender proceduren kaldes.
Hvis du er udenfor kalender området, slettes den aktive celle som DELETE plejer at gøre.

Lav evt. lige en backup, inden du prøver med den nye kode.
Avatar billede Slettet bruger
08. januar 2005 - 02:04 #64
Jeg glemte at nævne at linien
  Dim twice As Boolean

skal placeres som første linie i kodemodulet, således at det bliver en global variabel.
Avatar billede steensommer Praktikant
08. januar 2005 - 10:01 #65
Fantastisk hvis du virkelig har fundet en løsning. Der fremkommer desværre en fejlmeddelelse når jeg anvender delete: Makroen "Activeworkbook.Sheets("1. Kvartal").Worksheet_Change ActiveCell" blev ikke fundet.
Avatar billede steensommer Praktikant
08. januar 2005 - 10:03 #66
...og lige en lille tilføjelse: Der fremkommer også en error ved linien ActiveCell Clear (alle linier er flettede celler)
Avatar billede Slettet bruger
08. januar 2005 - 11:15 #67
OK, jeg tror ideen er god nok, men der skal lige rettes nogle detaljer til.

Har du mulighed for at maile arket til mig ? (tc@elvis.dk)
Alternativt, hvis du kunne smide hele koden op fra det relevante kodemodul.

Jeg kigger på det igen iaften.
Avatar billede Slettet bruger
13. januar 2005 - 11:53 #68
Prøv med:

---------
Private Sub Worksheet_Activate()
    Application.OnKey "{DELETE}", "'Worksheet_Change ActiveCell'"
    twice = False
End Sub
---------

istedet for.
Hvis ikke det virker, må jeg lige finde på noget andet :-)
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