Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
WF-1000X M6 è la sesta generazione di auricolare in-ear sviluppata da Sony, un prodotto che punta a coniugare facilità di utilizzo con una elevata qualità di riproduzione dei contenuti audio e una cura nella riduzione del rumore ambientale che sia da riferimento
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-11-2014, 12:05   #1
rossofoco
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:
[i]Sub Ovale1_Click()

Dim arrayChar() As StringarrayPwd() As Stringlunghezza As IntegerCodcheck() As String
Dim a 
As IntegernumeroComb As IntegervarChar As Stringpwd As String
Dim c 
As IntegerAs IntegerAs Integer
Dim 
break As Integerbreak2 As Integer
Dim found 
As Boolean

numeroComb 
1
lunghezza 
3
varChar 
"X,I"

'calcolo n° combinazioni
For i = 1 To lunghezza
numeroComb = numeroComb * 2
Next i

arrayChar = Split(varChar, ",")
Worksheets("Foglio1").Activate
Foglio1.Cells(1, 1).Activate
'
calcolo del numero di celle non vuote
Application.WorksheetFunction.CountA(Range(SelectionSelection.End(xlDown)).EntireColumn)

ReDim Codcheck(n) As String
ReDim arrayPwd
(numeroComb) As String

'ciclo per assegnare i valori dei codici all'array
For 
0 To n
    Codcheck
(i) = Foglio1.Cells(21).Value
Next i
break = 0
0
0

For 0 To numeroComb
 pwd 
genera(arrayCharlunghezza 1)
 
            For 
0 To n
            
                
If Codcheck(i) = pwd Then
        
                            break1 
break1 1
                            
Exit For
                            
                
End If
                
                
found InStr(1"" Join(arrayPwd"") & """" pwd "") > 0
                
If found Then
                         break2 
break2 1
                End 
If
            
Next i
               
                
If break1 0 Then
                              
If break2 0 Then
                                            arrayPwd
(a) = pwd
                                            a 
1
                             End 
If
                
End If
            
break1 0
            break2 
0
Next c

1
10
For 0 To numeroComb
    Foglio1
.Cells(1a) = arrayPwd(i)
Next i

End Sub


Private Function genera(arrnum_cifre)
Dim b As IntegerAs Integernumero As Integervariabile As String
     numero 
UBound(arr)
     
Randomize
     
For 0 To num_cifre
         k 
Int((Rnd))
         
variabile variabile arr(k)
     
Next
     genera 
variabile
End 
Function[/i
L'unico problema che mi rimane è che non è detto che la funzione generativa dei codici a tre cifre generi effettivamente tutte le possibili combinazioni. Sapete aiutarmi?? Ve ne sarei infinitamente grato!!!

PS.

Sicuramente il codice non è ottimizzato.... abbiate pietà ma le mie conoscenze sono abbastanza basic!!!

Ultima modifica di rossofoco : 23-11-2014 alle 14:02.
rossofoco è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2014, 12:43   #2
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
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
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2014, 13:59   #3
rossofoco
Junior Member
 
Iscritto dal: Nov 2014
Messaggi: 3
Ciao Daniels118,


grazie per la risposta!! Io però vorrei avere da voi un piccolo aiuto per capire come oltre a generare un array con le combinazioni di lunghezza K dei due elementi N, posso controllare quali di questi elementi non sono già stati utilizzati nella colonna A del mio foglio di lavoro. Questa parte di controllo mi sta risultando difficile da risolvere. Ogni aiuto sarebbe oro per me!!

Grazie mille,
Amedeo
rossofoco è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2014, 08:57   #4
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
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
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 25-11-2014, 19:01   #5
rossofoco
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
Mentre questa la sub per calcolo delle combinazioni:

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
Come ma se K è maggiore di N (numero degli elementi) mi da errore?

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à!!
rossofoco è offline   Rispondi citando il messaggio o parte di esso
Old 26-11-2014, 09:33   #6
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
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?
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 26-11-2014, 10:49   #7
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
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
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Sono 32, di cui 6 nuove, le offerte Amaz...
Rinnovo dei coupon Amazon nascosti: ecco...
Corsair aggiorna la confezione delle RAM...
Ecco tutti i robot aspirapolvere in offe...
Tachyum: dal processore universale alle ...
L'eVTOL tedesco per missioni mediche e m...
Zscaler Threat Report 2026: l'adozione d...
Claude AI minaccia omicidi e ricatti qua...
Dentro la gara: a Milano Cortina 2026 i ...
Samsung Display presenta QD-OLED Penta T...
KONAMI torna con "Silent Hill: Town...
Rende il citofono smart a 44,99€: Ring I...
ThunderX3 XTC, la sedia da ufficio che s...
Mercy, Mission Impossible, Aronofsky: il...
Project Windless: il nuovo action in esc...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:12.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v