Condividi:        

Composizione numeri con due casuali

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

Re: Composizione numeri con due casuali

Postdi Anthony47 » 18/09/18 22:51

Non farti venire fitte al cuore, non servono alla causa...

Tutto quello che ho fatto e ho detto e' basato sul file iniziale da te pubblicato, contenente un foglio Archivio e un foglio Sviluppo.

Io ho parlato dei numeri bassi per dire che 1-2-3 non hanno nessuna chance di essere scelti come i numeri piu' alti in una estrazione, e' matematico; quindi questi numeretti o vengono "pescati" come numeri random oppure lasceranno delle posizioni vuote.
Ma anche gli altri numeri 4-5-6 etc (a salire) avranno chance minime, che aumentano man mano che il numero aumenta.
Sono le regole del gioco che hai dettato: scegliere solo i numeri piu' alti nelle estrazioni in cui compare uno dei numeri random.
Ora io non so che significato hanno questi numeri, a partire dai numeri random; ma se vuoi avere possibilita' di riempire fino alla riga 18 allora i "numeretti" devono figurare tra i random (altrimenti hanno la certezza di non trovare una posizione oppure hanno chance minime di trovarla). La "soluzione #2", che limitava i random solo ai primi 36 numeri e quindi lasciava liberi (da pescare nelle estrazioni) solo i numeri >36, adottava (inconsciamente) questa strategia. Nella stragrande maggioranza dei casi riga 17 veniva riempita tutta; nel 95% dei casi (calcolato a spanne) riempiva anche riga 18. Il tutto senza Retry.

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

Sponsor
 

Re: Composizione numeri con due casuali

Postdi ikwae » 18/09/18 23:33

Ciao Anthony ... ho letto con molta attenzione e sono fiducioso in questa tua macro come sempre dei tuoi lavori ma non so se comprendi la "smania" che ho ho per bloccare il tutto per vedere i primi pronostici ma il fatto è che se blocco poi il lavoro di stanotte fino a oggi lo perdo tutto ... ormai sono rassegnato che per avere dati certi li devo far lavorare H24 sia il l'I7 che il portatile ... Lo so che non è la Sezione giusta ma vorrei fare una domanda a te o a chi sa rispondere un si o un no mi accontento ... vorrei assemblare un ennesimo computer super potente per avere dati non dico nell'ora ma almeno in giornata senza aspettare parecchi giorni di calcolo ... vorrei assemblare una MB doppio processore con due xeon (i soldi non sono un problema ho visto un solo processore Xeon molto potente da 2300 dollari) ... Domanda se installo Win 10 e Office 2016 pensi che Excel gira? ...vorrei che girasse per fare un esempio da Pentium 4 all'I9XE facciamo finta che corre 90 volte(immaginario esempio) l'I9XE rispetto al Pentium 4 ... io vorrei un Xeon che girasse 100 o 200 volte maggiore del I9XE e che si possa usare l'Excel pensi che gira? ... naturalmente a uso casalingo ossia che non deve avere una centrale elettrica per farlo girare che mi dici?
Ringraziandoti ancora per le parole rassicuranti del tuo post ... cordialmente 73 ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Composizione numeri con due casuali

Postdi Anthony47 » 19/09/18 16:19

Mi spiace deluderti, ma non ho esperienza di compatibilita' hardware quindi non so dirti se io "gioco" funzionerebbe e se vale i soldi spesi
Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Composizione numeri con due casuali

Postdi ikwae » 19/09/18 17:35

Grazie lo stesso per la tua risposta tuttavia vale sempre perché oltre che a divertirmi a costruirlo aumenterei ma mi professionalità da hobbysta assemblatore ... non mi sono dimenticato dei responsi a te e a Mario e alla prima occasione lo scriverò adesso li sto valutando... ancora grazie per il tempo che mi avete dedicato ... Cordialmente 73 ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Composizione numeri con due casuali

Postdi ikwae » 27/09/18 23:15

Gentilissimi... dopo giorni di lavoro “diamo a Cesare quello che è di Cesare” quindi su questa frase c’è da scrivere un “tema” ma cercherò si essere il più sintetico possibile...

@ Mario ... la tua macro “Sub completa” l’ho applicata alla seconda macro di Anthony(per capirci quella senza retry) va a meraviglia una “accoppiata vincente” ancora gira, è al concorso 90 e rotti deve arrivare al 110 quindi ancora un paio di giorni anche per l’elaborazione dei Dati e con specchietto cronologico finale...

