Macro Con Condizione



  • Macro Con Condizione
    di FRANCO69 data: 06/12/2013 20:12:36

    Buona sera a tutti gli amici del forum avrei bisogno di una macro con una condizione,riporto l esempio
    se la cella A1 contiene come valore numerico 1 vorrei riportare nel range E2:N2 i numeri dalla decina 1 lotto(1,2,3,4,5,6,7,8,9,90)
    se la cella A1 contiene come valore numerico 10 vorrei riportare nel range E2:N2 i numeri dalla decina 10 lotto(10,11,12,13,14,15,16,17,18,19)
    se la cella A1 contiene come valore numerico 20 vorrei riportare nel range E2:N2 i numeri dalla decina 10 lotto(20,21,22,23,24,25,26,27,28,29)
    e cosi fino alla decina 80.
    Spero di essermi spiegato.

    Saluti a Tutti



  • di Vecchio Frac data: 06/12/2013 20:20:34

    Hai descritto bene il problema e hai fornito anche l'algoritmo per la soluzione.
    Ti basta tradurre tutto con la corretta sintassi VBA.
    Gli elementi che devi considerare sono:
    - Come si comincia una routine in VBA?
    - Come si testa una condizione?
    - Come si assegna un valore a un range?

    Prova a cominciare da solo. Poi ti aiutiamo ad affinare ^_^





  • di gaetanopr data: 06/12/2013 20:24:43

    Ciao Franco69, prova questa macro



     
    Sub lotto()
    For i = 1 To 10
     Cells(2, i + 4).Value = Cells(1, 1).Value - 1 + i
    Next i
    If Range("N2").Value = 10 Then Range("N2").Value = 90
    End Sub



  • di gaetanopr data: 06/12/2013 20:25:40

    @VecchioFrac
    non avevo visto la tua risposta


  • Macro Con Condizione
    di FRANCO69 data: 06/12/2013 20:32:12

    Va benissimo ringrazio sia gaetanopr che Vecchio Frac siete stati velocissimi abbino un pulsante alla prossima

    Tanti Saluti di una buona Immacolata



  • di patel data: 06/12/2013 20:33:09

    questo è il tipico caso in cui sarebbe utile poter eliminare il messaggio oppure correggerlo





  • di nichicanta (utente non iscritto) data: 06/12/2013 20:41:48

    Buonasera amici, esperti e non, e pensare che stavo cercando di aiutare l'amico FRANCO69 considerando di utilizzare un ciclo select case la soluzione al suo quesito ( ragionando in questo modo se la cella è uguale a un dato valore dammi questo e cosi via e stando a quanto ho letto è preferibile usare seelct case al posto di if end if quando si devono verificare più condizioni.
    Sto imparando cose nuove grazie al vostro prezioso aiuto, per favore mi potreste indicare se era possibile ( lo so gaetanopr l'ha realizzato con poche righe di codice) ottenere lo stesso risultato e se è no perché.
    Vi saluto con affetto e stima.


  • Macro Con Condizione
    di FRANCO69 data: 06/12/2013 20:42:59

    Ciao patel scusami o sbagliato qual cosa nel scrivere puoi correggermi .

    Saluti



  • di scossa data: 06/12/2013 20:43:56

    Volendo si può fare senza VBA.

    Selezionare E2..N2 ed inserire questa formula matriciale da confermare con ctrl+maiusc+invio:
     
    ={12345678990}*(A1=1)+({0123456789}+A1)*((A1=10)+(A1=20))


  • Macro Con Condizione
    di FRANCO69 data: 06/12/2013 20:50:58

    O provato anche quella di scossa va benissimo vi ringrazio tutti.

    Saluti



  • di Vecchio Frac data: 06/12/2013 20:54:54

    @patel
    Pur potendolo fare, non elimino post se non è strettamente necessario (essenzialmente elimino i doppioni).
    Trovo che comunque una discussione si dipana in un contesto di reciproca costruzione.
    Franco può confrontare il mio ragionamento con la "traduzione" di gaetano. Anzi, forse è meglio così :)

    Peraltro invito scossa ad illustrare, se ne ha tempo e voglia, la sua formula (altrimenti lo farò io), che combina efficacemente matrici e intersezioni.





  • di totygno (utente non iscritto) data: 06/12/2013 20:55:44

    Ciao Nichi
    dato un problema le soluzioni possono essere sempre svariate...
    Tutte le strade portano a Roma... Ma ci sono strade e strade...
    L'hai detto tu gaetano con poche righe ha risolto il problema (anche se non si è considerato il problema se in A1 non c'è nulla oppure c'è un numero superiore a 80 o un numero decimale, una stringa etc etc)
    utilizzando il metodo che suggerisci tu raggiungi lo stesso risultato ma devi scrivere molte più righe.
    Questo è quanto per quanto mi riguarda.
    Ciao



  • di nichicanta (utente non iscritto) data: 06/12/2013 21:00:11

    Grazie V.Frac, per la precisazione, cerco sempre più di imparare e immagazzinare esperienze e metodologie diverse di programmazione, ma soprattutto di capire come voi esperti percorrete la via più breve e altrettanto funzionale.
    Saluti.



  • di gaetanopr data: 06/12/2013 21:00:22

    cit>>anche se non si è considerato il problema se in A1 non c'è nulla oppure c'è un numero superiore a 80 o un numero decimale, una stringa etc etc)
    Ciao totygno, Franco69 non ha specificato come inserisce i dati in A1, potrebbe usare una convalida dati in modo da poter scegliere solo tra i nove come da quesito oppure un combobox in modo da poter sfruttare l'evento change per avviare la macro




  • di nichicanta (utente non iscritto) data: 06/12/2013 21:03:01

    Scusami ancora totygno, ora ho notato che ho risposto a V.Frac e non a te che mi hai giustamente consigliato.
    Saluto tutti Voi indistintamente con affetto e stima.
    Ciao Toty.



  • di totygno (utente non iscritto) data: 06/12/2013 21:04:04

    Ciao Gaetano
    lungi da me criticare il tuo ottimo lavoro, anzi... era solo per spiegare a Nichi che le modalità possono essere diverse anche se più o meno valide...



  • di totygno (utente non iscritto) data: 06/12/2013 21:10:17

    cit"Scusami ancora totygno, ora ho notato che ho risposto a V.Frac
    bhahahaha non te l'aspettavi e???? ^_^



  • di nichicanta (utente non iscritto) data: 06/12/2013 21:19:37

    No Totygno, per esserti sincero, pensavo di averti ferito tanto in quella famosa discussione, e che, non vedendoti per tanto tempo intervenire nelle mie richieste di aiuto, avevo dato per scontato l'intervento di un altro amico del forum ( in questo caso ho nominato V.Frac).
    Posso solo dirti che mi fa piacere averti riconquistato e sentirti vicino come amico ed esperto di questo bellissimo forum.
    Ciao Toty



  • di gaetanopr data: 06/12/2013 21:25:12

    Ciao Totygno, ci mancherebbe non l'ho presa come una critica, anzi, stavo per rispondere al ns amico nichicanta, ma mi hai preceduto e ho semplicemente risposto alle tue giuste osservazioni, in modo che anche Franco possa prenderle in considerazione
    Un saluto a tutto il forum


  • Macro Con Condizione
    di FRANCO69 data: 06/12/2013 21:36:30

    Ciao gaetanopr scusami ai ragione avevo pensato di inserire i numeri nella cella A1 manualmente dato che sono 10 o con un filtro ma se troviamo la soluzione con una macro abbinata con un pulsante sarebbe più semplice chiaramente i numeri partendo da 0,1,10,20,30,40,50,60,70,80.




  • di Vecchio Frac data: 06/12/2013 21:46:57

    cit. "mi fa piacere averti riconquistato"
    ---> Che dite, li lasciamo soli questi due? Hanno fatto la paciuccia





  • di totygno (utente non iscritto) data: 06/12/2013 21:48:53

    cit "Che dite, li lasciamo soli questi due?

    Come mod mi aspetto che ci offri almeno una bottiglia di prosecco!!! Hai il braccino corto come i nonesi percaso...^_^



  • di gaetanopr (utente non iscritto) data: 06/12/2013 22:11:07

    Ti allego un piccolo esempio con la macro associata all'evento Worksheet_Change del Foglio1, al variare del valore in A1, dove ho inserito un menu a tendina con i nove valori (1, 10, 20, 30, 40, 50, 60, 70, 80) vengono popolate le celle da E2:N2

    Saluti



  • di totygno (utente non iscritto) data: 06/12/2013 22:19:33

    cit "se la cella A1 contiene come valore numerico 1 vorrei riportare nel range E2:N2 i numeri dalla decina 1 lotto(1,2,3,4,5,6,7,8,9,90)

    risp: sicuro che l'ultimo sia un 90 e non un 10???? che senso ha?



  • di scossa data: 06/12/2013 23:24:47

    Una variante senza ciclo for...next al codice di gaetanopr:
     
    Private Sub Worksheet_Change(ByVal Target As Range)
      Dim nVal As Integer
      Dim aVal As Variant
      
        If Intersect(Target, Me.Range("A1")) Is Nothing Then Exit Sub
      
        nVal = Me.Range("A1").Value
        If nVal = 1 Then
          aVal = [row(1:10)]
          aVal(10, 1) = 90
        Else
          aVal = Application.Evaluate("row(" & nVal & ":" & nVal + 9 & ")")
        End If
        Application.EnableEvents = False
        Me.Range("E2:N2") = Application.Transpose(aVal)
        Application.EnableEvents = True
    End Sub
    


  • Macro Con Condizione
    di FRANCO69 data: 06/12/2013 23:51:50

    Se possibilmente vorrei abbinare alla macro una casella di selezione mi riportate un esempio con file in allegato.


  • Macro Con Condizione
    di FRANCO69 data: 06/12/2013 23:57:23

    Ciao gaetanopro visto il tuo file se invece della tendina abbinerei alla macro una casella di selezione mi riporti un esempio in allegato il file.


  • Macro Con Condizione
    di FRANCO69 data: 07/12/2013 01:33:57

    Una correzzione se non chiedo troppo inserendo il numero 0 nella cella A1 vorrei che il range E2:N2 mi riportasse 0
    una precisazione per totygno riguardo la decina 1 corrisponde alla decina cabalistica alcuni programmi la riportano come 0 (1,2,3,4,5,6,7,8,9,90) io come 1

    Saluti a tutti



  • di Raffaele_53 (utente non iscritto) data: 07/12/2013 13:43:47

    X Scossa
    >>> ={12345678990}*(A1=1)+({0123456789}+A1)*((A1=10)+(A1=20)) Non mi funziona???

    Inoltre credo che i numeri dovrebbero essere 1,11,21,31,41,51,61,71,81
    Ex = sia dal 1 al 10, 11 al 20, 21 al 30 ecc ecc sino dal 81 al 90
    Non ho mai giocato al lotto.



  • di gaetanopr (utente non iscritto) data: 07/12/2013 14:23:01

    Ciao ti ho aggiunto il pulsante di selezione



  • di scossa data: 07/12/2013 14:51:58

    @Raffaele_53: non saprei dirti, allego il file.

    Nel nuovo file ho messo (solo per la soluzione con VBA) un adeguamento automatico del valore in A1 alla decina.

     
    Private Sub Worksheet_Change(ByVal Target As Range)
      Dim nVal As Integer
      Dim aVal As Variant
      
      With Application
        If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub
        nVal = Round(Me.Range("A1").Value)
        Select Case nVal
        Case 0
          aVal = [row(1:10) - row(1:10)]
        Case 1 To 9
          aVal = [row(1:10)]
          aVal(10, 1) = 90
        Case Else
          nVal = .Min(Int(nVal / 10) * 10, 80)
          aVal = .Evaluate("row(" & nVal & ":" & nVal + 9 & ")")
        End Select
        .EnableEvents = False
        Me.Range("E2:N2") = .Transpose(aVal)
        .EnableEvents = True
      End With
    End Sub
    



  • di Raffaele_53 (utente non iscritto) data: 07/12/2013 15:27:55

    @ scossa
    Con questa aggiunta mi funziona
    >>>={1;2;3;4;5;6;7;8;9;90}*(A1=1)+({0;1;2;3;4;5;6;7;8;9}+A1)*((A1=10)+(A1=20)+(A1=30)+(A1=40)+(A1=50)+(A1=60)+(A1=70)+(A1=80))

    Però, come credo devono essere scritte come nel post mio sopra (sicuramente sbaglio, io volevo solo capire la Tua formula)
    Ps. macro non mi interessa, la saprei fare come dice gaetanopr con una casella di controllo.


  • Macro Con Condizione
    di FRANCO69 data: 07/12/2013 15:42:12

    Ciao gaetanopr o visionato il tuo ultimo file tutto ok adesso provo a crearlo da solo per capire se ci riesco eventualmante ti informo, ringrazio tutti.

    Saluti



  • di scossa data: 07/12/2013 18:50:49

    Cit. Raffaele: "Con questa aggiunta mi funziona >>>={1;2;3;4;5;6;7;8;9;90}*(A1=1)+({0;1;2;3;4;5;6;7;8;9}+A1)*((A1=10)+(A1=20)+(A1=30)+(A1=40)+(A1=50)+(A1=60)+(A1=70)+(A1=80))

    Però, come credo devono essere scritte come nel post mio sopra (sicuramente sbaglio, io volevo solo capire la Tua formula) "

    Per la richiesta di Franco i numeri sono giusti come li ho messi.
    Provo a spiegare la formula.

    ={1;2;3;4;5;6;7;8;9;90}*(A1=1)+({0;1;2;3;4;5;6;7;8;9}+A1)*((A1=10)+(A1=20)+(A1=30)+(A1=40)+(A1=50)+(A1=60)+(A1=70)+(A1=80))

    la logica sottostante è quella che la cella A1 può contenere uno ed un solo valore (che sia 0, 1, 10, 20 ... 80) per cui una sola delle condizioni A1=qualcosa sarà VERA, quindi se

    A1 = 0 -> nessuna condizione è vera e nelle celle E2..N2 avremo tutti 0

    A1 = 1 -> avremo {1;2;3;4;5;6;7;8;9;90}*(VERO) + ({0;1;2;3;4;5;6;7;8;9}+A1)*(FALSO+FALSO+....+FALSO) cioè
    {1;2;3;4;5;6;7;8;9;90}*1 + 0 quindi nelle celle E2..N2 avremo questa matrice.

    A1 = 10 -> avremo {1;2;3;4;5;6;7;8;9;90}*(FALSO) + ({0;1;2;3;4;5;6;7;8;9}+10)*(VERO+FALSO+FALSO+......+FALSO+FALSO) cioè
    ({0;1;2;3;4;5;6;7;8;9}+10)*(1) -> {10;11;12;13;14;15;16;17;18;19}

    .....

    A1 = 80 -> avremo {1;2;3;4;5;6;7;8;9;90}*(FALSO) + ({0;1;2;3;4;5;6;7;8;9}+80)*(FALSO+FALSO+FALSO+......+FALSO+VERO) cioè
    ({0;1;2;3;4;5;6;7;8;9}+80)*(1) -> {80;81;82;83;84;85;86;87;88;89}

    Spero la spiegazione sia sufficientemente chiara, se Vecchio Frac o chiunque altro volesse spiegare la formula più "didatticamente" intervenga pure.



  • di Raffaele_53 (utente non iscritto) data: 08/12/2013 00:30:58

    @scossa
    La domanda di franco è ambigua
    Io credo che nel lotto i numeri siano differenti per ottenere le decine
    Come scritto sopra desidero ottenere la decina del 5
    Pertanto sarà 51,52,53,54,55,56,57,58,59,60

    Almeno per quello che ho capito e chiedo scusa se ho sbagliato
    >>>dalla decina 1 lotto(1,2,3,4,5,6,7,8,9,90)
    >>>se la cella A1 contiene come valore numerico 10 vorrei riportare nel range E2:N2 i numeri dalla decina 10 lotto(10,11,12,13,14,15,16,17,18,19)

    Che invece dovrebbero essere 11,12 ecc ecc e 20 finale
    Se mi puoi spiegare come modificare la formula? (rimbambito si, mà riesco ancora a leggere i suggerimenti). Ciao



  • di Raffaele_53 (utente non iscritto) data: 08/12/2013 00:41:29

    Oppure la decina del zero= 1,2,3,4,5,6,7,8,9,10


  • Macro Con Condizione
    di FRANCO69 data: 08/12/2013 01:49:26

    Una precisazione le decine si distinguono in decine naturali e decine cabalistiche
    Decine Cabalistiche
    0>1 2 3 4 5 6 7 8 9 90
    1>10 11 12 13 14 15 16 17 18 19
    2>20 21 22 23 24 25 26 27 28 29
    3>30 31 32 33 34 35 36 37 38 39
    4>40 41 42 43 44 45 46 47 48 49
    5>50 51 52 53 54 55 56 57 58 59
    6>60 61 62 63 64 65 66 67 68 69
    7>70 71 72 73 74 75 76 77 78 79
    8>80 81 82 83 84 85 86 87 88 89

    Decine Naturali
    1>1 2 3 4 5 6 7 8 9 10
    2>11 12 13 14 15 16 17 18 19 20
    3>21 22 23 24 25 26 27 28 29 30
    4>31 32 33 34 35 36 37 38 39 40
    5>41 42 43 44 45 46 47 48 49 50
    6>51 52 53 54 55 56 57 58 59 60
    7>61 62 63 64 65 66 67 68 69 70
    8>71 72 73 74 75 76 77 78 79 80
    9>81 82 83 84 85 86 87 88 89 90
    queste sono le vere disposizioni
    e stata una mia scelta sostituire 1 la decina da 1a 90 10 la decina da 10 a 19 ecc.. ma la vera disposizione e quella che riportato con il mio programma lottovision della softvision.

    Saluti tanti auguri al forum


  • Macro Con Condizione
    di FRANCO69 data: 10/12/2013 00:18:36

    Ciao gaetanopr scusa la mia ignoranza riguardo VBA o provato a inserire in un foglio il tuo codice in abbinamento al pulsante ma non riesco attivarlo provo a inviarti il mio file eventualmente correggerlo se manca qualche attivazione nel VBA con una spiegazione semplice.

    Saluti



  • di gaetanopr (utente non iscritto) data: 10/12/2013 09:12:45

    Ciao Franco, nel file che hai allegato non è presente alcun pulsante, devi selezionarlo tra i controlli ActiveX



  • di gaetanopr data: 10/12/2013 10:19:42

    Rileggendo il codice è più "corretto" usare le proprietà Min e Max del spinbutton, quindi la macro puoi cambiarla in questo modo, la parte remmata è quella sostituita
     
    Option Explicit
    
    Private Sub SpinButton1_Change()
    Dim S()
    Dim i As Integer
    S = Array(0, 1, 10, 20, 30, 40, 50, 60, 70, 80)
    SpinButton1.Min = 0
    SpinButton1.Max = 9
    'If Foglio1.SpinButton1.Value >= 9 Then Foglio1.SpinButton1.Value = 9
    Range("A1").Value = S(Foglio1.SpinButton1.Value)
    
    
    If Cells(1, 1).Value = 0 Then [E2:N2] = 0: Exit Sub
    For i = 1 To 10
      Cells(2, i + 4).Value = Cells(1, 1).Value - 1 + i
    Next i
    If Range("N2").Value = 10 Then Range("N2").Value = 90
    End Sub


  • Macro Con Condizione
    di FRANCO69 data: 10/12/2013 12:03:00

    Grazie gaetanopr tutto ok funziona, grazie della disponibilità nel rispondere.

    Saluti