Jeg har et Ark1 hvor jeg indtaster data, som behandles af Ark2. På Ark2 har jeg en del rækker som skal være synlige hvis der er data i nogle celler i Ark1. Jeg har lavet en "markør" i kolonne A på Ark2 som tildeler hver række en værdi ud fra data på Ark1. Hvis værdien i celle i kolonne A på Ark2 er 0 skal rækken vises. Hvis værdien er -1 skal rækken skjules. Der er ca 200 rækker der skal løbes igennem.
Ark2 er et inaktivt ark, hvor der ikke tastes data, men arkets udseende skifter karakter alt efter hvilke data der står i Ark1, og når disse data redigeres, skulle Ark2 gerne "efterses" for hvilke linjer der skal skjules/vises.
Kan nogen hjælpe mig med hvordan VBA koden skal være, og hvilket faneblad koden skal ligge på. (Denne_projektmappe, Ark1 eller Ark2?
Det har ikke noget med VBA at gøre. Du skriver formelen i den celle, hvor du vil have informationen. Formelen udfylder automatisk celler til højre og nedefter i nødvendigt omfang
Jeg forstår desværre ikke hvordan jeg bruger denne formel.
Jeg har gjort som følger: I alle rækker i kolonne A på Ark2, er der indtastet en formel, som undersøger hvilke data der er på Ark1. Eksempel: =HVIS('Ark1'!T2>0;0;-1) Dermed får jeg celler som enten har værdien 0 eller -1.
Jeg kan godt se ideen i at bruge filter. Jeg har oprettet en makro som udfører dette, og det virker. men jeg vil godt have det til at virke uden at skulle aktivere makroen hver gang.
Makroen ser sådan ud:
Sub Makro1() ' ' Makro1 Makro
' Sheets("Ark2").Select Columns("A1:A200").Select Selection.AutoFilter ActiveSheet.Range("$A$1:$A$200").AutoFilter Field:=1, Criteria1:="0" End Sub
Du er en tålmodig mand. Tak fordi du tager dig tid til en nybegynder.
Hmmm...... Jeg kan godt se hvad du mener. Jeg skal lige fintænke lidt over hvordan jeg kan bruge denne feature. :-)
Det er jo på Ark2 jeg undersøger om den linje jeg står på, skal have væredien 0 eller-1, alt efter de værdier der er indtastet i Ark1. Flere rækker på Ark2 bruger de samme værdier fra Ark1, og nogle gange flere værdier for at validere om den pågældende række på Ark2 skal vises. De ca 200 rækker på Ark2 validerer data fra ca 30 celler på Ark1.
Jeg tror jeg kan få det til at virke, men det kræver dog at jeg re designer hele mit Ark2, da denne formel åbenbart ikke har det godt med flettede celler. Sådan som jeg ser det, skal jeg beholde mit Ark2, og så oprette et Ark3 hvor jeg bruger denne formel til at hente data fra Ark2, såfremt at Ark2 har sat en markør for udskrift. Er dette løsningen, eller er der en smutvej?
Det virkede ellers elegant med denne filtrering, men jeg mister desværre meget af den formatering som får udskriften til at se anstændig ud. Er der ikke en løsning hvor jeg kan skjule linjerne i Ark2??
OK, så er det måske alligevel bedre at lave det i VBA. Højrklik på Ark2 fanebladet og indsæt disse to små makroer under Vis Koder. Indsæt i arket 2 knapper og link den ene til SkjulLinjer, og den anden til VisLinjer
Sub SkjulLinjer() For x = 1 To 200 If Cells(x, 1) = -1 Then Cells(x, 1).EntireRow.Hidden = True Else Cells(x, 1).EntireRow.Hidden = False End If Next End Sub
Sub VisLinjer() Range("A1:A200").EntireRow.Hidden = False End Sub
Tak for hjælpen. Det virker med de to knapper, selv om gennemløbstiden for makroen er forholdsvis lang. Jeg har en løsning der virker, men jeg arbejder nok lidt videre med filtrer formlen, da den er langt mere elegant. Så må jeg se om jeg kan få outputtet lidt mere elegant også.
jeg tænkte på om man kan programmere filterfunktionen i VBA?
Det er stadig i forlængelse af ovennævnte, men for ikke at blande tingene sammen, spørger jeg mere direkte: Kan man programmere sig ud af at når en celle i kolonne K ændres, ikke ved fysisk indtasstning, men på baggrund af en =Hvis(xxx;xxx;xxx), så aktiveres filteret i kolonne K?
Jeg syntes at foreslåede makroer tager ret lan tid om at gennemløbes,(8-10 sek) , og det er jo ikke brugervenligt i vore dage. Filterfunktionen virker jo uden ventetid.
For at "skrue" lidt ned for kodens gennemløbs tid, kan der justeres en anelse i Dan's løsning i #10.
Sub SkjulLinjer() Application.ScreenUpdating = False Dim x As Long Dim LastRow As Long
LastRow = Cells(Rows.Count, 1).End(xlUp).Row For x = 1 To LastRow Cells(x, 1).EntireRow.Hidden = (Cells(x, 1).Value = -1) Next Application.ScreenUpdating = True End Sub
Jeg lagde hele dit spørgsmål ind i Grok.com (AI), og fik dette 😉 Jeg kan hjælpe dig med at lave en VBA-kode, der automatisk skjuler eller viser rækker på Ark2 baseret på værdierne i kolonne A, når data ændres i Ark1. Her er en løsning:
Hvor skal koden ligge? Koden skal placeres i Ark1's kode-modul (ikke "Denne_projektmappe" eller Ark2), fordi du vil have, at den kører, når der sker ændringer i Ark1. Dette gøres ved at bruge Worksheet_Change -begivenheden, som automatisk udløses, når data i Ark1 redigeres.
Logik Når en celle i Ark1 ændres, tjekker vi, om ændringen påvirker "markørerne" i kolonne A på Ark2. Derefter løber vi gennem de 200 rækker på Ark2 og skjuler eller viser dem baseret på værdien i kolonne A (0 = vis, -1 = skjul). VBA-kode Hendes er koden:
vba
Bryde sammen
Indpakning
Kopi Private Sub Worksheet_Change(ByVal Target As Range) ' Slå beregninger og skærmopdatering fra for at gøre koden hurtigere Application.Calculation = xlCalculationManual Application.ScreenUpdating = False
' Definer variabler Dim ws2 As Worksheet Dim i As Long Dim lastRow As Long
' Sæt reference til Ark2 Set ws2 = ThisWorkbook.Sheets("Ark2")
' Antag at vi tjekker rækker fra 2 til 201 (200 rækker i alt) lastRow = 201
' Løb gennem rækkerne i Ark2 For i = 2 To lastRow If ws2.Cells(i, 1).Value = 0 Then ws2.Rows(i).Hidden = False ' Vis rækken ElseIf ws2.Cells(i, 1).Value = -1 Then ws2.Rows(i).Hidden = True ' Skjul rækken End If Next i
' Genaktiver beregninger og skærmopdatering Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub Sådan installerer du koden Åbn din projektmappe i Excel. Tryk på Alt + F11 for at åbne VBA-editoren. I venstre rude (Project Explorer) finder du "Ark1" under "Microsoft Excel-objekter". Dobbeltklik på "Ark1" for at åbne dets kode-modul. Kopier og indsæt ovenstående kode i vinduet. Luk VBA-editoren ( Alt + Q ). Tilpasninger Rækkeinterval : Koden antager, at dine 200 rækker starter fra række 2 og går til række 201 på Ark2. Hvis det er et andet interval (fx række 5 til 204), skal du ændre For i = 2 To lastRow til fx For i = 5 To 204 . Afhængighed af Ark1 : Hvis "markørerne" i Ark2 kun opdateres, når specifikke celler i Ark1 ændres (fx et bestemt område som A1:B50), kan du tilføje en betingelse for at begrænse, hvornår koden kører. Eksempel: vba
Bryde sammen
Indpakning
Kopi Private Sub Worksheet_Change(ByVal Target As Range) ' Tjek om ændringen sker i et bestemt område, fx A1:B50 If Not Intersect(Target, Me.Range("A1:B50")) Is Nothing Then Application.Calculation = xlCalculationManual Application.ScreenUpdating = False
Dim ws2 As Worksheet Dim i As Long Dim lastRow As Long
Set ws2 = ThisWorkbook.Sheets("Ark2") lastRow = 201
For i = 2 To lastRow If ws2.Cells(i, 1).Value = 0 Then ws2.Rows(i).Hidden = False ElseIf ws2.Cells(i, 1).Value = -1 Then ws2.Rows(i).Hidden = True End If Next i
Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End If End Sub Ark-navne : Sørg for, at arknavnet i koden ( "Ark2" ) matcher det faktiske navn på dit ark. Hvis det hedder noget andet (fx "Sheet2"), skal du ændre det i ThisWorkbook.Sheets("Ark2") . Hvordan virker det? Når du ændrer noget i Ark1, udløser Worksheet_Change koden. Koden tjekker hver række i kolonne A på Ark2 og skjuler eller viser rækken baseret på værdien (0 eller -1). Application.ScreenUpdating = False og Calculation = xlCalculationManual gør det hurtigere, især med 200 rækker. Bemærkninger Hvis "markørerne" i Ark2 beregnes med formler baseret på Ark1, skal du sikre dig, at disse formler opdateres korrekt, inden koden kører. Ovenstående kode antager, at markørerne allerede er opdateret. Gem projektmappen som en makroaktiveret fil ( .xlsm ), så koden kan køre.
Obs. der skal være en værdi/overskrift i celle A1 på ark2
koden aktiveres hver gang du åbner/vælger Ark2
Synes godt om
Ny brugerNybegynder
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.