Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Riempimento con probabilità

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

Riempimento con probabilità

Postdi john_pigal » 26/04/15 19:18

Buonasera!
sono un novizio di VBA e vi chiedo aiuto per un esercizio...lo spiego praticamente che è meglio :oops:

Ho due fogli (che per semplicità chiamo 'F1' e 'F2'):
- nell' 'F1' ho 3 colonne: Cod_A (che può andare da 1 a 5), Cod_Fr (che può andare da 1 a 4) e Num_articoli (che per ora è vuota); ho quindi circa 30000 righe composte dalle varie combinazioni di Cod_A e Cod_Fr
- nell' 'F2' ho 4 colonne: Cod_A, Cod_Fr, Num_articoli, e Probabilita. Praticamente in questo foglio ho che per ogni Cod_A e per ogni Cod_Fr (1-1;1-2;1-3;1-4;2-1;2-2 ... 4-4) ho un certo Num_articoli (non più di 25) che a loro volta hanno una certa Probabilità (crescente, che va da 0 a 1 ovviamente).

Ora, vorrei che, per ogni riga dell' 'F1', si generi un RND(); se questo RND() è minore della prima Probabilità associata al Cod_A e Cod_Fr si prende il Num_articoli relativo e lo si metta nella relativa cella dell' 'F1', altrimenti si prende la seconda probabilità, la terza e così via.

Spero di essermi spiegato bene...chiedo il vostro aiuto e vi ringrazio!!!!
john_pigal
Newbie
 
Post: 3
Iscritto il: 26/04/15 18:52

Sponsor
 

Re: Riempimento con probabilità

Postdi ricky53 » 26/04/15 19:42

Ciao,
prima di tutto benvenuto nel nostro forum.

Puoi dare qualche altre informazione e/o dettagliare un po' di più il tuo quesito.

Un file di esempio che sia esaustivo della casistica reale che hai ci aiuterebbe.

Per allegare un file leggi QUI
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Riempimento con probabilità

Postdi john_pigal » 26/04/15 21:12

Grazie del benvenuto e della risposta.

Il file è qui:
http://we.tl/gvQcEcB3LY


Come si vede la struttura è come ho spiegato (più o meno :lol: ); ora per ogni riga del primo foglio voglio generare un numero casuale tra 0 e 1 e confrontarlo con le cumulate del secondo foglio...faccio un esempio con la prima riga:
foglio 1, prima riga: Cod_A=2 Cod_FR=2 -> genero un numero casuale RND 0.881861918
Vado nel secondo foglio e mi metto in Cod_A=2 e Cod_FR=2, vedo che il primo Num_articoli è 0 a cui è associata una prob di 0.31958, il numero casuale è maggiore: NON VA BENE. Vado al secondo Num_articoli idem, stessa cosa terzo e quarto. Il quinto Num_articoli è 4 che ha una Probabilità di 0.92783 che è MAGGIORE del numero casuale generato e quindi vorrei che 4 sia messo nella cella C2...ovviamente questo appena detto deve essere fatto per tutte le righe

Ti ringrazio infinitamente
john_pigal
Newbie
 
Post: 3
Iscritto il: 26/04/15 18:52

Re: Riempimento con probabilità

Postdi ricky53 » 27/04/15 00:57

Ciao,
allora procedi in questo modo:
A) nel foglio "freqNum" inserisci una colonna prima della colonna "Cod_FR e copia la seguente formula
Codice: Seleziona tutto
=B2 & C2 & E2


B) copia in basso fino all'ultima riga, nel tuo file e la riga "202"

C) nel foglio "Foglio1" in "D2" scrivi
Codice: Seleziona tutto
=CASUALE()


D) sempre nel "Foglio1" in "C2" scrivi
Codice: Seleziona tutto
=INDIRETTO("freqNum!D"& CONFRONTA(A2 & B2 & D2; freqNum!$A$1:$A$300;  1)+ SE(D2<1; 1;0))


E) copia in basso fino a necessità


Prova e ... mi trovi QUI


ATTENZIONE: per frequenze molto piccole la formula potrebbe restituire #N/D ... Cerco una soluzione a questo caso
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Riempimento con probabilità

Postdi john_pigal » 27/04/15 08:07

Perfetto! grazie!!! :D

