Avatar billede dego Novice
16. november 2010 - 00:11 Der er 16 kommentarer og
1 løsning

Kode fejler i beskyttet regneark

Hvordan kan jeg få denne kode til at ignorere hvis der højreklikkes i tomme beskyttede celler?

Som det er nu får man en "runtime error 1004", hvis cellen er tom og beskyttet og andre lignende fejl, afhængig af hvor man højreklikker.

Kan man tilføje "en smart" linie i koden så man undgår fejlmeddelser og måske i stedet får en dialogboks op?
Eller måske lave en "hvis fejl Then End Sub", så man undgår at brugeren kommer ind og sletter koden?

Det undrer mig i øvrigt at man kan komme direkte ind i koden når regnearket er beskyttet, men sådan skal det nok være.

End Sub
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    With Target
        Cancel = True
      If .Value = "0" Then
            .Value = "1"
                End If
    End With
End Sub
Avatar billede dego Novice
16. november 2010 - 00:13 #1
If.Value = "" Then
skulle der have stået.
Avatar billede supertekst Ekspert
16. november 2010 - 09:41 #2
Kunne dette være en løsning:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    With Target
        Cancel = True
        If .Value = "" Then
            Exit Sub
        End If
    End With
End Sub
Avatar billede dego Novice
16. november 2010 - 16:24 #3
Tak for svaret.

Jeg har indsat din kode + Else .Value = 1, men den virker ikke da den går i stå hvis cellen er tom.
Jeg vil gerne have sat et 1-tal i cellen, men kun hvis cellen både er tom og ikke beskyttet.

Jeg forestiller mig noget i stil med at, hvis cellen er udfyldt i forvejen, eller cellen er beskyttet, eller hvis der er markeret mere end én celle, skal koden afsluttes uden handling og hvis det skal være rigtig fint, give en msgbox om at man er ved at udføre en handling der ikke er tilladt.

Sådan ser den ud nu hvor den går i stå:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    With Target
        Cancel = True
        If .Value = "" Then
            Exit Sub
            Else: .Value = 1
        End If
    End With
End Sub
Avatar billede kabbak Professor
16. november 2010 - 16:49 #4
du tjekker om den er tom med

  If IsEmpty(Target) Then
Avatar billede kabbak Professor
16. november 2010 - 16:54 #5
denne virker vist også

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    With Target
        If .Value = "" Then
            .Value = 1
            Cancel = True
        End If
    End With
End Sub
Avatar billede dego Novice
16. november 2010 - 18:00 #6
De virker begge 2, men hvis cellen er beskyttet og man forsøger at indsætte 1-tallet får jeg - udover excels "egen" indbyggede fejlmeddelelse om at man ikke kan skrive i et beskyttet regneark - stadig den uønskede runtime error.
Avatar billede anlu Nybegynder
16. november 2010 - 18:08 #7
Ja, for du kan jo ikke skrive i en beskyttet ark (medmindre cellen ikke er låst), så du skal først unprotecte, så protecte, fx:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Worksheets(<sheetnavn>).Unprotect [<evt password>]
    With Target
        If .Value = "" Then
            .Value = 1
            Cancel = True
        End If
    End With
    Worksheets(<sheetnavn>).Protect [evt. password & parametre]
End Sub
Avatar billede anlu Nybegynder
16. november 2010 - 18:16 #8
Undskyld, jeg havde ikke læst fra toppen og set hvad du egentlig ville.

Du kan bruge Target.Locked for at tjekke om den specifikke celle er låst.
Avatar billede dego Novice
16. november 2010 - 18:54 #9
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    With Target
        If Target.Locked = False And .Value = "" Then
.Value = 1
        End If
    End With
End Sub

Virker tilsyneladende, bortset fra der kommer en "højreklikmenu" op efter 1-tallet er blevet indsat.

Jeg er nødt til at køre en times tid, men kigger på det umiddelbart efter, jeg tror det nærmer sig en løsning!
Avatar billede anlu Nybegynder
16. november 2010 - 19:07 #10
Hvis du vil undgå højreklik-menuen skal du sætte Cancel = true som du havde i nogle af de første forsøg.
Avatar billede dego Novice
16. november 2010 - 19:48 #11
Ja, Cancel = True fjerner højreklik menuen som du skriver.

Desværre får jeg stadig runtime error hvis jeg højreklikker under følgende omstændigheder:

Ved markering af mere end 1 celle
Ved markering af en række eller en kolonne
Ved markering af en beskyttet og samtidig flettet celle

Ved markering og højreklik i beskyttede celler, både tomme og udfyldte, får jeg ingen fejlmeddelelser, så denne del virker nu!
Avatar billede anlu Nybegynder
16. november 2010 - 20:00 #12
Hvis target refererer til mere end 1 celle kan du ikke kalde target.value, så må du løbe alle cellerne igennem. Koden vil selvfølgelig afhænge af hvilken opførsel du ønsker hvis der er valgt flere celler.
Avatar billede dego Novice
16. november 2010 - 20:27 #13
De 3 fejlsituationer jeg nævnte i forrige kommentar har umiddelbart det tilfælles at de alle markerer flere celler og jeg skal jo så på en eller anden måde have koden til at stoppe når den betingelse er opfyldt.

Sagt på en anden måde, hvis cellen er tom og ulåst skal den udfyldes, i alle andre tænkelige og utænkelige situationer skal koden ikke foretage nogen handling overhovedet.
Avatar billede dego Novice
16. november 2010 - 20:48 #14
Denne virker som den skal, undtagen hvis man markerer en kolonne eller en række hvor der både er beskyttede og ubeskyttede celler.

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    With Target
        Cancel = True
        If Target.Locked = True Then
        Exit Sub
        End If
        If .Value = "" Then
        .Value = 1
        Else
        Exit Sub
        End If
    End With
End Sub
Avatar billede anlu Nybegynder
16. november 2010 - 21:04 #15
Hvis den ikke skal gøre noget ved markering af flere celler, så kan du checke på target.cells.count:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    With Target
        Cancel = True
        If .Cells.Count = 1 Then
            If .Locked And .Value = "" Then
                .Value = 1
            End If
        End If
    End With
End Sub
Avatar billede dego Novice
16. november 2010 - 21:35 #16
Jeg ændrede If .Locked And .... til If Not .Locked And ..... og alt ser ud til at fungere nu uden fejlmeddelelser.

anlu, det er super!
Send mig et svar og du får dine velfortjente point.
Tak for indsatsen.
Avatar billede anlu Nybegynder
16. november 2010 - 21:43 #17
Nå ja der var lige kommet rod i logikken... men godt du selv lige fik den fikset - og at du endelig fik det hele til at spille :o)
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