Just nu i M3-nätverket
Jump to content

Räkna upp... och ner


Horpe

Recommended Posts

Hej!

 

Jag vill kunna skriva in ett tal i A1, tex 5, varpå 5 skall visas i C1. När jag sedan skriver in tex 7 i A1 ska den lägga ihop 7 och 5 och visa 12 i C1.

Jag vill dessutom kunna skriva tal i B1 som dras ifrån summan. Tex om jag sen skriver 6 i B1 skall alltså 6 visas i C1. osv.

 

Som det är nu så "nollställs" ju allt när man skriver över det sist inlagda...

 

MVH

 

Horpe

 

Link to comment
Share on other sites

Följande tråd i detta forum kanske ger lite svar ...

//eforum.idg.se/viewmsg.asp?EntriesId=698203#698299

 

mvh

/Johan

 

Link to comment
Share on other sites

hubbemannen

Tråden pekar på ett bra sätt ut problemet med självreferenser och det är ju precis vad vi råkar ut för i det här fallet om vi inte trixar lite.

 

Låt oss leka med den första delen av frågan, den om vad som ska hända vid inskrivning i cellen A1 (Räkna upp):

 

Öppna en ny arbetsbok i Excel.

Gå till VBA-editorn, skapa en ny kodmodul.

 

Klistra in

[color="#0000ff"]Option Explicit[/color]
Option Base 1
[color="#006400"]'[/color]
[color="#0000ff"]Public[/color] iAckumulator As Integer
[color="#006400"]'[/color]
[color="#0000ff"]Public[/color] [color="#0000ff"]Function[/color] MyFunk(theCell As Range) As Integer
  iAckumulator = iAckumulator + theCell.Value
  MyFunk = iAckumulator
[color="#0000ff"]End[/color] [color="#0000ff"]Function[/color]

 

Gå till Excel-arket och skriv in formeln =myfunk(A1) i cell C1.

 

Skriv nu in lite olika tal (bara heltal) i cell A1 och tryck retur.

Du bör kunna se att C1 får resultat precis som du vill ha.

 

Problemet är bara att detta nog mest är en "kul grej". Ska det fås att fungera fullt ut väntar antagligen en massa klurande och besvär är jag rädd. (Värdet i iAckumulator måste ju sparas undan när arbetsboken stängs och läsas tillbaka när den öppnas. Ska man vara noga ska iAckumulator också initieras till 0).

 

mvh

hubbemannen

 

EDIT

OOPS, såg inte att du redan hunnit lösa det. Grattis!

 

 

[inlägget ändrat 2005-06-22 12:08:44 av hubbemannen]

Link to comment
Share on other sites

Om du använder en cell istället för iackumulator sparas värdet automatiskt med arket. Värre är att funktionen stegar varje gång arket räknas om, vilket kanske inte bara sker när du matar in något i A1.

 

mvh

/Johan

 

Link to comment
Share on other sites

hubbemannen

Hej Johan,

 

Tack för ditt påpekande. Ibland blir man blind.

 

Jag är säker på att du har rätt och har försökt få värdet i C1 att stega utan att mata in något i A1 - via Tools/Options/Calculation knappen Calc Now(F9). Har även tryckt F9, men utan stegningen.

 

Hur tvingar man fram en omräkning som åstadkommer den stegning du talade om?

 

mvh

hubbemannen

 

Link to comment
Share on other sites

hubbemannen

Horpe,

 

ditt problem är både klurigt och intressant. Det skulle vara väldigt kul att få ta del av din lösning!

 

mvh

hubbemannen

 

Link to comment
Share on other sites

Dock Pejo, en funktion kan inte skriva till annan cell än den den är skriver i. Så det går inte att med funktionen spara undan värdet.

Däremot kan man ha en anan VBA funktion som körs ex.v. vid öppning och stängning av arbetsboken och som då sparar undan värdet på lämplig plats.

 

Allmänt ska sägas att rekursion av det slaget som efterfrågas bör undvikas, den är svårhanterlig och fungerar sällan så som man tänkt sig. Bättre vore om uppdateringen av cellen initierades av ex.v. en knapp på arbetsbladet och inte automatiskt.

 

 

/T

 

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

 

Link to comment
Share on other sites

Oj oj oj, det var hög felprocent på så få rader i mitt inlägg. Där får man för att man tror att man vet hur saker och ting fungerar utan att prova ...:)

 