@Anthony ... curiosità, ansia e tutto quello che vuoi e, vedere l’7 lavorare e non poter far nulla ho deciso di far girare le macro anche sul mio pc, più veloce dell’I7 e ho fatto girare la tua 3à macro, quella con il retry e, applicato lo “spezzone di codice” che completa i numeri mancanti e li colora dove sono scritti è uno spettacolo velocissimo(ha impiegato un giorno e mezzo per le 110 estrazioni e specchietto cronologico ... poi un ulteriore prove ho iniziato a eliminare righe dell’archivio da 100 mila a 50 mila poi ancora 30 mila per arrivare a 5 mila per finire a 3 mila righe e la macro da veloce è passata man mano che si eliminavano le righe dell’archivio, a macro “siluro” fino a macro istantanea completando sempre le 18 righe...

Anche se il lavoro è stato fatto con molta professionalità e impegno la delusione è arrivata una volta visti i Dati non sono quelli sperati e sono andato a cercare a ritroso e ho notato che la macro non sempre prende dal primo numero, i maggiori, ma li prende, alcune volte nel secondo o terzo ... Probabilmente è l’impostazione iniziale che li scarta... in allegato sul foglio Dati ti renderai conto di quello che voglio dire nell’ultino specchietto a dx ossia il Parziale D ... quindi una impostazione diversa dalle “prese” e, una delusione dei Dati, vorrei fare diversamente sempre con la stessa matrice di “presa” quindi ti chiedo, gentilissimo Anthony, se puoi modificare una macro che legga direttamente dal foglio Archivio con 5 colonne il numero in P3 e scriva i due numeri maggiori in colonna X partendo da X2 ... mi spiego meglio in P3 c’è un numero e la macro deve andare a cercare in Archivio a 5 colonne i due numeri maggiori, sulla stessa riga,del numero presente in P3 e li scrive(la coppia maggiore) in X2 fine macro serve per un progetto1.
Poi una che legga il valore di P3(uguale a prima) e va a leggere sul foglio Archivio di 4 colonne e lo scrive in colonna X partendo da X2 ... Per il progetto2 è la sessa cosa ma cambiano solo le colonne dell’archivio. Puoi fare un’unica macro con un “interruttore”, interno al codice, che io posso scegliere uno o l’altro Archivio ... poi una semplice macro che copia i due numeri da X2 a dx della colonna P ... Mi spiego meglio e in P4 c’è in numero scrive a dx di P4 se ci sono 2 numeri(P4 e S4) scrive a dx di S4 se ci sono tre numeri(P4,S4 e R4) scriva a dx di R3 i due numeri di X2...

Ricapitolo brevemente:.
1)in P3 un numero e lo cerca nel foglio Archivio, di 5 colonne nel range G2:K(end), copia i due maggiori numeri e li scrive in X2 del foglio Sviluppo
2)in P3 un numero e lo cerca nel foglio Archivio, di 4 colonne nel range G2:J(end), copia i due maggiori numeri e li scrive in X2 del foglio Sviluppo
3) una macro che copia la coppia di numeri presenti in X2 e Y2 e li scrive a dx del numero presente sulla colonna P.

Io ho molte macro, compilate da te, simili a questa richiesta di aiuto sono simili ma hanno tutte “prese” diversa fra di loro e, volutamente, non ne allego nessuna per non creare confusione. Ma se ritieni opportuno averle io te li allego... In allegato lo stesso foglio Archivio per vedere i range delle 5 e 4 colone e un foglio Sviluppo per fare eventuali prove... come sempre se hai tempo e con calma io attendo fiducioso ... Grazie per quello che ai fatto e per quello che eventualmente farai se hai tempo da dedicarmi ... grazie e ancora 1000 grazie Cordialmente 73 ikwae

http://www.filedropper.com/parziali2018copiaperrete
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Composizione numeri con due casuali

Postdi Anthony47 » 28/09/18 13:36

i Dati non sono quelli sperati e sono andato a cercare a ritroso e ho notato che la macro non sempre prende dal primo numero, i maggiori, ma li prende, alcune volte nel secondo o terzo
Prima di esaminare la nuova richiesta vorrei debuggare questo "errore": partendo dal file originariamente allegato (con 100mila record) mi puoi indicare un paio di casi in cui le estrazioni non collimano?

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

Re: Composizione numeri con due casuali

Postdi ikwae » 28/09/18 14:02

Ciao Anthony e grazie per la risposta .. provvedo subito per la tua richiesta .. posso anticipare che è il primo numero che cerco sempre perché gli altri delle file successive possono essere estratti quindi un momento a cercare sull'altro pc ... intanto ti ringrazio per la tua cortese attenzione ... Cordialmente 73 ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Composizione numeri con due casuali

