+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: EXCEL 2010 - inserire una macro in una funzione IF- Possibile?

  1. #1
    clunga non è in linea Novello
    Post
    8

    EXCEL 2010 - inserire una macro in una funzione IF- Possibile?

    Buona giornata a tutti e grazie in anticipo per il vostro aiuto. Premetto che ho Excel 2010 e non so quale visual basic usi.
    Sono riuscito dopo lungo vagabondare a creare due macro(?) che riproducono 2 suoni in files wav
    codice:
     Public Declare Function sndPlaySound32 _
     Lib "Winmm.dll" _
     Alias "sndPlaySoundA" ( _
     ByVal lpszSoundName As String, _
     ByVal uFlags As Long) As Long
    
    
     Sub buffone()
     sndPlaySound32 "D:\allarmi\buffone.WAV", 0&
     Const SND_SYNC = &H0
    
     End Sub
    
     Public Declare Function sndPlaySound32 _
     Lib "Winmm.dll" _
     Alias "sndPlaySoundA" ( _
     ByVal lpszSoundName As String, _
     ByVal uFlags As Long) As Long
    
    
     Sub Applausi()
     sndPlaySound32 "D:\allarmi\APPLAUS2.WAV", 0&
     Const SND_SYNC = &H0
    
     End Sub
    Il mio problema è adesso fare partire in maniera automatica mentre aggiorno dei dati su un unico foglio "Tabella", il primo o il secondo suono in base al fatto se la cella 1 è più grande o più piccola della cella 2 ( trattasi di dieta sopra o sotto il target!). Se le macro partissero automaticamente mettendo il nome in una funzione IF, avrei risolto il problema, ma non mi è riuscito e temo sia più complicato e la funzione IF vada messa nella macro, ma non so di più.
    Conosco il diffuso scetticismo sui suoni, ma .... a me piacciono.
    Vi ringrazio per la Vostra assistenza.
    Ultima modifica di @Alex; 09-10-2013 10:06 

  2. #2
    DOMENICO_FALCO non è in linea Scolaretto
    Post
    285
    Salve Clunga

    Per prima cosa è inutile che metti due volte la stessa funzione Public Declare ...

    Poi una domanda ... cosa intendi per cella1 più grande della cella2, sono valori numerici... confronto tra stringhe ... ?

    Comunque solo così per introdurre l'argomento certo che si può fare quello che desideri....

    in effetti sarebbe se fossero dei dati numerici :

    codice:
    If cells(1,1).value > cells(2,2).value then
    
    Call buffone
    
    else 
    
    Call Applausi
    
    End If
    Questa procedura poi va messa nel VBA del foglio in cui c'è la tabella.... indicando i Target di range ....

    Aspetto tua risposta.... così avanziamo mano mano...

  3. #3
    L'avatar di @Alex
    @Alex non è in linea Very Important Person
    Post
    12,258
    Attenzione a non dichiarare 2 volte la funzione API... non serve.
    Definire poi una COSTANTE dopo la chiamata in quel modo a che serve...?

    codice:
    Public Declare Function sndPlaySound32 _
     Lib "Winmm.dll" _
     Alias "sndPlaySoundA" ( _
     ByVal lpszSoundName As String, _
     ByVal uFlags As Long) As Long
    
    Sub buffone()
       sndPlaySound32 "D:\allarmi\buffone.WAV", 0&
    End Sub
     
    Sub Applausi()
      sndPlaySound32 "D:\allarmi\APPLAUS2.WAV", 0&
    End Sub
    @Alex
    Il CROSSPOST è VIETATO
    Mirror al vecchio sito WEB(salvare i Demo riassegnando l'estensione (.Zip/.Rar/.Exe in base all'icona...):
    http://mirror.masterdrive.it/alessandrobaraldi/
    Leggi il
    Regolamento del Forum e nel comprenderne la filosofia rispettalo.

  4. #4
    clunga non è in linea Novello
    Post
    8
    Grazie Alex, ho provveduto al cambiamento.

    Grazie Domenico e trattandosi delle celle E1 dove metto un valore di impostazione ( per esempio 1400 cal) ed E14 che è la somma delle calorie provenienti dal menù scelto ( così ho spiegato il contenuto delle celle) ho provveduto al cambiamento della macro

    If Cells(5, 14).Value > Cells(5, 1).Value Then

    Call buffone

    Else

    Call Applausi

    End If

    Adesso.. la macro parte al cambiamento di qualsiasi componente del menù, ma.. si apre il modulo macro in automatico è mi appare un avviso "Errore, non valido all'esterno di una routine" ed il 5 del primo riferimento e marcato in celeste.
    Consultata guida.. ma mi sono fermato.
    Non credo che interferisca, ma il modulo anziché lasciarlo modulo 1 l'ho rinominato controllo.
    Grazie per il tempo

  5. #5
    DOMENICO_FALCO non è in linea Scolaretto
    Post
    285
    E ci credo che ti da errore.....
    chiedo scusa ma pensavo che te sapessi dove mettere la routine....

    allora iniziamo da capo...
    prima cosa ricorda che la sintassi per il comando cells() è questa : cella( riga, colonna) e quindi vengono usati nel linguaggio VBA delle sintassi tipo :

    codice:
    cells(Selection.Row, Selection.Column).value
    
    'oppure dipende dai casi
    
    cells(Target.Row, Target.Column).value
    
    'o direttamente il valore numerico della riga o colonna, ad esempio la cella A5 è :
    
    cells(5,1)
    quindi per ottenere ciò che vuoi devi prima aprire il modulo1 ed incollare :

    codice:
    Public Declare Function sndPlaySound32 _
     Lib "Winmm.dll" _
     Alias "sndPlaySoundA" ( _
     ByVal lpszSoundName As String, _
     ByVal uFlags As Long) As Long
    
    Sub buffone()
       sndPlaySound32 "D:\allarmi\buffone.WAV", 0&
    End Sub
     
    Sub Applausi()
      sndPlaySound32 "D:\allarmi\APPLAUS2.WAV", 0&
    End Sub
    e poi devi aprire il modulo del foglio in cui stai lavorando.... per intenderci meglio... sopra la scritta modulo1 che tu hai cambiato in Controllo... c'è l'elenco dei fogli della cartella di lavoro in oggetto...
    te devi cliccare due volte sul nome del foglio in cui hai la tabella e si apre una schermata e qui incolli :

    codice:
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Column = 5 Then
            If Cells(14, Target.Column).Value > Cells(1, Target.Column).Value Then
                Call buffone
            Else
                Call Applausi
            End If
        End If
    End Sub
    adesso se provi a mettere dei valori nelle celle da te indicate dovresti avere quello che chiedi...

    prova..... e per cortesia cerca di comprendere i linguaggi delle routine... altrimenti si limita solo ad un copia ed incolla...
    che non insegna nulla )

    Domenico.
    Ultima modifica di DOMENICO_FALCO; 09-10-2013 11:44 

  6. #6
    clunga non è in linea Novello
    Post
    8
    Francamente cerco di capire i linguaggi, il copia incolla mi salva dalla sintassi che non conosco, ma di sicuro non capisco abbastanza, perché adesso non avviene nulla, come se la macro non esistesse.
    Ricapitolando:
    In foglio 1 ho le istruzioni sui due suoni. Infatti se esamino le macro in Excel mi appaiono e sono funzionanti
    In tabella del menù a discesa che mi mostra i vari fogli, su Tabella, cliccando due volte ho inserito ed è andato automaticamente in worksheet questo codice che tu mi hai dato
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 5 Then
    If Cells(14, Target.Column).Value > Cells(1, Target.Column).Value Then
    Call buffone
    Else
    Call Applausi
    End If
    End If
    End Sub
    TUTTAVIA, non so se è normale, non mi appare tra le macro. Se apro il modulo in VBA e cerco di capire e clicco su Esegui, mi appaiono le due macro buffone ed Applausi, ma non parte la macro. Io nelle colonne dei componenti ho inserito una formattazione condizionale che cambia il riempimento delle celle in base alle regole di > o < e quella funziona perfettamente.
    Ti ringrazio e se la vuoi finire qui, ti capisco pienamente.
    Ultima modifica di clunga; 09-10-2013 12:18 

  7. #7
    DOMENICO_FALCO non è in linea Scolaretto
    Post
    285
    Non ti preoccupare..... basta solo capirci meglio....

    prima cosa tu non vedi nell'elenco delle macro la macro del " Private Sub Worksheet_Change" proprio perchè c'è la parola Private davanti.... che non rende pubblica la macro...

    A te non serve richiamarla.... il " Private Sub Worksheet_Change" è una macro che funziona sull'evento del cambiamento di valore che avviene nella cella indicata... e questo in automatico.... senza che tu debba richiamare nulla...

    Poi io avevo compreso che tu i valori nelle due celle le digitavi tu direttamente.... ma a quanto ho capito nelle due celle ci vanno i risultati di calcoli fatti altrove cioè in altre ulteriori celle.... giusto ?

    se fosse così ti ho fatto un esempio su un foglio che ti allego in modo che ti rendi conto direttamente...
    nell'esempio ho fatto in modo che se cambio dei valori in due celle a cui ho scritto accanto : VALORE1 e VALORE2
    in automatico si cambiano le celle E1 e E14 e partono le due macro...

    sei te adesso che devi associare nella macro valore che scrivo anche qua :


    codice:
    Sub valore()
    ActiveSheet.Cells(1, 5).Value = ActiveSheet.Cells(1, 11).Value
    ActiveSheet.Cells(14, 5).Value = ActiveSheet.Cells(2, 11).Value
    ActiveSheet.Cells(14, 5).Select
    End Sub

    le celle apposite....

    intanto ti allego file.... te prova a cambiare il valore nelle celle K1 e K2 e vedrai....

    FOGLIODIETE.zip


    Facci sapere...


    Domenico

  8. #8
    clunga non è in linea Novello
    Post
    8
    Mi sono totalmente perso, forse in un bicchiere d'acqua.
    Io ho un foglio con una cella E1dove liberamente imposto "a mano" un target di calorie sulla base di miei parametri.
    La cella E15 che è una semplice somma, mi da il totale delle calorie risultanti dalle scelte sul menù base e logicamente si aggiorna al cambiare di qualsiasi dei 50 dati. Se la sommatoria che si forma di volta in volta è sotto E1, applausi, se è sopra buffone!
    Non riesco a capire il foglio e quindi non so come usare i codici che mi hai dato.

  9. #9
    DOMENICO_FALCO non è in linea Scolaretto
    Post
    285
    Scusami.... il foglio è quello in cui stai lavorando.... e poi non era la cella E14 ???

    E poi ancora hai aperto il mio documento che ti ho inviato ?

    La c'è tutto.... basta che cambi i riferimenti delle celle nelle macro ....

    Apri il mio documento.... e poi fai alt+f11 e guarda quello che c'è scritto nel modulo del foglio1 e nel modulo1 e capirai...



    Più di questo non posso...

  10. #10
    clunga non è in linea Novello
    Post
    8
    Grazie per tutto l'aiuto ed il tempo che ti ho preso

+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi