Just nu i M3-nätverket
Gå till innehåll

Villkorsstyrd formatering av blad


Rekommendera Poster

Hej.

 

Jag undrar om det går att använda någon form av villkorstyrd formatering av arbetsbladen utan att använda VBA?

Det jag har är ett huvudblad där jag skall skriva in informationen. I en cell i huvudbladet så kommer det att finnas en rullista

där man har lite olika alternativ. Utifrån valet i denna lista skulle jag vilja att ett specifikt arbetsblad skall bli synligt/valbart

för utskrift. Dem andra bladen som är kopplade till rullistan i huvudbladet skall fortsatt vara dolda.

 

mvh Patrik

 

Länk till inlägg
Dela på andra webbplatser

Nej (jag tar risken att vara tvärsäker, med risk för att något har en smart lösning...).

 

För områden så kan man ändra textfärg/storlek med villkorsstyrd formatering. I normalläget kan texten vara vit (samma som bakgrunden), Om "X" är vald ändras färgen för område X till någonting synligt. 

 

Men för att dölja blad måste du använda VBA.

 

Tyvärr går det inte att dölja Rader/kolumner heller. Så det går inte att göra något smart på det sättet.

 

Och det går inte att hyperlänka till ett dolt blad heller, annars hade du kunnat leka med det (länk till det dolda bladet Blad2 eller blad3 beroende på om du väljer X eller Y  i cell A1).

=OM(A1="X";HYPERLÄNK("[Bok1]Blad2!$A$1");OM(A1="Y";HYPERLÄNK("[Bok1]Blad3!$A$1");""))

eller, kortare:

=HYPERLÄNK("[Bok1]"&VÄXLA(A1;"X";"Blad2";"Y";"Blad3")&"!$A$1")

Jag tor att man kunde hyperlänka till ett dolt blad förut, precis som man kunde använda Ctrl+PageUp/down för att hoppa till ett dolt blad. Men det har ju inte du någon nytta av...

 

Så, svaret är nog tvär-ej 

Länk till inlägg
Dela på andra webbplatser

Det var synd.

 

Om man använder sig av VBA, kan man isåfall få koden att köras automatiskt när man har valt något i den cellen som

skall styra vilket blad som skall vara synligt?

Om isåfall, kommer koden att automatiskt att dölja bladet som inte skall användas för att sen ta fram rätt blad om man skulle byta värde i cellen som styr detta.

 

Undrar mest så att man kanske slipper starta macrot själv eller koppla det till en knapp.

 

Länk till inlägg
Dela på andra webbplatser
Postad (redigerade)

Jag är nästan säker på att jag har skrivit exakt den kod du efterfrågar för några månader sedan. Men inte tusan hittar jag den... 

Nåja. 

Exempel där:

  • du väljer fliknamn i A1
  • och det är 3 flikar du vill påverka blad1, blad2 och blad3
  • Makrot körs så fort någonting ändras på styrbladet
  • Samtliga blad (av de du vill påverka) döljs
  • Det blad du vill visa gör synligt

 

Högerklicka på Fliknamnet längst ner (på "styrbladet" där du skall välja vilket blad som skall synas) och välj:

Visa Kod

Klistra in den här koden och byt ut bladnamn osv

Private Sub Worksheet_Change(ByVal Target As Range)

'//Stäng av makrot om det är någon annan cell än A1 som har ändrats.
If Target.Address <> "$A$1" Then Exit Sub
'//Stäng av makrot om A1 är tom 
If Target.Value = "" Then Exit Sub

'//Dölj alla blad som du vill påverka.
Sheets("Blad1").Visible = False
Sheets("Blad2").Visible = False
Sheets("Blad3").Visible = False

'//Visa bladet som du valde i A1.
Sheets(Target.Value).Visible = True

End Sub

Stäng av VBA-editorn och testa din arbetsbok.

När du stänger arbetsboken måste du välja "Spara Som"-> makroaktiverad

 

Om makrot inte kör så kan du behöva ändra nivå på makrosäkerhet:

https://support.microsoft.com/sv-se/office/ändra-inställningar-för-makrosäkerhet-i-excel-a97c09d2-c082-46b8-b19f-e8621e8fe373

Jag kör nivån: "inaktivera alla makron och visa ett meddelande". Då får du välja om du skall köra makro när du öppnar ett dokument. På så sätt kan du köra egna makrodokument och neka främmande arbetsböcker. 

Redigerad av MH_
Länk till inlägg
Dela på andra webbplatser
  • 3 weeks later...

Hej.

 

Efter lite stiltje så har jag tagit upp detta projekt igen.

Har försökt använda din kod men det verkar inte fungera.

Så här ser det ut när jag försökte anpassa den efter min arbetsbok (se bild)

 

