Gå til innhold

[LØST] Automatisk kjøring av macro.


Anbefalte innlegg

Holder på å lage et skjema for innlevering av diverse utstyr. Vi bruker en del formler for å legge inn noen verdier og disse data flyttes så til riktig sted i dokumentet når macroen kjøres. Det jeg ønsker meg er at denne macroen skal kjøres automatisk når man fyller inn data i siste celle på raden hvor data legges inn, er det mulig å få til det, eller må man aktivere makroen med en snarvei/hurtigtast?

Endret av NikkaYoichi
Lenke til kommentar
Videoannonse
Annonse

Det går bra. Excel inneholder mange tomme makroer som kjører idet ett eller annet skjer, de kalles "events". Høyreklikk arkfanen, velg "vis kode", lim inn følgende:

 

Private Sub Worksheet_Change(ByVal Target As Range)

 

If Target.Count = 1 Then

 

If Target.Column = 8 Then 'H-kolonnen

 

MsgBox "Halla" 'erstatt med din kode

 

'eller start en eksisterende makro slik:

 

'Call Makro1

 

End If

 

End If

 

End Sub

 

Les om events her: http://www.cpearson.com/Excel/Events.aspx

 

HTH. Beste hilsen Harald

Lenke til kommentar

Jeg får det ikke helt til, vet ikke hvorfor, men den reagerer ikke/utfører ikke det jeg ber den om. Foreløpig så har vi følgende makro som virker - det er denne jeg ønsker skal bli utført når Celle H3 endrer seg.

 

Skjult tekst: (Marker innholdet i feltet for å se teksten):

Sub Settinnidag()

'

' Settinnidag Makro

'

Rows("5:5").Select

Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

Rows("3:3").Select

Selection.Copy

Rows("5:5").Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False

Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _

SkipBlanks:=False, Transpose:=False

Range("G7").Select

End Sub

Lenke til kommentar

Hehe problemet er vel heller at den utfører nøyaktig det du ber om, ikke det du egentlig vil :)

 

Du ber ganske diffust, blir litt gjetting. Denne kopierer raden du skriver i inn, område A:H, inn på en ny rad 5:

 

Private Sub Worksheet_Change(ByVal Target As Range)

 

If Target.Count = 1 Then

 

If Target.Column = 8 Then 'H-kolonnen

 

Rows(5).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

 

Range(Cells(Target.Row, 1), Cells(Target.Row, 8)).Copy _

Destination:=Range(Cells(5, 1), Cells(5, 8))

 

End If

 

End If

 

End Sub

Lenke til kommentar

Jeg trodde jeg var spesifikk, men ser nå at jeg egentlig ikke har vært tydelig nok.

 

Helt konkret, så ønsker jeg at det som står i cellene B3:J3 skal settes inn på linje 5 og flytte det som ligger der, nedover i dokumentet. (Koden jeg postet i min siste post, gjør akkurat det.) Det jeg ikke får til, men ønsker meg er at dette skjer automatisk når jeg er ferdig å skrive i celle H3, da celle I3 er resultatet av en formel og J3 skal stå tom, da det er dato for avslutning. Jeg har brukt koden over for å være sikker på at kun de data som ligger i feltene blir med.

 

I3 baserer seg på data som ligger i cellene B3-H3, så det er ingen løsning å flytte det fortløpende, slik den koden du postet nå sist gjør. Skal se om jeg klarer å snuse ut hvordan du har gjort det ut fra den fungerende koden, for den gjør jo omtrent det jeg er ute etter. :)

 

Nå kan jeg selvsagt legge til en snarveisknapp, ctrl-kombo for å kjøre den aktuelle makroen jeg har laget som fungerer, men det ville vært mer smidig om dette skjedde automatisk.

 

Takk for all hjelp, Harald. :)

Lenke til kommentar

Begynner å lure på om det er buggy i Excel 2010, for når jeg oppretter en makro, så er den plutselig borte fra lista under makroer, men hvis jeg så oppretter en ny en, så dukker den magisk opp, inn i koden til den nye makroen jeg forsøker å lage. *river seg i håret*

Lenke til kommentar

Dette er ennå litt utydelig. Dette skal startes når man har fullført innskrivning i bare H3? Ikke H2 eller H4 eller H27? Det som skal kopieres er verdiene i A3:J3 ? Jeg håper du også tar høyde for at man kan skrive feil i H3 og at undo ikke funker for å omgjøre registreringen i så fall. Sånn sett er det kanskje mer brukervennlig med en "registrer"-knapp/boks/figur. Det lager du med å sette inn et grafisk objekt whatever, høyreklikke det, tilordne makro.

 

Beste hilsen Harald

Lenke til kommentar

Det stemmer Harald, når man har fylt inn data i H3 som er det siste feltet brukeren skal legge inn data, så skal alt det som ligger i B3:J3, flyttes ned til B5:J5 og de data som allerede ligger der skal selvsagt flyttes et hakk ned.

 

Det man altså registrer her er navn, type maskin, serienummer, type feil osv. Siden datoen for innlevert oppdateres med funksjonen =today() så må man altså kun kopiere data fra de opprinnelige cellene, slik koden over gjør.

De to siste feltene altså I3 og J3, er dato innlevert og dato utlevert/ferdigstilt reparasjon. Førstnevnte fylles ut automatisk til datoen brukeren skriver inn data i B3:H3, hvor H3 er siste felt som har brukerinteraksjon. I3 blir fylt ut så fort brukeren legger inn data i B3. J3 skal selvsagt ikke fylles ut før etter at reparasjon er utført, så egentlig er denne unødvendig i denne sammenhengen.

 