Postdi ikwae » 28/09/18 15:30

Gentilissimo Anthony ... Le prove effettuate:

Primo Trovato:.
1)si lancia la macro con il tasto sul foglio Sviluppo e vengono completate le 18 righe la 1à è 23 13 82 57 87
quindi i maggiori del 23 devono essere l’82 e il 57
2) Sul foglio Archivio, con la FC si trova esclusivamente il PRIMO numero 23 alla riga 34 e i maggiori suoi numeri sono 44 e 31
3) Sul foglio Archivio, con la FC si trova esclusivamente il SECONDO numero 23 alla riga 74 e i maggiori suoi numeri sono 57 e 82

Secondo trovato:
1)si lancia la macro con il tasto sul foglio Sviluppo e vengono completate le 18 righe la 1à è 7 12 78 69 75
quindi i maggiori del 7 devono essere il 78 e 69
2) Sul foglio Archivio, con la FC si trova esclusivamente il PRIMO numero 7 alla riga 25 e i maggiori suoi numeri sono 30 e il 19
3) Sul foglio Archivio, con la FC si trova esclusivamente il SECONDO numero 7 alla riga 54 e i maggiori suoi numeri sono 59 e 32
4) Sul foglio Archivio, con la FC si trova esclusivamente il TERZO numero 7 alla riga 75 e i maggiori suoi numeri sono 78 e 69

Ti allego il file originale scaricato immediatamente dopo aver postato per controllare il link ... Ti ho lasciato la FC per non farti perdere tempo...
Se ritieni opportuno te ne trovo degli altri ... Ringraziandoti sempre e tantissime volte per il tempo che mi dedichi . Con Profonda Stima 73 ikwae

http://www.filedropper.com/parziali2018copiaperretebox1
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Composizione numeri con due casuali

Postdi Anthony47 » 28/09/18 18:52

La mia macro prima estrae i random su tuttle le 18 righe, POI cerca i massimi.
Evidentemente il 44 e 31 presenti in riga 34 (che mi pare di capire dovrebbero essere le scelte corrette, nel tuo ragionamento) sono gia' stati estratti e non possono essere utilizzati, per cui si passa alla riga successiva (la 74, da cui si estraggono 82 e 57)

