03. august 2021 - 13:47Der er
31 kommentarer og 1 løsning
Genskab formel hvis indhold i celle slettes
Hej :)
Jeg har en celle som indeholder en formel. Det er op til bruger, om man manuelt ønsker at indtaste data i cellen med formlem (og dermed "ødelægge" formlen).
Hvis man som bruger gør dette, men så indser at det er en fejl - kan man så få "genskabt" den oprindelige formel i cellen?
Jeg forestiller mig, at formlen genskabes, når man trykker "delete" i cellen.
Ovenstående med antagelse om, at brugerne ikke selv kan finde ud af at "Fortryde" eller trække rundt med formler.
hvis du har formel (den rigtige) i en celle langt væk (fx zz90) og denne celle er formateret med ens baggrund og skrift-farve, så intet ses, så kan du med en 'gendan' makro sætte din faktiske celle til =zz90 Den vil så også virke selvom bruger gemmer ark undervejs. 'Fortryd' kan/bør placeret lige ved den celle, som bruger interagerer med.
store-morten - jeg er usikker på, hvad jeg præcist skal gøre med din kode ovenfor. Har skiftet "B2" til "G32:G2031" og Target.Formula = "=HVIS([@Holdnavn]="";0;INDEKS(Tabel26[Holdtimer i alt];SAMMENLIGN([@Holdnavn]"
Når jeg prøver at afspille den, så beder den mig om at navngive en makro og tilføjer så en horisontal streg og noget kode efter:
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("B2")) Is Nothing Then
If Target.Value = "" Then Target.Formula = "=A1*2" End If
End If End Sub _________________________________________________ Sub test()
Når folk overskriver indholdet i fx G32 og evt. fortryder og trykker DELETE, så skal formlen gendannes i cellen.
Jeg er HELT ny i VBA, men er nået så langt at kunne indsætte data i et Module. Problemet er, at når jeg har kopieret noget kode ind og ønsker at afspille, så beder den mig navngive Makroen og herefter tilføjer den selv ekstra kode - og så er jeg lost :)
Koden skal ligge på det ark hvor cellerne slettes.
Hvis du har en: Private Sub Worksheet_Change(ByVal Target As Range) i forvejen, skal koden ligge i denne, første og sidste linie udelades, da der ikke kan være 2 af dem.
'Private = skjult sub. Worksheet_Change = Hvis der ændres i arket. Private Sub Worksheet_Change(ByVal Target As Range)
'Makro skal kun køres hvis denne/disse celer ændres. If Not Intersect(Target, Range("G32:G2031")) Is Nothing Then
'Hvis den celler der blev ændret er tom If Target.Value = "" Then 'Så indsættes denne formel i cellen Target.Formula = "=HVIS([@Holdnavn]="";0;INDEKS(Tabel26[Holdtimer i alt];SAMMENLIGN([@Holdnavn]" End If
1. Oprettet en kopi, arket hedder "Test" 2. Højreklikker på arket "Test" og går til "Vis programkode" 3. Indsætter koden som skrevet i grå boks 4. Vælger "Afspil" og navngiver min Makro "test"
Når jeg så prøver, manuelt, at skrive i fx G32, så melder den runtime error '1004': Applications-defined or object defined error.
Det skal være en kopi at original arket (Excel filen) Da du bruger Tabeller og navngivet henvisninger.
Og koden skal ligge på det ark/fane hvor den (Funktionen) skal virke. Du skal ikke ændre/tilpasse koden.
"Når jeg så prøver, manuelt, at skrive i fx G32" Hvis du skriver noget i G32 skulle der ikke ske noget. Men: Hvis du sletter det der står i G32 skulle formlen gerne skrives.
1. Oprettet en kopi af mit excel dokument 2. Højreklikker på arket "Hold- og medlemsliste" og går til "Vis programkode" 3. Indsætter koden som skrevet i grå boks 4. Vælger "Afspil" og navngiver min Makro "test"
Dette gør, at der oprettes et "Module1" med koden:
Sub Hejsa()
End Sub
Når jeg f.eks. sletter (delete) G32, så kommer der samme run-time error som ovenfor.
Det er i kopieringen, at den laver en fejl, men selv hvis jeg retter og den står korrekt, melder den samme runtime-error (også, hvis jeg erstatter HVIS med IF, INDEKS med INDEX og SAMMENLIGN med MATCH):
'Private = skjult sub. Worksheet_Change = Hvis der ændres i arket. Private Sub Worksheet_Change(ByVal Target As Range)
'Makro skal kun køres hvis denne/disse celer ændres. If Not Intersect(Target, Range("G32:G2031")) Is Nothing Then
'Hvis den celler der blev ændret er tom If Target.Value = "" Then 'Så indsættes denne formel i cellen Target.Formula = "=HVIS([@Holdnavn]="";0;INDEKS(Tabel2[Holdtimer i alt];SAMMENLIGN([@Holdnavn];Tabel2[Holdnavn];0)))" End If
B6: Holdnavn I6: Holdtimer i alt F31: Holdnavn G31: Aktivitetstimer
1. Man navngiver et hold (B6) 2. Man beregner samlet et antal timer for det pågældende hold (I6) 3. Man tilføjer et hold til en person (F31) 4. Hvis personen registreres på et hold (F31) som er oprettet (B6) hentes det totale antal timer fra dette hold ned på medlemmets aktivitetstimer (G31).
Hvis ikke medlemmet er på et hold, kan man som bruger selv skrive en værdi i G31. Dette sletter den formel, som automatisk linkede personen til holdet.
Det jeg gerne vil, er at man som bruger kan fortryde den manuelle indtastning ved at trykke DELETE i cellen, hvorefter cellen (G31) "nulstilles" og igen bruger formlen:
=HVIS([@Holdnavn]="";0;INDEKS(Tabel2[Holdtimer i alt];SAMMENLIGN([@Holdnavn];Tabel2[Holdnavn];0)))
Åh det er ikke let :) Jeg har vist tidligere sendt dig mit regneark, så det prøver jeg lige igen. Jeg skal snart logge af desværre :(
Du havde jo flere ændringer i arket, pga. din måde at teste på.
Denne virker på dit test ark:
'Private = skjult sub. Worksheet_Change = Hvis der ændres i arket. Private Sub Worksheet_Change(ByVal Target As Range)
'Makro skal kun køres hvis denne/disse celer ændres. If Not Intersect(Target, Range("G32:G2031")) Is Nothing Then
'Hvis den celler der blev ændret er tom If Target.Value = "" Then 'Så indsættes denne formel i cellen Target.FormulaLocal = "=HVIS([@Holdnavn]="""";0;INDEKS(Tabel210[Holdtimer i alt];SAMMENLIGN([@Holdnavn];Tabel210[Holdnavn];0)))" End If
'Private = skjult sub. Worksheet_Change = Hvis der ændres i arket. Private Sub Worksheet_Change(ByVal Target As Range)
'Makro skal kun køres hvis denne/disse celer ændres. If Not Intersect(Target, Range("G32:G2031")) Is Nothing Then
'Hvis den celler der blev ændret er tom If Target.Value = "" Then 'Så indsættes denne formel i cellen Target.FormulaLocal = "=HVIS([@Holdnavn]="""";0;INDEKS(Tabel2[Holdtimer i alt];SAMMENLIGN([@Holdnavn];Tabel2[Holdnavn];0)))" End If
Okay - det virker rigtig fint, hvis man sletter én celle.
Det virker ikke, hvis man sletter flere celler på én gang, men jeg synes at løsningen er rigtig fin som den er, så du skal ikke bøvle mere med mig for denne gang :)
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.