Avatar billede mira96ac Novice
01. oktober 2006 - 13:23 Der 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
Avatar billede mira96ac Novice
01. oktober 2006 - 13:36 #1
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
Avatar billede gider_ikke_mere Nybegynder
01. oktober 2006 - 17:48 #2
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
Avatar billede mira96ac Novice
08. oktober 2006 - 10:39 #3
Hej

Hvor skal koden placeres for at den hele tiden tester hver side i baggrunden...

Så skal den ikke lave en messageboks med fejlmeddelelsen. Hvis der er fejl skal teksten barre skrives i f.eks. celle C2 på arket "Forside"...
Avatar billede gider_ikke_mere Nybegynder
08. oktober 2006 - 11:08 #4
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
Avatar billede gider_ikke_mere Nybegynder
08. oktober 2006 - 11:12 #5
Og til dit andet spm: Sheets("Forside").Range("C1").Value = "du viser en linie med 0 - " & I

Denne metode overskrives hvis der er flere. Du må overveje hvordan du vil have det lavet. Skal alle fejl stå i C2?
Avatar billede gider_ikke_mere Nybegynder
08. oktober 2006 - 11:16 #6
Du kunne lave det således:

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
Avatar billede mira96ac Novice
08. oktober 2006 - 11:19 #7
Min mening var at var fejlen på ark 2, så skrev den fejlmeddelesen i C2 på forsiden
og var fejlen i ark 3 skriver den fejlmeddelelsen i c3 osv.

Jeg kan ikke få det til at virke. Den skriver ikke noget på forsiden.
Avatar billede gider_ikke_mere Nybegynder
08. oktober 2006 - 11:21 #8
Det var en anden sag. Et øjeblik..
Avatar billede gider_ikke_mere Nybegynder
08. oktober 2006 - 11:46 #9
Put denne i f.eks Module1:

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
Avatar billede mira96ac Novice
08. oktober 2006 - 11:56 #10
Den skriver stadig intet på forsiden.

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...
Avatar billede mira96ac Novice
08. oktober 2006 - 11:58 #11
Nu kan jeg se lidt af hvor jeg går galt i byen.

Jeg troede at makroen kørte af sig selv i baggrunden hele tiden (nå man f.eks. går ud og ind af arket), men jeg skal jo selv afspille den...

Den skulle gerne køre i baggrunden
Avatar billede mira96ac Novice
08. oktober 2006 - 12:10 #12
Når jeg så til gengæld skjuler alle linier med 0 duer scriptet ikke mere...

Fejl på denne linie :  If SlutFind(65536 - Z, 1) <> "" Then
Avatar billede mira96ac Novice
08. oktober 2006 - 12:13 #13
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"
Avatar billede gider_ikke_mere Nybegynder
08. oktober 2006 - 13:09 #14
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!!
Avatar billede mira96ac Novice
08. oktober 2006 - 13:14 #15
Er det f.eks. en handling hvis det er hver gang man går ind og ud af arket ?
Avatar billede gider_ikke_mere Nybegynder
08. oktober 2006 - 13:34 #16
Åbn, gem, skift ark, ændre ark, der er masser af muligheder.
Avatar billede gider_ikke_mere Nybegynder
08. oktober 2006 - 13:36 #17
Jeg ville bare gøre således:

I hvert ark:

Private Sub Worksheet_Activate()
CheckForFejl
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
CheckForFejl
End Sub

Private Sub Worksheet_Deactivate()
CheckForFejl
End Sub
Avatar billede gider_ikke_mere Nybegynder
08. oktober 2006 - 13:38 #18
For at få arknavn med:

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
Avatar billede mira96ac Novice
08. oktober 2006 - 13:51 #19
Jeg er ked af det... men jeg synes simpelthen ikke at jeg kan få det til at virke

Nogle gange skriver den fejlen på forsiden og andre gange ikke og nogle gange i forskellige felter.

Desuden opdaterer den ikke fejlbeskeden når jeg ændrer på arkene og skriver stadig at der er nullinier skjult selvom jeg ikke har skjult nogle.
Avatar billede gider_ikke_mere Nybegynder
08. oktober 2006 - 13:56 #20
Du skal jo kun putte
Private Sub Worksheet_Activate()
CheckForFejl
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
CheckForFejl
End Sub

Private Sub Worksheet_Deactivate()
CheckForFejl
End Sub

.. i de ark, hvor koden skal køre.
Avatar billede gider_ikke_mere Nybegynder
08. oktober 2006 - 13:57 #21
Hvad mener du med "i foskellige felter"?
Avatar billede mira96ac Novice
08. oktober 2006 - 14:05 #22
Jeg har puttet koden i to ark: "res." og "ark"

På forsiden skriver den:

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 ???
Avatar billede mira96ac Novice
08. oktober 2006 - 14:10 #23
Jeg prøver lige at formulere mig lidt klarere:

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
Avatar billede gider_ikke_mere Nybegynder
08. oktober 2006 - 14:41 #24
Nå, jeg kan se det ikke umiddelbart duer med Worksheet_Deactivate, da den så tager det nye ark der er aktiveret. Du kan evt. sende arket til:

