23. juli 2005 - 19:04Der er
35 kommentarer og 2 løsninger
Dynamisk navngivng af ark
Hej Jeg er ved at lave en budgetopfølgning og har i den forbindelse 12 ark der hedder Januar, Februar, Marts osv. Da ikke alle virksomheder har samme regnskabsperiode, kunne jeg tænke mig at de forskellige ark kunne hedde det samme som det der stod i en bestemt celle i et bestemt ark. Altså jeg prøver at samle alle relevante oplysninger som kontonr, måned osv i et ark der hedder Noter. Kan man så navgive et Ark som =Noter!F2 (cellen med januar)??? Mvh
De fleste virksomheder har efterhånden bevist, at AI virker.
Pilotprojekter leverer resultater. Medarbejdere bruger generative AI-værktøjer. Nye use cases dukker op på tværs af organisationen.
Hvis dit "Noter" ark ligger som det første ark, kan du omdøbe arknavnene med følgende kode:
Sub OmdøbArk() For i = 2 To 13 Sheets(i).Name = Worksheets("Noter").Range("F" & i) Next i End Sub
BEMÆRK! Koden fungerer kun, hvis din fil består af 13 ark, og arket "Noter" skal være det første (dvs. placeret længst til venstre). De øvrige ark vil så få de navne, der står i Noter!F2, Noter!F3 osv.
Hvis det er det du er ude efter, men din fil er struktureret anderledes, så sig lige til, så skal jeg nok justere det.
Jeg tror du har fat i det rigtige der....men...mit første ark hedder forside, herefter kommer januar, februar, marts.....op til december. Herefter kommer der et ark der hedder noter, likviditet, kvartal, år, nøgletal, grafer. Det er kun de ark der hedder "måneder" der skal omdøbes. Skal koden ind som et modul, eller hvordan ? Mvh
Nåh ja, koden vil faktisk også fungere i dit ark - uden ændringer.
Spørgsmålet er så hvordan koden skal fungere. Skal den aktiveres med en kommandoknap, eller skal den f.eks. køre automatisk, hver gang du ændrer på et af navnene (bør undgås hvis det ikke er noget, der sker hyppigt).
- Højreklikke på menuen og vælge værktøjsmenuen "Kontrolelementer" - I værktøjslinien "Kontrolelementer" trykker du på "Kommandoknap" og indsætter den i regnearket - Højreklik på kommandoknappen og vælg "Vis programkode" - Indsæt følgende tre linier i programkoden
For i = 2 To 13 Sheets(i).Name = Worksheets("Noter").Range("F" & i) Next i
Hvis du hellere vil have det skal ske løbende skal du
Tryk Alt-F11 og indsæt følgende kode
Private Sub Worksheet_Change(ByVal Target As Excel.Range) If Target.Column = 6 And (Target.Row >= 2 And Target.Row <= 13) Then Sheets(Target.Row).Name = Worksheets("Noter").Range("F" & Target.Row) End If End Sub
Bemærk at den automatiske løsning bruger lidt processorkraft på løbende at undersøge om der er sket nogen ændringer i Noter!F2:F13 Det er ikke kritisk ved mindre regnetunge ark, men ved mere komplicerede ark, vil man normalt foretrække at så meget regnekraft som muligt bruges på selve beregningerne.
Nu kan du jo prøve begge dele og se hvad du foretrækker.
Desværre....automatisk, sker der intet. Sætter jeg en knap på, får jeg en runtime error 1004. Kan ikke have mere end et ark med samme navn.......de hedder jo i forvejen januar...december. mvh
Prøv først med helt andre navne - f.eks. A, B, C osv. Bagefter kan du så prøve med de rigtige navne.
DU har muligvis ret i det med at det måske ikke betyder så meget med hvor meget tid, der bruges på at kontrollere om celler er ændret, da det VISTNOK kun er manuelle ændringer i cellerne, der undersøges - og de forekommer jo typisk ikke under beregnignerne.
Jeg har nogen ark, der bruger 12-30 sekunder på at opdatere beregningerne, og jeg ville blive noget irriteret, hvis de pludselig skulle bruge 10-20 sek. mere tid.
<sjap Tjah..det har du ret i. Det er nok lidt lissom når man får en ny computer. Efter et par måneder har man glemt hvor langsom den gamle var. Undskyld jeg blandede mig ;-)
Hej sjap Læg et svar. Du har ærligt fortjent dine point. Det virker ihvertfald med commandbtn, dog ikke med automatisk, men skidt med det. Jeg brugte a-b-c osv. så kørte koden med det samme. Godnat
Godmorgen....Ja så driller det alligevel :-) Jeg har lige lagt koden over på mit "rigtige" ark, og der stå månederne listet i kolonne F32:F43....og så virker det ikke mere. Er det Range der skal ændres eller må der bare ikke stå mere i den kolonne? mvh
Hej brynil Tak for inputtet. Desværre har jeg ikke evnet at få den automatiske til at virke. Det var derfor jeg spurgte til Range. Har ændret lidt i min Noter og sat Range i kolonne J fra 2-13 og så virker det....Men inden jeg ændrer referencerne til de resterende steder i mine ark ville jeg lige checke om det var muligt at flytte Range.
Til sjap - 10 øren er faldet med hensyn til at navngive aksernes indeling på grafer...det virker fint når månedens navne står i mit ark, noter :-) Tak for hintet. Mvh
florint > prøv at ændre den "automatiske" funktion til
Private Sub Worksheet_Change(ByVal Target As Excel.Range) If Target.Column = 6 And (Target.Row >= 32 And Target.Row <= 43) Then Sheets(Target.Row-30).Name = Worksheets("Noter").Range("F" & Target.Row) End If End Sub
Den automatiske funktion var måske blevet lidt kryptisk, og det skyldes lidt smart udnyttelse af nogen tilfældigheder. Derfor er det måske på plads med en forklaring:
Jeg går ud fra at i er med på at Target er den celle, der er ændret i.
Sætningen: If Target.Column = 6 And (Target.Row >= 32 And Target.Row <= 43) Then er derfor blot en kontrol af om den ændrede sætning ligger i området med Ark-overskrifter. Derfor skal denne sætning ændres, hvis overskrifterne flyttes.
Funktionen Sheets(Target.Row).Name ændrer navnet på Ark nummer "Target.Row". Dette er lidt et tilfælde, da det første af de ark, der skal ændres navn på er ark nr. 2 og navnet er placeret i kolonne F i RÆKKE nr 2 (altså tilfældigvis 2 begge steder). Navnet på ark nr. 3 står i kolonne 3 osv. Hvis området med arknavnene flyttes, så det første navn IKKE står i række 2, så skal funktionen altså ændres. Ændringen er sådan set ret enkel idet man blot skal sikre at resultatet altid er 2 ved det første arknavn, f.eks. Sheets(Target.Row-30).Name hvis navnene er flyttet til F32:F43
Den sidste funktion referer blot til cellen, der lige er blevet ændret Worksheets("Noter").Range("F" & Target.Row)
Efter denne lille gennemgang kunne jeg lige se et par muligheder for at trimme funktionen lidt, så du ikke skal pille så meget ved den, når du flytter rundt på området med arknavne:
Private Sub Worksheet_Change(ByVal Target As Excel.Range) rStart = "F2" If Target.Column = Range(rStart).Column And (Target.Row >= Range(rStart).Row And Target.Row <= Range(rStart).Row + 11) Then Sheets(Target.Row - Range(rStart).Row + 2).Name = Worksheets("Noter").Range(Target.Address) End If End Sub
Hej Begge, Jeg er ked af det men jeg kan dæleme ikke få den automatiske til at virke. Jeg har prøvet alle de foreslåede metoder men lige meget hjælper det :-( Hvorimod den med knappen virker upåklageligt - hver gang... brynil - du må hellere lave et svar også da jeg synes dine indlæg også fortjener lidt point for ulejligheden (ikke mindst tidligheden :-)) Mvh
Det er selvfølgelig vigtigt at forstå at koden er lavet specifikt til dette formål, og ud fra de givne forudsætninger. Koden er IKKE generel, men kræver lidt tilpasning, hvis der foretages ændringer i:
- placering af område med dynamiske navne - antal ark, der er placeret INDEN arkene med dynamiske navne
For at forenkle tilpasning, hat jeg lige lavet endnu en lille ændring:
Private Sub Worksheet_Change(ByVal Target As Excel.Range) rStart = "F2" 'Første celle i område med dynamiske navne aStart = 2 'Nummeret på det første ark med dynamisk navn (tælles på fanebladene fra venstre) If Target.Column = Range(rStart).Column And (Target.Row >= Range(rStart).Row And Target.Row <= Range(rStart).Row + 11) Then Sheets(Target.Row - Range(rStart).Row + aStart).Name = Worksheets("Noter").Range(Target.Address) End If End Sub
florint > Funktionen fungerer fint her! Fandt dog ud af, at det kan gå galt, hvis man kopierer flere celler ad gangen, så jeg lavede lige endnu en justering:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
rStart = "F29" 'Første celle i område med dynamiske navne aStart = 2 'Nummeret på det første ark med dynamisk navn (tælles på fanebladene fra venstre)
If Target.Column = Range(rStart).Column And (Target.Row >= Range(rStart).Row And Target.Row <= Range(rStart).Row + 11) Then For Each c In Target Sheets(c.Row - Range(rStart).Row + aStart).Name = Worksheets("Noter").Range(c.Address) Next c End If
Hej Takker for hjælpen - Jeg satte dit sidste forslag ind, og så virker det!!!!! Tak for kampen til jer begge. Vi "mødes" nok igen :-) Jeg har opdaget Excel.....og hvad man kan gøre i det. Mvh
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.