Avatar billede Juniormester
03. august 2021 - 13:47 Der 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.
Avatar billede claes57 Ekspert
03. august 2021 - 18:56 #1
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.
Avatar billede Juniormester
04. august 2021 - 12:35 #2
Hej Claes57

Tak for dit svar. Jeg efterprøver lige metoden og vender tilbage :)
Avatar billede store-morten Ekspert
04. august 2021 - 23:27 #3
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
Avatar billede Juniormester
05. august 2021 - 12:59 #4
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()

End Sub
Avatar billede store-morten Ekspert
05. august 2021 - 13:34 #5
Skal den samme formel skrives i alle 2000 celler?
Avatar billede Juniormester
05. august 2021 - 13:40 #6
Ja, det er en relativ formel.

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 :)
Avatar billede store-morten Ekspert
05. august 2021 - 13:42 #7
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

    End If
End Sub
Avatar billede store-morten Ekspert
05. august 2021 - 13:45 #8
Husk at teste i en kopi, makro kan ikke fortrydes :-)
Avatar billede Juniormester
05. august 2021 - 13:54 #9
Jeg har gjort følgende:

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.
Avatar billede store-morten Ekspert
05. august 2021 - 14:22 #10
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.
Avatar billede Juniormester
05. august 2021 - 15:04 #11
Jeg har nu gjort følgende:

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.
Avatar billede store-morten Ekspert
05. august 2021 - 16:10 #12
Hvorfor gør du nr. 4?
Avatar billede Juniormester
05. august 2021 - 16:16 #13
Det troede jeg man skulle for at "køre" koden :D

Nu har jeg prøvet og bare droppet step 4., men får samme fejl ved delet. Vælger jeg "Debug" på fejlen, highlighter den følgende linje med gul:

Target.Formula = "=HVIS([@Holdnavn]="";0;INDEKS(Tabel26[Holdtimer i alt];SAMMENLIGN([@Holdnavn]"
Avatar billede store-morten Ekspert
05. august 2021 - 16:19 #14
Ja, der er en fejl i din formel, prøv at tjekke den.
Avatar billede Juniormester
05. august 2021 - 16:22 #15
Formlen virker efter hensigten i arket, burde det samme ikke være tilfældet i VBA'en så?
Avatar billede store-morten Ekspert
05. august 2021 - 16:22 #16
Er der ikke et 6 tal for meget

=HVIS([@Holdnavn]="";0;INDEKS(Tabel26[Holdtimer i alt];SAMMENLIGN([@Holdnavn
Avatar billede Juniormester
05. august 2021 - 16:23 #17
Formlen er jo dansk mens VBA "taler" engelsk - kan det være udfordringen? Måske et dumt spørgsmål.
Avatar billede store-morten Ekspert
05. august 2021 - 16:26 #18
Nej, det er ikke dumt :-)

Men har du en Tabel26 ?
Avatar billede Juniormester
05. august 2021 - 16:38 #19
Du har ret!

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

    End If
End Sub
Avatar billede store-morten Ekspert
05. august 2021 - 16:39 #20
Skal den ikke være:
=HVIS([@Holdnavn]="";"";INDEKS(Tabel2[Timer i alt];SAMMENLIGN([@Holdnavn];Tabel2[Holdnavn];0)))
Avatar billede store-morten Ekspert
05. august 2021 - 16:41 #21
Så prøv en lille tilføjelse:

Target.FormulaLocal =
Avatar billede store-morten Ekspert
05. august 2021 - 16:45 #22
Din formel fejler stadig?
Avatar billede store-morten Ekspert
05. august 2021 - 16:47 #23
Jeg tror denne virker, sidste forsøg inden jeg går på havearbejde.

Target.FormulaLocal = "=HVIS([@Holdnavn]="""";0;INDEKS(Tabel2[timer i alt];SAMMENLIGN([@Holdnavn];Tabel2[Holdnavn];0)))"
Avatar billede Juniormester
05. august 2021 - 16:50 #24
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 :(
Avatar billede store-morten Ekspert
05. august 2021 - 16:52 #25
Prøv lige den sidste
Avatar billede Juniormester
05. august 2021 - 16:55 #26
Samme error desværre :(

God fornøjelse i haven :)
Avatar billede store-morten Ekspert
05. august 2021 - 17:13 #27
Target.FormulaLocal = "=HVIS([@Holdnavn]="""";0;INDEKS(Tabel2[Holdtimer i alt];SAMMENLIGN([@Holdnavn];Tabel2[Holdnavn];0)))"
Avatar billede store-morten Ekspert
05. august 2021 - 17:35 #28
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

    End If
End Sub
Avatar billede store-morten Ekspert
05. august 2021 - 17:42 #29
Og denne virker på dit Hold- og medlemsliste 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(Tabel2[Holdtimer i alt];SAMMENLIGN([@Holdnavn];Tabel2[Holdnavn];0)))"
        End If

    End If
End Sub
Avatar billede Juniormester
06. august 2021 - 08:20 #30
Du er en knag! Tak :)
Avatar billede store-morten Ekspert
06. august 2021 - 08:41 #31
Velbekomme 😀👍
Avatar billede Juniormester
06. august 2021 - 09:18 #32
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 :)
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

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