Avatar billede ullum Praktikant
03. februar 2005 - 17:21 Der er 27 kommentarer og
1 løsning

valg af to tilfældige spillere

Vi er ni billardspillere der fører kampregnskab i et krydsfelt.
Ved venlig hjælp fra sjap http://www.eksperten.dk/spm/584659
fik jeg det til at virke automatisk.
Nu er verden bare skruet sådan sammen at nogle gange går antallet af kampe ikke op med antallet af deltagere, derfor har jeg brug for valg af to tilfældige spillere ud fra de her givne betingelser:

Spillerne står i felterne o10 til og med o18, der kan være tomme imellem de står altid i bunden de samme spillere er igen listet fra p4 til x4 startende fra venstre. Hvis der ud for nogen af disse i krydsfeltet står et "a" må de ikke vælges. Krydsfeltet ligger i p10 til og med
X18 (øverste højre / nederste venstre) "a" indikere at man er udtaget til en kamp og man kan derfor ikke spille mod sig selv

Jeg ved ikke om i skal bruge dette også, men det er hovedsageligt det automatiske valg:


Const OffsetRække = 9      'Antallet af rækker over tabelområdet (inkl. overskrifter)
Const OffsetKolonne = 15 'Antallet af kolonner til venstre for tabelområdet (inkl. overskrifter)
Const MaksDeltagere = 9      'Det maksimale antal deltagere, der er plads til i tabellen
                            'Har intet med det aktuelle antal deltagere at gøre

Private Sub CommandButton2_Click()
Dim Deltager1, Deltager2, Tæller, AntalMulig As Integer
Dim MuligModstander(MaksDeltagere)
Dim MuligModstander2(MaksDeltagere - 2)
Const MaksTæller = 10000

For i = OffsetRække + 1 To OffsetRække + MaksDeltagere
    For j = OffsetKolonne + 1 To OffsetKolonne + MaksDeltagere
        If Worksheets("1 spilledag").Cells(i, j) = "a" Or Worksheets("1 spilledag").Cells(i, j) = "b" Then
            Worksheets("1 spilledag").Cells(i, j) = "X"
        End If
    Next j
Next i

AntalDeltagere = 0
For i = 1 To MaksDeltagere
    If Not IsEmpty(Worksheets("1 spilledag").Cells(OffsetRække + i, OffsetKolonne)) Then
        AntalDeltagere = AntalDeltagere + 1
    End If
Next i

Randomize
Tæller = 0
Do Until Tæller > MaksTæller Or AntalMulig > 0
    Deltager1 = Int((AntalDeltagere * Rnd) + 1)
    AntalMulig = 0
    For i = 1 To AntalDeltagere
        If IsEmpty(Worksheets("1 spilledag").Cells(Deltager1 + OffsetRække, i + OffsetKolonne)) And Deltager1 <> i Then
            AntalMulig = AntalMulig + 1
            MuligModstander(AntalMulig) = i
        End If
    Next i
    Tæller = Tæller + 1
Loop
If AntalMulig > 0 Then
    Deltager2 = MuligModstander(Int((AntalMulig * Rnd) + 1))
    Worksheets("1 spilledag").Cells(Deltager1 + OffsetRække, Deltager2 + OffsetKolonne) = "a"
End If

Tæller = 0
For i = 1 To AntalDeltagere
    If Deltager1 <> i And Deltager2 <> i Then
        Tæller = Tæller + 1
        MuligModstander2(Tæller) = i
    End If
Next i

AntalMulig = 0
Tæller = 0
Do Until Tæller > MaksTæller Or AntalMulig > 0
    Deltager3 = MuligModstander2(Int(((AntalDeltagere - 2) * Rnd) + 1))
    AntalMulig = 0
    For i = 1 To AntalDeltagere - 2
        If IsEmpty(Worksheets("1 spilledag").Cells(Deltager3 + OffsetRække, MuligModstander2(i) + OffsetKolonne)) And Deltager3 <> MuligModstander2(i) Then
            AntalMulig = AntalMulig + 1
            MuligModstander(AntalMulig) = MuligModstander2(i)
        End If
    Next i
    Tæller = Tæller + 1
Loop
If AntalMulig > 0 Then
    Deltager4 = MuligModstander(Int((AntalMulig * Rnd) + 1))
    Worksheets("1 Spilledag").Cells(Deltager3 + OffsetRække, Deltager4 + OffsetKolonne) = "b"
End If

End Sub

Private Sub CommandButton3_Click()

Offset = OffsetRække + 2
For j = OffsetKolonne + 1 To OffsetKolonne + MaksDeltagere
    For i = Offset To OffsetRække + MaksDeltagere
        Worksheets("1 spilledag").Cells(i, j).ClearContents
    Next i
    Offset = Offset + 1
