VBARendere una matrice casuale



  • VBA:Rendere una matrice casuale
    di daligeno data: 03/04/2017 19:09:08

    Salve a tutti, sto facendo un progetto per l'università, metto in allegato il file con il codice in vba.
    Avrei bisogno di sapere come riempire in maniera casuale la matrice pur rispettando i vincoli che ho imposto.
    Al momento riempie la matrice in maniera lineare dal primo operatore in poi, sempre nella stessa sequenza: vorrei rendere questa sequenza casuale.
    1 indica il turno di sala operatoria
    2 indica la reperibilità
    3 la disponibilità pediatrica
    Io ho già imposto il vincolo di fabbisogno ovvero che il numero di operatori non deve superare il fabbisogno giornaliero indicato nell'ultima riga della tabella in basso (ex. il lunedì sono necessari 14 operatori per la sala operatoria 8-14 , 4 dalle 14-20, 1 operatore che faccia disponibilità 8-14 e 3 che siano reperibili 20-8).
    vorrei però che si generi una matrice casuale pur rispettando sempre questi vincoli per tutti i giorni della settimana.
    Ringrazio in anticipo chiunque mi sappia aiutare.



  • di Marius44 data: 04/04/2017 18:50:21

    Ciao daligeno

    prova a dare uno sguardo al tuo file a cui ho aggiunto un foglio.
    Clicca sul pulsante. Ho messo uno stop alla fine per farti notare che nella col.E c'è un problema. Deve essere 14 altrimenti la macro non funziona; penso che il 15mo si possa inserire manualmente.

    Fammi sapere. Ciao,
    Mario



  • di Marius44 data: 05/04/2017 05:20:06

    Ciao (ancora) daligeno

    La notte porta consiglio ...

    Ti allego il file PROGETTO_TER in cui ho aggiunto Modulo2 la cui routine fa quello che ti serve.
    Unico obbligo è lasciare in cella E31 il numero 14 (se mettessimo 15 la macro non funzionerebbe); provvede poi la macro stessa ad aggiungere quanto manca. Infatti nella cella E27 il totale è 15 (come richiesto).

    Un'altra cosa: nella macro vedrai che ho "ripulito" il codice da tutti i doppi apici che avevi messo nell'indicare la riga. Quando utilizzi Cells il riferimenti è sempre a NUMERO di riga e di colonna; se vuoi proprio usare i doppi apici allora + meglio indicare la lettera relativa alla colonna (cioè una stringa).

    Vedi se funziona a dovere e fammi sapere. Ovviamente il file di prima non serve più.
    Ciao,
    Mario



  • di Daligeno (utente non iscritto) data: 05/04/2017 13:16:19

    Ciao Mario

    Ti ringrazio infinitamente per il tuo aiuto prezioso
    Ero bloccata senza saper come andare avanti

    Grazie
    Ciao



  • di Marius44 data: 05/04/2017 15:45:30

    Ciao
    Ho scoperto altre due cose:
    1°) sei una "lei" e non un "lui"
    2°) quando scrivo talvolta il dito non va sul tasto voluto (vedi errori di tasto o di spaziatura) .

    Son contento che ti ho fatto superare l'inghippo. Se sei arrivata al capolinea, allora metti RISOLTO.
    Ciao,
    Mario



  • di daligeno data: 05/04/2017 23:15:55

    Ciao Mario

    sì sono una lei e anche alle prime armi con VBA

    non mi è molto chiaro cosa fa questa parte finale del codice

    j = 0
    For i = 5 To 26
    If Cells(i, 5) = "" Then
    j = j + 1: vt(j) = i
    End If
    Next i
    Randomize
    numcas = Int((j - 1 + 1) * Rnd + 1)
    Cells(vt(numcas), 5) = 1

    Mi trovo in difficoltà perchè ho provato anche ad aggiungere il vincolo che ognuno debba fare al max 38h a settimana, ma mi si blocca tutto
    Credo sia dovuto al fatto che con il codice fin ora non sono ammesse ripetizioni di turni

    Ciao



  • di Marius44 data: 06/04/2017 00:16:47

    Ciao "lei"
    La parte di codice riportato non fa altro che assumere la posizione delle celle vuote della colonna E, generare un numero casuale (compreso fra 1 e 8 perchè tante sono le celle vuote) e scrivere "1" nella cella della riga di cui al numero casuale. Questo perchè il totale del martedì deve essere 15.

    Fin qui la spiegazione.
    Per quanto riguarda, invece, lo stare "sotto" le 38h settimanali, beh, non prometto nulla ma provo a darti la soluzione. Ovvio che se ... arrivi prima tu, gentilmente mi avvisi.

    Ciao,
    Mario



  • di Marius44 data: 06/04/2017 00:42:16

    Ciao
    credo che non sia possibile fare quello che chiedi (oppure aggiungiamo un altro operatore ).

    Il numero di "presenze" previsto (riga 27) moltiplicato per il numero di ore per ogni turno risulta pari a 888h, che diviso il numero totale degli operatori (22) dà una media di poco superiore a 40h ciascuno.

    Come si fa a stare "sotto" le 38h?????

    Ciao,
    Mario



  • di Daligeno (utente non iscritto) data: 06/04/2017 00:52:31

    Ciao

    in realtà le ore di reperibilità non sono da considerarsi nelle 38 h settimanali perché non rappresentano un vero turno . Sono da considerarsi solo le ore di sala operatoria e disponibilità.
    Inoltre ho a disposizione al Max 10 ore di straordinario per ognuno, e il fatto che di sala op , turno 1 per intenderci, Ogni giorno uno stesso operatore può anche fare sia mattina che pomeriggio e infine tutti dovrebbero avere un giorno libero a settimana.

    Ciao
    Dalila




  • di Marius44 data: 06/04/2017 19:01:03

    Ciao Dalila
    Ho apportato qualche modifica al codice (vedi il Foglio3 e, in VBA, il Modulo3 come pure il Modulo del Foglio3).
    Ho aggiunto una FormatCondiz per la col.V dove c'è la somma di ore (REP escluse) settimanali. Mi sono impallato nel "RIPOSO".

    Aggiungo una cosa: quando clicchi sul pulsante la macro esegue e nella col.V, se qualche numero di ore supera 38, la cella relativa si colora in marrone. Puoi cancellare, nella settimana, l'indicazione 1 oppure 3 nella riga e la scrivi in un'altra cella di altra riga. Il nuovo calcolo delle ore avverrà in automatico.

    Come al solito, prova e fai sapere. Ciao,
    Mario



  • di daligeno data: 15/04/2017 12:34:06

    ciao Mario,

    ho avuto problemi alla connessione e non ho avuto più modo di ringraziarti perchè la tua macro è super efficiente, rispetto a ciò che ero riuscita a combinare io

    mi si presenta adesso un problema, dovrei riuscire a contare le volte in cui nella settimana si presenta la combinazione 1 1 2 (solo se si verificano consecutivamente, cioè per lo stesso operatore tutti e tre i turni in un giorno), perchè in base a quello devo poi fare dei calcoli successivi. E' possibile farlo in vba? perchè ho provato con una serie di blocchi if ma senza risultati

    ciao
    Dalila



  • di daligeno data: 15/04/2017 19:39:33

    Ci sono riuscita!!
    grazie comunque per il grandissimo aiuto!!
    Piano piano sto imparando