Non preoccuparti del #N.D. non è un problema...
Ti chiedo solo un'altra cosa, se hai la disponibilità e la voglia (che è stata già tantissima!): con ciò che hai fatto, si potrebbe scrivere un codice???

In ogni caso, ancora grazie
john_pigal
Newbie
 
Post: 3
Iscritto il: 26/04/15 18:52

Re: Riempimento con probabilità

Postdi ricky53 » 27/04/15 12:29

Ciao,
si era mia intenzione dirti: che ne dici se facciamo tutto con del codice VBA visto che hai tante righe?
Mi hai anticipato!



Dammi un po' di tempo e ...
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Riempimento con probabilità

Postdi ricky53 » 28/04/15 01:17

Ciao,
per il momento il codice che ho scritto ha tempi di elaborazione lunghi ... sto cercando altre soluzioni.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Riempimento con probabilità

Postdi ricky53 » 28/04/15 14:22

Ciao,
quanto ti invio mi sembra buono, prova e ... io ottengo tempi di elaborazione, con il tuo file, di 1,2 sec.
Codice: Seleziona tutto
Option Explicit
Option Base 1

Sub Elabora_Probabilità()
    Dim UR1 As Long, UR2 As Long, I As Long, J As Long, Num_Casuale As Single, Trovato As String, Inizio As Double
    Dim Matr1, Matr2, WS1 As Worksheet, WS2 As Worksheet
   
    Application.ScreenUpdating = False
    Inizio = Timer

    Set WS1 = Sheets("Foglio1"): Set WS2 = Sheets("FreqNum")
    WS1.Select
    WS1.Range("A1").AutoFilter Field:=1, Criteria1:="<>"
    ActiveSheet.ShowAllData
    WS2.Select
    WS2.Range("A1").AutoFilter Field:=1, Criteria1:="<>"
    ActiveSheet.ShowAllData
   
    UR1 = WS1.Range("A" & Rows.Count).End(xlUp).Row
    WS1.Range("C2:D" & UR1).ClearContents
    Matr1 = WS1.Range("A2:D" & UR1)
   
    UR2 = WS2.Range("A" & Rows.Count).End(xlUp).Row
    Matr2 = WS2.Range("A2:D" & UR2)
   
    For I = 1 To UR1 - 1
        Trovato = "NO"
Continua:
        Num_Casuale = Rnd()
        For J = 1 To UR2 - 1
            If Matr1(I, 1) = Matr2(J, 1) And Matr1(I, 2) = Matr2(J, 2) Then
                If Matr2(J, 4) > Num_Casuale Then
                    Matr1(I, 3) = Matr2(J, 3)
                    Matr1(I, 4) = Num_Casuale
                    Trovato = "SI"
                    Exit For
                End If
            End If
        Next J
        If Trovato <> "SI" Then
            If Matr1(I, 1) > Matr2(J - 1, 1) Then
                Matr1(I, 3) = "Cod. non trovati"
            Else
                Matr1(I, 3) = "Probab. non trovata"
                Matr1(I, 4) = Num_Casuale
                GoTo Continua
            End If
        End If
    Next I
    WS1.Range("A2:D" & UR1) = Matr1
    Application.ScreenUpdating = True
       
    MsgBox "Elaborazione effettuata in  '" & Format(Timer - Inizio, "0.000") & "'  sec."
    Set WS1 = Nothing: Set WS2 = Nothing
End Sub
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Riempimento con probabilità

Postdi robi88_na » 29/04/15 12:44

Ti ringrazio tantissimo!!

:) :)

P.S. la funzione
INDIRETTO("freqNum!D"& CONFRONTA(A2 & B2 & D2; freqNum!$A$1:$A$300; 1)+ SE(D2<1; 1;0))
cosa fa?
robi88_na
Newbie
 
Post: 4
Iscritto il: 25/03/15 16:25

Re: Riempimento con probabilità

Postdi ricky53 » 29/04/15 15:49

Ciao,
come è andata l'elaborazione con la macro?


Per i chiarimenti che hai chiesto:
dalla guida di excel ottieni (non ho riportato tutto ... leggila)

INDIRETTO
Restituisce il riferimento specificato da una stringa di testo. I riferimenti vengono calcolati immediatamente in modo da visualizzarne il contenuto. Utilizzare la funzione INDIRETTO quando si desidera cambiare il riferimento a una cella all'interno di una formula senza modificare la formula stessa.