Next j

End Sub
Private Sub CommandButton1_Click()

End Sub

Private Sub ComboBox1_Change()

End Sub

Private Sub ScrollBar1_Change()

End Sub

Private Sub Worksheet_Activate()

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub
Sub Makro6()
  X = [j10]
  [o10].Value = X
  X = [j11]
  [o11].Value = X
  X = [j12]
  [o12].Value = X
  X = [j13]
  [o13].Value = X
  X = [j14]
  [o14].Value = X
  X = [j15]
  [o15].Value = X
  X = [j16]
  [o16].Value = X
  X = [j17]
  [o17].Value = X
  X = [j18]
  [o18].Value = X
End Sub
Avatar billede sjap Praktikant
03. februar 2005 - 23:35 #1
Hej igen ullum

Jeg skal lige se om jeg har forstået det korrekt. Der vil være tilfælde, hvor kun to spillere mangler at spille en kamp, men der skal fire spillere. Derfor skal der udtages to spillere som i princippet kommet til at spille en kamp for meget.

Hvis det er korrekt, så skal du sådan set blot have lavet en funktion der vælger Deltager3 og Deltager4 UDEN hensyn til om de har spillet i forvejen.
Avatar billede sjap Praktikant
03. februar 2005 - 23:56 #2
I den sidste del af "Private Sub CommandButton2_Click" (lige inden
"Private Sub CommandButton3_Click") har du følgende sætninger:

If AntalMulig > 0 Then
    Deltager4 = MuligModstander(Int((AntalMulig * Rnd) + 1))
    Worksheets("1 Spilledag").Cells(Deltager3 + OffsetRække, Deltager4 + OffsetKolonne) = "b"
End If

Disse sætninger skal du erstatte med nedenstående:

If AntalMulig > 0 Then
    Deltager4 = MuligModstander(Int((AntalMulig * Rnd) + 1))
    Worksheets("Kampskema").Cells(Deltager3 + OffsetRække, Deltager4 + OffsetKolonne) = "b"
Else
    Tæller = 0
    Deltager3 = MuligModstander2(Int(((AntalDeltagere - 2) * Rnd) + 1))
    Deltager4 = Deltager3
    Do Until Tæller > MaksTæller Or Deltager3 <> Deltager4
        Deltager4 = MuligModstander2(Int(((AntalDeltagere - 2) * Rnd) + 1))
        Tæller = Tæller + 1
    Loop
    Worksheets("Kampskema").Cells(OffsetRække + 11, OffsetKolonne + 1) = Worksheets("Kampskema").Cells(Deltager3 + OffsetRække, OffsetKolonne)
    Worksheets("Kampskema").Cells(OffsetRække + 12, OffsetKolonne + 1) = Worksheets("Kampskema").Cells(Deltager4 + OffsetRække, OffsetKolonne)
End If
Avatar billede ullum Praktikant
04. februar 2005 - 12:18 #3
det er korrekt forstået. Der er en lille tillægs ting, kan vi få de to udvalgte vist i et to felter, idet vi ikke har a / b til at køre det videre.
Jeg kunne godt se ved gennemlæsning at der manglede et par kommaer, hvorfor er man så åndsvag at gennemlæse efter der er trykket på send
Nu håber jeg der er p nok ;-9, jeg har det jo med at få ekstra idder.
Jeg har fundet ud af hvorfor den ikke altid beregner sidst kamp, det er fordi den kan "male sig selv op i et hjørne", derfor lavede jeg en funktion med fortryd kamp.
Avatar billede sjap Praktikant
04. februar 2005 - 13:43 #4
Hvor er det, du gerne vil have dem vist? I mit eksempel skrives navnene på de to spillere under tabellen.
Avatar billede ullum Praktikant
05. februar 2005 - 08:56 #5
jeg har dem stående i z 4 til og med z 12 hvor de står fast, altså ikke som variable. Hvad med at lave noget betinget formatering på de to der matcher så felterne der får en anden farve.
Avatar billede sjap Praktikant
05. februar 2005 - 19:17 #6
Du kan blot erstatte disse to linier:

    Worksheets("Kampskema").Cells(OffsetRække + 11, OffsetKolonne + 1) = Worksheets("Kampskema").Cells(Deltager3 + OffsetRække, OffsetKolonne)
    Worksheets("Kampskema").Cells(OffsetRække + 12, OffsetKolonne + 1) = Worksheets("Kampskema").Cells(Deltager4 + OffsetRække, OffsetKolonne)

med dem her:

    Worksheets("Kampskema").Cells(3 + Deltager3, 26).Font.ColorIndex = 2
    Worksheets("Kampskema").Cells(3 + Deltager3, 26).Interior.ColorIndex = 3
    Worksheets("Kampskema").Cells(3 + Deltager4, 26).Font.ColorIndex = 2
    Worksheets("Kampskema").Cells(3 + Deltager4, 26).Interior.ColorIndex = 3

