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
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
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"?
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
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
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.
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
Synes godt om
Ny brugerNybegynder
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.