Condividi:        

vba excel: "mischiare" una lista di nomi

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

vba excel: "mischiare" una lista di nomi

Postdi karug64 » 31/08/16 10:55

Salve a tutti.

Ho un foglio "Dizionario" in cui ci sono circa 60.000 parole che uso per ricercare quelle da sistemare nel mio schema del cruciverba.
Il foglio attualmente ha solo la colonna "A" con le parole ed è ordinato alfabeticamente.

Ogni volta che vi accedo per cercare una parola, ovviamente, la prima è sempre compresa tra quelle con la lettera "A" e via scendendo.

La domanda:
ma c'e' un modo di disordinare una colonna in modo causale ?
Avrei pensato di aggiungere una colonna dove c'e' una formula che estragga un numero casuale accanto ad ogni parola e poi ordinare su quella colonna, ma mi sembra molto macchinoso e con eccessiva perdita di tempo (visto che che i numeri della colonna di appoggio andrebbero generati ogni volta che accedo alla routine per cercare una parola).

Ogni suggerimento e soluzione è ben accetta.

Grazie
Office 2010
karug64
Utente Senior
 
Post: 746
Iscritto il: 20/11/11 21:22

Sponsor
 

Re: vba excel: "mischiare" una lista di nomi

Postdi Anthony47 » 01/09/16 01:42

Ma invece una funzione che ti estragga una parola a caso dall'elenco?
Esempio questa User Function:
Codice: Seleziona tutto
Function GetOneW(ByRef myList As Range) As String
Dim myLen As Long, myInd As Long
'
    myLen = myList.Rows.Count
    Randomize
    myInd = 1 + Int(Rnd * myLen)
    GetOneW = myList.Cells(myInd, 1)
End Function

Poi dalla macro principale richiami la funzione passandogli l'indirizzo dell'intervallo del "Dizionario"; es
Codice: Seleziona tutto
myWord = GetOneW(Sheets("Foglio2").Range("A1:A2200"))


Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: vba excel: "mischiare" una lista di nomi

Postdi oraetlabora » 13/06/17 11:30

ciao a tutti, a me servirebbe mischiare in modalità random un elenco di parole sulla colonna A di Excel ( può restituire il risultato anche su altro colonna/foglio), mi sapete indicare come fare ? grazie :)
oraetlabora
Newbie
 
Post: 8
Iscritto il: 13/06/17 11:24

Re: vba excel: "mischiare" una lista di nomi

Postdi Anthony47 » 13/06/17 11:59

Per capire meglio quel che chiedi sarebbe necessario un file di esempio, su cui inserisci non solo i dati di partenza ma anche un esempio di come vorresti i risultati.
Per le istruzioni su come allegare un file:
viewtopic.php?f=26&t=103893&p=605487#p605487

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: vba excel: "mischiare" una lista di nomi

Postdi oraetlabora » 13/06/17 12:14

grazie per la rispsota Anthony.
E' un elenco di parole che vorrei mischiare a caso, senza particolari risultati mi basta che vengono mischiati.
oraetlabora
Newbie
 
Post: 8
Iscritto il: 13/06/17 11:24

Re: vba excel: "mischiare" una lista di nomi

Postdi oraetlabora » 13/06/17 13:03

ecco un esempio https://we.tl/TogfyEKnjQ
oraetlabora
Newbie
 
Post: 8
Iscritto il: 13/06/17 11:24

Re: vba excel: "mischiare" una lista di nomi

Postdi patel » 13/06/17 15:13

prova questa
Codice: Seleziona tutto
Sub sortrange()
Dim arr() As Integer, arr1()
Dim first As Integer, last As Integer
Set orig = Range("A1:A21")
arr1 = orig.Value
first = orig.Row
last = first + orig.Rows.Count - 1
arr = RandomArray(first, last)
For r = first To last
  Cells(r, "A") = arr1(arr(r), 1)
Next

End Sub
Function RandomArray(first As Integer, last As Integer) As Integer()
Dim i As Integer, J As Integer, temp As Integer
ReDim result(first To last) As Integer
For i = first To last: result(i) = i: Next
For i = last To first Step -1
  J = Rnd * (last - first + 1) + first
  If J > last Then J = last
  temp = result(i): result(i) = result(J): result(J) = temp
Next
RandomArray = result
End Function
patel
Utente Senior
 
Post: 309
Iscritto il: 24/04/12 16:03

Re: vba excel: "mischiare" una lista di nomi

Postdi oraetlabora » 13/06/17 15:57

patel ha scritto:prova questa


grazie mille patel!
e se le righe fossero per esempio 200000 cosa devo modificare ? grazie
oraetlabora
Newbie
 
Post: 8
Iscritto il: 13/06/17 11:24

Re: vba excel: "mischiare" una lista di nomi

Postdi patel » 13/06/17 16:31

modifica così per qualsiasi numero di righe
Codice: Seleziona tutto
Sub sortrange()
Dim arr() As Integer, arr1()
Dim first As Integer, last As Integer. LR as long
LR = Cells(Rows.Count, "A").End(xlUp).Row ' <<<<<ultima riga
Set orig = Range("A1:A" & LR) ' <<<<< range da mischiare
.....
patel
Utente Senior
 
Post: 309
Iscritto il: 24/04/12 16:03