Se questa scelta (che in realta' era utile in una prima bozza di macro, che non ha visto poi la luce) non e' giusta, allora "basta" spostare il calcolo dei Random all'interno del ciclo For I = 4 To 21 /Next I; la vecchia Sub CipNCiop cambia cioe' come segue (il resto del codice non cambia):
Codice: Seleziona tutto
Sub CiopNCip()
Dim Estr0 As String, I As Long, J As Long
Dim myK As String, myTim As Single, noH As Boolean
Dim noBB As Boolean, tCell As Long, flMax As Long
Dim MaxRetr
Dim myMatch
Range("P4:T21").Interior.Color = xlNone
'
MaxRetr = 4                     '<<< Il numero max di Retry
mRnd = 90                       'Verra' ridotto a ogni Retry
Sheets("Sviluppo").Select
Estr0 = "G2"
Erase uArr: Erase P4T21: Erase kArr
With Sheets("Archivio")
    AArr = .Range(.Range(Estr0), .Range(Estr0).End(xlDown)).Resize(, 5).Value
End With
Beep
'
myTim = Timer
'Crea indice dei numeri:
For I = 1 To UBound(AArr)
    For J = 1 To UBound(AArr, 2)
        kArr(AArr(I, J)) = kArr(AArr(I, J)) & "-" & I
    Next J
Next I
'
Beep
reTry:
Erase uArr: Erase P4T21
Randomize
'Raccogli qualcosa in giro:
'Prima i numeri random          'NO! I random vengono calcolati riga per riga
'For I = 4 To 21
'    Call GimmeR1R2(I)
'    DoEvents
'Next I
'Poi i numeri dalle estrazioni
For I = 4 To 21
    Cells(I, "O").Select
    Call GimmeR1R2(I)           'Calcola i Random Riga per Riga
    Call GimmeN1N2(I, True): If GotIt Then tCell = tCell + 4
    Call GimmeN1N2(I, False):: If GotIt Then tCell = tCell + 1
    Debug.Print I, Format(Timer - myTim, "0.0")
    DoEvents
    If tCell < (I - 3) * 5 And I < 21 And flMax < MaxRetr Then
    Debug.Print "#", I, tCell
        flMax = flMax + 1
        noBB = True
        Exit For
    End If
Next I
If noBB Then
    noBB = False
    tCell = 0
    Range(Cells(LBound(P4T21), LBound(P4T21, 2)), Cells(UBound(P4T21), UBound(P4T21, 2))).Value = P4T21
    mRnd = mRnd - 15
    GoTo reTry
End If
'Output risultati:
Range(Cells(LBound(P4T21), LBound(P4T21, 2)), Cells(UBound(P4T21), UBound(P4T21, 2))).Value = P4T21
MsgBox ("Completato; Sec: " & Format(Timer - myTim, "0.0") & ", Retry: " & flMax)
'
'Popola numeri mancanti:
For I = LBound(P4T21, 1) To UBound(P4T21, 1)
    For J = LBound(P4T21, 2) To UBound(P4T21, 2)
        If P4T21(I, J) = "" Then
            myMatch = Application.Match(0, uArr, False)
            If Not IsError(myMatch) Then
                Cells(I, J) = myMatch
                Cells(I, J).Interior.Color = RGB(255, 200, 200)
                uArr(myMatch) = 11
            End If
        End If
    Next J
Next I
End Sub

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

Re: Composizione numeri con due casuali

Postdi ikwae » 28/09/18 20:08

Anthony47 ha scritto:La mia macro prima estrae i random su tutte le 18 righe, POI cerca i massimi.
Gentilissimo Anthony siamo molto lontani non è quello che cerco perché non so poi andare avanti mi bloccherei ... Vediamo un attimo la richiesta iniziale le "prese" due numeri random e poi collegati al primo due maggiori e collegato al secondo uno maggiore ... Quindi solo due numeri random e la riga è libera a completare con nessuna restrizione a 360° è su queste basi che poi io continuo il mio lavoro.. Dirai ma è lo stesso farli prima o dopo i numeri non è la stessa cosa? No! perché c'è la "restrizione" dei numeri messi li, come random, che non si possono più usare... Ricapitolando se la restrizione #2 impedisce di fare tutto ciò ti prego di fare le tre semplici macro che vado avanti come posso ... Sicuramente la tua ottima macro funzionerà e la proverò per il responso ma per quanto sia spettacolare purtroppo :oops: non è quello che cerco ... tuttavia è molto apprezzato l'impegno e la "fatica" fatta per aiutarmi e non finirò mai di ringraziarti a dovere. Cordialmente 73 ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Composizione numeri con due casuali

Postdi Anthony47 » 29/09/18 10:34

Ma hai avuto la possibilita' di leggere anche la seconda parte del mio messaggio precedente?
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Composizione numeri con due casuali

Postdi ikwae » 29/09/18 13:17

Ciao Anthony... io cerco sempre di leggere tutto con attenzione e questa tua frase
"Anthony47 La mia macro prima estrae i random su tuttle le 18 righe, POI cerca i massimi".

l'ho associata, alla seconda parte del tuo post, solo dopo che sono andato sul codice a trovare l'errore che la macro aveva generato e ho trovato questa affermazione
Codice: Seleziona tutto
'Prima i numeri random      >>>>>>>  'NO! I random vengono calcolati riga per riga
For I = 4 To 21
    Call GimmeR1R2(I)
    DoEvents
Next I


quindi ho collegato tutto cronologicamente corretto .... Comunque ho provato la tua macro con dentro la "Matrioska" e ti posso dire che esce l'errore su entrambi le macro con o senza "Matrioska" (tolto gli apici al ciclo For/Nest come hai indicato sul post)... l'errore generato è il seguente segnalato con il segno di minore <<<<<

Codice: Seleziona tutto
Sub GimmeN1N2(ByVal II As Long, ByVal Fl1 As Boolean)
    K1 = kArr(P4T21(II, LBound(P4T21, 2))) <<<<<<<<<<<<<<< si evidenzia in giallo 
    K2 = kArr(P4T21(II, LBound(P4T21, 2) + 1))


Ho aggiunto 20 mila righe all'Archivio quindi 120 mila righe ma non è servito a nulla ... Ricapitolando come ho scritto nel posta precedente dato che è molto articolata la richiesta e non di facile esecuzione se mi fai le tre semplici macro io vado avanti poi tu fai quello che ritiene più opportuno se vuoi andare avanti il questa impresa ne sarei felice ma se lasci perdere ti capisco ugualmente... Ringraziandoti mille e mille volte il lavoro e l'impegno oltre che alla pazienza che mi stai dimostrando ... Cordialmente 73 ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Composizione numeri con due casuali

Postdi Anthony47 » 29/09/18 13:56

Se questa scelta (che in realta' era utile in una prima bozza di macro, che non ha visto poi la luce) non e' giusta, allora "basta" spostare il calcolo dei Random all'interno del ciclo For I = 4 To 21 /Next I; la vecchia Sub CipNCiop cambia cioe' come segue (il resto del codice non cambia)
La macro proposta ieri era spostava il calcolo dei random nel "riga per riga", visto che non era era giusta la scelta di calcolarli tutti inizialmente.

Se hai quell'errore e' perche' hai inserito il nuovo codice aggiungendolo in un nuovo modulo, e non in sostituzione (sul modulo gia' presente) del vecchio codice.
Riprova, perche' per me e' piu' semplice far funzionare cose gia' pronte che svilupparne di nuove.

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

Re: Composizione numeri con due casuali

Postdi ikwae » 29/09/18 17:04

Ciao Anthony... Hai ragione avevo incollato su un nuovo modulo per non fare confusione ....ho preso quello “vecchio” e ha funzionato all’istante è quello che genera prima i 18 numeri random e poi i maggiori per adesso funge e lo metterò sull'I7 a girare tra 10 giorni abbiamo i risultati(sempre che non lo blocco prima) .MA e dico MA :oops: :oops: non è quello che cerco la prima parte ossia la 4 macro quella senza ciclo FOR non funge mi esce l'errore e l'errore generato è il seguente segnalato con il segno di minore <<<<<
Codice: Seleziona tutto
Sub GimmeN1N2(ByVal II As Long, ByVal Fl1 As Boolean)
    K1 = kArr(P4T21(II, LBound(P4T21, 2)))
    K2 = kArr(P4T21(II, LBound(P4T21, 2) + 1))   <<<<<<<<<<<<<<< si evidenzia in giallo

ossia la riga sotto al precedente errore ... sicuramente sarà una stupidaggine quindi ti allego il file se riesci a metterlo a posto ...
Ripeto la "matriosca" funge l'altro no ... Se hai del tempo e puoi dare un'occhiata va bene altrimenti molliamo il tutto (questo hobby sta diventando un lavoro e deve rimanere hobby!!! ... mille grazie per il tuo tempo e pazienza molto gradita e apprezzata cordialmente ikwae
http://www.filedropper.com/b2018cinqued ... eteboxorg3
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Composizione numeri con due casuali

Postdi Anthony47 » 29/09/18 23:03

La versione "funzionante" della mia prima macro era in questo messaggio:
viewtopic.php?f=26&t=110039#p645779

Successivamente ho aggiunto il codice per compilare i numeri mancanti (viewtopic.php?f=26&t=110039#p645800)

Infine avevo pubblicato il codice che doveva sostituire integralmente la sub CipNCiop (viewtopic.php?f=26&t=110039&start=20#p64592)

Insomma il codice complessivo (da mettere tutto in un unico modulo inizialmente vuoto del vba) dovrebbe essere questo:
Codice: Seleziona tutto
Dim mRnd As Long
Dim uArr(1 To 90) As Long, AArr, P4T21(4 To 21, 16 To 20), kArr(1 To 90), GotIt As Boolean
Sub CiopNCip()
Dim Estr0 As String, I As Long, J As Long
Dim myK As String, myTim As Single, noH As Boolean
Dim noBB As Boolean, tCell As Long, flMax As Long
Dim MaxRetr
Dim myMatch
Range("P4:T21").Interior.Color = xlNone
'
MaxRetr = 4                     '<<< Il numero max di Retry
mRnd = 90                       'Verra' ridotto a ogni Retry
Sheets("Sviluppo").Select
Estr0 = "G2"
Erase uArr: Erase P4T21: Erase kArr
With Sheets("Archivio")
    AArr = .Range(.Range(Estr0), .Range(Estr0).End(xlDown)).Resize(, 5).Value
End With
Beep
'
myTim = Timer
'Crea indice dei numeri:
For I = 1 To UBound(AArr)
    For J = 1 To UBound(AArr, 2)
        kArr(AArr(I, J)) = kArr(AArr(I, J)) & "-" & I
    Next J
Next I
'
Beep
reTry:
Erase uArr: Erase P4T21
Randomize
'Raccogli qualcosa in giro:
'Prima i numeri random          'NO! I random vengono calcolati riga per riga
'For I = 4 To 21
'    Call GimmeR1R2(I)
'    DoEvents
'Next I
'Poi i numeri dalle estrazioni
For I = 4 To 21
    Cells(I, "O").Select
    Call GimmeR1R2(I)           'Calcola i Random Riga per Riga
    Call GimmeN1N2(I, True): If GotIt Then tCell = tCell + 4
    Call GimmeN1N2(I, False):: If GotIt Then tCell = tCell + 1
    Debug.Print I, Format(Timer - myTim, "0.0")
    DoEvents
    If tCell < (I - 3) * 5 And I < 21 And flMax < MaxRetr Then
    Debug.Print "#", I, tCell
        flMax = flMax + 1
        noBB = True
        Exit For
    End If
Next I
If noBB Then
    noBB = False
    tCell = 0
    Range(Cells(LBound(P4T21), LBound(P4T21, 2)), Cells(UBound(P4T21), UBound(P4T21, 2))).Value = P4T21
    mRnd = mRnd - 15
    GoTo reTry
End If
'Output risultati:
Range(Cells(LBound(P4T21), LBound(P4T21, 2)), Cells(UBound(P4T21), UBound(P4T21, 2))).Value = P4T21
MsgBox ("Completato; Sec: " & Format(Timer - myTim, "0.0") & ", Retry: " & flMax)
'
'Popola numeri mancanti:
For I = LBound(P4T21, 1) To UBound(P4T21, 1)
    For J = LBound(P4T21, 2) To UBound(P4T21, 2)
        If P4T21(I, J) = "" Then
            myMatch = Application.Match(0, uArr, False)
            If Not IsError(myMatch) Then
                Cells(I, J) = myMatch
                Cells(I, J).Interior.Color = RGB(255, 200, 200)
                uArr(myMatch) = 11
            End If
        End If
    Next J
Next I
End Sub

Sub GimmeR1R2(ByVal II As Long)
Dim LJ As Long, LI As Long, lK As Long
'
'mRnd = 80
For lK = LBound(P4T21, 2) To LBound(P4T21, 2) + 1
    LJ = Int(Rnd() * mRnd) + 1
    For LI = 1 To mRnd
        If uArr(LJ) = 0 Then
            P4T21(II, lK) = LJ
            uArr(LJ) = 1
            Exit For
            If P4T21(II, lK) = "" Then Stop
        Else
            LJ = LJ + 1
            If LJ > mRnd Then LJ = 1
        End If
    Next LI
Next lK
'Stop
End Sub

Sub GimmeN1N2(ByVal II As Long, ByVal Fl1 As Boolean)
Dim K1 As String, K2 As String, LI As Long, LJ As Long, Lii As Long
Dim lSplit1, lSplit2, Max1 As Long, Max2 As Long, oLine(1 To 5), CiP As Long, zZz
'
GotIt = False
If Fl1 Then
    K1 = kArr(P4T21(II, LBound(P4T21, 2)))
    K2 = kArr(P4T21(II, LBound(P4T21, 2) + 1))
Else
    K2 = kArr(P4T21(II, LBound(P4T21, 2)))
    K1 = kArr(P4T21(II, LBound(P4T21, 2) + 1))
End If
'
If Fl1 Then CiP = 0 Else CiP = 2
lSplit1 = Split(K1, "-", , vbTextCompare)
'
'Esamina le righe
For LI = 0 To UBound(lSplit1)
If lSplit1(LI) <> "" Then
    If InStr(1, K2, "-" & lSplit1(LI) & "-", vbTextCompare) = 0 Then
        Lii = CLng(lSplit1(LI))
        For LJ = 1 To 5
            If P4T21(II, LBound(P4T21, 2)) <> AArr(Lii, LJ) And _
              P4T21(II, LBound(P4T21, 2) + 1) <> AArr(Lii, LJ) Then
                oLine(LJ) = AArr(Lii, LJ)
            Else
                oLine(LJ) = 0
            End If
        Next LJ
        Max1 = Application.WorksheetFunction.Large(oLine, 1)
        Max2 = Application.WorksheetFunction.Large(oLine, 2)
'        If Max1 = Max2 Then Stop
        If (uArr(Max1) = 0 And uArr(Max2) = 0 And Fl1) Or _
           (uArr(Max1) = 0 And Fl1 = False) Then
            P4T21(II, LBound(P4T21, 2) + 2 + CiP) = Max1
            If Fl1 Then P4T21(II, LBound(P4T21, 2) + 3) = Max2
            uArr(Max1) = 1
            If Fl1 Then uArr(Max2) = 1
            GotIt = True
            Exit For
        End If
    End If
End If
Next LI
End Sub
Il file che hai pubblicato contiene invece il codice privo di una delle variazione che sono state pubbllicate.

Non l'avevo detto, ma con il metodo dei random Riga-per-Riga (questo) le chance di compilare fino alla riga 18 sono altissime gia' al primo run (senza retry, intendo).
Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Composizione numeri con due casuali

Postdi ikwae » 30/09/18 00:34

Gentilissimo Anthony ... l’attesa è stata premiata!!!! Ho provato la tua ultima macro completa le 18 righe. Ho controllato i numeri maggiori abbinati al primo e al secondo numero con la FC e sono giusti. Nelle prove precedenti al terzo giro “sballava” adesso con 10 giri neanche uno. Gira già nel “contenitore” del 2018 e con 117 estrazioni finirà domani verso le 16:00(salvo improvvisi interruzioni) completo di specchietto cronologico. Dato che vorrei fare una modifica, per avere ulteriori possibilità di dati e, vorrei farlo da solo per non darti altro lavoro quindi se trovi ancora qualche momento e mi faresti tre semplicissime macro ma proprio lo stretto indispensabile così io leggo le parole nel codice che scrivi e vado a trovare con l’help in linea o in rete e capire come si fanno determinate cose quindi le tre macro sono:.
La Prima una che legga direttamente dal foglio Archivio con 5 colonne il numero in P3 e scriva i due numeri maggiori in colonna X partendo da X2 ... mi spiego meglio in P3 c’è un numero e la macro deve andare a cercare in Archivio a 5 colonne i due numeri maggiori, sulla stessa riga,del numero presente in P3 e li scrive(la coppia maggiore) in X2 (fine macro).
La seconda che legga il valore di P3(uguale a prima) e va a leggere sul foglio Archivio di 4 colonne e lo scrive in colonna X partendo da X2.(fine macro)
La terza che copia i due numeri da X2 a dx della colonna P ... Mi spiego meglio e in P4 c’è in numero scrive a dx di P4 se ci sono 2 numeri(P4 e S4) scrive a dx di S4 se ci sono tre numeri(P4,S4 e R4) scriva a dx di R3 i due numeri di X2.(fine macro)
Ricapitolo brevemente:
1)in P3 un numero e lo cerca nel foglio Archivio, di 5 colonne nel range G2:K(end), copia i due maggiori numeri e li scrive in X2 del foglio Sviluppo
2)in P3 un numero e lo cerca nel foglio Archivio, di 4 colonne nel range G2:J(end), copia i due maggiori numeri e li scrive in X2 del foglio Sviluppo
3) una macro che copia la coppia di numeri presenti in X2 e Y2 e li scrive a dx del numero presente sulla colonna P.
ho riportato pare del post sopra ma ho tolto alcune cose ... lo so che per te le tre macro sono a livello -1 ma per me sono come muri alti tipo grattacieli...
Ma soprattutto servono anche se capisco la “procedura” di velocizzare il tutto perché ho messo una richiesta di aiuto sulla Sezione giusta ma non ho avuto risposta forse è talmente banale che non c’è risposta ... in rete ci sono pareri contrastanti della compatibilità o meno tre Excel e i processori Xeon ... aggiungo profondo grazie e buona notte cordialmente 73 ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Composizione numeri con due casuali

Postdi Marius44 » 30/09/18 10:57

Ciao Anthony
ancora una volta complimenti per la velocità di esecuzione (oltre alle varie intuizioni: assegnazione di numeri indice, ecc).
Ho apportato, per mio studio e ti chiedo scusa per questo, delle piccole variazioni alla tua macro perchè volevo capire se è possibile individuare a quale riga dell'archivio fai riferimento in un dato momento.
Mi dichiaro vinto. Non ci sono riuscito! :oops:
Ho cancellato i dati precedenti con questa riga (prima di retray:) Range("P4:T21").ClearContents
ed ho eliminato la riga di output alla fine. Ecco cosa ho "cambiato" nella tua macro (che rimane sempre molto veloce ma si possono "vedere" i passaggi da una riga all'altra)
Codice: Seleziona tutto
For I = 4 To 21
    Cells(I, "O").Select
    Call GimmeR1R2(I)           'Calcola i Random Riga per Riga
    Range(Cells(LBound(P4T21), LBound(P4T21, 2)), Cells(UBound(P4T21), UBound(P4T21, 2))).Value = P4T21
'Stop
    Call GimmeN1N2(I, True): If GotIt Then tCell = tCell + 4
    Range(Cells(LBound(P4T21), LBound(P4T21, 2)), Cells(UBound(P4T21), UBound(P4T21, 2))).Value = P4T21
'Stop
    Call GimmeN1N2(I, False):: If GotIt Then tCell = tCell + 1
    Range(Cells(LBound(P4T21), LBound(P4T21, 2)), Cells(UBound(P4T21), UBound(P4T21, 2))).Value = P4T21
'Stop
'   Debug.Print I, Format(Timer - myTim, "0.0")
    DoEvents
    If tCell < (I - 3) * 5 And I < 21 And flMax < MaxRetr Then
'   Debug.Print "#", I, tCell
        flMax = flMax + 1
        noBB = True
        Exit For
    End If
Next I

Immagino che il riferimento alla riga dell'Archivio deve trovarsi in una delle due Function (penso la GimmeR1R2) ma non riesco a cavare un ragno dal buco. Troppo difficile per me.

Grazie in anticipo (se puoi). Ciao,
Mario
Marius44
Utente Senior
 
Post: 655
Iscritto il: 07/09/15 22:00

Re: Composizione numeri con due casuali

Postdi Marius44 » 30/09/18 20:40

Salve
in merito al post precedente ho sbagliato l'indicazione delle Function. Credo sia l'altra (penso la GimmeN1N2)

Ciao,
Mario
Marius44
Utente Senior
 
Post: 655
Iscritto il: 07/09/15 22:00

Re: Composizione numeri con due casuali

Postdi Anthony47 » 01/10/18 22:02

Mario, mi sembra che tu stessi cercando un metodo per controllare se l'esito della ricerca fosse corretta.
Io ho usato, in N2 del foglio Archivio, la formula
Codice: Seleziona tutto
=SOMMA(CONTA.SE(G2:K2;$W$1:$X$1))
(Contr-Maiusc-Enter)
Da copiare poi verso il basso.
In questo modo , scrivendo in W1:X1 due numeri da controllare (es il primo random e il primo degli estratti), la formula restituira' "2" nelle righe in cui i due numeri compaiono.
Filtrando per "2" si avranno le righe con risultati compatibili e si puo' verificare l'esattezza di quanto ottenuto.

Se invece vuoi farlo da macro, senza rallentare la velocita' della macro:
1) Aggiungi una Dim in testa al Modulo:
Codice: Seleziona tutto
Dim V4X21(4 To 21, 22 To 23)


2) Modifica la GimmiN1N2 per popolare anche questa nuova matrice, aggiungendo queste righe in questa posizione:
Codice: Seleziona tutto
            GotIt = True
