Just nu i M3-nätverket
Gå till innehåll

Funktion för statiskt datum


qwert87

Rekommendera Poster

Hej!

 

Sitter och försöker knåpa ihop en användarvänlig produktionslogg, där aktuellt datum automatiskt ska skrivas ut i en kolumn, då värden matas in i andra. Meningen är att de anställda enbart ska skriva in en siffra, och loggen ska sköta resten. Jag trodde jag hade löst det med denna funktion i datum-cellen:

 

=OM(E11>0;IDAG();" ")

 

(det är då i kolumn E man matar in värden)

 

...men sen märkte jag att datumet uppdateras varje gång dokumentet öppnas (då ju funktionen körs).

 

Jag är medveten om kortkommandot CTRL + Skift + Semikolon, men jag vill befria mig från sånt eftersom man glömmer bort de direkt. Speciellt folk som styr flera olika kommandostyrda maskiner. Vill göra det så enkelt som möjligt.

 

Jag vill alltså ha en funktion som skriver ut det aktuella datumet, men som gör den statisk.

 

Någon som kan hjälpa mig?

 

Länk till kommentar
Dela på andra webbplatser

Funktion som skriver in datumet statiskt?

Nej, det vill sig inte.

 

Antingen skapar man en funktion som returnerar en konstant, dvs samma värde vid varje användande, eller en som räknar fram ett värde att returnera vid varje omräkning. Funktionen kan inte veta när den skrivits in i en cell.

 

Två vägar finns att gå om du vill förenkla det:

1: Skapa en knapp, exempelvis, som infogar dagens datum.

2: Skapa ett makro som går igenom arket och utför jämförelsen du nu utför med formeln. Hur/när makrot ska aktiveras beror på vad du vill att datumstämplen ska visa. Ska den visa när ett värde större än noll matades in i eller när första värdet större än noll matades in i kolumn E?

 

(och - för att skapa en tom cell skriv "" utan mellanslag)

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Länk till kommentar
Dela på andra webbplatser

Attans... förenkling ska alltid vara så komplicerat!

 

Meningen är att så fort något över huvud taget matas in i kolumn E, så skrivs datum ut. Det är helt enkelt en logg över lagerstatus, och när en enhet hämtas så skriver man bara in antalet och aktuellt datum automatiskt.

 

1. Knapp? Hur gör man så att den infogar dagens datum?

 

2. Makro? Hur får jag den att utföra önskad åtgärd, med statiskt datum?

 

Jag är, som du kanske märker, inte särskillt djupt insatt i Excel, så om du inte har tid får du gärna hänvisa till någon bra kunskapskälla.

 

Men jag uppskattar hjälp väldigt mycket!

 

Länk till kommentar
Dela på andra webbplatser

1 tror jag vi skippar, du ville ha det enkelt och användbart. En knappa skulle bara vara en ersättning för snabbkommandot.

 

2: Finns tre senarion

a) Användaren initierar en uppdatering/genomgång av värden i E

B) Körs automatiskt vid ändring i E

c) Körs automatiskt vid byte av ark eller stängning av arbetsbok.

 

Tror, trots alla mina normala varningar om händelsefunktioner, att B) är att föredra i detta fall.

 

Så kanske något i stil med:

