16. november 2010 - 00:11Der 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
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
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
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
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
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.
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
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!
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.
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.
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
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
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)
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.