Gå till innehåll

VB - Att med hjälp av initial generera signatur + dagens datum infört i cell


Gå till lösning Löst av MH_,

Recommended Posts

Hej, 

kollat runt men finner inte assistans för mitt dilemma. Tänkte om någon VB guru kunde hjälpa mig. Jag har nedan kodsnutt, som i nuvarande skick fixar till en "check i rutan" vid dubbelklick i en cell (uppgift slutförd). Jag skulle vilja, om möjligt, istället få en signatur följt av dagens datum när jag börjar skriva ett namn (första bokstaven) för att kunna veta vem som slutförde uppgiften och när det skedde. Min strävan närmare beskrivet under koden:

Koden:

 

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

'Updateby Extendoffice

    If Target.Cells.Count = 1 Then

        If Not Intersect(Target, Range("c4:n50")) Is Nothing Then

            With Target

                .Font.Name = "wingdings"

                .Font.Size = 10

                If .FormulaR1C1 = "ü" Then

                    .FormulaR1C1 = " "

                Else

                    .FormulaR1C1 = " ü "

                End If

            End With

        End If

        Cancel = True

    End If

End Sub

 

Så, det första är ju att jag inte vill använda BeforeDoubleClick utan istället "VäntaPåFörstaBokstaven_SenUtförsFöljande" ;)

När jag skriver in första bokstaven, P, är min önskan att cellen ska fyllas med "PB - =IDAG()"Jag försöker också möjliggöra tre olika användare som genererar tre olika signaturer+datum. Så när:

P förs in är önskvärt resultat - PB + IDAG().

J förs in är önskvärt resultat - JW + IDAG().

E förs in är önskvärt resultat - EJ + IDAG().

Anledningen till detta projekt är att vi blivit fler medarbetare och nu räcker det inte, i vår värld, att checka uppgiften som slutförd utan vi vill veta vem och när också. Jag hoppas jag gör mig förstådd och att hjälp finns att få här på forumet av de experter jag vet finns. Jag står mig slätt och har tagit mig vatten över huvudet. HJÄÄÄÄÄLP

Mvh

Patric.

Checklista 2023.xlsm

Länk till kommentar
Dela på andra webbplatser

Om du bara har 3 val så kan du fånga upp "Worksheet_Change" och klistra in när du tryckt enter.

Men då bör du vara paranoid och försöka undvika evighetsloopar på alla sätt du kommer på.

Förenklat exempel: 

Private Sub Worksheet_Change(ByVal Target As Range)

'Stäng av excels möjlighet att upptäcka Changes (försöker undvika evighetsloopar)
Application.EnableEvents = False

' KörAvbryter bara makrot om något annat än A1 ändrades - du kör naturligtvis din kod med Intersect istället
If Not Target.Address = "$A$1" Then Exit Sub

'Avbryter om det står mer eller mindre än ett tecken i Target (ännu ett försök att undvika evighetsloopar)
If Not Len(Target.Value) = 1 Then Exit Sub

' Använd "Select case" för att välja vad de olika initialerna skall bli (Lcase gör om till små bokstäver så att du kan skriva både små och stora initialer)
    Select Case LCase(Target.Value)
        Case "p"
            Target.Value = "PB"
        Case "j"
            Target.Value = "JW"
        Case "e"
            Target.Value = "EJ"
        Case Else
            Application.EnableEvents = True
            Exit Sub
    End Select

'Och släng på mellanslag + datum
    Target.Value = Target.Value & " " & Date
' flyttar fokus från cellen (inte nödvändigt, men evighetslooparna...)
Target.Offset(1, 0).Select

' och sätt på "händelsehantering" igen så att den kan uptäcka en ändring igen
Application.EnableEvents = True

End Sub

 

Inte riktigt vad du ville. Men det borde duga.

 

Redigerad av MH_
Stavvar såm än krata
  • Like 1
Länk till kommentar
Dela på andra webbplatser

@MH_ Gudars, vad kul att se att vissa har så lätt för detta, övning ger färdighet antar jag ;) Fantastiskt pedagogiskt och bra förklarat vilket gör att jag, ta' mäh fasen, förstår koden. Skulle aldrig kommit fram till detta själv, men färdigskriven är det förståeligt.

Du vill inte ta dig tid att utveckla detta med "evighetsloopar"? Det antyds vad det kan vara men jag förstår inte riktigt och konsekvensen...

Tack så oerhört mycket för svar, jag meddelar efter lite testning och lek.

@Mikael63 Tack även för ditt svar. Är dock inte med på vad du menar avseende A1 morgon och A1 på fredag... Borde inte införandet av data IDAG() ange dagens datum och skriver jag in IDAG() på fredag så borde väl fredagens datum hamna i rutan.

 

