Patric Ahlqvist Postad Februari 21, 2023 Dela Postad Februari 21, 2023 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 Citera Länk till kommentar Dela på andra webbplatser Fler delningsalternativ...
MH_ Postad Februari 21, 2023 Dela Postad Februari 21, 2023 (redigerade) 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 Februari 21, 2023 av MH_ Stavvar såm än krata 1 Citera Länk till kommentar Dela på andra webbplatser Fler delningsalternativ...
Mikael63 Postad Februari 21, 2023 Dela Postad Februari 21, 2023 Kan man inte ha tre makroknappar för detta? Knappen som heter Pelle skriver in PB + IDAG() i den cell som är aktiv? Fast.. om man använder IDAG() i A1 morgon och IDAG() i A2 på fredag, vad kommer det då att stå i A1 på fredag? Citera Länk till kommentar Dela på andra webbplatser Fler delningsalternativ...
Patric Ahlqvist Postad Februari 22, 2023 Författare Dela Postad Februari 22, 2023 @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. Citera Länk till kommentar Dela på andra webbplatser Fler delningsalternativ...
Lösning MH_ Postad Februari 22, 2023 Lösning Dela Postad Februari 22, 2023 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 1 Citera Länk till kommentar Dela på andra webbplatser Fler delningsalternativ...
Patric Ahlqvist Postad Februari 22, 2023 Författare Dela Postad Februari 22, 2023 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. 1 Citera Länk till kommentar Dela på andra webbplatser Fler delningsalternativ...
MH_ Postad Februari 22, 2023 Dela Postad Februari 22, 2023 >>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/ 1 Citera Länk till kommentar Dela på andra webbplatser Fler delningsalternativ...
Patric Ahlqvist Postad Februari 22, 2023 Författare Dela Postad Februari 22, 2023 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. Citera Länk till kommentar Dela på andra webbplatser Fler delningsalternativ...
Mikael63 Postad Februari 22, 2023 Dela Postad Februari 22, 2023 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. Citera Länk till kommentar Dela på andra webbplatser Fler delningsalternativ...
Recommended Posts
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.