Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Creare allarme accustico se una condizione è vera

86 views
Skip to first unread message

io

unread,
Mar 31, 2013, 4:45:17 PM3/31/13
to
Ciao a tutti.

Vorrei creare un allarme se un certo risultato si verifica all'interno di
un mio foglio di calc.

In sostanza ho già un foglio che si chiama RISULTATI dove ho 6 colonne in
tutto e per esattezza le seguenti :

PRIMA COLONNA = COMPRA (nome del mercato dove comprare)
SECONDA COLONNA = PREZZO EURO (valore acquisto in euro c/o quel mercato)
TERZA COLONNA = PREZZO ORIG (valore acquisto in valuta originale di quel
mercato)

QUARTA COLONNA = VENDI (nome del mercato dove vendere)
QUINTA COLONNA = PREZZO EURO (valore di vendita in EURO di quel mercato)
SESTA COLONNA = PREZZO ORIG (valore di vendita in valuta originale di
quel mercato)

Ci sono diverse righe per queste colonne, e le colonne si aggiornano ogni
tot secondi/minuti.

Io vorrei creare una sorta di allarme (magari su un foglio a parte
chiamato ALLARME) dove posso inserire diverse righe (per esempio) :

MERCATO1 COMPRA <= 50 ALLARMESONORO1
MERCATO2 COMPRA >40 ALLARMESONORO2
MERCATO3 VENDI >= 100 ALLARMESONORO3
etc..


Vorrei creare una macro che ogni tot secondi/minuti (magari il codice va
a leggere il valore da una cella così non devo mettere mano al codice
tutte le volte per variare la frequenza di controllo) effettua la lettura
di ogni riga del foglio ALLARME e legge le condizioni da verificare sul
foglio RISULTATI e se la condizione si verifica allora manda in
esecuzione un file sonoro di cui il nome viene riportato sul file ALLARME
nella quarta colonna (l'estensione possiamo fare che sia mp3 o wav)

NB: mentre scrivo mi sono reso conto di una cosa ... se si dovessero
verificare più condizioni l'audio dei vari allarmi si sovrappone (ma
meglio di niente)

Inoltre teniamo presente solo le colonne che riportano i valori in euro,
l'altra colonna relativa al valore in valuta originale serve solo per un
controllo visivo ma non in questo caso.


Esempio del foglio RISULTATI :


MERCATO1 20 20 MERCATO9 35 42
MERCATO3 12 12 MERCATO7 23 23
MERCATO2 22 130 MERCATO3 110 110
MERCATO4 40 40 MERCATO2 23 140


Ovviamente le prime tre colonne sono quelle dove acquistare mentre le
altre 3 sono quelle dove poter vendere.


Esempio del foglio ALLARME :

MERCATO1 COMPRA <= 50 ALLARMESONORO1
MERCATO2 COMPRA >40 ALLARMESONORO2
MERCATO3 VENDI >= 100 ALLARMESONORO3


La macro deve essere in grado di controllare il foglio ALLARME, leggere
ogni singola riga e se la seconda colonna è COMPRA deve controllare se il
valore di MERCATO1 presente nella seconda colonna corrisponde ai
requisiti riportati nella terza colonna di ALLARME ed in caso positivo
deve eseguire il file audio.

Questo le deve fare per tutte le righe ... ovviamente se la seconda
colonna riporta VENDI la macro dovrà controllare la quinta colonna del
foglio RISULTATI relativa alla rispettiva riga del nome del mercato.

Negli esempi appena riportati dovranno quindi scattare solo gli allarmi
del mercato1 e mercato3 che sono rispettivamente un compra ed un vendi.

Spero di essere stato chiaro.

Questo mi permette di poter dormire di notte invece di vegliare sui
mercati. Se suonerà l'allarme saprò già cosa fare ma almeno non devo
stare sveglio inutilmente se le condizioni non si verificano!

Grazie a chiunque potrà aiutarmi o indirizzarmi sulla via della soluzione.


io

unread,
Mar 31, 2013, 6:23:15 PM3/31/13
to
Intanto che aspetto che qualcuno mi dia una mano, cerco da solo di creare
i pezzi che assieme poi comporranno il puzzle.