Der bliver ændret farve i både forgrund og baggrund, men du behøver selvfølgelig ikke bruge begge dele. Hvis du vil bruge andre farver, så slå op i hjælpen under ColorIndex.
Avatar billede ullum Praktikant
07. februar 2005 - 17:54 #7
får denne fejl

Subscript out of range
Worksheets("Kampskema").Cells(Deltager3 + OffsetRække, Deltager4 + OffsetKolonne) = "b"
Avatar billede sjap Praktikant
07. februar 2005 - 18:33 #8
Hej ullum

Jeg havde ikke lige registreret hvilket navn du har på fanebladet. Prøv med nedenstående i stedet.

If AntalMulig > 0 Then
    Deltager4 = MuligModstander(Int((AntalMulig * Rnd) + 1))
    Worksheets("1 Spilledag").Cells(Deltager3 + OffsetRække, Deltager4 + OffsetKolonne) = "b"
Else
    Tæller = 0
    Deltager3 = MuligModstander2(Int(((AntalDeltagere - 2) * Rnd) + 1))
    Deltager4 = Deltager3
    Do Until Tæller > MaksTæller Or Deltager3 <> Deltager4
        Deltager4 = MuligModstander2(Int(((AntalDeltagere - 2) * Rnd) + 1))
        Tæller = Tæller + 1
    Loop
    Worksheets("1 Spilledag").Cells(3 + Deltager3, 26).Font.ColorIndex = 2
    Worksheets("1 Spilledag").Cells(3 + Deltager3, 26).Interior.ColorIndex = 3
    Worksheets("1 Spilledag").Cells(3 + Deltager4, 26).Font.ColorIndex = 2
    Worksheets("1 Spilledag").Cells(3 + Deltager4, 26).Interior.ColorIndex = 3
End If
Avatar billede ullum Praktikant
07. februar 2005 - 19:27 #9
nu sker der godt nok noget med de celler, desværre har jeg fedtet mig lidt ind i det.
Kan vi lave sådan at cellerne resettes når jeg trykker "slet skema", tror det er command buttom 2
Jeg tror også at den vælger to til sidst når kamp antallet går op, men jeg er ikke sikker
Avatar billede sjap Praktikant
07. februar 2005 - 19:53 #10
Under koden for commandbutton2 indsætter du blot nedenstående. Det sætter for- og baggrund til default-farvevalg. Hvis du bruger andre farver, så må du lige rette de to 0'er (slå evt. op i hjælpen under ColorIndex, for at se numrene for farverne).

For Each c In Worksheets("1 Spilledag").Range("Z4:Z12")
    With c
        .Font.ColorIndex = 0
        .Interior.ColorIndex = 0
    End With
Next
Avatar billede ullum Praktikant
07. februar 2005 - 21:11 #11
DEt bliver bedre og bedre, lille fejl, den foreslog en spiller der faktisk var registreret med a, men jeg tror at grunden er der kun spørges på de lodrette altså
o 10 til 18 og ikke på de vandrette p4 til x4, men ellers virker det fint
Avatar billede sjap Praktikant
07. februar 2005 - 22:48 #12
Hmm. det skulle faktisk ikke kunne lade sig gøre. Så vil den også af og til komme til at forslå en spiller til "b" som allerede står med et "a" - det er nemlig samme princip, der anvendes. Jeg kan ikke lige få den til at lave den fejl.
Avatar billede sjap Praktikant
07. februar 2005 - 22:50 #13
Hvad mener du med, at der kun spørges på de lodrette?
Avatar billede ullum Praktikant
08. februar 2005 - 09:51 #14
Det er når vi foreslår ekstra spillere til den overskydende kamo, der er der ingen med b.
spillerne står i et krydsfelt hvor de er registreret både lodret og vandret
Avatar billede sjap Praktikant
08. februar 2005 - 10:21 #15
Jeg er stadig ikke helt med.

- Først findes to spillere til "a"
- Så findes to spillere til "b"
- Hvis der ikke er ledige/lovlige spillere til "b", så vælges to tilfældige spillere, der ikke er med i "a". Disse to spillere markeres ikke i spilleplanen, men formateres med farver i Spilleroversigten.