I will return. 

 

Länk till kommentar
Dela på andra webbplatser

  • Lösning

När man skriver in någonting i cellen man står i, t.ex 
Target.Value = "EJ"

Så är det ju en "change" som inträffar och då skall ju Change_makrot köras igen, vilket kan göra en ändring som triggar igång en förändring som startar makrot som trigga....

Det här borde lösas med hjälp av: 
Application.EnableEvents = False

Men eftersom jag är paranoid pga erfarenhet (Tangenten [Break] är ett viktig instrument när du skall stoppa ett makro som löpt amok... (eller var det Ctrl+break, hmmm?))

så vill jag gärna ha både hängsle, livrem och kontorsklister för att vara säker på att byxorna sitter kvar

If Not Len(Target.Value) = 1 Then Exit Sub

Avbryter om cellen är tom eller om det står något i stil med "EJ 2023-02-22" (dvs om vi hamnat i en loop).

medan "Target.Offset(1, 0).Select" i ärlighetens namn ökar risken för en loop - Tag bort- jag hade lite otur när jag tänkte...

 

Och när jag kollar koden igen så inser jag att "EnableEvents = False" skall ligga efter de första "exit-raderna". Annars kommer excel sluta känna av "Change" så for du ändrar en cell utanför området eller skriver något annat än p,j,e i en av cellerna

Och Case Else behövs inte heller

Det här blir ju ganska kompakt och trevligt:

Private Sub Worksheet_Change(ByVal Target As Range)
' avbryt om ändringen skedde utanförd ditt bevaknings-område
    If Intersect(Target, Range("c4:n50")) Is Nothing Then Exit Sub
' avbryt om mer än en cell är vald
    If Target.Cells.Count <> 1 Then Exit Sub
' fortsätt bara om det är exakt ett tecken i cellen
    If Len(Target.Value) <> 1 Then Exit Sub

' du bör inte stänga av "EnableEvents" förrän här eftersom ovanstående rader inte 
' gör något som kan uppfattas som en Change och de sätter inte på "event" innan exit
    Application.EnableEvents = False
        Select Case LCase(Target.Value)
            Case "p"
                Target.Value = "PB " & Date
            Case "j"
                Target.Value = "JW " & Date
            Case "e"
                Target.Value = "EJ " & Date
        End Select
    Application.EnableEvents = True
End Sub

 

 

  • Thanks 1
Länk till kommentar
Dela på andra webbplatser

1 timme sedan, MH_ sade:

När man skriver in någonting i cellen man står i, t.ex 
Target.Value = "EJ"

Så är det ju en "change" som inträffar och då skall ju Change_makrot köras igen, vilket kan göra en ändring som triggar igång en förändring som startar makrot som trigga....

Det här borde lösas med hjälp av: 
Application.EnableEvents = False

Men eftersom jag är paranoid pga erfarenhet (Tangenten [Break] är ett viktig instrument när du skall stoppa ett makro som löpt amok... (eller var det Ctrl+break, hmmm?))

så vill jag gärna ha både hängsle, livrem och kontorsklister för att vara säker på att byxorna sitter kvar

If Not Len(Target.Value) = 1 Then Exit Sub

Avbryter om cellen är tom eller om det står något i stil med "EJ 2023-02-22" (dvs om vi hamnat i en loop).

medan "Target.Offset(1, 0).Select" i ärlighetens namn ökar risken för en loop - Tag bort- jag hade lite otur när jag tänkte...

 

Och när jag kollar koden igen så inser jag att "EnableEvents = False" skall ligga efter de första "exit-raderna". Annars kommer excel sluta känna av "Change" så for du ändrar en cell utanför området eller skriver något annat än p,j,e i en av cellerna

Och Case Else behövs inte heller

Det här blir ju ganska kompakt och trevligt:

Private Sub Worksheet_Change(ByVal Target As Range)
' avbryt om ändringen skedde utanförd ditt bevaknings-område
    If Intersect(Target, Range("c4:n50")) Is Nothing Then Exit Sub
' avbryt om mer än en cell är vald
    If Target.Cells.Count <> 1 Then Exit Sub
' fortsätt bara om det är exakt ett tecken i cellen
    If Len(Target.Value) <> 1 Then Exit Sub

' du bör inte stänga av "EnableEvents" förrän här eftersom ovanstående rader inte 
' gör något som kan uppfattas som en Change och de sätter inte på "event" innan exit
    Application.EnableEvents = False
        Select Case LCase(Target.Value)
            Case "p"
                Target.Value = "PB " & Date
            Case "j"
                Target.Value = "JW " & Date
            Case "e"
                Target.Value = "EJ " & Date
        End Select
    Application.EnableEvents = True
