01. oktober 2006 - 13:23Der er
49 kommentarer og 1 løsning
Teste om linie er skjult
Hej
Kan man lave en makro som tester på en værdi i kolonne M.
Hvis der står 1 på en given linie i kolonne M og linien er skjult skal den skrive en fejlmedelelse i f.eks. i felt A1 (Du har skjult en linie med 1). Hvis der står 0 og linien er vist skal den skrive en fejlmeddelelse (du viser en linie med 0)
Den skal teste hele kolonne M sålænge der står talværdier dernedaf. Der står enten 1 eller 0
Helt optimalt vil det være, hvis den pågældende makro udføres automatisk hver gang man går ind og ud af et ark (hvis det altså ikke sløver hele projektmappen væsentligt).
Ideen er nemlig at der er flere ark denne makro skal udføres på og hele tiden opdateres så der hele tiden står en meddelelse i eks. a1 når der er fejl og meddelelsen forsvinder når der ikke er fejl mere
Dim I As Long, Slut As Long, Z As Long, SlutFind SlutFind = Range("M1:M65536") For Z = 1 To 65536 If SlutFind(65536 - Z, 1) <> "" Then Slut = 65536 - Z Exit For End If Next For I = 1 To Slut + 1 If Range("M" & I).Value = 1 And Range("M" & I).RowHeight = 0 Then MsgBox "Du har skjult en linie med 1 - " & I End If If Range("M" & I).Value = "0" And Range("M" & I).RowHeight <> 0 Then MsgBox "du viser en linie med 0 - " & I End If Next
Du skal putte koden i modulet for arket. Hvis det .fesk skal virke for ark 1, dobbeltklikker du på Ark1(Ark1) i VBA editoren og putter koden ind i WorkSheelt_Change:
Private Sub Worksheet_Change(ByVal Target As Range) Dim I As Long, Slut As Long, Z As Long, SlutFind SlutFind = Range("M1:M65536") For Z = 1 To 65536 If SlutFind(65536 - Z, 1) <> "" Then Slut = 65536 - Z Exit For End If Next For I = 1 To Slut + 1 If Range("M" & I).Value = 1 And Range("M" & I).RowHeight = 0 Then MsgBox "Du har skjult en linie med 1 - " & I End If If Range("M" & I).Value = "0" And Range("M" & I).RowHeight <> 0 Then MsgBox "du viser en linie med 0 - " & I End If Next End Sub
Private Sub Worksheet_Change(ByVal Target As Range) Dim I As Long, Slut As Long, Z As Long, SlutFind SlutFind = Range("M1:M65536") For Z = 1 To 65536 If SlutFind(65536 - Z, 1) <> "" Then Slut = 65536 - Z Exit For End If Next For I = 1 To Slut + 1 If Range("M" & I).Value = 1 And Range("M" & I).RowHeight = 0 Then Fejlbesked = Fejlbesked & "1-fejl" & I & ", " End If If Range("M" & I).Value = "0" And Range("M" & I).RowHeight <> 0 Then Fejlbesked = Fejlbesked & "0-fejl" & I & ", " End If Next Sheets("Ark2").Range("C1").Value = Fejlbesked End Sub
Sub CheckForFejl() Application.EnableEvents = False Nr = 0 For Each ws In Worksheets Nr = Nr + 1 If ActiveSheet.Name = ws.Name Then Ok = Nr End If Next Dim I As Long, Slut As Long, Z As Long, SlutFind SlutFind = Range("M1:M65536") For Z = 1 To 65536 If SlutFind(65536 - Z, 1) <> "" Then Slut = 65536 - Z Exit For End If Next For I = 1 To Slut + 1 If Range("M" & I).Value = 1 And Range("M" & I).RowHeight = 0 Then Fejlbesked = Fejlbesked & "1-fejl " & I & ", " End If If Range("M" & I).Value = "0" And Range("M" & I).RowHeight <> 0 Then Fejlbesked = Fejlbesked & "0-fejl " & I & ", " End If Next Sheets("Forside").Range("C" & Ok).Value = Fejlbesked v = v + 1 Application.EnableEvents = True End Sub
og denne i hvert arkmodul: Private Sub Worksheet_Change(ByVal Target As Range) CheckForFejl End Sub
Jeg har oprettet et module1 og lagt din første kode der..
Jeg har lagt din anden kode i et af arkene i dens "worksheet-modul"
Lige nu står der skiftevis 0 og 1 i kolonne M da jeg ikke har skjult "nul-linierne" endnu. Dette burde jo skrive en fejl om at nul linier ikke er skjult på forsiden...
Jeg kan godt se din ide med makroen. Men ideelt vil være at den hele tiden tester på den ark jeg ønsker i baggrunden og så skriver på forsiden om der er en fejl.
Der behøver ikke stå på hvilke linier fejlen er, det vigtigste er at man kan se hvilket ark der er fejl på.
Eks. Der er nul-linier vist på arket "Noter" eller "Der er skjult 1-linier på arket "Noter"
Fejlen: Ret 65536 til 65537 For at afvikle en kode er du nødt til at have en handling. Det kan være WorkSheet_Change, WorkSheet_Activate o.s.v. Du kan ikke have en kode til at køre konstant!!
Sub CheckForFejl() Application.EnableEvents = False Nr = 0 For Each ws In Worksheets Nr = Nr + 1 If ActiveSheet.Name = ws.Name Then Ok = Nr Fejlbesked = ws.Name & ": " End If Next Dim I As Long, Slut As Long, Z As Long, SlutFind SlutFind = Range("M1:M65536") For Z = 1 To 65536 If SlutFind(65537 - Z, 1) <> "" Then Slut = 65536 - Z Exit For End If Next For I = 1 To Slut + 1 If Range("M" & I).Value = 1 And Range("M" & I).RowHeight = 0 Then Fejlbesked = Fejlbesked & "1-fejl " & I & ", " End If If Range("M" & I).Value = "0" And Range("M" & I).RowHeight <> 0 Then Fejlbesked = Fejlbesked & "0-fejl " & I & ", " End If Next Sheets("Forside").Range("C" & Ok).Value = Fejlbesked v = v + 1 Application.EnableEvents = True End Sub
i celle F3 (jeg har ændret kolonnen til F) = Fors.: i celle F5 = Fors. i celle F9 = Prak.: nul linier....osv (dette ark har jeg slet ikke puttet koden i ?) i celle F10 = Res.: nul-linier....osv (her er alle nul-linier vist og den skriver stadig fejlmeddelelsen i celle F11 = Akt.: nul-linier.....osv (det samme som ovenstående)
Jeg synes heller ikke at der er nogen logik i hvornår den opdaterer beskeden på forsiden ???
Jeg har ca. 10 ark hvor der står enten 0 eller 1 i kolonne M.
0 betyder skjul 1 betyder vis
Jeg har en makro/knap som automatisk gennemsøger kolonne M og skjuler rækken hvis der står 0 i M og en makro der igen kan vise alle rækker.
Der kan være flere antal rækker i de enkelte ark men ca. max. 100 rækker, derefter står der ikke mere o eller 1 i kolonne M
Jeg vil gerne have funktionen, at når jeg trykker mig væk fra ark (handlingen du snakkede om) "Res." f.eks. så aktiveres en makro som tjekker om en række med 1 i kolonne M er blevet skjult (manuelt) eller om en række med 0 vises (manuelt)
Hvis dette er tilfældet skal der i et andet ark f.eks. "Fors." skrives en fejlmeddelelse i celle f.eks. F5 (Du har skjult en linie med 1 i arket "Res." eller du har vist en linie med 0 i arket "Res."
Således står der hele tiden på forsiden hvis der er lavet en manuel handling på et af de andre ark
Det vil jeg heller ikke. Jeg ved bare ikke hvordan man kan gøre det.
Pointen er at UDEN jeg skal trykke på en knap eller lignende skal der hele tiden undersøges på de pågældende ark om der er fejl. Disse fejl skrives på forsiden.
Dvs. når jeg er klar til at udskrive, så kan jeg se på forsiden om der er nogle fejl.
Alle ark bliver som det sidste inden undskrivning tilrettet således at nullinier bliver skjult, men hvis man "glemmer" dette skal fejlen stå på forsiden så man opdager det...
Jeg synes bare at denne handling som du siger skal være der kunne være ved at gå ind/ud af arket, men det kan være du kender en bedre ?
Private Sub Worksheet_Deactivate() Application.EnableEvents = False Nr = 0 For Each ws In Worksheets Nr = Nr + 1 If ActiveSheet.Name = "Led.ber." Then Ok = Nr End If Next Dim I As Long, Slut As Long, Z As Long, SlutFind SlutFind = Range("M1:M65536") For Z = 1 To 65536 If SlutFind(65537 - Z, 1) <> "" Then Slut = 65536 - Z Exit For End If Next For I = 1 To Slut + 1 If Range("M" & I).Value = 1 And Range("M" & I).RowHeight = 0 Then Fejlbesked1 = "1-fejl" Else Fejlbesked1 = "OK"
End If If Range("M" & I).Value = "0" And Range("M" & I).RowHeight <> 0 Then Fejlbesked2 = "0-fejl " Else Fejlbesked2 = "OK"
End If Next Sheets("Fors.").Range("O9").Value = Fejlbesked1 Sheets("Fors.").Range("P9").Value = Fejlbesked2 v = v + 1 Application.EnableEvents = True End Sub
Men to ting fungerer ikke:
1. Den ændrer ikke værdien i celle O9 hvis fejlbesked1 er = OK og bliver til fejl (det gør den for fejlbesked2 2. Jeg vil gerne have at den skriver hvor man linier der er fejl på (f.eks. "10 fejl")
Worksheet_Deactivate bruger du i selve arket: Ark1, Ark2 o.s.v. Derfor er det ikke nødvendigt at bruge
For Each ws In Worksheets Nr = Nr + 1 If ActiveSheet.Name = "Led.ber." Then Ok = Nr End If Next
Det giver sig selv. Koden vil alligevel kun køre i det ark hvor du har puttet koden.
Derudover skal du være opmærksom på at RowHeigh = 0 ikke er det samme som at rækken er skjult. Sagt på en anden måde: er en række skjult har den stadig sin højde. I stedet skal du bruge: Selection.EntireRow.Hidden = True
En tredie ting: Din "For"-lykke fortsætter jo! Så hvis den sidste række med check er ok, bliver der ikke sat en fejl.
Private Sub Worksheet_Deactivate() Dim Fejl0 As Boolean, Fejl1 As Boolean 'ny Fejl0 = False 'ny Fejl1 = False 'ny Application.EnableEvents = False Nr = 0 For Each ws In Worksheets Nr = Nr + 1 If ActiveSheet.Name = "Led.ber." Then Ok = Nr End If Next Dim I As Long, Slut As Long, Z As Long, SlutFind SlutFind = Range("M1:M65536") For Z = 1 To 65536 If SlutFind(65537 - Z, 1) <> "" Then Slut = 65536 - Z Exit For End If Next For I = 1 To Slut + 1 If Range("M" & I).Value = 1 And Range("M" & I).EntireRow.Hidden = True Then AntalFejl1 = AntalFejl1 + 1 Fejl1 = True 'Fejlbesked1 = "1-fejl" End If
If Range("M" & I).Value = "0" And Range("M" & I).RowHeight <> 0 Then AntalFejl0 = AntalFejl0 + 1 'Fejlbesked2 = "0-fejl " Fejl0 = True End If Next
If Fejl1 = False Then 'ny Fejlbesked1 = "OK" Else Fejlbesked1 = "Der er " & AntalFejl1 & " stk. 1-fejl" End If
If Fejl0 = False Then 'ny Fejlbesked2 = "OK" Else Fejlbesked2 = "Der er " & AntalFejl0 & " stk. 0-fejl" End If
Sheets("Fors.").Range("O9").Value = Fejlbesked1 Sheets("Fors.").Range("P9").Value = Fejlbesked2 v = v + 1 Application.EnableEvents = True End Sub
Du kan evt sætte AntalFejl0 og AntalFejl1 til 0 i starten, men det burde ingen indflydelse have når variablerne ikke er globale. Gælder det både for fejl o & 1?
Det er vigtigt at vise dem fordi der er så mange brugere som bruger det regneark jeg har lavet. Der skal være så mange kontroller på arket som overhovedet muligt.
De fleste 0 og 1 fremkommer via formler. Nogle bliver sat manuelt.
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.