Sintassi
INDIRETTO(rif;a1)

Rif è un riferimento a una cella che contiene un riferimento di tipo A1, un riferimento di tipo R1C1, un nome definito come riferimento oppure un riferimento a una cella come una stringa di testo. Se rif non è un riferimento di cella valido, INDIRETTO restituirà il valore di errore #RIF!.
Se rif si riferisce a un'altra cartella di lavoro, ovvero è un riferimento esterno, questa cartella di lavoro deve essere aperta. In caso contrario verrà restituito il valore di errore #RIF!.

A1 è un valore logico che specifica il tipo di riferimento contenuto nella cella rif.
Se a1 è VERO o è omesso, rif verrà interpretato come un riferimento di tipo A1.
Se a1 è FALSO, rif verrà interpretato come un riferimento di tipo R1C1.

=INDIRETTO($A$2) Valore del riferimento nella cella A2 (1,333)
=INDIRETTO($A$3) Valore del riferimento nella cella A3 (45)
=INDIRETTO("B"&$A$5) Valore di un riferimento nella cella A5 (62)


Quando si crea una formula che si riferisce a una cella, il riferimento alla cella verrà automaticamente aggiornato se: (1) la cella viene spostata utilizzando il comando Taglia o (2) la cella viene spostata perché vengono inserite o eliminate righe o colonne. Se non si desidera che il riferimento venga aggiornato, sarà sufficiente utilizzare la funzione INDIRETTO.


CONFRONTA
Restituisce la posizione relativa di un elemento in una matrice che corrisponde a un valore specificato in un ordine particolare. Utilizzare la funzione CONFRONTA invece di una delle sintassi della funzione CERCA quando è necessario determinare la posizione di un elemento all'interno di un intervallo piuttosto che l'elemento stesso.

Sintassi
CONFRONTA(valore;matrice;corrisp)

Valore è il valore utilizzato per ricercare il valore desiderato all'interno di una tabella.
Valore è il valore del quale si desidera trovare il corrispondente in matrice. Ad esempio, se si ricerca il numero di telefono di una persona in una rubrica, si utilizza il nome della persona come valore di ricerca, ma il valore desiderato è il numero di telefono.
Valore può essere un valore numerico, di testo o logico oppure un riferimento di cella a un numero, a del testo o a un valore logico.

Matrice è un intervallo contiguo di celle adiacenti che contengono i possibili valori da ricercare. Matrice deve essere una matrice o un riferimento di matrice.

Corrisp è il numero -1, 0 o 1. Corrisp specifica il modo in cui Microsoft Excel deve confrontare valore con i valori contenuti in matrice.

Se corrisp è 1, CONFRONTA troverà il valore più grande che è minore o uguale a valore. È necessario che i valori in matrice siano disposti in ordine crescente: ...-2; -1; 0; 1; 2;...A-Z; FALSO; VERO.
Se corrisp è 0, CONFRONTA troverà il primo valore che corrisponde esattamente a valore. I valori in matrice possono essere disposti in qualsiasi ordine.
Se corrisp è -1, CONFRONTA troverà il valore più piccolo che è maggiore o uguale a valore. È necessario che i valori di matrice siano disposti in ordine decrescente: VERO; FALSO; Z-A;...2; 1; 0; -1; -2;... e così via.
Se corrisp è omesso, verrà considerato uguale a 1.

Osservazioni
CONFRONTA restituisce la posizione del valore confrontato all'interno di matrice, non il valore stesso. La formula CONFRONTA("b";{"a";"b";"c"};0), ad esempio, restituisce 2, la posizione relativa di "b" all'interno della matrice {"a";"b";"c"}.
La funzione CONFRONTA non rileva le maiuscole.
Se CONFRONTA non riesce a trovare un valore corrispondente, restituirà il valore di errore #N/D.
Se corrisp è 0 e valore è del testo, valore potrà contenere i caratteri jolly asterisco (*) e punto interrogativo (?). L'asterisco rappresenta una sequenza di caratteri qualsiasi, mentre il punto interrogativo rappresenta un singolo carattere.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia


Torna a Applicazioni Office Windows


Topic correlati a "Riempimento con probabilità":


Chi c’è in linea

Visitano il forum: Nessuno e 12 ospiti