End Sub

 

 

@ML_ Helt fantastiskt bra... Hade lite dilemman möjligen kopplat till ditt påstående ovan alternativt jag gjorde nåt annat lite tokigt. Men med detta behöver jag inte trixa alls. Du löste det helt åt mig. Jag är oerhört tacksam. Du håller inte online kurser ;)

Tack a million för all hjälp.

  • Thanks 1
Länk till kommentar
Dela på andra webbplatser

>>håller inte online kurser ;) ?

När forumen var mer aktiva så var det precis vad ett forum var. Hängde man på ett forum blev man snabbt bättre. Ett gäng som ställde frågor och ett annat gäng som höll sig uppdaterade genom att hjälpa till och läras sig av andras svar (och de som ställde frågor "betalade igen" genom att själva hjälpa till något stans).

Jag skulle gärna skylla på alla Svärjevänner som förstörde stämningen på forum får något årtionde sen. Men sanningen är nog att den stora, anonyma och hjälpsamma  gemenskapen som fanns i nätets barndom redan hade börjat dö när Svärjevännerna härjade som värst. Trist, men kanske väntat.

He, he. Det finns en klassisk tråd i Eforums musiktråd eller möjligtvis Studios forum när en nisse som kallar sig "Timberman" frågar om mixer-råd och åsikter om en demo. Han blev ju rätt bra på det där så småningom (se slutet av tråden, 5 år senare)... 
https://www.studio.se/forums/topic/34925-timberman-brain/

  • Like 1
Länk till kommentar
Dela på andra webbplatser

7 minuter sedan, MH_ sade:

>>håller inte online kurser ;) ?

När forumen var mer aktiva så var det precis vad ett forum var. Hängde man på ett forum blev man snabbt bättre. Ett gäng som ställde frågor och ett annat gäng som höll sig uppdaterade genom att hjälpa till och läras sig av andras svar (och de som ställde frågor "betalade igen" genom att själva hjälpa till något stans).

Jag skulle gärna skylla på alla Svärjevänner som förstörde stämningen på forum får något årtionde sen. Men sanningen är nog att den stora, anonyma och hjälpsamma  gemenskapen som fanns i nätets barndom redan hade börjat dö när Svärjevännerna härjade som värst. Trist, men kanske väntat.

He, he. Det finns en klassisk tråd i Eforums musiktråd eller möjligtvis Studios forum när en nisse som kallar sig "Timberman" frågar om mixer-råd och åsikter om en demo. Han blev ju rätt bra på det där så småningom (se slutet av tråden, 5 år senare)... 
https://www.studio.se/forums/topic/34925-timberman-brain/

Jag vet... Höll väldigt mycket på med ett CMS som kallades "Snews CMS" för massa år sedan (vet inte ens om det finns kvar tävlade ju med Joomla och liknande), började som frågeställare, gick vidare till betatestare och senare utvecklade jag även små mods som implementerades i eller till koden i CMS motorn. Till slut gjorde jag egna websidor med egna funktioner och "fuskade" lite med den koden som var motorn i systemet för att få fram mina egna lösningar så, visst är jag bekant med hur det en gång var... Dock kan jag inte likna det med Timberman, haha... Riktigt juste inpass. Riktigt häftigt att läsa ändå.

Vi är alla barn i början. Men denna "stämning" verkar som bortblåst, eller njae... inte lika vanligt förekommande ;) Jag vill inte säga "det var bättre förr" men lite annat var det allt. Nå, du upphåller den stämningen som jag ser det. Jag ska plugga på lite och försöka ge tillbaka i den mån jag är kompetent när dagen inträffar. Excel och VBA är sexigt ihop ;)

HA det gott och tack för hjälp än en gång.

Länk till kommentar
Dela på andra webbplatser

8 timmar sedan, Patric Ahlqvist sade:

Borde inte införandet av data IDAG() ange dagens datum och skriver jag in IDAG() på fredag så borde väl fredagens datum hamna i rutan.

Jag vet inte och därav frågetecknet. Tänkte att IDAG kanske fungerade som NU. Att värdet uppdateras vid en ny beräkning av kalkylbladet.

 

Länk till kommentar
Dela på andra webbplatser

Delta i dialogen

Du kan skriva svaret nu och registrera dig senare, Om du har ett konto, logga in nu för att svara på inlägget.

Gäst
Svara i detta ämne...

×   Du har klistrat in innehåll med formatering.   Ta bort formatering

  Only 75 emoji are allowed.

×   Din länk har automatiskt bäddats in.   Visa som länk istället

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Skapa nytt...