|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Nov 2014
Messaggi: 3
|
[VBA EXCEL] Controllo delle combinazioni rimanenti date quelle utilizzate
Buongiorno a tutti/e,
intanto mi presento...mi chiamo Amedeo e vi ho "utilizzato" molto ultimamente imparando tante cose! Quindi grazie! Venendo al dunque, vorrei da voi un consiglio. La situazione è la seguente: Ho un foglio Excel che riporta sulla prima colonna combinazioni di lunghezza diversa (da poter scegliere di volta in volta) delle lettere I,X. Posta ad esempio la lunghezza della "password" pari a 3 avremmo la seguente tabella A B 1 IIX XII 2 XII XXII 3 III IXX 4 XXX IXI Io vorrei con un clic, far apparire nella colonna B (per esempio) tutte le combinazioni rimanenti da poter utilizzare. Il mio codice VB è il seguente: Codice PHP:
PS. Sicuramente il codice non è ottimizzato.... ![]() ![]() Ultima modifica di rossofoco : 23-11-2014 alle 13:02. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Per favore, usa i tag code per formattare il codice.
La domanda non richiedeva di postare tutto, quello di cui hai bisogno è un algoritmo per generare combinazioni con ripetizione, trovi la versione VBA qui: http://www.hwupgrade.it/forum/showthread.php?t=2084088 |
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Nov 2014
Messaggi: 3
|
Ciao Daniels118,
grazie per la risposta!! ![]() Grazie mille, Amedeo |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Nella forma più semplice basta fare due loop annidati e selezionare dal primo array gli elementi che non trovi nel secondo:
Codice:
risultato = "" for i = 0 to ubound(arr1) trovato = false for j = 0 to ubound(arr2) if arr1(i) = arr2(j) then trovato = true exit for end if next j if not trovato then risultato = risultato & " " & arr1(i) end if next i |
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Nov 2014
Messaggi: 3
|
Ciao a tutti,
sto utilizzando il codice gentilmente offerto da voi : Questa la sub principale Codice:
Sub Ovale1_Click() Dim N() As Variant N = Array("x", "i") Dim K As Byte K = 2 Dim Comb As Collection Set Comb = CombinazioniSemplici(N, K) Dim i As Integer For i = 1 To Comb.Count Cells(i, 5).Value = (Comb(i)) Next i End Sub Codice:
Public Function CombinazioniSemplici(arrayElementi() As Variant, dimensioneGruppo As Byte) As Collection Dim LC As New Collection If UBound(arrayElementi) = 0 Then Set CombinazioniSemplici = LC End If If dimensioneGruppo = 0 Or dimensioneGruppo > UBound(arrayElementi) Then Set CombinazioniSemplici = LC End If Dim aP() As Integer ReDim aP(dimensioneGruppo - 1) Dim i As Integer For i = 0 To UBound(aP) aP(i) = i Next i Dim j As Integer Dim C As String Dim cnt As Integer Do C = "" For i = 0 To UBound(aP) C = C & arrayElementi(aP(i)) Next i LC.Add (C) cnt = 0 For i = UBound(aP) To 0 Step -1 If aP(i) = UBound(arrayElementi) - cnt Then cnt = cnt + 1 If cnt = UBound(aP) + 1 Then Exit Do Else aP(i) = aP(i) + 1 For j = 0 To UBound(aP) If i < j Then aP(j) = aP(i) + (j - i) Next Exit For End If Next i Loop Set CombinazioniSemplici = LC End Function E' questa la sub giusta per calcolare le disposizioni con ripetizione di 2 lettere su 7 cifre (2^7) ?? Scusate ma sono un novizio...abbiate pietà!! ![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Combinazioni e disposizioni sono due cose diverse, cosa ti serve esattamente?
In entrambi i casi comunque, quelle "semplici" (cioè senza ripetizione) hanno senso solo per K<=N: come potremmo creare una lista di N elementi diversi se i valori degli elementi sono meno di N? |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Ti propongo due algoritmi in vbs, il primo è più conciso ed elegante, il secondo è più efficiente e va bene anche per valori di K e N molto grandi:
Codice:
Public Sub disposizioniConRipetizione(alfabeto(), k, disposizioni()) Dim n 'As Integer Dim ubAlfabeto 'As Integer Dim ubParola 'As Integer Dim nDisp 'As Integer Dim i 'As Integer Dim j 'As Integer Dim parola 'As Integer Dim sParola 'As String ubAlfabeto = UBound(alfabeto) n = ubAlfabeto + 1 ubParola = k - 1 nDisp = n ^ k Redim disposizioni(nDisp - 1) For i = 0 To nDisp - 1 parola = i sParola = "" For j = 0 To ubParola sParola = alfabeto(parola Mod n) & sParola parola = parola \ n Next 'j disposizioni(i) = sParola Next 'i End Sub Codice:
Public Sub disposizioniConRipetizione(alfabeto(), k, disposizioni()) Dim n 'As Integer Dim ubAlfabeto 'As Integer Dim ubParola 'As Integer Dim parola() 'As Integer Dim nDisp 'As Integer Dim i 'As Integer Dim j 'As Integer Dim sParola 'As String ubAlfabeto = UBound(alfabeto) n = ubAlfabeto + 1 ubParola = k - 1 nDisp = n ^ k Redim disposizioni(nDisp - 1) Redim parola(k) 'Mettiamo un elemento in più di proposito For i = 0 To nDisp - 1 sParola = "" For j = ubParola To 0 Step -1 sParola = sParola & alfabeto(parola(j)) Next 'j disposizioni(i) = sParola parola(0) = parola(0) + 1 For j = 0 To ubParola If parola(j) < n Then Exit For parola(j) = 0 parola(j + 1) = parola(j + 1) + 1 Next 'j Next 'i End Sub |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:38.