Avatar billede folj Forsker
19. januar 2017 - 10:00 Der er 15 kommentarer og
2 løsninger

Excel - metode til at referere til det forgående sheet.

Jeg har nogle planer der er bygget op med sheets for hver uge.

Jeg har dog savnet noget der kan hjælpe mig når jeg i en formel skal referere til det forrige ark (altså den foregående uge). Formlen hedder eksempelvis =SUM('Uge 2'!E67).
Derfor kreerede jeg en egen function til at servere navnet på det foregående sheet, som jeg så benytter når jeg har indsat et nyt sheet, og med vba retter formler til i nogle udvalgte celler der skal finde en værdi der skal hentes i det forrige uge-sheet.

Function PreviosSheetname(TestSheetName As String)
' function der finder navnet på det sheet der ligger lige før - bruges bl.a når der skal rettes formler til, så de referer til celer i arket der ligger lige før

Dim NrOfSheets As Integer

NrOfSheets = ThisWorkbook.Worksheets.Count

For i = 1 To NrOfSheets

If Sheets(i).Name = TestSheetName Then
  PreviosSheetname = Sheets(i - 1).Name ' når TestSheetName er fundet, så returnerer vi navnet der ligger før
End If

Next i

End Function


Nu er det jo sjældent man kan opfinde noget der ikke allerede er opfundet i excels egne functioner.

Mit spørgsmål:
Findes der allerede en nem metode til at referere til det forgående sheet (altså uden at specificere navnet på det forgående sheet)?
Avatar billede xl-Enthusiast Ekspert
19. januar 2017 - 10:49 #1
En mulighed er at gå ind i Name Manager og oprette et navn, for eksempel:

PrevShtValue

og i Refers to feltet at indsætte følgende:

=INDIRECT(INDEX(GET.WORKBOOK(1);GET.DOCUMENT(87)-1)&"!RC";0).

Herefter kan du for eksempel stille dig i Sheet3!A1 og her indtaste:

=PrevShtValue

og du vil få returneret det der står i Sheet2!A1
Avatar billede folj Forsker
19. januar 2017 - 12:10 #2
@xl-Enthusiast
Hvis jeg laver navngivne celler i det sheet der fungerer som skabelon, og bliver kopieret til den nye uge, så får jeg vist det problem at navnet ikke refererer til én side, da det går igen på flere sheets.

Og så kan jeg ligeså godt rette formlen til med VBA, som jeg gør i øjeblikket, når jeg har loopet mig frem til forrige sheetname.
Avatar billede xl-Enthusiast Ekspert
19. januar 2017 - 12:27 #3
Ikke forstået, men hvis du alligevel vil bruge VBA kan det vel også være lige meget.
Avatar billede folj Forsker
19. januar 2017 - 12:27 #4
@xl-Enthusiast
En hurtig test afslører at:
Hvis jeg opretter en navngiven celle "LastWeekData" i sheet1, og kopierer sheetet med navngivningen (og ændrer sheetname til noget andet)
Når jeg så senere vil kalde værdien fra et tredje sheet fra navngivne celle med formlen =LastWeekData, så stækkes den stadig fra sheet1
Avatar billede xl-Enthusiast Ekspert
19. januar 2017 - 12:35 #5
Kan/vil du uploade filen?
Avatar billede folj Forsker
19. januar 2017 - 12:40 #6
Nej det kan jeg ikke umiddelbart.
Fildelings-tjenester er ulovligt område i den virksomhed jeg arbejder i.

Desuden brugte jeg blot en tom excel-fil til at lave de simple tests i.
Avatar billede xl-Enthusiast Ekspert
19. januar 2017 - 12:48 #7
Lad os sige at LastWeekData er celle B6 i sheet1. Navngiv cellen i Name Manager på følgende måde:

=!$B$6

Hvis du stadigvæk ikke kan få det til at virke, så prøv eventuelt følgende formel:

=INDIRECT("Sheet"&MID(CELL("filename";B1);FIND("]";CELL("filename";B1))+6;256)-1&"!RC";FALSE)

i Sheet2!B1 for at hente værdien i Sheet1!B1.
Avatar billede xl-Enthusiast Ekspert
19. januar 2017 - 12:56 #8
Altså, du skal selvfølgelig kopiere arket igen for at få den nye navngivning (=!$B$6) med.
Avatar billede folj Forsker
19. januar 2017 - 13:10 #9
@xl-Enthusiast

Det er jo til brug i mene VBA-automstideringer.
Jeg afvikler en VBA-procedure der kopierer sheet og på den  måde opretter en ny uge når der er behov.