Per ora ho pensato che questa parte potrebbe gestire il discorso del file
audio che ho pensato di dichiarare come una variabile globale così da
poter assegnare il valore che voglio.

'apre il file musicale
Sub apri_file_musicale()

Dim oSvc as object

fileaudio = "allarme.mp3"
oSvc = createUnoService("com.sun.star.system.SystemShellExecute")

Rem Example 1 - Launch the default program associated with a file
extension:
oSvc.execute(ConvertToUrl("/home/io/percorso/audio/" & fileaudio), "",
0)

End Sub

martello

unread,
Apr 1, 2013, 4:14:15 AM4/1/13
to
Allora ...
Diciamo che se ho capito bene il tuo foglio di calcolo si aggiorna
automaticamente con delle tabelle di internet.

l'avvio di una procedura a seguito di un evento è relativamente
complessa da fare.

Ma nel tuo caso potrebbe andare bene una macro che gira permanentemente
in sottofondo ed esegue i controlli da te richiesti a tempi regolari.

A questo punto se hai un po di dimestichezza con la programmazione il
tuo problema è solo leggere e scrivere le celle di calc per eseguire i
controlli ed eventualmente modificare delle celle a tuo piacere.

Non posso che consigliarti le superFaq e la lettura di:

Come si fa tramite macro a leggere e/o scrivere le celle di calc?

Scarica le super FAQ di OpenOffice

http://sourceforge.net/projects/ooodocs/files/FAQ%20i-a.c.s.o/OpenOffice3%20Soluzioni%20a%20raccolta/

Buon download

io

unread,
Apr 1, 2013, 4:32:23 AM4/1/13
to
Grazie della risposta.

Avevo già scaricato le superfaq, ma siccome non sono pratico col codice
avrei gradito qualche pezzo di codice o suggerimento dove trovare spunto
per del codice utile al mio scopo (consapevole che nelle superfaq c'è
quello che mi serve).

Ci darò nuovamente uno sguardo e vediamo se riesco a realizzarlo.

Io intanto mi sono messo giù a parole quello che poi devo convertire in
codice :


'apre il file musicale
Sub apri_file_musicale()

Dim oSvc as object

fileaudio = "allarme.mp3"
oSvc = createUnoService("com.sun.star.system.SystemShellExecute")

Rem Example 1 - Launch the default program associated with a file
extension:
oSvc.execute(ConvertToUrl("/home/io/percorso/audio/" & fileaudio), "",
0)

End Sub



sub autopilot_allarme

'posizionarsi sul foglio ALLARME
'contare le righe del foglio ALLARME e memorizzare il dato in variabile a
uso interno di questa procedura
'contatorerighedaelaborare = righe foglio ALLARME


'****
' FOR i = 0 to a
' oCell = oSheet.getCellByPosition(1, 1) 'B2
' If a = 1 Then
'qualcosa del genere per il ciclo di ripetizione



'ripeti finchè contatorerighedaelaborare = 0 'scala 1 per capire
quando siamo arrivati all'ultima riga di parametri
'contatorerighedaelaborare = contatorerighedaelaborare -1
'leggere la prima riga e passare i valori alle variabili globali
(autopilotmktname ; autopilotbidask , autopilotcondizione, autopilotvalue)

'autopilotmktname = valore letto
'autopilotbidask = valore letto
'autopilotcondizione = valore letto
'autopilotvalue = valore letto


'se il valore di autopilotbidask è bid richiama la procedura per
controllare BID altrimenti chiama quella di ASK

end sub



'variabili globali dichiarate sono : autopilotmktname, autopilotbidask,
autopilotcondizione, autopilotvalue as string
'procedura che controlla la funziona di autopilot per quanto riguarda i
valori dei BID
sub autopilot_bid
'cerca il valore di autopilotmktname nella colonna 1 del foglio risultati
'leggi il valore presente nella colonna 2 sulla stessa riga e lo
memorizza nel variabile temporranea valoremkt

'verifica la condizione con la formula che segue :

