|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2007
Messaggi: 827
|
[excel] popup o effetto sonoro, se il valore cella è >0
ciao ragazzi!
vi scrivo perchè dopo ore di ricerca su google, ancora non ho trovato quello che mi serve. vengo subito al dunque: ho diciamo 10 celle di excel contenenti formule che calcolano un valore in base a tutta una serie di dati. quando una di queste celle assume un valore maggiore di zero, vorrei che comparisse un popup, o in alternativa, venisse eseguito un suono. Se tutte le 10 celle sono >0 allora appariranno 10 popup se 5 celle sono >0, allora appariranno 5 popup (e così via) di "funzioni" in vba che fanno quello che cerco ne ho trovate tante.. il problema che le accomuna è che, se una delle 10 celle è >0, modificando una qualsiasi cella del foglio, il popup appare in continuazione; ovvero cella a1 >0 (è una delle 10) appare popup (e fin qui è tutto ok) se poi vado a scrivere un valore nella B55 (cella a caso), ricompare il popup(e qui non va bene) se scrivo nella D64 ricompare se scrivo nella G33 ricompare e via dicendo... io invece voglio che il popup compaia SOLO se la cella interessata viene modificata... mi sono spiegato? grazie in anticipo p.s. escludete la formattazione condizionale, poichè è gia implementata...ma non è sufficiente |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Puoi tenere traccia solo della prima volta in cui le celle nell'intervallo desiderato ( nell'esempio "A1:A10" ) cambiano da >0 a <0, ad esempio impostando e poi leggendo la proprietà ID delle celle stesse.
Nell'esempio che ti faccio qui ho 10 celle, appunto, da A1 a A10. Queste celle, come nel tuo caso, contengono formule che calcolano una differenza tra 2 interi ( che ho messo su altre 2 colonne... ), quindi mi appoggio all'evento Worksheet_Calculate() del Foglio1 : Codice:
Private Sub Worksheet_Calculate()
Dim R As Range
For Each R In Sheets("Foglio1").Range("A1:A10")
If R.Value > 0 Then
R.ID = ">0"
Else
If R.ID = ">0" Then MsgBox R.Address & " <0 !" 'Pop-Up
R.ID = "<0"
End If
Next R
End Sub
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jun 2007
Messaggi: 827
|
Quote:
prima di tutto grazie per la risposta... ho provato il codice...ma non funziona come volevo... ovvero, come dicevi tu, segnala solo il primo cambiamento....mentre a me serve che ad ogni cambiamento del valore della cella, appaia un pop-up. Ma sopprattutto, mi interessa che scatti il pop-up solo se il valore della cella è maggiore o uguale al valore di un'altra cella. Che tu sappia non è possibile? Ultima modifica di MARCOS_32 : 05-02-2010 alle 10:25. |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Codice:
Private Sub Worksheet_Calculate()
Dim valoreConfronto As Variant
valoreConfronto = Sheets("Foglio1").Range("B1").Value
Dim R As Range
For Each R In Sheets("Foglio1").Range("A1:A10")
If R.Value >= valoreConfronto And R.ID <> R.Text Then MsgBox R.Address & " Rilevato." 'Pop-Up
R.ID = R.Text
Next R
End Sub
|
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jun 2007
Messaggi: 827
|
Quote:
GRAZIEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE (mi limito a 36 "E" per non essere bannato per spam, in realtà ne vorrei mettere molte di più) Era esattissimamente quello che cercavo!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! mi hai salvato dalla disperazione grazie ancora!! |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
|
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jun 2007
Messaggi: 827
|
ehi ciao!
ascolta avrei un piccolo problemino: il file di excel integra una macro, che a quanto pare va in conflitto col tuo codice. mi da un errore di runtime (errore 13) quando eseguo la macro. la macro sostanzialmente è un bottone che permette di inserire dei dati in una tabella. se serve ti posso passare il file con la macro. puoi aiutarmi? te ne sarei infinitamente grato :P |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Se è un conflitto, puoi risolvere sostanzialmente in 2 modi :
1. "On Error Resume Next" sul mio codice... 2. Usa una variabile di controllo Boolean. Sarà True per tutta la durata della tua routine, e mentre è True, il mio codice, opportunamente modificato allo scopo, non produrrà effetti. Come ultima istruzione sul tuo pulsante la setti a False... |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jun 2007
Messaggi: 827
|
Quote:
1) non funziona...ho provato a metterlo in svariate posizioni ma non risolve il problema 2) non ho la più pallida idea di come iniziare :P. ho googlato un attimo ed ho trovato il come creare la variabile booleana e setterla in true...ma modificare il tuo codice e fare convivere tutto con la macro non so proprio da che parte girarmi :P per quanto riguarda invece un effetto sonoro? cioè al posto del popup viene eseguito un suono...magari da meno problemi... (mi va bene sia un beep sia un suono che ho sul pc..) ho trovato diversi codici, ma quei pochi che funzionano, fanno emettere il suono OGNI volta che viene modificata una QUALSIASI cella...cosa chiaramente assurda... sostanzialmente deve fare la stessa identica cosa del tuo codice, ma col suono....magari dico una cavolata, ma potrebbe essere meno problematico.... grazie anticipatamente |
|
|
|
|
|
|
#10 | ||
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Codice:
Private calcola As Boolean
Private Sub CommandButton1_Click()
calcola = False
'Routine pulsante
'...
calcola = True
End Sub
Private Sub Worksheet_Calculate()
If calcola = False Then Exit Sub
Dim valoreConfronto As Variant
valoreConfronto = Sheets("Foglio1").Range("B1").Value
Dim R As Range
For Each R In Sheets("Foglio1").Range("A1:A10")
If R.Value >= valoreConfronto And R.ID <> R.Text Then MsgBox R.Address & " Rilevato." 'Pop-Up
R.ID = R.Text
Next R
End Sub
Quote:
> Dichiarazione API : Codice:
Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long Codice:
Private Sub Worksheet_Calculate()
Dim valoreConfronto As Variant
valoreConfronto = Sheets("Foglio1").Range("B1").Value
Dim R As Range
For Each R In Sheets("Foglio1").Range("A1:A10")
If R.Value >= valoreConfronto And R.ID <> R.Text Then sndPlaySound "C:\suono.wav", 1 'Suono
R.ID = R.Text
Next R
End Sub
|
||
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jun 2007
Messaggi: 827
|
Quote:
il bello è che te ne vieni fuori con un "era semplicissimo" ![]() comunque sia ti ringrazio moltissimo, stassera massimo domani provo e ti faccio sapere |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Aggiungo anche un utilizzo ancora più semplice con la funzione Beep, che non richiede alcuna dichiarazione API : Codice:
Private Sub Worksheet_Calculate()
Dim valoreConfronto As Variant
valoreConfronto = Sheets("Foglio1").Range("B1").Value
Dim R As Range
For Each R In Sheets("Foglio1").Range("A1:A10")
If R.Value >= valoreConfronto And R.ID <> R.Text Then Beep 'Beep base di Windows
R.ID = R.Text
Next R
End Sub
|
|
|
|
|
|
|
#13 |
|
Junior Member
Iscritto dal: Apr 2010
Messaggi: 5
|
ciao marcogg
di macro e vb non so praticamente nulla e gli ultimi post per me sono arabo. stavo invece provando a mettere su excel il post del 4/02 delle 13.28 ed ieri in serata mi era anceh riuscito, ma ora non so perchè non sono più in grado. in pratica faccio così: dalle celle a1 fino ad a10 ho messo la formula a1= b1-c1 ; a2=b2-c2 e così via. a quel punto vado su strumenti-macro-vb editor. copio il tuo posto poi salvo e chiudo excel. al riavvio mi chiede se voglio attivare macro, dico di si, ma quando i dati in a1:a10 dovrebbero modificarsi in modo tale da lanciare la pop up, questa popup non compare. inoltre se nello stesso programma volessi fare una seconda macro che verifica le celle a11:a20, su parametri diversi dalla prima macro, come si potrebbe fare? grazie mille per ogni risposta e/o suggerimento |
|
|
|
|
|
#14 | ||
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Quote:
Codice:
Private Sub Worksheet_Calculate()
'...
'...
Dim R As Range
For Each R In Sheets("Foglio1").Range("A1:A10")
If [CONDIZIONE = TRUE] And R.ID <> R.Text Then MsgBox R.Address & " Rilevato." 'Pop-Up
R.ID = R.Text
Next R
For Each R In Sheets("Foglio1").Range("A11:A20")
If [CONDIZIONE = TRUE] And R.ID <> R.Text Then MsgBox R.Address & " Rilevato." 'Pop-Up
R.ID = R.Text
Next R
'...
End Sub
|
||
|
|
|
|
|
#15 |
|
Junior Member
Iscritto dal: Apr 2010
Messaggi: 5
|
ciao marcoGG
grazie mille per la risposta. in pratica quello che faccio è questo: vado su macro, scrivo il nome della macro e poi clicco su crea a quel punto scrivo: sub macro777_Calculate() Dim R As Range For Each R In Sheets("Foglio1").Range("A1:A10") If R.Value > 0 Then R.ID = ">0" Else If R.ID = ">0" Then MsgBox R.Address & " <0 !" 'Pop-Up R.ID = "<0" End If Next R End Sub ora se la cella a1 da positiva diventa negativa, io clicco su alt+f8 poi dò invio dalla tastiera e compare la pop up. io però vorrei che comparisse in automatico al verificarsi di quanto previsto nella macro. penso dipenda dal fatto ceh tu hai scritto la macro preceduta da PRIVATE. se per faccio la stessa cosa io, non ritrovo la macro appena creata. è come se non l'avesse salvata. metto tutto nella finestra di visual basic , chiudo il file excel salvandolo, ma poi riapro, faccio in modo che ad esempio, la cella a1 diventi negativa , ma non vedo la pop up. può essere o salto qualcosa di cui non mi rendoconto? per quanto riguarda il tuo esempio di più macro in una, in pratica se si verifica .la condizione nella cella a1 e poi nella a11 mi compaiono comunque due popup per ciascun evento? allo stesso modo se si verificasse prima nella a11 e poi nella a1? grazie mille per la risposta, sei stato gentilissimo , un pò di dimestichezza con excel ce l'ho, ma macro e vb sinceramente ne so meno di zero. spero tu possa essermi anche questa volta di aiuto buona giornata |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Se crei una Sub "sub macro777_Calculate()", VBA la interpreta come una qualsiasi subroutine, che perciò è slegata dagli eventi predefiniti del WorkSheet. In pratica quel codice non partirà mai in automatico, al verificarsi di un particolare evento, ma solo su esecuzione esplicitamente chiamata dall'utente. Che poi tu ci metta il suffisso _Calculate() non conta nulla. A questo punto i casi sono 2 : 1. Se, come nel caso dell'utente MARCOS_32, le celle nel Range di studio ( A1:A10 ) contengono Formule ( NON dati puri ) che cambiano valore in risposta ad operazioni che l'utente esegue direttamente sul WorkBook ( il che significa NON per via programmatica ), allora scatta l'evento _Calculate() del Foglio. In quel caso il tuo codice va messo sotto Private Sub Worksheet_Calculate() : Codice:
Private Sub Worksheet_Calculate()
Dim R As Range
For Each R In Sheets("Foglio1").Range("A1:A10")
If R.Value > 0 Then
R.ID = ">0"
Else
If R.ID = ">0" Then MsgBox R.Address & " <0 !" 'Pop-Up
R.ID = "<0"
End If
Next R
End Sub
Credo di essere stato chiaro, a livello di manuale direi... |
|
|
|
|
|
|
#17 |
|
Junior Member
Iscritto dal: Apr 2010
Messaggi: 5
|
ciao MarcoGG
sei stato chiarissimo, però io non riesco ad aver questa benedetta macro se vado su macro devo mettere un nome che voglio dare alla macro. diciamo che voglio chiamarla macro1. la macro la metto in tutte le cartelle di lavoro. a quel punto si attiva il tasto crea. clicco su crea e si apre vb. all'interno scrivo: Private Sub Worksheet_Calculate() Dim R As Range For Each R In Sheets("Foglio1").Range("A1:A10") If R.Value > 0 Then R.ID = ">0" Else If R.ID = ">0" Then MsgBox R.Address & " <0 !" 'Pop-Up R.ID = "<0" End If Next R End Sub a questo punto salvo il foglio excel e lo riapro, ma la macro non esiste. se invece scrivo: sub macro777_Calculate() Dim R As Range For Each R In Sheets("Foglio1").Range("A1:A10") If R.Value > 0 Then R.ID = ">0" Else If R.ID = ">0" Then MsgBox R.Address & " <0 !" 'Pop-Up R.ID = "<0" End If Next R End Sub allora la macro c'è, ma non lancia la pop up in automatico , ma solo con la combinazione alt+f8 - invio. tu sei stato perfetto , ma essermi rincretinito d'un botto.....cosa è che sbaglio? riesci a darmi una dritta ulteriore ? grazie mille, ciao |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Lascia perdere la creazione guidata delle Macro. Entra direttamente nell'editor di codice di VBA e scrivi nel foglio di codice associato a Foglio1.
|
|
|
|
|
|
#19 |
|
Junior Member
Iscritto dal: Apr 2010
Messaggi: 5
|
di te so solo il nickname,
ma per oggi e tutto il fine settimana sei la mia divinità GRAZIEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE p.s. a questo punto fatta una pop up devo riuscirne a metterne altre. se dovessi avere difficoltà ovviamente sai che tornerò a romperti le scatole. HAVE A NICE DAY |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Jun 2007
Messaggi: 827
|
MarcoGG hai un pm
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:26.




