Dem enda bladen som skall vara synliga hela tiden är "Underlag protokoll" samt "Arbetsprotokoll".

Sen skall koden plocka fram ett av bladen som står med i VBA-koden utifrån de val man gör i bladet "Arbetsprotokoll".

I bladet "Arbetsprotokoll" så finns informationen som styr vilket blad som skall användas i cell "AA22".

Övriga blad skall vara dolda hela tiden.

 

Jag har även kollat så att allt är rätt stavat på alla ställen. Kollade även inställningarna för makrosäkerhet och det skall

vara som du rekommenderade. 

 

 

skärmdump VBA.jpg

Länk till inlägg
Dela på andra webbplatser
Ove Söderlund

Du ska nog inte ha Target.Value inom situationstecken utom möjligtvis använda CStr-funktionen för att definera värdet som en sträng.

 

Sheets(CStr(Target.Value)).Visible = True

 

Länk till inlägg
Dela på andra webbplatser
8 minuter sedan, skrev Ove Söderlund:

Du ska nog inte ha Target.Value inom situationstecken utom möjligtvis använda CStr-funktionen för att definera värdet som en sträng.

 


Sheets(CStr(Target.Value)).Visible = True

 

Hej.

 

Provade vad du skrev och det vart ingen skillnad. Situationstecknena råkade bli kvar när jag testade en annan sak så dem är borta nu.

 

Problemet känns som att makrot aldrig startar då jag har tagit fram de dolda flikarna manuellt och när jag påverkar

cellen som skall styra allt så händer det inget, alla flikarna är fortfarande framme och ingen döljs.

Länk till inlägg
Dela på andra webbplatser
Ove Söderlund

Som felsökning, testa att lägga koden mellan Sub... och End Sub först i din egen sub;

Gör ändring och se om MsgBox triggas.

 

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range

' The variable KeyCells contains the cells that will
    ' cause an alert when they are changed.
    Set KeyCells = Range("AA22")

If Not Application.Intersect(KeyCells, Range(Target.Address)) _
           Is Nothing Then

' Display a message when one of the designated cells has been 
        ' changed.
        ' Place your code here.
        MsgBox "Cell " & Target.Address & " has changed."

End If
Exit Sub
End Sub

 

Länk till inlägg
Dela på andra webbplatser

Nu fick jag allt att fungera så koden plockar fram rätt blad och döljer de andra.

Koden jag använder står här under.

 

Citat

Private Sub Worksheet_Change(ByVal Target As Range)


Dim i As String

i = Range("AA22")


'//Dölj alla blad som du vill påverka.
Sheets("Uppgifter VTR (MRED)").Visible = False
Sheets("Uppgifter VTR (TGV)").Visible = False
Sheets("Uppgifter VTR (TR)").Visible = False
Sheets("Uppgifter VTR (SLÄP)").Visible = False
Sheets("Uppgifter VTR (LB)").Visible = False
Sheets("Uppgifter VTR (Mobilkr)").Visible = False

'//Visa bladet som du valde i AA22.
Sheets(i).Visible = True
       

End Sub

 

Det som nu är lite irriterande är att när man fyller i data i andra celler i huvudbladet så "blinkar allt till", precis som att

koden körs igen. Finns det någon/några kodsträngar som man kan lägga till så att när data läggs till i "de andra" cellerna så

kommer inte hela koden att köras.

 

Dem cellerna som kan ändras som styr vilket blad som skall visas är "E7" samt "Q10". Utifrån värdena i dessa  2 celler så

kommer via några OM-satser att slutresultatet redovisas i cell "AA22" som styr vilket blad som skall vara synligt.

 

När jag prövade den ursprungliga koden i den här tråden så vill inget fungera, antagligen för att vad jag tror så kommer man inte förbi de första raderna

Länk till inlägg
Dela på andra webbplatser

Äntligen efter mycket letande så lyckades jag till sist att få allt att fungera.

Kanske inte den finaste koden men den gör sitt jobb.

 

Citat

Private Sub Worksheet_Change(ByVal Target As Range)

Dim KeyCells As Range
Dim i As String

Set KeyCells = Range("E7", "Q10")

If Not Application.Intersect(KeyCells, Range(Target.Address)) _
      Is Nothing Then

i = Range("AA22")



Sheets("Uppgifter VTR (MRED)").Visible = False
Sheets("Uppgifter VTR (TGV)").Visible = False
Sheets("Uppgifter VTR (TR)").Visible = False
Sheets("Uppgifter VTR (SLÄP)").Visible = False
Sheets("Uppgifter VTR (LB)").Visible = False
Sheets("Uppgifter VTR (Mobilkr)").Visible = False


Sheets(i).Visible = True
       
End If
End Sub
 

 

Länk till inlägg
Dela på andra webbplatser

Två små saker.

Vill att det inte ska blinka lägga in

