03. september 2002 - 13:06Der er
24 kommentarer og 1 løsning
Funktion i Visual Basic
Hej Eksperten.dk
Jeg har et lille programeringsproblem, som jeg meget gerne vil have hjælp til. Jeg ønsker at programere en funktion, som har nogle søgekriterier i sig.
Jeg vil give dig et eksempel på mit problem:
X/Y 230 220 200 180 160 140
90 13649 13612 13465 13122 12639 11440
80 13084 13007 12853 12492 11983 10615
70 11816 11756 11411 11240 10524 9101
60 9633 9581 9397 9101 8506 7264
50 7269 7268 7123 6890 6382 5470
40 4903 4838 4778 4584 4286 3583
30 3088 3065 2987 2833 2531 2043
20 1419 1405 1359 1275 1113 862
10 468 455 448 402 341 290
0 213 213 197 183 161 134
Her har du mine dataer.
X= {90,80,70,60.....0}
Y= {230,220,200...140}
Z= {alle værdier fra 13649 til 134}
Nu ville jeg gerne, at jeg kunne søge på en Z værdi, og computeren retunere den højeste X værdi og den Y værdi, der passer til X værdien, til mig. MEN X må ALDRIG overstige 90 eller gå under 0, og Y må SKAL være mellem 140 og 230.
Hvis jeg f.eks. skriver Z= 13649, så skulle computeren gerne retunere 90, 230 til mig, da det jo er den højeste X værdi ved det givne Z punkt. Dette er simpelt, da jeg jo kender X og Y værdierne til 13649, men hvis jeg f.eks skriver 10000, kender jeg jo ikke den højeste X værdi og Y værdien til denne. Y værdien skal ikke være den højeste - den skal bare være mellem 140 og 230.
Jeg har en søge-interpolerings-funktion i Excel, men når jeg bruger den, finder computeren værdier, der ligger over 90 og 230 og det er det jeg søger efter. En funktion, der kan begrænse søgningen, så den ikke overskrider mine grænser.
Hvis jeg f.eks indtaster 10000 i den funktion jeg har giver den mig: X= 75 og Y=141. Dette er godtnok, men indtaster jeg 12000 giver den mig: X=99 og Y=141 - dette er jo over min grænse.
Samtidig skal programmet også kunne finde ud af følgende:
Når ovenstående program/funktion har fundet den højeste X værdi (mellem 0 og 90) til et givet punkt Z punkt og den Y værdi, der passer til x værdien (mellem 140 og 230), skal programmet nu kigge i nedenstående tabel:
X= {90,80,70,60.....0} Y= {230,220,200...140} Z= {resten af værdierne)
Her må de fundne X/Y værdier ALDRIG overskride 23.
DVS: Hvis jeg f.eks i funktion 1 indtaster følgende Z værdi (jeg tager én jeg kender punkterne til): 13649
Skal programmet retunere følgende X værdi til mig: 90 Og følgende Y værdi: 230 Derefter skal programmet gå ind i tabllen nederst og checke 90, 230. I dette tilfælde er det 7,6, så den kan godt bruges. Havde Z punktet i den nederste tabel været f.eks 25,3 ved et givet X/Y punkt, kunne den ikke bruges. I tilfælde hvor det nederste Z punkt er over 23, skal programmet selv finde den højeste X værdi (i øverste tabel), der ligger på eller under 23, så den hele tiden finder den næsthøjeste X værdi, indtil den passer i nederste tabel, hvor X/Y punktet skal være under 23.
Dette ser lidt indviklet ud, men jeg håber meget I kan hjælpe mig (kan I ikke hjælpe mig, håber jeg I har en adresse, man kan henvende sig til sig for yderligere hjælp).
Meget mystisk - jeg _havde_ kommenteret spørgsmålet, lukket min browser, kikket ind senere, og min kommentar var der stadig - men nu er den væk??? Hvorfor???
Nå - Det jeg skrev var noget i retning af:
Jeg var gået i gang med at svare på dit sp., men så at de samme Z-værdier optræder flere steder i tabellen - altså kan man ikke umiddelbart interpolere. Således forstår jeg ikke helt reglerne for hvordan man skal aflæse X,Y-værdier ud fra en vilkårlig Z-værdi...?
Så før jeg kan svare, så fortæl mig lige følgende:
Input Z=10000, hvad er output (X=?, Y=?)? Input Z=9101, hvad er output (X=?, Y=?)
Bemærk, at tallet 9101 optræder 2 gange i tabellen.
Umiddelbart kan jeg ikke se om du har svaret (jeg er ny på Eksperten, så jeg ikke helt klar over hvordan det virker....:O)) Men hvis du har svaret kan du så ikke sende en mail til mig på mop@skov.dk og fortælle hvordan jeg ser dine svar?????
Bare rolig - jeg har ikke svaret endnu. Når jeg svarer, vil der stå "svar" i stedet for kommentar - og er du glad for svaret, acceptere du og giver mig og eventuelle andre point...
Tilbage til dit spørgsmål: Hvordan hulen kan du få Z=9101 til at give X=62 og Z=163?
Der er 2 steder man kan aflæse Z=9101 i din tabel - den ene aflæsning giver X,Y = 60,180, den anden giver X,Y=70,140 - hvordan får du det til 62,163?
Jeg kan absolut heller ikke gennemskue hvordan du får de angivne værdier for Z=10000?
Du bliver lige nødt til at forklare lidt bedre, hvad det er du gør for at få de resultater - og dermed forklare hvordan programmet skal virke :o)
Jeg indtaster en tilfældig Z værdi (mellem 134 og 13649 selvfølgelig), så skal programmet de X/Y punkter, hvor X er højest (mellem 0 og 90 og 140 og 230).
Samtidig må Z værdien i tabel 2 ikke overstige 23. Z værdien i tabel 2 finder jeg ved det X,Y punkt jeg fandt ovenfor. Er Z værdien over 23 i tabel2, skal programmet nu finde en mindre X værdi i tabel 1, så den til sidst kommer til at passe med 23 (eller under)
"Jeg indtaster en tilfældig Z værdi (mellem 134 og 13649 selvfølgelig), så skal programmet de X/Y punkter, hvor X er højest (mellem 0 og 90 og 140 og 230)"
Hvis jeg nu indtaster Z=9500 - hvad så? Hvor er "X så højest"?
Der findes en række (med X=60), hvori der er en værdi større og mindre end den valgte Z
MEN der findes også en anden række (med X=70), hvor der er 2 Z-værdier der ligger hhv. over og under den ønskede Z-værdi.
Hvordan er reglerne - skal du have X-værdien for den række, hvori den indtastede Z-værdi befinder sig - og hvis der er 2 rækker, skal den så tage den med den højeste X-værdi? Skal der interpoleres - og i så fald mellem hvilke værdier?
PS - dit regneark indeholder referencer til andre ark, så det har jeg droppet - du behøver ikke sende mig de andre, jeg skal bare forstå problemet, så skal jeg nok svare :o)
Er der mulighed for at vi kan skrives ved i morgen?? Jeg blvier nemlig nødt til at gå....
Hvis du har tid i morgen kan du skrive en mail til mig på mop@skov.dk når du kommer på nettet (før kl. 15.00) og så kan vi mødes herinde på Eksperten.dk og snakke videre om mit problem.
Du må vide hvordan interpoleringen principielt skal foretages - ellers kan du ikke bede om hjælp til det.
Så med tabellen og Z=9500 som input må du kunne vise mig et regnestykke, der når frem til X,Y = 72,140 - det kan jeg så leve en generel funktion ud af :o)
Martin-> nu er denne katagori jo ikke lige mit speciale, så jeg har lavet en excel-version, der arbejder som jeg kan læse spørgsmålet. Hent den på http://tommy.bak.homepage.dk/tabel.xls og se om du kan lave en funktion ud af det (der er ingen vba i den), men den kan måske hjælp lidt forståelsemæssigt /BAK
Bak -> dit regneark giver jo andre resultater end klausbobby siger det skal give? For Z=9500 skal resultatet være X,Y = 72,140!
Jeg kan stadig ikke se, hvordan man skal kunne interpolere noget som helst ud fra den tabel, idet de samme Z-værdier optræder flere steder med forskellige X,Y-værdier.
Z=9500 optræder - hvis man interpolere - både i rækken med X=60 og X=70 - hvordan vægtes den enkelte X-værdi, så man når frem til X=72, som jo er facit??? Det fatter jeg ikke!
Skal det forstås således, at man ignorere linien med X=60, derefter siger at X=70 for Z=9101 og X=80 for Z=13084 (ydergrænserne i rækken med X=70) - hvis man gør det, kan man interpolere sig frem til at X=70+(80-70)/(13084-9101)*(9500-9101)=71 (og ikke 72!!!)
Eller skal man udføre en interpolation som ovenstående for alle de rækker hvori den søgte Z findes, og derefter interpolere mellem resultaterne for hver række?
Uanset hvordan man vender og drejer det, kan jeg ikke se hvordan X nogensinde kan blive større end 71 for Z=9500???
Det er sikkert mig der er dum, eller også er det klausbobby der ikke rigtig ved hvordan han helt grundlæggende skal bruge tabellen - han har endnu ikke formået at forklare hvordan Z=9500 giver X,Y=72,140, og så længe den forklaring mangler kan jeg ikke hjælpe en tøddel:o(
Jeg tror jeg trækker mig fra dette sp, med mindre der kommer nyt i sagen ;o)
Nej - uanset hvordan jeg vender og drejer det, kan jeg ikke få noget som helst til at hænge sammen - så længe jeg ikke får en helt overordnet generel regel for hvordan man skal aflæse den tabel, kan jeg ikke komme videre. Ingen kan fortælle mig hvordan Z=9500 giver X,Y=72,140 - så jeg giver op.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.