Avatar billede lynser Nybegynder
16. november 2006 - 14:48 Der er 13 kommentarer og
1 løsning

Hjælp kvindelig økonomi-studerende med VBA-problem

Vi har en opgave, hvor vi skal sortere en tabel, hvor der skal tages højde for to kolonner (tabellen består af 3 kolonner: Job, tid for maskine 1, tid for maskine 2).
Problemet består i at finde den optimale jobplanlægning med følgende algoritme:
1. Find den mindste af alle tider for de endnu ikke planlagte jobs (begge kolonner), og vælg det tilhørende job
2. Hvis det valgte job har sin mindste tid i kolonne 1, så planlæg det tidligst muligt. Hvis det valgte job har sin mindste tid i kolonne 2, så planlæg det senest muligt. Gå til trin 1, hvis der er flere jobs tilbage)

Dette kan kontrolleres ved at benytte følgende:
Hvis job j tager tiden pj og qj på maskine 1 og 2, mens job k tager tiden pk og qk på maskine 1 og 2, så er det optimalt at lade job j stå foran job k, hvis

Min(qj,pk) >= min(pj,qk),

Resultatet skal udskrives i en ny tabel.
Avatar billede shy Nybegynder
16. november 2006 - 23:17 #1
Forstår godt problem stillingen, men det er lidt svært at hjælpe for hvad snakker vi, Excel, Word, eller VB6? Hvordan er bruger interfacet o.s.v.
Men send projektet til hyltoft@msn.com så vil jeg gerne kigge på det!
Avatar billede supertekst Ekspert
17. november 2006 - 08:52 #2
Hvis muligt - så prøv at vise data fra den usorterede tabel og herefter den sorterede. Antager at det er i Excel - har begyndelsen til en model.
Avatar billede kjulius Novice
18. november 2006 - 20:12 #3
Jeg ved ikke helt, hvordan opgaven skal tolkes, men her er mit lille bidrag. Hvis du har en tabel med f.eks. følgende data:

Jobnavn    Maskine1tid    Maskine2tid
Job1    10    85
Job2    22    993
Job3    993    22
Job4    992    11
Job5    223    1192
Job6    992    11
Job7    99    112

Jeg tror resultatet skal være:

Jobnavn    Maskine1tid    Maskine2tid
Job5    223    1192
Job7    99    112
Job2    22    993
Job1    10    85
Job6    992    11
Job4    992    11
Job3    993    22

Resultatet er nået ved brug af følgende SQL:

SELECT Jobafviklingskø.Jobnavn, Jobafviklingskø.Maskine1tid, Jobafviklingskø.Maskine2tid
FROM Jobafviklingskø
ORDER BY IIf(Maskine1tid<Maskine2tid,-Maskine1tid,Maskine2tid);

Jeg ved, at det er SQL og ikke VBA, men måske kan du "oversætte" det til noget brugbart.
Avatar billede kjulius Novice
18. november 2006 - 20:17 #4
Det viste eksempel er lavet i Access, hvor IIf funktionen bruges. Hvis man anvender standard SQL, som de fleste databaser bruger, så anvendes i stedet en CASE funktion (som måske er lettere at gennemskue):

SELECT Jobnavn, Maskine1tid, Maskine2tid
FROM Jobafviklingskø
ORDER BY CASE WHEN Maskine1tid < Maskine2tid THEN -Maskine1tid ELSE Maskine2tid END;
Avatar billede shy Nybegynder
20. november 2006 - 09:18 #5
Et svar :o)
Avatar billede kjulius Novice
20. november 2006 - 19:12 #6
Øhh, hvad var det accepterede svar. Måske kan vi jo lære noget.
Avatar billede lynser Nybegynder
20. november 2006 - 19:26 #7
Det er sent til min mail. Og løst vha. VBA, som var spørgsmålet.
Avatar billede fixxxer Nybegynder
20. november 2006 - 19:33 #8
http://www.eksperten.dk/regler.phtml

   
Sidste nyt fra Eksperten : 1. skridt i moderniseringen af Eksperten
Som led i den store modernisering af Eksperten vil vi gerne have dig til at besvare nogle spørgsmål. Vi er interesserede i feedback, således at vi kan sørge for, at eksperten bliver tilpasset dig som ... [læs mere]

Du er her : Eksperten : Reglement :

Ved accept af Eksperten.dk’s regler har du tilkendegivet, at du forstår og accepterer nedenstående betingelser.

  1. Brugeroprettelse

        1. For at oprette eller besvare spørgsmål på Eksperten.dk skal du være oprettet som bruger. Ved oprettelse på Eksperten.dk skal du opgive en gyldig e-mailadresse. Denne e-mailadresse skal altid være gyldig, så Eksperten.dk altid har mulighed for at kontakte dig. Gentagne henvendelser uden svar kan medføre deaktivering af brugeren.

        2. Det er kun tilladt at have én brugerprofil på Eksperten.dk, med mindre andet er aftalt med Admin eller CoAdmins.
              1. Hvis man af den ene eller anden årsag ønsker at skifte brugernavn, skal dette ske ved først at lukke sin eksisterende bruger for derefter at oprette en ny bruger. Det er under ingen omstændigheder tilladt at overføre pointene fra den gamle bruger til den nye bruger. NB: Eksperten Pro-brugere kan under Konto -> Indstillinger skifte brugernavn og behøver derfor ikke at gøre som beskrevet ovenfor.


        3. Det er, ifølge loven om ophavsret, ikke tilladt at kopiere indhold fra Eksperten.dk for at gengive det andre steder uden skriftlig tilladelse fra IDG Danmark A/S. Det gælder naturligvis ikke for en brugers egne indlæg, som brugeren selv disponerer over. Alle kan frit bruge de løsninger, der bliver udvekslet på webstedet, men kopiering af tekst til andre medier, webssteder, bøger, artikler med mere skal foregå inden for lovens rammer om citater. IDG Danmark forbeholder sig som udgiver ret til at kunne bruge indlæg og løsninger i firmaets produkter.

        4. Brugernavnet må ikke indeholde eller minde om Admin eller CoAdmin, og må desuden heller ikke indeholde diverse ukvemsord, ord der kan være nedladende, racistiske, seksuelle eller lignende. Ligesom indlæg på Eksperten.dk skal holdes i en sober tone, skal brugernavnet også holdes i en sober tone. Det er heller ikke tilladt at benytte navnet på et domæne (f.eks. www_domæne_dk eller domæne_dk) som brugernavn.

