Avatar billede rskadk Nybegynder
10. juli 2013 - 12:13 Der er 6 kommentarer

Optimere lille visual basic kode til brug i excel

Jeg har følgende kode, bestående af:
1: En calender der indsættes når jeg klikker i en defineret celle
2: Data der fyldes i 4 celler når en celle i kolonnen A udfyldes.

Punkt 2 forekommer meget langsom, idet den indsætter værdien celle for celle når en celle i kolonnen A udfyldes.
Kan dette sammenskrives, så det er hurtigere?


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    'check cells for desired format to trigger the calendarfrm.show routine
    'otherwise exit the sub
    Dim DateFormats, DF
    DateFormats = Array("dd/mm/yy", "mmmm d yyyy")
    For Each DF In DateFormats
        If DF = Target.NumberFormat Then
            If CalendarFrm.HelpLabel.Caption <> "" Then
                CalendarFrm.Height = 191 + CalendarFrm.HelpLabel.Height
            Else: CalendarFrm.Height = 191
                CalendarFrm.Show
            End If
        End If
    Next
End Sub

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
       
    With Target
            If .Count > 1 Then Exit Sub
            If Not Intersect(Range("A2:A999"), .Cells) Is Nothing Then
                Application.EnableEvents = False
                If IsEmpty(.Value) Then
                    .Offset(0, 3).ClearContents
                Else
                    With .Offset(0, 3)

                        .Value = "(N/A)"
                    End With
                End If
                Application.EnableEvents = True
            End If
        End With
       
    With Target
            If .Count > 1 Then Exit Sub
            If Not Intersect(Range("A2:A999"), .Cells) Is Nothing Then
                Application.EnableEvents = False
                If IsEmpty(.Value) Then
                    .Offset(0, 4).ClearContents
                Else
                    With .Offset(0, 4)

                        .Value = "(N/A)"
                    End With
                End If
                Application.EnableEvents = True
            End If
        End With
       
    With Target
            If .Count > 1 Then Exit Sub
            If Not Intersect(Range("A2:A999"), .Cells) Is Nothing Then
                Application.EnableEvents = False
                If IsEmpty(.Value) Then
                    .Offset(0, 5).ClearContents
                Else
                    With .Offset(0, 5)
                        .NumberFormat = "dd-mm-yy"
                        .Value = Date
                    End With
                End If
                Application.EnableEvents = True
            End If
        End With
       
    With Target
            If .Count > 1 Then Exit Sub
            If Not Intersect(Range("A2:A999"), .Cells) Is Nothing Then
                Application.EnableEvents = False
                If IsEmpty(.Value) Then
                    .Offset(0, 10).ClearContents
                Else
                    With .Offset(0, 10)

                        .Value = "Not Started"
                    End With
                End If
                Application.EnableEvents = True
            End If
        End With
       
    With Target
            If .Count > 1 Then Exit Sub
            If Not Intersect(Range("A2:A999"), .Cells) Is Nothing Then
                Application.EnableEvents = False
                If IsEmpty(.Value) Then
                    .Offset(0, 11).ClearContents
                Else
                    With .Offset(0, 11)

                        .Value = 3
                    End With
                End If
                Application.EnableEvents = True
            End If
        End With
       
       
    End Sub
Avatar billede claes57 Ekspert
10. juli 2013 - 12:22 #1
prøv at skifte den anden rutine ud med
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
       
    With Target
            If .Count > 1 Then Exit Sub
            If Not Intersect(Range("A2:A999"), .Cells) Is Nothing Then
                Application.EnableEvents = False
                If IsEmpty(.Value) Then
                    .Offset(0, 3).ClearContents
                    .Offset(0, 4).ClearContents
                    .Offset(0, 5).ClearContents
                    .Offset(0, 10).ClearContents
                    .Offset(0, 11).ClearContents
                Else
                    With .Offset(0, 3)
                        .Value = "(N/A)"
                    End With
                    With .Offset(0, 4)
                        .Value = "(N/A)"
                    End With
                    With .Offset(0, 5)
                        .NumberFormat = "dd-mm-yy"
                        .Value = Date
                    End With
                    With .Offset(0, 10)
                        .Value = "Not Started"
                    End With
                    With .Offset(0, 11)
                        .Value = 3
                    End With
                End If
                Application.EnableEvents = True
            End If
        End With
       
    End Sub