'case valoremkt <= autopilotvalue condizione = "<="
'case valoremkt >= autopilotvalue condizione = ">="
'case valoremkt = autopilotvalue condizione = "="
'case valoremkt < autopilotvalue condizione = "<"
'case valoremkt > autopilotvalue condizione = ">"

' if condizione = autopilotcondizione then dai allarme leggendo il file
da eseguire



end sub


'procedura che controlla la funziona di autopilot per quanto riguarda i
valori dei ASK (simile a quella dei BID)
sub autopilot_ask



end sub

io

unread,
Apr 1, 2013, 4:50:44 AM4/1/13
to
ho pensato che questo è meglio :
'case valoremkt < autopilotvalue condizione = "<"
'case valoremkt > autopilotvalue condizione = ">"
'case valoremkt = autopilotvalue condizione = "="
'case valoremkt <= autopilotvalue condizione = "<=" 'forse questi non
servono essendoci la versione min e anche uguale
'case valoremkt >= autopilotvalue condizione = ">=" 'forse questi non
servono essendoci la versione mag e anche uguale

' if condizione = autopilotcondizione then dai allarme leggendo il file
da eseguire

end sub


'procedura che controlla la funziona di autopilot per quanto riguarda i
valori dei ASK
sub autopilot_ask
'cerca il valore di autopilotmktname nella colonna 4 del foglio risultati
'leggi il valore presente nella colonna 5 sulla stessa riga e lo
memorizza nel variabile temporranea valoremkt

'verifica la condizione con la formula che segue :

'case valoremkt < autopilotvalue condizione = "<"
'case valoremkt > autopilotvalue condizione = ">"
'case valoremkt = autopilotvalue condizione = "="
'case valoremkt <= autopilotvalue condizione = "<=" 'forse questi non
servono essendoci la versione min uguale
'case valoremkt >= autopilotvalue condizione = ">=" 'forse questi non
servono essendoci la versione mag uguale

martello

unread,
Apr 1, 2013, 8:26:08 AM4/1/13
to

Qui c'è un esempio.

La macro genera un bip ogni 5 secondi se è solo se a2>b2.

Per tacitare l'allarme o si cambiano i valori di a2 e b2 oppure si
inserisce un numero maggiore di 0 nella cella c2.

https://dl.dropbox.com/u/65873735/Allarme.ods

io

unread,
Apr 1, 2013, 8:42:04 AM4/1/13
to
Grazie mille, purtroppo io ho già realizzato il tutto, sto cercando di
controllarne il funzionamento. L'unica cosa che mi manca è fare in modo
che possa mandare in ciclo ripetitivo il tutto finchè non viene premuto
un tasto (esempio ESC)

Ecco il mio codice (sicuramente lungo e molto migliorabile)

'avvia il file sonoro dell'allarme
Sub avvia_allarme_audio()

Dim oSvc as object

'file_audio_allarme = "allarme.mp3"
oSvc = createUnoService("com.sun.star.system.SystemShellExecute")

Rem Example 1 - Launch the default program associated with a file
extension:
oSvc.execute(ConvertToUrl("/home/io/percorso/audio/" &
file_audio_allarme & ".mp3"), "", 0)

End Sub


sub apri_allarme

document = ThisComponent 'assigns the current document to the
variable document
Sheets = document.Sheets 'get the container of all Sheets
Sheet = Sheets.getByName("allarme") 'get the sheet named Sheet2
Controller = document.getcurrentController
Controller.setActiveSheet(Sheet)
end sub

'conta il numero di righe presenti nel foglio allarme
sub conta_righe_allarme

dim Doc as object
dim Sheet as object


Sheet = ThisComponent.Sheets.getByName("allarme")

Doc = ThisComponent 'The current document
oc = ThisComponent

Curs = Sheet.createCursor
Curs.gotoEndOfUsedArea(True)
NumRows = Curs.Rows.Count
righe_allarme = numrows 'variabile globale a cui viene
assegnato il numero di righe contate in jsondata

end sub


sub autopilot_allarme

Doc = StarDesktop.CurrentComponent
oSheet = ThisComponent.Sheets.getByName("allarme")

dim contatore as integer

