I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
Hvis dine tekster står i A2..A10 kan du f.eks. bruge
=INDIREKTE("A"&SLUMPMELLEM(2;10))
Bemærk at funktionen SLUMPMELLEM kræver at Analysis Toolpak er installeret (aktiveres ved hjælp af kommandoen Tilføjelsesprogrammer i menuen Funktioner).
der må gerne bruges makro, men det er mere kringlet end som så:
vi er ni spillere der er skrevet op i et krydsfelt
a b c d e f g h i a b c d e f g h i
Ved tryk på eksempelvis en knap eller cont. et eller andet skal vælge en kamp eksempelvis mellem b og h. Det bliver sjovere endnu, det er nemlig to hold med hver to spillere så egentlig skal der vælges to gange. I krydsfeltet udfyldes så om det er en kamp der er spillet så det skal der også tages hensyn til.
En stor mundfukd, men lad os nu bare holde os til starten. Kommer vi længere er der naturligvis flere p mvh
ok sjap dit forslag kører nøjagtig som det jeg spurgte efter, p til dig, har du (I) en ide til at komme videre, nu vil jeg spørg på felterne i krydsfeltet markeret med et "X" (for ikke spillet) formlen skal returnere navnene
Mit første forslag løser faktisk det problem som du beskrev. Det som du nu har beskrevet, er et helt andet problem, og kan nok bedst klares med en makro. Du kan relativt enkelt få en delvis løsning af problemet.
Den opdateres hver gang du trykker på F9, men den tager ikke højde for allerede afviklede kampe, og den tager ikke højde for at man ikke kan spille mod sig selv (tror jeg).
Placer et X i alle cellerne i diagonalen (disse kampe kan jo ikke spilles).
I celle B12 skrives =INDIREKTE("A"&SLUMPMELLEM(2;10)) &HVIS(C12=0;"";"")& INDIREKTE("A"&SLUMPMELLEM(2;10))
I menuen Funktioner/Indstillinger under fanebladet Beregning sættes et flueben ud for gentagelse og Maks. antal gentagelser sættes til 10000.
I celle C12 skrives =HVIS(FORSKYDNING($A$1;SAMMENLIGN(VENSTRE(B12);$A$2:$A$10;0);SAMMENLIGN(HØJRE(B12);A2:A10;0))="X";C12+1;0)
Hver gang du så trykker på F9 foreslås en kamp. Når kampen er afviklet, kan du sætte et X i tabellen ud for kampen. Så vil den ikke blive foreslået igen.
Bemærk at jo færre mulige kampe, der er, jo længere tid kan programmet bruge på at finde en ikke-afviklet kamp (det er det, de 10000 gentagelser skal bruges til). Hvis der foreslås en afviklet kamp, så prøv F9 igen eller sæt maks gentagelser højere.
Den skal også kopieres ud til alle celleren. Den skriver "a" ud for den kamp, der lige er valgt. Næste gang du trykker på F9 ændres det til "X" (som indikation af at kampen er afviklet). X'et bliver så stående i cellen til evig tid... Nåh nej, jeg har lavet funktionen sådan, at hvis du skriver 1 i celle C13 og trykker F9, så nulstilles kampskemaet.
Har overgivet mig til makroerne. Det sidste du bad om kan jeg simpelthen ikke får til at fungere med funktioner. Jeg har i stedet lavet en makro på en knap:
Dim Deltager1, Deltager2, Tæller As Integer Const MaksTæller = 10000
For i = 2 To 10 For j = 2 To 10 If Worksheets("Kampskema").Cells(i, j) = "a" Then Worksheets("Kampskema").Cells(i, j) = "X" End If Next j Next i
Randomize Tæller = 0 Do Until (Deltager1 <> Deltager2 And IsEmpty(Worksheets("Kampskema").Cells(Deltager1 + 1, Deltager2 + 1))) Or Tæller > MaksTæller Deltager1 = Int((9 * Rnd) + 1) Deltager2 = Int((9 * Rnd) + 1) Tæller = Tæller + 1 Loop If Tæller < MaksTæller Then Worksheets("Kampskema").Cells(Deltager1 + 1, Deltager2 + 1) = "a" End If
Af en eller anden grund som jeg ikke lige kan gennemskue, så sker det af og til, at der ikke kommer en ny kamp, men bare tryk på knappen igen, så sker der noget.
Her er en der skulle vælge 2 ad gangen, kamp a og kamp b
Sub KAMP() Dim Deltager1, Deltager2, Tæller As Integer Const MaksTæller = 20000 Fejl = False For i = 2 To 10 For j = 2 To 10 If Worksheets("Kampskema").Cells(i, j) = "a" Or Worksheets("Kampskema").Cells(i, j) = "b" Then Worksheets("Kampskema").Cells(i, j) = "X" End If Next j Next i
Randomize Tæller = 0 Do Deltager1 = Int((9 * Rnd) + 1) Deltager2 = Int((9 * Rnd) + 1) Tæller = Tæller + 1 If Tæller > MaksTæller Then GoTo Slut Exit Do End If If (Deltager1 <> Deltager2 And IsEmpty(Worksheets("Kampskema").Cells(Deltager1 + 1, Deltager2 + 1))) Then Worksheets("Kampskema").Cells(Deltager1 + 1, Deltager2 + 1) = "a" Exit Do End If Loop Tæller = 0 Do Deltager3 = Int((9 * Rnd) + 1) Deltager4 = Int((9 * Rnd) + 1) Tæller = Tæller + 1 If Tæller > MaksTæller Then Exit Do If Deltager3 <> Deltager4 And Deltager1 <> Deltager3 And Deltager2 <> Deltager4 _ And IsEmpty(Worksheets("Kampskema").Cells(Deltager3 + 1, Deltager4 + 1)) Then Worksheets("Kampskema").Cells(Deltager3 + 1, Deltager4 + 1) = "b" Exit Do End If Loop Slut: End Sub
kabbak > Det er måske muligt, at lave funktionen med makroer, men jeg mistede tålmodigheden. Det blev for svært st styre antallet af genberegninger. Så vidt jeg lige kan se, så er den eneste ændring du har lavet i den løkke, der generer kampene. Og så vidt jeg kan se, så foretages kontrollen af om kampen er gyldig med "if" og "exit Do". I min fagre ungdom (i forrige århundrede) blev jeg belært om at den slags programmer, er "dårlig programmering", og det sidder stadig så dybt i mig, at jeg vil gå langt for at undgå det. Men det er altså ikke så interessant hvorvidt det er dårligt eller ej. Det interessante er: Er det bedre. Dvs. undgås min fejl, hvor der i nogen tilfælde (godt nok sjældne) ikke foreslås en ny kamp, og er programmet hurtigere. Har du nogen ide om det?
sjap: dette er langt over min fatteevne, jeg har leget lidt med det du sendte mig, jeg kan få den til kun at slette halvdelen af X'erne idet den øverste højre halvdel egentlig er gentagelser og i dette tilfælde uinteressante. Næste punkt var også at få den til at skrive b men der hopper kæden af mit goto fungerer ikke
Private Sub CommandButton1_Click() Dim Deltager1, Deltager2, Tæller As Integer Const MaksTæller = 10000
For i = 2 To 10 For j = 2 To 10 If Worksheets("Kampskema").Cells(i, j) = "a" Then Worksheets("Kampskema").Cells(i, j) = "X" End If Next j Next i
For i = 2 To 10 For j = 2 To 10 If Worksheets("Kampskema").Cells(i, j) = "b" Then Worksheets("Kampskema").Cells(i, j) = "X" End If Next j Next i
If Worksheets("Kampskema").Cells(i, j) = "a" Then GoTo line1
Randomize Tæller = 0 Do Until (Deltager1 <> Deltager2 And IsEmpty(Worksheets("Kampskema").Cells(Deltager1 + 1, Deltager2 + 1))) Or Tæller > MaksTæller Deltager1 = Int((9 * Rnd) + 1) Deltager2 = Int((9 * Rnd) + 1) Tæller = Tæller + 1 Loop If Tæller < MaksTæller Then Worksheets("Kampskema").Cells(Deltager1 + 1, Deltager2 + 1) = "a" End If
1 Randomize Tæller = 0 Do Until (Deltager1 <> Deltager2 And IsEmpty(Worksheets("Kampskema").Cells(Deltager1 + 1, Deltager2 + 1))) Or Tæller > MaksTæller Deltager1 = Int((9 * Rnd) + 1) Deltager2 = Int((9 * Rnd) + 1) Tæller = Tæller + 1 Loop If Tæller < MaksTæller Then Worksheets("Kampskema").Cells(Deltager1 + 1, Deltager2 + 1) = "b" End If
End Sub
Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
End Sub
Man skal bare passe på hen mod slutningen, hvis det ikke går op vil den stå med en kamp hvor samme deltager skal spille på begge hold. Det vil nok være for vildt at lave noget der også tager højde for det, men kunne man ikke lave en slags "fortryd" i stil med:
For i = 2 To 10 For j = 2 To 10 If Worksheets("Kampskema").Cells(i, j) = "a" Or Worksheets("Kampskema").Cells(i, j) = "b" Then Worksheets("Kampskema").Cells(i, j) = "" End If Next j Next i End Sub
Giv point til sjap, han har fortjent dem, med sin ihærdige indsats med funktioner
Hmmm. Jeg synes at hver gang vi er lige ved at være der, så kommer der en ny komplikation.
Jeg kan god se din ide, men fik en anden ide, hvor man kan reducere antallet af søgninger. Ideen er simpelthen at man bruger et array, der indeholder de 9 spillere. Den første spiller vælges tilfældigt. Den valgte spiller fjernes fra arrayet, og kan derfor ikke vælges igen. den næste søgning foregår derfor kun blandt 8 spillere. For b-holdet vælges den første så kun blandt 7 spillere osv.
Det ser måske lidt kringlet ud i koden, men jeg er lige ved at tro det virker (lige bortset fra det der med diagonalen:
Private Sub CommandButton1_Click() Dim Deltager1, Deltager2, Tæller, AntalMulig As Integer Dim MuligModstander(9) Dim MuligModstander2(7) Const MaksTæller = 10000
For i = 2 To 10 For j = 2 To 10 If Worksheets("Kampskema").Cells(i, j) = "a" Or Worksheets("Kampskema").Cells(i, j) = "b" Then Worksheets("Kampskema").Cells(i, j) = "X" End If Next j Next i
Randomize Tæller = 0 Do Until Tæller > MaksTæller Or AntalMulig > 0 Deltager1 = Int((9 * Rnd) + 1) AntalMulig = 0 For i = 1 To 9 If IsEmpty(Worksheets("Kampskema").Cells(Deltager1 + 1, i + 1)) 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("Kampskema").Cells(Deltager1 + 1, Deltager2 + 1) = "a" End If
Tæller = 0 For i = 1 To 9 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((7 * Rnd) + 1)) AntalMulig = 0 For i = 1 To 7 If IsEmpty(Worksheets("Kampskema").Cells(Deltager3 + 1, MuligModstander2(i) + 1)) 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("Kampskema").Cells(Deltager3 + 1, Deltager4 + 1) = "b" End If
Hold da op der sker ting og sager, når man lige tager en tænkepause. Tag blot mit oplæg som en idé, og brug det eller lad være. Hvis du har fået lavet noget, der virker, så hold fast i det :0)
Hvordan undgår jeg at den genererer en kamp hvis ikke der står en deltager på felterne a2 a10/b1 til j1
Private Sub CommandButton1_Click() Dim Deltager1, Deltager2, Tæller, AntalMulig As Integer Dim MuligModstander(9) Dim MuligModstander2(7) Const MaksTæller = 10000
For i = 2 To 10 For j = 2 To 10 If Worksheets("Kampskema").Cells(i, j) = "a" Or Worksheets("Kampskema").Cells(i, j) = "b" Then Worksheets("Kampskema").Cells(i, j) = "X" End If Next j Next i
Randomize Tæller = 0 Do Until Tæller > MaksTæller Or AntalMulig > 0 Deltager1 = Int((9 * Rnd) + 1) AntalMulig = 0 For i = 1 To 9 If IsEmpty(Worksheets("Kampskema").Cells(Deltager1 + 1, i + 1)) 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("Kampskema").Cells(Deltager1 + 1, Deltager2 + 1) = "a" End If
Tæller = 0 For i = 1 To 9 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((7 * Rnd) + 1)) AntalMulig = 0 For i = 1 To 7 If IsEmpty(Worksheets("Kampskema").Cells(Deltager3 + 1, MuligModstander2(i) + 1)) 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("Kampskema").Cells(Deltager3 + 1, Deltager4 + 1) = "b" End If
End Sub
Private Sub CommandButton2_Click() For i = 2 To 10 For j = 2 To 10 If Worksheets("Kampskema").Cells(i, j) = "a" Or Worksheets("Kampskema").Cells(i, j) = "b" Then Worksheets("Kampskema").Cells(i, j) = "" End If Next j Next i
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
Du finder da også hele tiden på noget nyt! Kan du huske hvad dit oprindelige spørgmål var? Prøv lige at sammenligne det med komplexiteten af svaret.
Nå, men her er så et forsøg på at løse din sidste indskydelse. Den virker kun hvis du fjerner deltagere fra "bunden". Dvs. der må ikke være tomme felter midt i tabellen.
Option Base 1 Const OffsetRække = 2 'Antallet af rækker over tabelområdet (inkl. overskrifter) Const OffsetKolonne = 1 '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 CommandButton1_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("Kampskema").Cells(i, j) = "a" Or Worksheets("Kampskema").Cells(i, j) = "b" Then Worksheets("Kampskema").Cells(i, j) = "X" End If Next j Next i
AntalDeltagere = 0 For i = 1 To MaksDeltagere If Not IsEmpty(Worksheets("Kampskema").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("Kampskema").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("Kampskema").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("Kampskema").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("Kampskema").Cells(Deltager3 + OffsetRække, Deltager4 + OffsetKolonne) = "b" End If
End Sub
Private Sub CommandButton2_Click()
Offset = OffsetRække + 2 For j = OffsetKolonne + 1 To OffsetKolonne + MaksDeltagere For i = Offset To OffsetRække + MaksDeltagere Worksheets("Kampskema").Cells(i, j).ClearContents Next i Offset = Offset + 1 Next j
hej sjap det er ikke fordi at citronen skal presses til det yderste besvar venligst http://www.eksperten.dk/spm/586108 og hvis jeg ikke kan finde ud af det sidste opretter jeg endnu et spm
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.