Avatar billede rskadk Nybegynder
10. juli 2013 - 12:39 #2
Tak for dette - har prøvet denne. Den insætter stadig value med 1 felt af gangen, hvilket gør at det tager ca. 5sec. fra cellen i kolonne "A" udfyldes til cellen i række 3, 4, 5, 10 og 11 er udfyldt.

Kan man ikke få udfyldt alle cellerne på én gang, når der indsættes en værdi i cellen i kolonne "A"?
Avatar billede claes57 Ekspert
10. juli 2013 - 13:46 #3
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
       
    With Target
            If .Count > 1 Then Exit Sub
            If Not Intersect(Range("A2:A999"), .Cells) Is Nothing Then
                Application.EnableEvents = False
                If IsEmpty(.Value) Then
                    .Offset(0, 3).ClearContents
                    .Offset(0, 4).ClearContents
                    .Offset(0, 5).ClearContents
                    .Offset(0, 10).ClearContents
                    .Offset(0, 11).ClearContents
                Else
                    .Offset(0, 3).Value = "(N/A)"
                    .Offset(0, 4).Value = "(N/A)"
                    .Offset(0, 5).NumberFormat = "dd-mm-yy"
                    .Offset(0, 5).Value = Date
                    .Offset(0, 10).Value = "Not Started"
                    .Offset(0, 11).Value = 3
                End If
                Application.EnableEvents = True
            End If
        End With
       
    End Sub
Avatar billede kabbak Professor
10. juli 2013 - 23:13 #4
måske hurtigere

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
       
    With Target
            If .Count > 1 Then Exit Sub
            If Not Intersect(Range("A2:A999"), .Cells) Is Nothing Then
            Application.ScreenUpdating = False
                Application.EnableEvents = False
                If IsEmpty(.Value) Then
                  Range(.Offset(0, 3), .Offset(0, 5)).ClearContents
                  Range(.Offset(0, 10), .Offset(0, 11)).ClearContents
                Else
                Range(.Offset(0, 3), .Offset(0, 4)) = "(N/A)"
                  .Offset(0, 5).NumberFormat = "dd-mm-yy"
                    .Offset(0, 5).Value = Date
                    .Offset(0, 10).Value = "Not Started"
                    .Offset(0, 11).Value = 3
                End If
                Application.EnableEvents = True
            End If
        End With
          Application.ScreenUpdating = True
    End Sub
Avatar billede rskadk Nybegynder
15. juli 2013 - 10:11 #5
SIdst nævnte udfører skift i alle celler samtidig, så dette er bedre :) Det er lidt hurtigere end såfremt én celle udfyldes pr. run.

Dog har jeg opdaget at formlen ikke er helt som jeg gerne ville have den skulle være. Den overskriver værdierne hver gang en celle i kolonnen A ændres.

Jeg vil dog kun have at cellerne skal overskrives (offset 3,5,10,11) første gang en celle i kolonnen A ændres/udfyldes. Såfremt en allerede udfyldt celle i kolonnen A ændres, skal cellerne der offsettes (3,5,10,11) ikke overskrives.
Avatar billede kabbak Professor
15. juli 2013 - 11:16 #6
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
       
    With Target
            If .Count > 1 Then Exit Sub
            If Not Intersect(Range("A2:A999"), .Cells) Is Nothing Then
if  .Offset(0, 5) <> "" then exit sub' DATO ER UDFYLDT
            Application.ScreenUpdating = False
                Application.EnableEvents = False
                If IsEmpty(.Value) Then
                  Range(.Offset(0, 3), .Offset(0, 5)).ClearContents
                  Range(.Offset(0, 10), .Offset(0, 11)).ClearContents
                Else
                Range(.Offset(0, 3), .Offset(0, 4)) = "(N/A)"
                  .Offset(0, 5).NumberFormat = "dd-mm-yy"
                    .Offset(0, 5).Value = Date
                    .Offset(0, 10).Value = "Not Started"
                    .Offset(0, 11).Value = 3
                End If
                Application.EnableEvents = True
            End If
        End With
          Application.ScreenUpdating = True
    End Sub
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

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