Condividi:        

Calcolo combinatorio

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: Calcolo combinatorio

Postdi Karistotele » 21/02/12 09:58

Ciao grande Anthony,
chiedo venia, l'ho provata poco fa e funziona secondo quanto da me voluto però, Anthony, potresti cortesamente adattarla come da te pre-detto allo schema da me illustrato?
Dovrei avere anche la possibilità con un button di pulire i dati.

Grazie

P.S. Noto comunque che è molto lenta.
.K
Avatar utente
Karistotele
Utente Junior
 
Post: 45
Iscritto il: 01/05/10 06:28
Località: PADOVA

Sponsor
 

Re: Calcolo combinatorio

Postdi Anthony47 » 21/02/12 23:54

Immagino che l' adattamento riguardi la presentazione delle coppie nella stessa cella; per questo modifica l' ultimo ciclo in
Codice: Seleziona tutto
'scrivi in Dest
For I = 1 To Player - 1
    For J = 1 To Player Step 2
    Range(Dest).Offset(I - 1, (J - 1) / 2).Value = MyVArr(DynArr(I, J), 1) & "-" & _
    MyVArr(DynArr(I, J + 1), 1)
    Next J
Next I
End Sub

In quanto a velocita', con 30 partecipanti la nuova macro si esegue in 2-3 decimi di secondo (la precedente circa il 4-5 decimi); potresti avere delle formule con funzioni "volatili" (Adesso, Oggi, Scarto, Indice, Casuale Cella, Info e forse altre), oppure delle macro "di evento" (tipo Worksheet_Change) o semplicemente un pc un po' giu' di risorse; le aggiunte qui evidenziate (in due blocchi della macro) possono darti una mano:
Codice: Seleziona tutto
If Rispo <> vbYes Then Exit Sub
Application.Calculation = xlManual   '<< Aggiungere
Application.ScreenUpdating = False   '<<
Application.EnableEvents = False     '<<
Selection.Clear

Next I
Application.Calculation = xlCalculationAutomatic   '<< Aggiungere
Application.ScreenUpdating = True   '<<
Application.EnableEvents = True      '<<
End Sub

Se vuoi una macro che cancelli tutto l' elenco (a parte che quando riesegui la macro viene gia' cancellato), allora registrati una macro mentre selezioni e cancelli il range che ti serve.Poi disegna un pulsante (trovi questa forma nella barra degli strumenti Moduli) e assegnagli la macro appena creata (ti verra' fatta una domanda specifica nel corso della creazione del pulsante). In questo modo pero' la tabella deve essere sempre nella stessa posizione che dovrai aver inserito anche nell' istruzione Dest = "C2" 'l' area delle combinazioni

Fai sapere, ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Calcolo combinatorio

Postdi Flash30005 » 22/02/12 00:12

Ho solo modificato il messaggio inserito nella macro di Anthony
dando la possibilità di avere 3 scelte
leggi il messaggio e clicca dove è più opportuno

Codice: Seleziona tutto
Sub comb2a2()
Dim ListA1 As String, Dest As String, MyVArr, DynArr, Rispo, aaa
Dim LstList As Integer, Player As Integer, I As Integer, J As Integer
'Parametri
ListA1 = "A2"   'La cella dove comincia l' elenco dei componenti
Dest = "C2"  'l' area delle combinazioni
'
RePlayer:
LstList = Range(ListA1).Offset(100, 0).End(xlUp).Row
Player = LstList - Range(ListA1).Row + 1
If Player Mod 2 = 1 Then
Range(ListA1).Offset(Player) = "Rip"
GoTo RePlayer
End If
If Player < 4 Or Player > 30 Then
    MsgBox ("Almeno 4 e max 30 Player (ora sono " & Player & "); operazione interrotta")
    Exit Sub
End If
MyVArr = Range(ListA1).Resize(Player, 1).Value
Range(Dest).Resize(Player + 10, Player).Select
Rispo = MsgBox("Effettuare l'intero processo?" & vbCrLf & _
    "SI per continuare, NO per pulire solo l'area selezionata, Annulla per Annullare", vbYesNoCancel)
If Rispo = vbYes Then
Selection.Clear
Selection.Range("A1").Select
'inizializza dynArr
DynArr = Range(Dest).Resize(Player - 1, Player).Value
I = UBound(DynArr, 2)
For I = 0 To Player / 2 - 1
    DynArr(1, 1 + I * 2) = 1 + I: DynArr(1, 1 + I * 2 + 1) = Player - I
Next I
For I = 2 To Player - 1
For J = 2 To Player
    DynArr(I, J) = (DynArr(I - 1, J) - 3 + 2 * (Player - 1)) Mod (Player - 1) + 2
Next J
Next I
For I = 2 To Player - 1
    DynArr(I, 1) = 1
Next I
'scrivi in Dest
For I = 1 To Player - 1
    For J = 1 To Player
        With Range(Dest).Offset(I - 1, J - 1)
            .Value = MyVArr(DynArr(I, J), 1)
            If Int((J - 1) / 2) Mod 2 = 0 Then .Interior.Color = RGB(0, 200, 200)
        'Range(Dest).Resize(Player - 1, Player) = DynArr
        End With
    Next J
Next I
Else
If Rispo = 7 Then Selection.Clear
Range("A1").Select
End If

End Sub


Ma ricorda che ad ogni rielaborazione avrai la stessa distribuzione dei dati dello schema iniziale
quindi l'azzeramento della tabella di output è inutile in quanto, se non cambiano i "valori" nella lista si ripresenteranno nella stessa maniera e, se cambiano
ad ogni nuovo processo avrai automaticamente il risultato voluto
senza dover azzerare la tabella di output

ciao

Edit: 22/02/2012 ore 00:17
penso che sia inutile il mio post scritto accavallandomi a quello di Anthony
per il momento lo lascio, poi vedremo...
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Calcolo combinatorio

Postdi Karistotele » 22/02/12 11:23

Anthony
>Se vuoi una macro che cancelli tutto l' elenco (a parte che quando riesegui la macro viene gia' cancellato),
>allora registrati una macro mentre selezioni e cancelli il range che ti serve.Poi disegna un pulsante (trovi
>questa forma nella barra degli strumenti Moduli) e assegnagli la macro appena creata (ti verra' fatta una
>domanda specifica nel corso della creazione del pulsante). In questo modo pero' la tabella deve essere
>sempre nella stessa posizione che dovrai aver inserito anche nell' istruzione Dest = "C2" 'l' area delle
>combinazioni.