'>> AGGIUNTE per memorizzare N° riga:
            If Fl1 Then
                Cells(II, LBound(V4X21, 2)) = Lii
            Else
                Cells(II, LBound(V4X21, 2) + 1) = Lii
            End If
'<< FINE Aggiunte
            Exit For

3) Modifica la "chiusura" della Sub CiopNCip per dumpare sia il risultato che i numeri riga:
Codice: Seleziona tutto
'Output risultati:
Range("P4:W21").ClearContents    'Opzionale
Range(Cells(LBound(P4T21), LBound(P4T21, 2)), Cells(UBound(P4T21), UBound(P4T21, 2))).Value = P4T21
Range(Cells(LBound(V4X21), LBound(V4X21, 2)), Cells(UBound(V4X21), UBound(V4X21, 2))).Value = V4X21  '+++
MsgBox ("Completato; Sec: " & Format(Timer - myTim, "0.0") & ", Retry: " & flMax)
'
'Popola numeri mancanti:

La ClearContents e' opzionale, la riga aggiunta e' quella marcata +++

NB: I Numeri Estrazioni saranno inseriti in colonna 22:23 (V:W); per altre posizioni bisogna modificare la dim della V4X21

Ciao

EDIT: vedi messaggio successivo per l'esatta versione della modifica #2
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Composizione numeri con due casuali

Postdi Statix » 01/10/18 22:31

Ciao Anthony47,
credo che manchi qualcosa,
Codice: Seleziona tutto
           GotIt = True
'>> AGGIUNTE per memorizzare N° riga:
            If Fl1 Then
                Cells(II, LBound(V4X21, 2)) = Lii
            Else
                Cells(II, LBound(V4X21, 2) + 1) = Lii
            End If
'<< FINE Aggiunte
            Exit For
Statix
Windows 10,
Office 2013,
Statix
Utente Senior
 
Post: 1287
Iscritto il: 12/05/06 21:55
Località: Provincia di Caserta

PrecedenteProssimo

Torna a Applicazioni Office Windows


Topic correlati a "Composizione numeri con due casuali":


Chi c’è in linea

Visitano il forum: Ricky0185 e 59 ospiti