Avatar billede janvogt Praktikant
16. december 2003 - 13:53 Der er 13 kommentarer og
1 løsning

VBA Kombinationsmuligheder

Jeg har brug for en VBA-kode, som kan liste antal kombinationsmuligheder i Excel.

Der skal udvælges enten "1" eller "0" i en 9-cifret streng således, at hver streng indeholder præcis fem "1".

Eksempel:
111110000
111101000
111100100
111100010
111100001
etc.

Så vidt jeg kan regne ud må der være 9*8*7*6*5 = 15.120 kombinationsmuligheder.

Nogen som kan hjælpe?
Avatar billede softcareconsult Nybegynder
16. december 2003 - 15:14 #1
Det er rigtigt, der er 15.120 kombinations muligheder, de fleste vil dog være ens!! Uden at skulle gå for meget i detaljer med matematiken ovenstående kunne betragtes som et binært tal som maksimalt kan være 2^9-1 = 511 ud af disse opfylder 126 din betingelse. Men til koden:

Sub Permut5Bit()
  Dim s As String
  Dim i As Long
  Dim Bits As Byte
  Bits = 9
  For i = 1 To 2 ^ Bits
    s = Deci2Bin(i, Bits)
    If CountBit(s) = 5 Then Debug.Print s
  Next
End Sub

Function Deci2Bin(ByVal i As Integer, l As Byte) As String
  Dim j As Byte
  For j = 1 To l
    If i Mod 2 > 0 Then
      s = "1" & s
    Else
      s = "0" & s
    End If
    i = Int(i / 2)
  Next j
  Deci2Bin = s
End Function

Function CountBit(s As String) As Byte
  Dim j, c As Byte
  For j = 1 To Len(s)
    c = c + CInt(Mid(s, j, 1))
  Next j
  CountBit = c
End Function
Avatar billede bak Seniormester
16. december 2003 - 15:15 #2
Hej jan, er du sikker på at der er så mange kombinationsmuligheder. Du benytter jo kun 0 og 1. Jeg mener kun at det giver 2^9 altså 512.
Avatar billede bak Seniormester
16. december 2003 - 15:17 #3
Godt gået , softcareconsult :-)
Avatar billede janvogt Praktikant
16. december 2003 - 15:22 #4
Ja, jeg mener det må være rigtigt, at der er 15.120 kombinationer.

Det første ettal kan placeres på 9 forskellige positioner, det næste på 8 osv.
Deraf 9*8*7*6*5 = 15.120 muligheder.
Avatar billede janvogt Praktikant
16. december 2003 - 15:26 #5
Hvordan får jeg lige lavet en liste i mit ark?
Avatar billede softcareconsult Nybegynder
16. december 2003 - 15:29 #6
Men på dette udtryk (100101011) kan du ikke se forskel på om det er det første ettal der står på plads nr. 1, 4, 6, 8 eller 9, hvorfor du skal dividere dit resultat med antallet af kombinations muligheder de 5 ettaller kan stå på, hvilket er 5*4*3*2*1 = 120 => 15120/120 = 126 !! QED :-D
Avatar billede softcareconsult Nybegynder
16. december 2003 - 15:31 #7
Erstat eventuelt debug.print s med activesheet.cells(1,i)
Avatar billede janvogt Praktikant
16. december 2003 - 15:32 #8
Du har nok ret. 15.120 lyder af ret mange.
Hvis jeg bare kunne få en liste, kunne jeg lave en stikprøve-kontrol.

I Excel er der forresten en formel til beregning af antal permutationer:
=PERMUT(9;5) = 15.120
Avatar billede janvogt Praktikant
16. december 2003 - 15:43 #9
Det kan ikke helt få til at fungere.
Strengen skal altid indeholde 9 karakterer.
Jeg brugte:
    If CountBit(s) = 5 Then Debug.Print s
    ActiveSheet.Cells(i, 1) = s
Avatar billede softcareconsult Nybegynder
16. december 2003 - 15:50 #10
Brug

If CountBit(s) = 5 Then ActiveSheet.Cells(i, 1) = s

eller

If CountBit(s) = 5 Then
AtiveSheet.Cells(i, 1) = s
endif
Avatar billede softcareconsult Nybegynder
16. december 2003 - 15:54 #11
PS: I Excel er der forresten en formel til beregning af antal kombinationer (UK version)

=COMBIN(9;5) = 126
Avatar billede janvogt Praktikant
16. december 2003 - 16:01 #12
Listen er ikke rigtig. Den giver giver rigtig nok 511 kombinationer, men de indeholder ikke alle sammen 9 karakterer og heller ikke 5 ét-taller.
Avatar billede softcareconsult Nybegynder
16. december 2003 - 16:24 #13
Sorry, vi prøver lige igen. Behold de to funktioner, og erstat Permut5Bit med denne:

Sub Permut5Bit()
  Dim s As String
  Dim i, j As Long
  Dim Bits As Byte
  Bits = 9
  j = 2
  For i = 1 To 2 ^ Bits
    s = Deci2Bin(i, Bits)
    If CountBit(s) = 5 Then
      Cells(j, 1) = s
      Cells(j, 1).NumberFormat = "000000000"
      j = j + 1
    End If
  Next
End Sub
Avatar billede janvogt Praktikant
16. december 2003 - 16:29 #14
Fandt selv ud af det, da jeg formaterede kolonnen til tekst :-)

Da jeg derefter tog tværsummen i kolonne B og lavede et filter og fik frasorteret alle dem forskellig fra 5 var der 126 tilbage.

Tak for hjælpen.
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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