In effetti avevo già registrato la macro associata ad un pulsante, ma alla luce di quanto dici e con la ulteriore precisazione di

Flash
>Ma ricorda che ad ogni rielaborazione avrai la stessa distribuzione dei dati dello schema iniziale
>quindi l'azzeramento della tabella di output è inutile in quanto, se non cambiano i "valori" nella lista si >ripresenteranno nella stessa maniera e, se cambiano
>ad ogni nuovo processo avrai automaticamente il risultato voluto
>senza dover azzerare la tabella di output

Verifico in effetti che “pulire i dati” non ha senso.
Ho seguito le indicazione di Anthony e tutto va bene

Per quanto riguarda il rallentamento della macro essa era in effetti dovuta ad un evento associato (che ho eliminato).
Vedo inoltre, a parte piccole differenze di semantica, una notevole simmetrica capacità di astrarre i problemi sia da Anthony sia da Flash.

Grazie ragazzi per aver aiutato un proletario di VBA a risolvere la questio e grazie per avermi fatto acquisire nuove nozioni, per me preziose. Devo superare però la pigrizia mentale.

Ciao e alla prossima.
.K
Avatar utente
Karistotele
Utente Junior
 
Post: 45
Iscritto il: 01/05/10 06:28
Località: PADOVA

Re: Calcolo combinatorio

Postdi aleghi1987 » 03/01/15 21:24

qualcuno di voi sarebbe disposto a spiegarmi come inserire la macro?
aleghi1987
Newbie
 
Post: 3
Iscritto il: 03/01/15 20:25

Re: Calcolo combinatorio

Postdi Anthony47 » 04/01/15 03:16

Ciao aleghi1987, benvenuto nel forum.
Per inserire una macro in un file excel:
-Da excel: Alt-F11 per aprire l' editor delle macro; Menu /Inserisci /Modulo; copia il codice e incollalo nel frame di dx.
Per eseguire una macro:
-Da Excel, Alt-F8; nell' elenco che ti presenta seleziona la macro che vuoi eseguire e premi Esegui.
-Oppure assegna alla macro un "tast di scelta rapida", o crea un Pulsante e assegnagli la macro.

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

Re: Calcolo combinatorio

Postdi aleghi1987 » 04/01/15 15:32

scusami per npn aver puntualizzato, utilizzo calc openoffice
aleghi1987
Newbie
 
Post: 3
Iscritto il: 03/01/15 20:25

Re: Calcolo combinatorio

Postdi aleghi1987 » 04/01/15 15:39

Vi ringrazio per il benvenuto, approfitto per porre un altro tipo di quesito:

è possibile, modificando la macro, aumentare i numeri dei componenti dei gruppi?
Esempio: nel caso della distribuzione degli operai nei tavoli, se da dmani i tavoli fossero da tre e non più da due, come posso adattare la macro?

Vi ringrazio in anticipo, e ribadisco che utilizzo calc di openoffice, is free. :)
aleghi1987
Newbie
 
Post: 3
Iscritto il: 03/01/15 20:25

Re: Calcolo combinatorio

Postdi Anthony47 » 06/01/15 18:48

La macro in questa discussione fa una cosa specifica, se hai un problema diverso ci vorra' una macro diversa.
Altre discussioni che trattano di calcolo combinatorio e che penso possano avere punti in comune col tuo problema:
viewtopic.php?f=26&t=101079
viewtopic.php?f=26&t=101779&p=588947#p588947
(questo secondo link e' richiamato gia' all' interno della prima disciussione)

Se non risolvi con quanto lì pubblicato allora ti chiederei di aprire una nuova discussione all' interno della quale spiegherai in dettaglio il tuo problema.

Che queste macro siano compatibili con OpenOffice non lo so prevedere.

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

Precedente

Torna a Applicazioni Office Windows


Topic correlati a "Calcolo combinatorio":


Chi c’è in linea

Visitano il forum: Nessuno e 42 ospiti