Aiuto Vba x excel



  • Aiuto Vba x excel
    di Clic (utente non iscritto) data: 24/01/2013 20:21:27

    Salve a tutti
    Vorrei far apparire un message box quando una cella contenuta nel foglio Valore supera i valori contenuti in determinate celle del foglio Soglia. Ho provato a scrivere del codice in VBA per excel pur non avendolo mai visto ma non funziona. Ovviamente la macro dovrebbe funzionare anche con più cartelle di lavoro aperte. Il codice è riportato di seguito. Qualcuno puoi darmi qualche indicazione?
    Grazie per l’attenzione.

    Sub SH50 ()
    '
    Dim SH61 As Integer
    Dim SH50 As Integer
    Dim SH38 As Integer
    Dim SH23 As Integer
    Dim SPRD As Integer


    SH61 = Worksheets("Soglia").Range(E5).Value
    SH50 = Worksheets("Soglia ").Range(E6).Value
    SH38 = Worksheets("Soglia ").Range(E7).Value
    SH23 = Worksheets("Soglia ").Range(E8).Value
    SPRD = Worksheets("Valore").Range(D5).Value

    If SPRD >= SH61 Then
    MsgBox " SH 61 "
    End If
    If SPRD >= SH50 Then
    MsgBox " SH 50 "
    End If
    If SPRD >= SH38 Then
    MsgBox " SH 38 "
    End If
    If SPRD >= SH23 Then
    MsgBox " SH 23,6 "
    End If


    End Sub



  • di Vecchio Frac data: 24/01/2013 21:13:20

    A un'occhiata superficiale il tuo codice dovrebbe funzionare.
    Cosa intendi per "non funziona"? non ottieni il risultato atteso o si blocca con un errore? in questo caso riportaci il codice di errore, la sua descrizione e la riga dove si ferma.
    Con i dati che hai fornito prova il codice sottostante, che, in forma più compatta, fa quel che ho capito io leggendo il tuo spezzone di codice.
     
    sub test()
    dim s as string
    with sheets("soglia")
        select case sheets("Valore").[D5]
        case is >= .[E5]: s = "61"
        case is >= .[E6]: s = "50"
        case is >= .[E7]: s = "38"
        case is >= .[E8]: s = "23,6"
        end select
        msgbox "SH " & s
    end with
    end sub






  • di Clic (utente non iscritto) data: 25/01/2013 21:05:21

    Innanzi tutto mi sono accorto che ho bisogno di individuare un range.
    Quindi le istruzioni “IF” credo si debbano modificare come segue:
    If SPRD >= SH61-20 and SPRD <= SH61+20 Then
    MsgBox " SH 61 "

    La subroutine dovrebbe funzionare come se fosse impostata una formattazione condizionale sulle celle solo che al verificarsi della condizione si deve aprire una sorta di finestra di pop up così che l’evento sia visibile anche con un altro programma aperto.
    Il tuo codice funziona ed ho provato a farlo eseguire anche automaticamente all’apertura della cartella di lavoro inserendolo nel foglio “ThisSWorkbook” però ... la macro viene eseguita una sola volta. Quando cambia il valore contenuto in D5 per effetto del flusso dati che ricevo in tempo reale e si verifica una delle predette condizioni, non succede nulla.

    Il mio codice genera un Errore di run-time 1004
    Quando eseguo il debug si blocca sull’assegnazione alla variabile “SH61” del valore contenuto nella cella ”E5”.



  • di HarryBosch data: 26/01/2013 02:15:36

    Proprio in quel punto genera un errore perché il riferimento al range va messo tra virgolette:
    Range("E5").Value
    oppure più semplicemente puoi utilizzare il sistema che VecchioFrac ti ha mostrato, ovvero inserendo il range fra le parentesi quadre:
    [E5]
    Il .value può essere omesso in entrambi i casi.

    Puoi riferirti allo stesso foglio utilizzando il With e successivamente anteponendo un punto:
    SH61 = .[E5]
    SH50 = .[E6]
    SH38 = .[E7]
    SH23 = .[E8]

    La differenza tra il tuo codice (che utilizza gli IF) e quello di VecchioFrac (che utilizza il Select Case), è che nel caso degli IF ogni condizione soddisfatta ti produce una Msgbox, nel caso dei Select esce una Msgbox soltanto alla prima condizione soddisfatta. Altrimenti bisognerebbe unire gli IF con Elseif tra uno e l'altro.

    Quello che ti manca per attivare la macro ad ogni modifica della cella D5 è l'evento Change, che non devi inserirlo nel ThisWorkbook, bensì nel modulo del foglio "Valore"; aperto l'editor vba clicca due volte sul foglio e riporta il codice sotto. Ad ogni modifica del range D5 richiami la macro che ti interessa, scrivendo semplicemente il nome della routine.
     
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Address = "$D$5" Then SH50 'oppure test
    End Sub



  • di HarryBosch data: 26/01/2013 02:16:41

    Mancava un pezzo sul With:
    With Sheets("Soglia")
    SH61 = .[E5]
    SH50 = .[E6]
    SH38 = .[E7]
    SH23 = .[E8]
    End With