13. august 2000 - 23:14Der er
13 kommentarer og 1 løsning
Udregning i Excel
Nu orker jeg ikke at prøve mere. Please, hjælp mig !!!! \"Opgaven\" er som følger:
Når en bestemt formular åbnes, skal en tabel (som ikke har noget med formularen at gøre) sendes over i et Excelark. Desuden skal indholdet fra 2 tekstbokse sendes over i hver sin celle i Excelarket, efter de er opdateret i formularen. Excelarket er nødt til at være et bestemt et, da det skal indeholde en temmelig lang formel (HVIS + VOPSLAG),for at udføre den beregning, der skal bruges, med mindre man kan skrive den funktion i VB, sammen med alt det andet. Når resultatet er regnet ud i Excel, skal det overføres til en tekstboks i formularen. Jeg har forsøgt med både object og DDE, men nu opgiver jeg altså. Fortæl venligst også, hvor \"tingene\" skal skrives/laves. På forhånd tak for jeres indsats. P.S. Jeg er kun på nettet, når jeg er på arbejde, så der kan ske at gå op til 5 dage, inden jeg ser jeres svar. Sorry!
Jeg tror godt, udregningen kan laves i VB, så det ikke er nødvendigt at overføre til Excel. Hvis du skriver formlen fra Excel her, skal jeg se om jeg kan lave et stykke kode, der kan udføre tricket. Skriv også, hvilke felter/tabelværdier, der skal bruges i beregningen.
Been there! Jeg er enig med de andre at det er synd at sende det hele frem og tilbage. Men af og til kan det være meget rart at få fat i Excel, for eksempel til grafer. Her er noget kode jeg brugte. Jeg havde dog bøvl med at lukke min computer bagefter, så den er vist ikke bugfree: Option Compare Database Option Explicit
\' Erklær de nødvendige API-rutiner: Declare Function FindWindow Lib \"user32\" Alias _ \"FindWindowA\" (ByVal lpClassName As String, _ ByVal lpWindowName As Long) As Long Declare Function SendMessage Lib \"user32\" Alias _ \"SendMessageA\" (ByVal hWnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long Function start() GetExcel
End Function Sub GetExcel() Dim MyXL As Object Dim ExcelWasNotRunning As Boolean Dim a As Integer, b As Integer, rst As Recordset On Error Resume Next
Set rst = henttabel Set MyXL = GetObject(, \"Excel.Application\") If Err.Number <> 0 Then ExcelWasNotRunning = True Err.Clear \' Nulstil objektet Err, hvis fejlen opstod. DetectExcel Set MyXL = GetObject(\"q:\\data\\lvp\\må ikke slettes.xls\") MyXL.Application.Visible = True MyXL.Parent.Windows(1).Visible = True
At undgå Excel og lave det hele i VB lyder meget tiltalende, da det meget gerne må ske, uden at brugeren opdager noget, så her kommer lidt yderligere oplysninger. De 2 tekstbokse, som iflg. ovenstående skulle overføres til Excel indeholder en \"Sværhedsgrad\" og en \"Placering\". Tabellen er nedenstående og er lavet sådan i Access. Sværheds- Placering grad 1 2 3 4 5 øvr. 1 5 4 3 2 1 0 2 12 10 8 6 4 2 3 18 15 12 9 6 3 4 24 20 16 12 8 4 5 30 25 20 15 10 5 6 36 30 24 18 12 6
Hvis \"Sværhedsgrad\" er 4 og \"Placering\" er 3 = 16 point, som så skal vises i en tekstboks i formularen og derved gemmes i den underliggende tabel. Håber dette kan få nogen til at komme med løsningen. Hilsen tinabymor.
1) Læs tabellen over i et VB - array; det kan du bare gøre med noget simpel kode, der tager dataene fra tabellen og smider dem over i arrayet. 2) Nu kan du udlæse antal point direkte fra arrayet.
Altså noget i retning af: Dim Tabel(6, 6) As Integer
Så udfører du noget kode, der læser indholdet af tabellen over i Arrayet. Hvis så Sværhedsgrad og Placering er et tal mellem 1 og 6 skriver du således for at tildele værdien til en tekstboks i formularen:
Til driis Det lyder vældig smart, men kan jeg få dig til at specificere det lidt nærmere, for jeg er stadig nybegynder m.h.t. VB. Hvis du kan skrive programmeringen helt ud og helst også fortælle, hvor det skal skrives, så bliver du \"dagens mand i skysovs\"
Det er lige ved at fungere. Jeg har lavet SQL-sætningen om til SELECT Table1.Point FROM Table1 WHERE (((Table1.Svær)=Forms![MyForm]![Tekst1] AND ((Table1.Plads)=IIf([Placering]>6,6,Forms![MyForm]![Tekst2]))); Sålænge placeringen er 6 eller derunder, så virker det perfekt, men når placeringen bliver over 6, så returnerer den 0, istedet for at returnere pointene for en 6. plads. Jeg troede IIf ville sørge for, at hente pointene for en 6. plads, når placeringen i Tekst2 var højere. Be\' om lidt mere hjæp.
HOV !! Der var også en fejl i din formel. Den korrekte hedder:
SELECT Table1.Point FROM Table1 WHERE (((Table1.Svær)=Forms![MyForm]![Tekst1]) AND ((Table1.Plads)=IIf(Forms![MyForm]![Tekst2]>6,6,Forms![MyForm]![Tekst2])));
Tak til alle, der har forsøgt at hjælpe. Det virker nu, med moses forslag.
Synes godt om
Ny brugerNybegynder
Din løsning...
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.