[color="#0000ff"]Private[/color] [color="#0000ff"]Sub[/color] Worksheet_Change(ByVal Target As Range)
    [color="#0000ff"]Dim[/color] sect As Range
    [color="#0000ff"]Set[/color] sect = Intersect(Target, Range([GRÅ]"E:E"[/GRÅ]))
    [color="#0000ff"]If[/color] [color="#0000ff"]Not[/color] sect Is [color="#0000ff"]Nothing[/color] [color="#0000ff"]Then[/color]
        [color="#0000ff"]Dim[/color] myCell As Range
        [color="#0000ff"]For[/color] [color="#0000ff"]Each[/color] myCell [color="#0000ff"]In[/color] sect.Cells
            [color="#0000ff"]If[/color] myCell.Column = 5 [color="#0000ff"]Then[/color]
                [color="#0000ff"]If[/color] myCell.Value > 0 [color="#0000ff"]Then[/color] myCell.Offset(0, 1) = [color="#0000ff"]Now[/color]()
                [color="#0000ff"]If[/color] myCell.Value = [GRÅ]""[/GRÅ] [color="#0000ff"]Then[/color] myCell.Offset(0, 1) = [GRÅ]""[/GRÅ]
            [color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
        [color="#0000ff"]Next[/color] myCell
    [color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

Högerklicka på namnlisten, på det blad du vill ha denna funktion, och välj visa kod.

 

Klistra in det ovan.

 

Funktionen är enkel;

skrivs något in i kolumn E kontrolleras om värdet är större än noll och datum (och tid) skrivs i på samma rad i kolumn F. Om en cell i E töms raderas värdet i F.

 

En sak till behövs, funktionen ovan ger att text blir positiva värden. Detta begränsas enklast via aktivering av dataverifiktion och där begränsa vad som får skrivas in, ex.v. heltal större än 0. Detta låter sig göras i menyn data -> Verifiering. Markera först hela E-kolumnen, eller det området av E du vill att det ska gälla.

 

Och ja, funktionen ovan arbetar i hela E-kolumnen. Vill du begränsa det till ett vist område ändra då i raden

[color="#0000ff"]Set[/color] sect = Intersect(Target, Range([GRÅ]"E:E"[/GRÅ]))

så att det exempelvis står:

[color="#0000ff"]Set[/color] sect = Intersect(Target, Range([GRÅ]"E2:E24"[/GRÅ]))

för att den ska vara "aktiv" om något händer inom det området.

 

För att det ska fungera överhuvudtaget måste makron vara tillåtna.

ed:kodtaggar

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

 

[inlägget ändrat 2007-01-16 10:05:19 av Monshi]

Länk till kommentar
Dela på andra webbplatser

  • 2 years later...

Jag lånade denna funktion för ett annat syfte men för samma resultat. Just nu måste man skriva något i kolumn B för att få datum och tid i kolumn E. Men hur kan jag omformulera funktionen så att om man skriver något i kolumn F så skrivs datum och tid ut i kolumn G också(utöver det som gäller för B/E)..

 

Tyvärr har jag långt ifrån den kunskap jag önskade att jag besatt.

 

Hjälp mottages tacksamt!

 

Edit: Vet om att tråden är gammal...

[inlägget ändrat 2009-05-26 12:47:51 av Rber]

Länk till kommentar
Dela på andra webbplatser

 

Svaret på din fråga är enkel, ändra referensen till E:E till F:F och kolumn numret, 5, till 6.

dvs

Private Sub Worksheet_Change(ByVal Target As Range)
   Dim sect As Range
   'om ändrade celler är del av kolumn F
   Set sect = Intersect(Target, Range("F:F"))
   If Not sect Is Nothing Then
       Dim myCell As Range
       For Each myCell In sect.Cells
 'även om ovan jämförelse stämmer kan celler vara utanför kolumnen
 If myCell.Column = 6 Then
     'skriver datum en kolumn åt höger.    
     If myCell.Value > 0 Then myCell.Offset(0, 1) = Now()
     'eller tömmer motsvarande cell    
     If myCell.Value = "" Then myCell.Offset(0, 1) = ""

 End If
       Next myCell
   End If
End Sub

 

Fast som jag brukar säga, man bör undvika dessa händelserutiner om kan.

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Länk till kommentar
Dela på andra webbplatser

Tack för svaret. Jo detta har jag koll på efter att tillämpat det på B/E som jag skrev.

 

Men nu vill UTÖVER B/E också ha det för F/G. Samma scenario skall alltså gälla på två ställen i samma arbetsbok. Så referensen skall alltså både vara i kolumn B och F. B skall kopplas till E och F skall kopplas till G.

 

Hoppas jag är lite tydligare nu!

 

Länk till kommentar
Dela på andra webbplatser

typ

 

Private Sub Worksheet_Change(ByVal Target As Range)
   Dim sect As Range

   'om ändrade celler är del av kolumn b
   Set sect = Intersect(Target, Range("B:B"))
   ' om inte, kanske del av kolumn F?
   If sect Is Nothing Then Set sect = Intersect(Target, Range("f:f"))
   'fast notera, det ger att enbart en kolumn kollas
   If Not sect Is Nothing Then
       Dim myCell As Range
       'en koll, om hela kolumnen raderas eller liknande kommer det ta lååång tid att köra det
       ' nedan om inte detta ändras
       If sect.Cells.Count > 1000 Then
           Debug.Print "för många celler har ändrats på en gång"
           Exit Sub
       End If
       Dim iOffset As Integer
       Application.EnableEvents = False
       For Each myCell In sect.Cells
           'även om ovan jämförelse stämmer kan celler vara utanför kolumnen
           If myCell.Column = 2 Then
               MyDateWriter myCell, 3
           ElseIf myCell.Column = 6 Then
               MyDateWriter myCell, 1
           End If
       Next myCell
       Application.EnableEvents = True
   End If

End Sub

Sub MyDateWriter(rn As Range, iOffset As Integer)
   'skriver datum en kolumn åt höger.
   If rn.Value > 0 Then rn.Offset(0, iOffset) = Now()
   'eller tömmer motsvarande cell
   If rn.Value = "" And rn.Offset(0, iOffset) <> "" Then rn.Offset(0, iOffset) = ""
End Sub

 

delat upp i två rutiner nu för att slippa skriva samma kod två gånger...Läs igenom, förstå vad jag gör. det rekommenderas det varmaste. Har kommenterat ganska väl anser jag.

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Länk till kommentar
Dela på andra webbplatser

Klockrent!

 

Bra kommenterat.. mycket lätt hänga med, tusen tack.

 

Detta ligger i en enkel arbetsbok utan några hårdare krav, så lösningen behöver inte vara mer avancerad heller för den delen!

 

Tack igen, /Robin

 

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...