Jeg har altså fått til, med koden over, å flytte datane fra der hvor brukeren skriver inn data og sette denne inn på rad 5, slik at de nyeste innleverte sakene alltid ligger øverst. Det som hadde vært kjekt var at den makroen som utfører flyttingen ble aktivert når brukeren er ferdig med utfylling av H3, som er den siste cella med brukerinteraksjon. :)

 

Det er mulig at det er enklere å bare legge til en hurtigtast/knapp for å kjøre makroen. :wee:

Lenke til kommentar

Glem enkleste, alt dette er ganske lett, og uansett er det engangsarbeid. Enklest å lage er aldri en tanke, vi går for enklest å bruke. Hva er mest brukervennlig og hva er mest praktisk i det daglige? Hva er mest forståelig for brukeren? Er det behagelig at noe bare poffer omkring når man har fylt ut noe uten varsel, eller er det mer begripelig og behagelig å klikke noe som heter "Fullfør" ?

Lenke til kommentar

Glem enkleste, alt dette er ganske lett, og uansett er det engangsarbeid. Enklest å lage er aldri en tanke, vi går for enklest å bruke. Hva er mest brukervennlig og hva er mest praktisk i det daglige? Hva er mest forståelig for brukeren? Er det behagelig at noe bare poffer omkring når man har fylt ut noe uten varsel, eller er det mer begripelig og behagelig å klikke noe som heter "Fullfør" ?

 

Brukeren som skal benytte skjemaet er svært oppegående og spurte selv om dette var mulig. Jada, mente jeg - det må jo gå an. Dessverre viste det seg å gi meg mye mer hodebry enn forventet. :wee:

Lenke til kommentar

Se på det som læring, dette er gøy når du kommer litt inn i det. A3:J3 til ny A5:J5 ved innskrivning i H3:

 

Private Sub Worksheet_Change(ByVal Target As Range)

 

If Target.Count = 1 Then

 

If Target.Column = 8 And Target.Row = 3 Then 'H3

 

Rows(5).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

 

Range(Cells(Target.Row, 1), Cells(Target.Row, 10)).Copy _

Destination:=Range(Cells(5, 1), Cells(5, 10))

 

Range(Cells(5, 1), Cells(5, 10)).Value = Range(Cells(5, 1), Cells(5, 10)).Value

 

'Fjern neste setning hvis vi IKKE skal tømme rad 3:

 

Range(Cells(Target.Row, 1), Cells(Target.Row, 10)).ClearContents

 

End If

 

End If

 

End Sub

Lenke til kommentar

Tusen takk, men jeg får det fortsatt ikke til å virke. Når jeg fyller inn data og forlater celle H3, så skjer det altså ingenting.

 

Det er meget mulig at jeg legger til denne koden på feil sted, og at DET er årsaken til at det ikke virker?

 

Det jeg har gjort er å trykke F8 for å starte en makro, og F8 for å avslutte denne. Deretter har jeg kopiert inn koden og påsett at det i rullegardina står "general" og "worksheet_change".

 

Jeg har også forsøkt å gå på "view macros", skrive inn et navn og "create", for deretter å lime inn koden og forsikre meg om at den blir registrert som "worksheet_change".

 

Det er godt å se at du er såpass tålmodig som du er, for det virker som at du har stålkontoll på dette og jeg setter meget stor pris på at du tar deg tid til dette. :)

Lenke til kommentar

NYDELIG! Nå virker det nøyaktig slik jeg hadde tenkt meg. :D Tusen takk skal du ha! :thumbup:

 

Det var som jeg trodde, at jeg la inn koden på feil sted. Jeg var faktisk ikke klar over denne funksjonen med å høyreklikke på arkfanen. Nå har jeg lært noe nytt om makroer og events.

 

Skrevet i gledesrus.

Lenke til kommentar

Det skjedde dog noe rart, det ser ut som at den kopierer hele radene og ikke bare de aktuelle cellene, misforstår jeg koden nå?

 

Range(Cells(Target.Row, 1), Cells(Target.Row, 10)).Copy _

Destination:=Range(Cells(5, 1), Cells(5, 10))

 

Her står det at den skal kopieres til cellene 5,1-5,10(A5:J5), men den forflytter det som ligger utenfor dette området også. Har det noe med hva som kopieres og at dette er en hel rad?

Lenke til kommentar

I fall dette skulle være av interesse for andre så ser koden nå slik ut:

 

Private Sub Worksheet_Change(ByVal Target As Range)

 

If Target.Count = 1 Then

 

If Target.Column = 8 And Target.Row = 3 Then 'H3

 

Range("A5:J5").Select

Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 'Velger område og setter inn celler i disse kolonnene

 

Range(Cells(Target.Row, 1), Cells(Target.Row, 10)).Copy _

Destination:=Range(Cells(5, 1), Cells(5, 10))

 

Range(Cells(5, 1), Cells(5, 10)).Value = Range(Cells(5, 1), Cells(5, 10)).Value

 

'Fjern neste setning hvis vi IKKE skal tømme rad 3:

 

Range(Cells(Target.Row, 1), Cells(Target.Row, 10)).ClearContents

 

End If

 

End If

 

End Sub

 

Jeg får dessverre ikke lastet opp selve dokumentet, men koden bør i alle fall være til hjelp om noen andre skulle ha lyst til å gjøre noe liknende.

 

Igjen, stor takk til deg Harald som har dyttet meg fremover her. :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...