Application.ScreenUpdating = False

i början av koden. Sedan är det fint att återställa den efter även om Excel automatiskt gör det med just denna:

Application.ScreenUpdating = True

 

Nästa sak är att Worksheets("ett namn") fungerar bra men det är lite säkrare att använda VBA-namnet som enbart kan ändras i VBA-editorn och inte påverkas av om namnet på bladet, som användaren ser, ändras.

bild.png.31ee157767ae54298d393f62a881b1b5.png

Länk till inlägg
Dela på andra webbplatser
  • 2 weeks later...

Tack för hjälpen med detta.

 

Ett annat problem som jag har upptäckt nu är att cellen (AA22) som styr vilket blad som skall visas, den cellen räknar ut rätt värde utifrån värden från två olika celler. Om en av dessa celler är tom eller om kombinationen från båda cellerna inte är korrekta så blir ju värdet i slutcellen felaktigt. När detta händer så får jag upp ett felmeddelande om att 

"Körfel nr 9.: Indexet är utanför intervall".

 

Jag har en till cell (AA17) som kontrollerar värdet i cell AA22 som visar SANT när slutvärdet är något av dem godkända värdena och FALSKT i alla andra fall. Går det att lägga in någon kod att cell AA17 måste också visa SANT för att makrot skall köras? Eller finns det någon bättre ide för att slippa få det här felmeddelandet? 

 

Länk till inlägg
Dela på andra webbplatser

Jag skulle helt enkelt vända på ditt villkor. istället för "kör koden om en av mina celler är vald"

If Not Application.Intersect(KeyCells, Range(Target.Address)) _
      Is Nothing Then

 

Till "hoppa ur koden om en av mina celler inte är vald"

If Application.Intersect(KeyCells, Range(Target.Address))  is Nothing Then exit sub

 

Då kan du lätt fylla på med nya villkor, t.ex en rad som kollar om AA22 är sann

If Application.Intersect(KeyCells, Range(Target.Address))  is Nothing Then exit sub
If  Range("AA22"). value <> True Then exit sub

 

(om man gör klart en "IF" på en rad så behövs ingen "End if")

Jag tycker i alla falla att det är smidigt att avluta makrot så fort ett villkor inte är uppfyllt

Länk till inlägg
Dela på andra webbplatser

Tack, nu kommer inte felmeddelandet längre.

 

En annan kort fråga bara. Nu plockar makrot fram rätt blad och så men just när ett specifikt blad plockas fram

så försvinner alla kryssrutor och bilder som ligger på bladet som makrot körs på. Om jag går in på ett annat blad och sen tillbaka till huvudbladet så är allt tillbaka igen. Detta händer bara vid ett specifikt blad, alla andra bladen som plockas fram så händer inte detta. Har du någon aning om vad detta kan bero på och om det går att rätta till?

Länk till inlägg
Dela på andra webbplatser

ingen aning. 

Jag har inte testat. men kolla om det går att lägga in det här sist i koden:

me.repaint

Ingenting man brukar behöva bry sig om i VBA. Och det är nog avsett för formulär. Men du kan väl testa 

Länk till inlägg
Dela på andra webbplatser

Nej. Nu testade jag. Repaint finns inte för kalkylblad. Du får göra som monshi föreslog tidigare i tråden och köra:

Application.ScreenUpdating = True

i slutet av koden. Det är nog det närmaste en repaint du kan komma

Länk till inlägg
Dela på andra webbplatser

Den sista raden är inte helt nödvändig då Excel återställer den när VBA slutar köra men den skadar inte att ha där, att ha vanan att skriva tillbaka status.

Om man gör samma med beräkningsinstruktionerna så återställs inte de exempelvis.

 

Länk till inlägg
Dela på andra webbplatser

Jag har med Application.ScreenUpdating = True i slutet av koden.

 

Det som är konstigt är att 5 av 6 blad så händer inte det här. 

Det är bara vid det sjätte bladet som det här problemet uppstår.

Länk till inlägg
Dela på andra webbplatser

Kanske, då menar jag kanske, om du fyrar av en omräkning av bladet i slutet av koden, efter screenupdating = true

worksheet.calculate

Kanske?

eller gör en snabb select av annat blad och tillbaka igen. Känns som en bugg, att excel inte renderar om vyn korrekt.

Länk till inlägg
Dela på andra webbplatser
  • 1 month later...

Jag lade till så att koden byter blad och sen tillbaka till rätt blad igen så nu funkar förhoppningsvis allting.

 

Tack för all hjälp.

Länk till inlägg
Dela på andra webbplatser

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Skapa ett nytt konto på vårt forum. Det är lätt!

Registrera ett nytt konto

Logga in

Redan medlem? Logga in här.

Logga in nu


×
×
  • Skapa nytt...