Hubbemannen: Nej, jag lyckas inte heller stega funktionen utom genom att direkt uppdatera A1 eller C1. Lite märkligt tycker jag dock, att myFunc inte räknas om som alla andra formler?

 

en funktion kan inte skriva till annan cell än den den är skriver i. Så det går inte att med funktionen spara undan värdet. 

Där ser man, det visste jag inte. Man lär så länge man lever.

 

mvh

/Johan

 

Link to comment
Share on other sites

hubbemannen

Att "rädda" iAckumulator är inte så svårt - det är ju värdet i cellen C1 (i det här fallet). Dvs inget behöver göras vid stängning av arbetsboken.

 

Däremot måste variabeln initieras (till värdet i C1) vid öppning av arbetsboken och det är väl inte heller något problem att åstadkomma med VBA.

 

Annars håller jag fullständigt med - nyttan med en sån här "approach" är tämligen liten. Det roliga är att man får grubbla en smula, även om slutsatsen blir att man kanske behöver hitta en ny väg att lösa sitt problem.

 

mvh

hubbemannen

 

 

 

Link to comment
Share on other sites

Hej igen!

 

Kul att man fått lite snurr på tråden!

 

:thumbsup:

 

För mig funkar det med iterationsinställningen (options) och sedan plussa till en totalsumma i C1 via inputs i A1.

 

 

 

Låt säga att jag har 20 i C1 och skriver in 8 i A1. Detta gör 28 i C1. Skriver jag sen in -5 i A1 får jag 23 i C1. Jag kan alltså dra ifrån också!

 

Men hela påroblemet är inte löst för min del:

 

Jag vill inte behöva skriva in ett negativt tal i A1 för att minska i C1, utan skriva in ett positivt tal i B1 som minskar i C1.

 

Hur biter man i denna nöt, hmmmm.

 

 

MVH

 

/Horpe

 

Link to comment
Share on other sites

Mmh, det där är ett skydd som Ms lade till för många år sedan tror jag. En gång i tiden var det fritt men det var samtidigt lite av en risk i dokumentet. Vet inte exakt vad för fara, men samtidigt är det ganska logiskt att man inte kan skriva till en cell som man ej blivit tilldelad att skriva till så att säga.

 

Men som hubbemannen säger, värdet finns ju i cellen så där är det egentligen inget problem.

 

(initiera iAckumulator till 0 eller kanske -4711 och jämför detta med cellens värde vid första körningen. Om cellens värde skiljer sig från iAck så är det bara att ta värdet från cellen istället.)

 

/T

 

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

 

Link to comment
Share on other sites

hubbemannen

Horpe,

 

den sista biten är antagligen knepig att få till:

 

Men hela påroblemet är inte löst för min del:

 

Jag vill inte behöva skriva in ett negativt tal i A1 för att minska i C1, utan skriva in ett positivt tal i B1 som minskar i C1.

 

Hur biter man i denna nöt, hmmmm.

 

Kanske hat du löst det vid det här laget och då vore det kul att få veta hur du gått tillväga.

 

Annars kanske det kan vara fruktbart - och göra svårigheterna tydligare - att se det hela så här:

 

Definiera en arbetsblads-funktion F som har cellerna A1, B1 och C1 som parametrar. Funktionen ska placeras i cellen C1; i C1 ska alltså stå

 

=F(A1,B1,C1)

 

Funktionen F ska ha följande egenskaper:

 

I. Om vi matar in något i A1 skall värdet C1+A1 returneras, dvs

parametern B1 ska ignoreras.

II. Om vi matar in något i cell B1 skall värdet C1-B1 returneras, dvs

parametern A1 ska ignoreras.

 

Jag vågar nog påstå att den funktionen är "icke-excelisk" och att den helt enkelt inte går att förverkliga med Excels inbyggda arbetsbladsfunktioner.

 

1. Vi har redan sett att den innebär cirkulär referens.

2. Kraven I och II ovan innebär att funktionen måste känna av om

sista inmatningen kom från cell A1 eller B1.

 

Ett närbesläktat problem - hur man får saker att hända vid inmatning i en cell - diskuterades i

 

//eforum.idg.se/viewmsg.asp?EntriesId=718744

 

Möjligen kan någon av de tekniker som diskuterades där vara användbara i ditt aktuella problem. (Monshis Event-bevakning eller mitt förslag om länkade osynliga textboxar - två i det här fallet).

 

Jag tror alltså att det kan finnas en risk för att du behöver skapa din funktionalitet på ett annat sätt än du ursprungligen hade tänkt dig.

 

mvh

hubbemannen

 

 

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...