call apri_allarme 'posizionarsi sul foglio ALLARME
call conta_righe_allarme 'contare le righe del foglio ALLARME e
memorizzare il dato in variabile globale "righeallarme"
contatore = 0


'ciclo di ripetizione per analizzare tutte le righe del foglio ALLARME

FOR contatore = 0 to righe_allarme-1 step 1 'incrementa il
contatore di uno ogni ciclo
'contatore = contatore +1

'leggere la prima riga e passare i valori alle variabili
globali (autopilotmktname ; autopilotbidask , autopilotcondizione,
autopilotvalue)

ocell = oSheet.getCellByPosition(0 , contatore)
'prima colonna
autopilotmktname = ocell.string

ocell = oSheet.getCellByPosition(1 , contatore)
'seconda colonna
autopilotbidask = ocell.string

ocell = oSheet.getCellByPosition(2 , contatore)
'terza colonna
autopilotcondizione = ocell.string

ocell = oSheet.getCellByPosition(3 , contatore)
'quarta colonna
autopilotvalue = ocell.value

ocell = oSheet.getCellByPosition(4 , contatore)
'quinta colonna con il nome file audio
file_audio_allarme = ocell.string

ocell = oSheet.getCellByPosition(5 , contatore)
'quinta colonna con il valore BID
valore_mkt_bid = ocell.value

ocell = oSheet.getCellByPosition(6 , contatore)
'quinta colonna con il valore ASK
valore_mkt_ask = ocell.value


'se il valore di autopilotbidask è bid richiama la
procedura per controllare BID altrimenti chiama quella di ASK

if autopilotbidask = "BID" then call autopilot_bid else
if autopilotbidask = "ASK" then call autopilot_ask



next contatore
end sub




'procedura che controlla la funziona di autopilot per quanto riguarda i
valori dei BID
sub autopilot_bid

'verifica la condizione con la formula che segue :
if valore_mkt_bid < autopilotvalue then condizione = "<"
if valore_mkt_bid > autopilotvalue then condizione = ">"
if valore_mkt_bid = autopilotvalue then condizione = "="

'se la condizione espressa nel foglio allarme si verifica allora
avvia l'allarme audio
if condizione = autopilotcondizione then
call avvia_allarme_audio
MsgBox "Il mercato "& autopilotmktname & " ha " &
autopilotbidask & " " & autopilotcondizione & " " & autopilotvalue & " ("
& valore_mkt_bid & ") ", vbCritical
end if
end sub


'procedura che controlla la funziona di autopilot per quanto riguarda i
valori dei ASK
sub autopilot_ask

'verifica la condizione con la formula che segue :
if valore_mkt_ask < autopilotvalue then condizione = "<"
if valore_mkt_ask > autopilotvalue then condizione = ">"
if valore_mkt_ask = autopilotvalue then condizione = "="

'se la condizione espressa nel foglio allarme si verifica allora
avvia l'allarme audio
if condizione = autopilotcondizione then
call avvia_allarme_audio
MsgBox "Il mercato "& autopilotmktname & " ha " &
autopilotbidask & " " & autopilotcondizione & " " & autopilotvalue & " ("
& valore_mkt_ask & ") ", vbCritical
end if
end sub

Serena

unread,
Mar 20, 2015, 11:20:40 AM3/20/15
to
So che questo post è vecchio ma spero di ricevere lo stesso risposta.
Ho scaricato il file Allarme di @martello e mi è stato molto d'aiuto, ora però vorrei modificare le condizioni e fare si che l'avviso compaia se nella cella ci sia la scritta "chiama".

Praticamente io ho tre colonne:
-data e ora del richiamo
-data e ora attuali
-chiama o no rispetto se l'ora attuale e uguale o superiore all'ora del richiamo

Io vorrei che si apra una finestra d'avviso se si verifica la condizione di "chiama".
Può poi questa condizione non riferirsi solo ad una specifica cella ma a tutta la colonna?

Allego il link del file che ho fatto fino ad adesso, specifico inoltre che ne capisco poco di macro, programmazione e tutto il resto :/

Grazie!

Serena

unread,
Mar 20, 2015, 11:53:56 AM3/20/15
to
0 new messages