2. Regler for brug af Eksperten.dk
1. Det er ikke tilladt at:
12. tildele point for en løsning, der ikke er tilgængelig for alle Eksperten.dk’s brugere.
Avatar billede fixxxer Nybegynder
20. november 2006 - 19:34 #9
Hov det gik helt galt i copy/paste.. Men humlen er vist at løsningen (såfremt der gives point for denne) skal være tilgængelig på eksperten..

Personligt er jeg bedøvende ligeglad, men det kan være at I ikke var klar over det.
Avatar billede lynser Nybegynder
20. november 2006 - 19:52 #10
Nej, det var jeg virkelig ikke klar over. Det er første gang jeg benytter Eksperten.
Avatar billede shy Nybegynder
20. november 2006 - 20:40 #11
Nå det er jeg da virkelig ked af. Det er svært at beskrive et helt Excel projekt i ren tekst, derfor foreslog jeg "lynser" at jeg læste opgave teksten og sendte Excel filen retur. Det havde været lettere hvis man kunne vedhæfte filer i sit svar. Så hermed svaret, og undskyld mange gange, prøvede jo bare at hjælpe :-|

Public Sub Beregn()
Dim X1 As Integer
Dim X2 As Integer
Dim X3 As Integer
Dim Xn As Integer
Dim Value As Integer
Dim Index As Integer
Dim NewIndex(100) As Integer
Dim Used(100) As Boolean
Dim Start1(100) As Integer
Dim Start2(100) As Integer

'Her findes antallet af jobs
For X1 = 2 To 100
    If Range("A" & X1).Value = "" Then
        Xn = X1 - 2
        Exit For
    End If
Next X1

X2 = 1: X3 = Xn
While (X3 >= X2)
    If (X3 >= X2) Then
        Value = 9999
        For X1 = 1 To Xn
            If Used(X1) = False Then
                'Find næste job i rækken for maskine 1
                If (Range("B" & X1 + 1).Value < Value) Then
                    Index = X1
                    Value = Range("B" & X1 + 1).Value
                End If
            End If
        Next X1
        Used(Index) = True
        NewIndex(X2) = Index
        Range("F" & Index + 1).Value = X2 'Nr. i sekvens skrives her
        X2 = X2 + 1
    End If
   
    If (X3 >= X2) Then
        Value = 9999
        For X1 = 1 To Xn
            If Used(X1) = False Then
                'Find næste job i rækken for maskine 1
                If (Range("C" & X1 + 1).Value < Value) Then
                    Index = X1
                    Value = Range("C" & X1 + 1).Value
                End If
            End If
        Next X1
        Used(Index) = True
        NewIndex(X3) = Index
        Range("F" & Index + 1).Value = X3 'Nr. i sekvens skrives her
        X3 = X3 - 1
    End If
Wend

'Start tider beregnes for maskine 1
For X1 = 1 To Xn
    Start1(X1 + 1) = Start1(X1) + Range("B" & NewIndex(X1) + 1).Value
Next X1

'Start tider beregnes for maskine 2
For X1 = 1 To Xn
    Start2(X1 + 1) = Start2(X1) + Range("B" & NewIndex(X1) + 1).Value
Next X1

'Skriv maskintiderne i tabel 2
For X1 = 1 To Xn
    Range("E" & X1 + 1).Value = X1
    Range("G" & NewIndex(X1) + 1).Value = Start1(X1)
    Range("H" & NewIndex(X1) + 1).Value = Start2(X1 + 1)
Next X1

'Skriv Timespan værdien
Range("H15").Value = "Makespan = " & Start2(X1) + Range("C" & NewIndex(Xn) + 1).Value

End Sub
Avatar billede kjulius Novice
20. november 2006 - 21:01 #12
Undskyld, hvis jeg har sat lus i skindpelsen! Det var ikke for at gøre nogen kede af det. Men hele formålet med sitet her er jo, at man kan hjælpe hinanden (det har du jo gjort, shy, så den del er helt i orden), og lære af hinandens løsninger. Det sidste er jo lidt svært, når man hverken får løsningen eller mellemregninger.

Men tak for svaret. Koden ser overbevisende ud, uden at jeg har tjekket løsningen. :-) - jeg håber du hurtigt får humøret igen, så du er klar til at hjælpe den næste, som trænger...
Avatar billede shy Nybegynder
20. november 2006 - 21:08 #13
Tror som nok jeg sover i nat ;-) Men vedhæftning af filer kunne være en fin mulighed at have som del af løsnings forslaget...
Avatar billede kjulius Novice
20. november 2006 - 21:13 #14
Det tror jeg vi er mange, som gerne så Eksperten tillade, men det har vist desværre lange udsigter! :-(
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester