|
|||||||
|
|
|
![]() |
|
|
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 14: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: 11:12.



















