Macro facile



  • Macro facile
    di EddieTH (utente non iscritto) data: 20/03/2013 18:31:45

    Salve, il prof ci ha dato un esercizio in VBA e noi dovevamo modificarlo. L'esercizio consisteva nel generare un numero compreso fra 1 e 100 e > 80 e di scrivere il numero ed il numero dei tentativi, e questo l'ho fatto, però poi ci ha chiesto da modificarlo in modo da fargli scrivere anche i numeri usciti prima con i rispettivi tentativi, come potrei farlo? grazie per l'aiuto, il mio esercizio lo inserisco sotto, buona sera.
     
    Sub Genera()
    Dim Numero, nrtent As Integer
    nrtent = 0
    Cells(1, 1) = "Numero"
    Cells(2, 1) = "Numero tentativi"
    Do
    Numero = Int(Rnd * 100 + 1)
    nrtent = nrtent + 1
    Loop Until Numero > 80
    Cells(1, 2) = Numero
    Cells(2, 2) = nrtent
    End Sub



  • di Vecchio Frac data: 20/03/2013 19:12:06

    Devi ragionare un po' e procedere passo passo come fossi tu l'interprete VBA che deve eseguire le istruzioni.
    Cioè devi pensare l'algoritmo (la soluzione per risolvere un problema), scriverlo in pseudocodice (a parole, non in codice) e quindi tentare di tradurlo.
    Questo sarà l'argomento della discussione che ho in mente di intavolare (appena avrò davvero il tempo di respirare, patron Mauro ha molta pazienza con me).

    Allora ragiona.
    Se dovessi farlo a mano, cosa ti serve? Probabilmente un contatore per tenere traccia dei tentativi (ma caspita! ce l'hai già), quindi una posizione della cella dove scrivere il dato... e via così :)





  • di EddieTH (utente non iscritto) data: 20/03/2013 19:16:06

    Lo so e ci ho già provato, ma è il primo esercizio di VBA che facciamo, e non riesco a capire come procedere. Ho provato anche con l'IF solo che so veramente poche funzione del VBA. Mi potresti dare qualche altra dritta? o magari scrivermi direttamente la soluzione che ci ragiono su? anche perchè non ho molto tempo dato che è per domani. Grazie tante per l'eventuale risposta, buona sera.



  • di totygno71 data: 20/03/2013 20:09:49

    @VB
    Eddai sò ragazzi....

     
    Sub Genera()
    Dim Numero, nrtent, c As Integer
    Range("B3:CC3").ClearContents
    c = 2
    nrtent = 0
    Cells(1, 1) = "Numero"
    Cells(2, 1) = "Numero tentativi"
    Cells(3, 1) = "Numeri estratti"
    
    Do
        Numero = Int(Rnd * 100 + 1)
        nrtent = nrtent + 1
        Cells(3, c) = Numero
        c = c + 1
    Loop Until Numero > 80
    
    Cells(1, 2) = Numero
    Cells(2, 2) = nrtent
    End Sub
    



  • di Vecchio Frac data: 20/03/2013 20:34:55

    Preferibile dire al prof "ho pensato ma non ci sono riuscito" piuttosto che avere in mano una soluzione per lui incomprensibile e darla per propria (senza sapere cosa ci sta dietro) :)

    p.s.
    1) Dim Numero, nrtent, c As Integer
    scrivere così è concettualmente sbagliato, bisogna scrivere:
    Dim Numero as integer, nrtent as integer, c As Integer
    specificando il tipo per ogni variabile (altrimenti si alloca spazio per variabili di tipo Variant e conseguente spreco di memoria), perchè non è come in altri linguaggi dove si può fare un'aggregazione di tipi
    2) la variabile "c" è inutile visto che hai già "nrtent"





  • di totygno71 data: 20/03/2013 20:37:23

    C'hai raggione, c'hai! volevo vedere se eri attento!
    bahahahha ^_^



  • di EddieTH (utente non iscritto) data: 20/03/2013 22:09:14

    Vabbè tanto è l'ora aggiuntiva che abbiamo scelto noi dell'ex P.N.I. quindi non c'è problema se non lo porto al prof. Però non ho capito una cosa, fra l'altro della parte che ho fatto io, perchè con il Rnd*100 ci va pure il +1? Grazie per le risposte, buona sera.



  • di Vecchio Frac data: 21/03/2013 15:39:33

    L'ora aggiuntiva che hai scelto è ottima, continua così e non ti pentirai ^_^

    La funzione Rnd restituisce un valore minore di 1 ma maggiore o uguale a zero.
    Moltiplicare un numero maggiore o uguale a 0 e minore di 1 per 100 significa ottenere un numero maggiore o uguale a 0 e minore di 100:
    x = Rnd * 100 ottieni 0 <= x <= 99
    (il simbolo <= si legge "minore di o uguale a")
    Poichè la richiesta iniziale è " L'esercizio consisteva nel generare un numero compreso fra 1 e 100", al numero così ottenuto devi aggiungere un'unità per soddisfare il requisito:
    x = Rnd * 100 + 1 ottieni 1 <= x <= 100

    In generale per ottenere un numero (intero) compreso fra due estremi la formula in VBA è:
    Int(Rnd * (limite_superiore - limite_inferiore + 1) + limite_inferiore)
    Perciò supponendo che vuoi lanciare due dadi, con questa formula ottieni un numero tra 2 e 12:
    x = Int(Rnd * (12 - 2 + 1) + 2)
    e sviluppando:
    x = Int(Rnd * 11 + 2)
    (che si legge così: poni in x la parte intera di un numero frazionario causale tra zero e dieci, più due)

    Come postilla, raccomando di inserire "Randomize Timer" a inizio Sub, per generare ogni volta che la richiami un numero (pseudo)causale sempre diverso.