Avatar billede nlr2000 Nybegynder
10. januar 2006 - 11:01 Der 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.

Tak for hjælpen!
Avatar billede jkrons Professor
10. januar 2006 - 11:30 #1
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

End Sub
Avatar billede nlr2000 Nybegynder
10. januar 2006 - 12:13 #2
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.
Avatar billede nlr2000 Nybegynder
10. januar 2006 - 12:14 #3
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.
Avatar billede jkrons Professor
10. januar 2006 - 13:14 #4
Prøv denne i stedet

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
Avatar billede nlr2000 Nybegynder
11. januar 2006 - 12:59 #5
Det ser godt ud.

Når du lægger et svar, kan du så rette makroen, så den sletter formler igen, hvis man ændrer tallet i A1 fra et tal til et mindre tal?
Avatar billede nlr2000 Nybegynder
11. januar 2006 - 13:00 #6
En ting mere:
Makroen går ret langsomt (i et stort ark) og kopierer formlen x gange. Kan den ikke kopiere det hele i et trin?
Avatar billede jkrons Professor
11. januar 2006 - 15:42 #7
1) Det er ikke så nemt at slette, da man ikke ved præcis, hvor meget, der allerede er. Men kan du evt. leve med, at alt slettes og så kopieres igen.

2) Du kan ikke indsætte mere end et sted ad gangen, men der kan måske tænkes en anden løsning end copy/paste. Jeg ser lige på det.
Avatar billede kabbak Professor
11. januar 2006 - 20:57 #8
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
Avatar billede nlr2000 Nybegynder
17. januar 2006 - 10:02 #9
jkrons 1):Den må gerne slette alt, men kun i de udvalgte søjler - ikke derefter

Kabbaks løsning holder ikke, da den ser ud til at slette rækker. Det må man ikke, da der er data i kolonner efter AA.
Avatar billede kabbak Professor
17. januar 2006 - 12:11 #10
Nu sletter den kun indholdet

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
Avatar billede nlr2000 Nybegynder
17. januar 2006 - 13:34 #11
Lige et sidste spg:
Hvorfor fungerer det, når man skriver en værdi direkte i A1, men ikke hvis man i A1 skriver =B1 og i B1 har et tal ?
Avatar billede kabbak Professor
17. januar 2006 - 13:47 #12
Fordi koden fanger når cellen aktiveres, og det gør den ikke når det er en formel der skriver i den.
Avatar billede nlr2000 Nybegynder
17. januar 2006 - 14:35 #13
Selvom jkrons prøvede, så synes jeg kabbak har fortjent pointene, så læg et svar.

Kan man gøre noget, så koden bliver kørt, når formlen giver værdien 1? Jeg giver 60 ekstra point
Avatar billede kabbak Professor
17. januar 2006 - 14:41 #14
> (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.
Avatar billede nlr2000 Nybegynder
17. januar 2006 - 15:15 #15
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.
Avatar billede kabbak Professor
17. januar 2006 - 15:21 #16
Datavaliderings cellen kan godt aktivere koden

prøv at udskifte A1 i denne linie med cellen hvor datavalideringen er i

If Not Intersect(Target, Range("a1")) Is Nothing Then
Avatar billede kabbak Professor
17. januar 2006 - 15:22 #17
hvis der kommer tekst i A1, via formlen, skal der skrives lidt mere kode
Avatar billede nlr2000 Nybegynder
17. januar 2006 - 15:44 #18
Det er tekst der kommer. Men selv når der kommer tal, aktiveres cellen ikke. Den aktiveres kun, hvis man ikke vælger, men indtaster
Avatar billede bak Forsker
17. januar 2006 - 16:01 #19
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
 
End Sub
Avatar billede nlr2000 Nybegynder
17. januar 2006 - 16:17 #20
Calculate holder nok ikke i mit tilfælde, idet hele pointen med makroen er, at formindske størrelsen på filen for at optimere arket.

Arket bliver selvfølgelig mindre, men hvis makroen køres hver gang et felt ændres, bliver det for sløvt.
Avatar billede bak Forsker
17. januar 2006 - 16:38 #21
sådan her burde den holde.
Makroen kører kun når værdien i A1 ændres.

Option Explicit
Dim oldvalue As Variant

Private Sub Worksheet_Activate()
  oldvalue = [A1]
End Sub

Private Sub Worksheet_Calculate()

  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
 
End Sub
Avatar billede nlr2000 Nybegynder
18. januar 2006 - 08:22 #22
Bak, det ser umiddelbart meget godt ud. Jeg tester det lige og vender tilbage senere
Avatar billede nlr2000 Nybegynder
18. januar 2006 - 08:41 #23
Bak, læg et svar.

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?
Avatar billede bak Forsker
18. januar 2006 - 08:44 #24
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.
Avatar billede bak Forsker
18. januar 2006 - 08:45 #25
og så lige et svar :-)
Avatar billede kabbak Professor
18. januar 2006 - 08:47 #26
denne burde altså virke, den skal i arkets modul

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
Avatar billede nlr2000 Nybegynder
18. januar 2006 - 08:51 #27
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
 
End Sub
Avatar billede nlr2000 Nybegynder
18. januar 2006 - 08:54 #28
Kabbak, ellers tak for hjælpen. Jeg har ikke set/afprøvet dit sidste svar før jeg så Baks. Først til mølle princippet går jeg ud fra er ok.
Avatar billede kabbak Professor
18. januar 2006 - 08:57 #29
det er ok, men jeg fatter ikke, hvorfor du ikke kan fange den på datavaliderings cellen
Avatar billede nlr2000 Nybegynder
18. januar 2006 - 09:01 #30
kan du det???
Avatar billede kabbak Professor
18. januar 2006 - 09:06 #31
det virker fint i mit regneark
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