Re: vba excel: "mischiare" una lista di nomi

Postdi oraetlabora » 13/06/17 16:50

mi da errore di sintassi sulla prima riga
io ho messo 200000 qua:
LR = Cells(Rows.Count, "A200000").End(xlUp).Row ' <<<<<ultima riga
Set orig = Range("A1:A200000" & LR) ' <<<<< range da mischiare

è giusto ?
oraetlabora
Newbie
 
Post: 8
Iscritto il: 13/06/17 11:24

Re: vba excel: "mischiare" una lista di nomi

Postdi patel » 13/06/17 17:09

non devi modificare niente, la riga
Codice: Seleziona tutto
LR = Cells(Rows.Count, "A").End(xlUp).Row ' <<<<<ultima riga

calcola da sé l'ultima riga
patel
Utente Senior
 
Post: 309
Iscritto il: 24/04/12 16:03

Re: vba excel: "mischiare" una lista di nomi

Postdi oraetlabora » 13/06/17 17:16

ok ho tolto le modfiche ma mi da comunque errore di sintassi e di compilazione sulla prima riga
oraetlabora
Newbie
 
Post: 8
Iscritto il: 13/06/17 11:24

Re: vba excel: "mischiare" una lista di nomi

Postdi patel » 13/06/17 17:42

Dim first As Integer, last As Integer. LR as long
questa riga è sbagliata sostituisci il punto con la virgola
patel
Utente Senior
 
Post: 309
Iscritto il: 24/04/12 16:03

Re: vba excel: "mischiare" una lista di nomi

Postdi oraetlabora » 13/06/17 20:10

patel ha scritto:Dim first As Integer, last As Integer. LR as long
questa riga è sbagliata sostituisci il punto con la virgola


ok fatto, adesso l'errore me lo da alla riga 6, dice "overflow"
last = first + orig.Rows.Count - 1
oraetlabora
Newbie
 
Post: 8
Iscritto il: 13/06/17 11:24

Re: vba excel: "mischiare" una lista di nomi

Postdi Anthony47 » 13/06/17 21:29

Mi permetto di proporre questa variante della bella soluzione di patel:
Codice: Seleziona tutto
Sub Shuffle()
'Vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=107394
Dim iArr, LB0 As Long, UB0 As Long, I As Long, Temp
Dim Inizio As Range, Output As Range
'
Set Inizio = Range("D1")                    '<<< La prima cella con i Nomi
Set Output = Sheets("Foglio1").Range("H1")  '<<< La prima cella di Output
'
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
iArr = Range(Inizio, Inizio.End(xlDown)).Value
'Debug.Print ">>>>"
'mytim = Timer
LB0 = LBound(iArr, 1): UB0 = UBound(iArr, 1)
For I = LB0 To UB0
    ri = Int((UB0 - LB0 + 1) * Rnd + LB0)
    Temp = iArr(I, 1)
    iArr(I, 1) = iArr(ri, 1)
    iArr(ri, 1) = Temp
Next I
Output.Resize(Range(Inizio, Inizio.End(xlDown)).Rows.Count, 1) = iArr
'Debug.Print Format(Timer - mytim, "0.0")
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Set Inizio = Nothing
Set Output = Nothing
MsgBox ("Completato...")
End Sub

Dovrebbe velocizzare la soluzione, e trattandosi di 200mila righe la cosa non dovrebbe essere secondaria.

Le due righe marcate <<< vanno personalizzate come da commento.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: vba excel: "mischiare" una lista di nomi

Postdi oraetlabora » 13/06/17 22:11

Anthony47 ha scritto:Mi permetto di proporre questa variante della bella soluzione di patel:
Codice: Seleziona tutto
Sub Shuffle()
'Vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=107394
Dim iArr, LB0 As Long, UB0 As Long, I As Long, Temp
Dim Inizio As Range, Output As Range
'
Set Inizio = Range("D1")                    '<<< La prima cella con i Nomi
Set Output = Sheets("Foglio1").Range("H1")  '<<< La prima cella di Output
'
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
iArr = Range(Inizio, Inizio.End(xlDown)).Value
'Debug.Print ">>>>"
'mytim = Timer
LB0 = LBound(iArr, 1): UB0 = UBound(iArr, 1)
For I = LB0 To UB0
    ri = Int((UB0 - LB0 + 1) * Rnd + LB0)
    Temp = iArr(I, 1)
    iArr(I, 1) = iArr(ri, 1)
    iArr(ri, 1) = Temp
Next I
Output.Resize(Range(Inizio, Inizio.End(xlDown)).Rows.Count, 1) = iArr
'Debug.Print Format(Timer - mytim, "0.0")
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Set Inizio = Nothing
Set Output = Nothing
MsgBox ("Completato...")
End Sub

Dovrebbe velocizzare la soluzione, e trattandosi di 200mila righe la cosa non dovrebbe essere secondaria.

Le due righe marcate <<< vanno personalizzate come da commento.

Ciao


funziona perfettamente, grazie Anthony !
Molto gentili entrambi, a presto!
oraetlabora
Newbie
 
Post: 8
Iscritto il: 13/06/17 11:24


Torna a Applicazioni Office Windows


Topic correlati a "vba excel: "mischiare" una lista di nomi":


Chi c’è in linea

Visitano il forum: raimea e 36 ospiti