gt4 at racingcar dot dk
Avatar billede mira96ac Novice
08. oktober 2006 - 14:47 #25
Jeg prøver at se om jeg kan finde hjælp andre steder

Ellers tak for assistancen
Avatar billede gider_ikke_mere Nybegynder
08. oktober 2006 - 15:16 #26
Det må du selv om. Jeg kan sagtens løse problemet, men det er svært når du ikke forklarer ordentligt hvad det er du vil.
Avatar billede mira96ac Novice
08. oktober 2006 - 15:58 #27
Jeg vil meget gerne have din hjælp men jeg ved ikke hvordan jeg skal forklare mig bedre end i 14:10:56
Avatar billede gider_ikke_mere Nybegynder
08. oktober 2006 - 16:05 #28
Hvorfor vil du kun have kontrollen, når du forlader arket?
Avatar billede mira96ac Novice
08. oktober 2006 - 17:13 #29
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 ?
Avatar billede gider_ikke_mere Nybegynder
08. oktober 2006 - 17:33 #30
Det gør du nemmest med WorkSheet_Change. Ellers skal du via beforePrint eller på anden måde løbe alle ark igennem.
Avatar billede gider_ikke_mere Nybegynder
14. oktober 2006 - 10:04 #31
Er du kommet videre?
Avatar billede mira96ac Novice
14. oktober 2006 - 11:11 #32
Desværre nej

Har heller ikke haft så meget tid til at kigge på det. Men regner med at lege lidt med det her i efterårsferien.
Avatar billede mira96ac Novice
15. november 2006 - 11:37 #33
Nu har jeg placeret følgende kode i hvert ark:

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")

Er det noget man kan hjælpe med ?
Avatar billede gider_ikke_mere Nybegynder
22. november 2006 - 19:27 #34
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.
Avatar billede gider_ikke_mere Nybegynder
22. november 2006 - 19:40 #35
Noget a la

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
Avatar billede gider_ikke_mere Nybegynder
22. november 2006 - 19:41 #36
... og undskyld den sene respons...
Avatar billede mira96ac Novice
23. november 2006 - 15:46 #37
Det virker fint bortset fra at det ser ud som om den tæller en linie mere end hvad der reelt er fejl i.
Avatar billede gider_ikke_mere Nybegynder
23. november 2006 - 15:53 #38
Hmmm, ikke hos mig...
Avatar billede gider_ikke_mere Nybegynder
23. november 2006 - 15:55 #39
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?
Avatar billede mira96ac Novice
23. november 2006 - 15:57 #40
Det gælder vist ikke for fejl 1 og kun på nogle ark med fejl 0 ??

Det er heller ikke så vigtigt om den tæller helt rigtigt, men nu er det så tæt på at det kunne være dejligt hvis det var helt perfekt.
Avatar billede mira96ac Novice
23. november 2006 - 15:58 #41
Jeg har et ark hvor der kun står 1 taller fra række 1 til 22. Her skriver den alligevel at der er 1 "0-fejl"
Avatar billede mira96ac Novice
23. november 2006 - 16:04 #42
Jeg har to makroer. En der viser alle linier og en der skjuler alle linier med 0 i kolonne M.

Der er når jeg har sagt vis alle linier at den tæller 1 fejl ???

Siger jeg vis alle og derefter skjul alle skriver den OK.

I dette ark er der kun 1.taller i kolonne M...
Avatar billede gider_ikke_mere Nybegynder
23. november 2006 - 16:06 #43
Ingen fejl her! Er du sikker på koden bliver kørt?
Avatar billede mira96ac Novice
23. november 2006 - 16:09 #44
Ja

Det virker perfekt og skriver OK og det hele når den skal
Avatar billede gider_ikke_mere Nybegynder
23. november 2006 - 16:11 #45
Fint.
Avatar billede mira96ac Novice
23. november 2006 - 19:36 #46
Altså det virker perfekt alt andet. Så koden må jo blive kørt.

Der er stadig den føromtalte fejl...desværre
Avatar billede excelent Ekspert
01. december 2006 - 14:49 #47
Er det et must, at disse fejlmeddelelser vises,
jeg mener hvorfor ikke blot rette dem ?
Avatar billede mira96ac Novice
01. december 2006 - 16:29 #48
Det gør ikke noget den fejl er der.

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.
Avatar billede excelent Ekspert
01. december 2006 - 16:40 #49
jo kontrollen kan være nødvendig, men jeg mener hvorfor ikke bare lade
en makro tage sig af det ( teste for skjulte/viste og rette evt.fejl ) ?

hvordan fremkommer dine 1 eller 0 værdier i kolonne M  (en formel) ?
Avatar billede mira96ac Novice
01. december 2006 - 20:05 #50
De fleste 0 og 1 fremkommer via formler. Nogle bliver sat manuelt.
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
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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