Det går jeg ud fra, er korrekt. Jeg forstår ikke hvad det er du skriver kl. 09:51:40.
Avatar billede ullum Praktikant
08. februar 2005 - 12:21 #16
08/02-2005 10:21:24 Helt korrekt opfattet. Men jeg kørte noget test igår aftes og der tog den en til "ekstra holdet" som i forvejen stod til "a", derfor tog jeg for givet at den havde hentet navnet fra den vandrette linie, jeg kan lave et screenshot og sende til dig
Avatar billede sjap Praktikant
08. februar 2005 - 14:02 #17
Det er ikke fordi, jeg ikke tror på dig. Jeg har bare ikke kunnet reproducere fejlen. Måske kan der være et problem med opsætningen (hvordan cellerne står i regnearket, i forhold til hvordan koden "tror" det står).
Avatar billede sjap Praktikant
08. februar 2005 - 22:42 #18
Henrik

Hvis du stadig har det regneark du sendte til mig, så prøv at erstatte linierne

    Worksheets("1 Spilledag").Cells(3 + Deltager3, 26).Font.ColorIndex = 2
    Worksheets("1 Spilledag").Cells(3 + Deltager3, 26).Interior.ColorIndex = 3
    Worksheets("1 Spilledag").Cells(3 + Deltager4, 26).Font.ColorIndex = 2
    Worksheets("1 Spilledag").Cells(3 + Deltager4, 26).Interior.ColorIndex = 3

med

    Worksheets("1 Spilledag").Range("Z4:Z12").Find(Worksheets("1 spilledag").Cells(Deltager3 + OffsetRække, OffsetKolonne)).Font.ColorIndex = 3
    Worksheets("1 Spilledag").Range("Z4:Z12").Find(Worksheets("1 spilledag").Cells(Deltager4 + OffsetRække, OffsetKolonne)).Font.ColorIndex = 3

og se om du kan få det til at køre uden fejl. Hvis ikke må vi finde på en anden måde at lave opslaget på.
Avatar billede ullum Praktikant
09. februar 2005 - 18:51 #19
kører ikke med
  Worksheets("1 Spilledag").Range("Z4:Z12").Find(Worksheets("1 spilledag").Cells(Deltager3 + OffsetRække, OffsetKolonne)).Font.ColorIndex = 3
  Worksheets("1 Spilledag").Range("Z4:Z12").Find(Worksheets("1 spilledag").Cells(Deltager4 + OffsetRække, OffsetKolonne)).Font.ColorIndex = 3

men kører med
Worksheets("1 Spilledag").Cells(3 + Deltager3, 26).Font.ColorIndex = 2
    Worksheets("1 Spilledag").Cells(3 + Deltager3, 26).Interior.ColorIndex = 3
    Worksheets("1 Spilledag").Cells(3 + Deltager4, 26).Font.ColorIndex = 2
    Worksheets("1 Spilledag").Cells(3 + Deltager4, 26).Interior.ColorIndex = 3


men så er vi vel tilbage ved
Kommentar: ullum
07/02-2005 21:11:53
Avatar billede sjap Praktikant
09. februar 2005 - 19:07 #20
Har en ide. Skal lige prøve den, så jeg vender nok tilbage indenfor en halv times tid.
Avatar billede ullum Praktikant
09. februar 2005 - 19:46 #21
fint
Avatar billede sjap Praktikant
09. februar 2005 - 19:46 #22
Hej igen

Prøv med nedenstående. Det virker her - og det er ikke lykkedes mig at få det til at fejle (endnu?)

    For Each c In Worksheets("1 Spilledag").Range("Z4:Z12")
        If c = Worksheets("1 spilledag").Cells(Deltager3 + OffsetRække, OffsetKolonne) Or c = Worksheets("1 spilledag").Cells(Deltager4 + OffsetRække, OffsetKolonne) Then
            c.Font.ColorIndex = 2
            c.Interior.ColorIndex = 3
        Else
            c.Font.ColorIndex = 0
            c.Interior.ColorIndex = 0
        End If
    Next
Avatar billede sjap Praktikant
09. februar 2005 - 19:47 #23
Hmm. Der kan du bare se. Du kan få et svar på kun 2 sekunder! ;0)
Avatar billede ullum Praktikant
09. februar 2005 - 19:51 #24
ha ha, læste lige i EB jeg chekker
Avatar billede ullum Praktikant
09. februar 2005 - 19:53 #25
behøver jeg at sige mere
Avatar billede sjap Praktikant
09. februar 2005 - 19:55 #26
:0))
Avatar billede ullum Praktikant
09. februar 2005 - 19:56 #27
jeg har så et tillægs spm.: men du er nok den eneste rigtige til at svare. Jeg vil gerne give ekstra p om nødvendigt.
De felter hvor der tælles point sammen (dem der highlightes til sidst) hvad sker der hvis jeg laver en betinget formateting, noget med at hvis spilleren ikke er i krydsfeltet skal han heller ikke stå på listen. jeg kan selvf  bare prøve ;-)
Avatar billede ullum Praktikant
09. februar 2005 - 19:58 #28
http://www.eksperten.dk/spm/589420 så er der jo også denne
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
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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