Den eneste forskel jeg kan se ved dit forslag er at jeg nu skal have VBA-proceduren til at skrive en langhåret formel ind i stedet for det simple =SUM('Uge 2'!E67).
Det er gangske rigtigt en anden løsning, men den giver ikke den forbedring jeg efterlyser. Tværtimod.

Jeg resumerer lige mit spørgsmål:
Mit spørgsmål:
Findes der allerede en nem metode til at referere til det forgående sheet (altså uden at specificere navnet på det forgående sheet)?
Avatar billede anedi Ekspert
19. januar 2017 - 13:38 #10
Med fare for at nedenstående forslag også er i kategorien "ikke-forbedrende-langhårede" løsninger, vil jeg blot bede dig se bort fra den. Ingen grund til uddybende kommentarer.

Hvis alle dine ark er navngivet "Uge X" og er sorteret i stigende orden, kan du måske bruge nedenstående funktion:
=INDIRECT("'Uge "&SHEET()-1&"'!e67")

Vh
Anedi
Avatar billede folj Forsker
19. januar 2017 - 13:57 #11
@anedi
Det luder da ikke så langhåret endda.
Det lyder jo ret enkelt. Princippet må være at SHEET()-1  skal returnere indexnummer på det forrige sheet.
Det gør den bare ikke. Den returnerer fejlen #NAME.
Avatar billede xl-Enthusiast Ekspert
19. januar 2017 - 14:11 #12
#9
Beklager, det var skam ikke for at binde dig noget på ærmet der var det modsatte af en forbedring.

Jeg synes måske ikke lige det fremgik særlig klart af dit indledende spørgsmål, at:

Det er jo til brug i mene VBA-automstideringer.

Det jeg oprindeligt mente var det der er vist i nedenstående, men hvis det skal være VBA, som glem mig.

https://www.dropbox.com/s/aen7hw5o0ne2wx8/Previous.xlsm?dl=0
Avatar billede anedi Ekspert
19. januar 2017 - 14:43 #13
#11
Det lyder mærkeligt, så må der være en tastefejl et sted.
Prøv at stille dig i en tilfældig celle og indtast: =Sheet(), giver den også #NAME-fejl?

Hvilken version af Excel benytter du? Tror først sheet er med fra 2013-versionen
Avatar billede jens48 Ekspert
19. januar 2017 - 18:15 #14
Anedis forslag i #10 er rimeligt elegant, men da TEXT funktionen først virker fra Excel 2013 skal der en lidt ekstraberegning til, hvis man har en ældre version. Jeg har fået det til at virke med:

=INDIRECT("Uge"&TEXT(VALUE(RIGHT(MID(CELL("Filename");FIND("]";CELL("filename"))+1;999);2))-2;"00")&"!E67")

Dog med det minus at CELL funktionen kræver genberegning af regnearket. Den bliver ikke automatisk opdateret.
Avatar billede folj Forsker
23. januar 2017 - 11:45 #15
#13
Har lige testet igen i et ny worbook. Når jeg indtaster formlen '=Sheet()' i en hvilken som helst celle, så returnerer den fejlen #NAME?
Avatar billede folj Forsker
03. februar 2017 - 11:39 #16
Da jeg ikke har fået nogle forslag til en nem løsning, så må svaret være det som jeg lagde ud med som egen løsning:

En function der finder sheetname på  PreviusSheetName:
Function PreviosSheetname(TestSheetName As String)
' function der finder navnet på det sheet der ligger lige før - bruges bl.a når der skal rettes formler til, så de referer til celer i arket der ligger lige før
Dim NrOfSheets As Integer
NrOfSheets = ThisWorkbook.Worksheets.Count

For i = 1 To NrOfSheets
  If Sheets(i).Name = TestSheetName Then
  PreviosSheetname = Sheets(i - 1).Name ' når TestSheetName er fundet, så returnerer vi navnet der ligger før
  End If
Next i

End Function


Herefter jeg lader min vba-procedure kalde functionen og få sereveret det forrige sheetname.
Det skal vi  bruge til at rette formlen til med, i stil med neden stående:
Sub GetPreviosSheetname()
' kalder functionen PreviosSheetname
PrevSheetname = PreviosSheetname("Template")
  Range("E16") = =SUM('" & PrevSheetname & "'!E67)
End Sub
Avatar billede folj Forsker
06. februar 2017 - 08:57 #17
Inden jeg markerer min ovenstående løsning i #16 som løsningen,så må jeg lige rette den linie der retter formlen til  (med korrekt satte gåseøjne eller "double quotes")
Her er den kopieret fra dat virkelige liv, og ikke bare beskrevet som "noget i stil med":
' retter formel så den trækker saldo fra ugen før celle E16 eksempelvis =SUM('Uge 51'!E16)
  Range("E9").Formula = "=SUM('" & PrevSheetname & "'!E16)"
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