10. januar 2006 - 11:01Der er
30 kommentarer og 1 løsning
En makro skal starte, når et felt har en vis værdi.
INFO: Jeg har et ark, som fylder lidt for meget. (1,5 mb)
25 kolonner med med lange formler er kopieret 400 rækker ned. I en række tilfælde behøves imidlertid kun de øverste rækker. Derfor ønsker jeg en løsning, som kan kopiere formler ned, hvis jeg ønsker det.
ØNSKES: Når man indtaster data, ændrer "A1" værdi. Hvis A1 er lig X, skal formlerne i "A39:AA39" kopieres X felter ned. Alså med formler i alle X rækker.
Bemærk: Jeg ønsker ikke, at man skal trykke på en knap, for at makroen går igang - den skal starte, når A1 får (ændret) en værdi.
Støv, fibre og metalliske partikler kan påvirke både uptime, levetid og driftssikkerhed. Derfor arbejder flere datacentre systematisk med contamination control.
Denne kode skalæ lægges i arkets kodemodul (højreklik på arkfane, og vælg Vis programkode):
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("a1")) Is Nothing Then Range("a39:aa39").Select Selection.Copy For i = 0 To Target.Value ActiveCell.Offset(1, 0).Select ActiveSheet.Paste Next i End If
Hej, umiddelbart ser det rimelig okay ud, men: Når den kopierer 1 mere end man vælger og den fjerner ikke rækkerne igen, hvis man vælger et mindre tal. Ellers okay. - Måske endnu bedre hvis man ikke ser kopieringen.
Hej, umiddelbart ser det rimelig okay ud, men: Den kopierer 1 linie mere end man vælger og den fjerner ikke rækkerne igen, hvis man vælger et mindre tal. Ellers okay. - Måske endnu bedre hvis man ikke ser kopieringen.
Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False If Not Intersect(Target, Range("a1")) Is Nothing Then Range("a39:aa39").Select Selection.Copy For i = 0 To (Target.Value - 1) ActiveCell.Offset(1, 0).Select ActiveSheet.Paste Next i End If Application.CutCopyMode = False Application.ScreenUpdating = True End Sub
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("a1")) Is Nothing Then If Range("b65536").End(xlUp).Row > 39 Then Rows("40:" & Range("b65536").End(xlUp).Row).Delete End If Range("A39:AA39").Copy Range("A40:A" & 39 + [a1]) End If End Sub
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("a1")) Is Nothing Then If Target > 0 Then If Range("A65536").End(xlUp).Row > 39 Then Range("A40:AA" & Range("A65536").End(xlUp).Row).ClearContents End If Range("A39:AA39").Copy Range("A40:A" & 39 + [a1]) End If End If End Sub
> (Kan man gøre noget, så koden bliver kørt, når formlen giver værdien 1?) så skal vi finde den celle der tastes ind i, for at A1 skifter vædi via dens formel.
eller hvis der er flere celler der har indflydelse på A1, så tjekke dem.
Sagen er den, at indtastningen skal ske via et felt, hvor man (med data->validation) skal vælge ud fra en liste. Listen indeholder enten ord eller værdier. Når man vælger, aktiverer man sjovt nok ikke cellen.
Alternativt kan du bruge worksheet_Calculate. Dette forudsætter at du tager en tilfældig celle og i den skriver =A1 Når A1 så ændres vil dette bevirke en genberegning af denne celle og makroen vil starte. Ulempen er så at enhver ændring i arket der fremprovokerer en genberegning vil også få makroen til at køre
Private Sub Worksheet_Calculate()
If [A1] > 0 Then If Range("A65536").End(xlUp).Row > 39 Then Range("A40:AA" & Range("A65536").End(xlUp).Row).ClearContents End If Range("A39:AA39").Copy Range("A40:A" & 39 + [A1]) End If
For øvrigt, hvis man har to problemer som skal løses, f.eks. både en kopiering og en hide, som startes af to forskellige begivenheder, skal de så lægges i to forskellige worksheet_calculate eller kan de kun lægges i den samme?
Man kan kun bruge worksheet_calculate een gang pr. ark Resten skal styres af et par if sætninger, men prøv at vise/fortælle hvad det er, du ønsker at gøre.
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("Din_celle_med_datavalidering")) Is Nothing Then If IsNumeric([A1]) And [A1] > 0 Then If Range("A65536").End(xlUp).Row > 39 Then Range("A40:AA" & Range("A65536").End(xlUp).Row).ClearContents End If Range("A39:AA39").Copy Range("A40:A" & 39 + [A1]) End If End If End Sub
Bak, læg svaret og glem evt. sidste spørgsmål. Jeg løste det ved at lægge begge aktioner i samme sub. Jeg går ud fra, der kun kan være 1 worksheet_calculate.
Tak for hjælpen til alle!
Private Sub Worksheet_Activate() oldvalue = [A1] oldvalue2 = [A2] End Sub
Private Sub Worksheet_Calculate()
Application.EnableEvents = False oldvalue2 = [A2] If [A2] = "Combo" Then Rows("10:11").Hidden = False Else Rows("10:11").Hidden = True End If Application.EnableEvents = True
If [A1] = oldvalue Then Exit Sub
Application.EnableEvents = False oldvalue = [A1] If Range("A65536").End(xlUp).Row > 39 Then Range("A40:AA" & Range("A65536").End(xlUp).Row).ClearContents End If Range("A39:AA39").Copy Range("A40:A" & 39 + [A1]) Application.EnableEvents = True
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.