PDA

View Full Version : [EXCEL] Sommare celle in un intervallo stabilito che rispettino dei parametri


GlasgowKiss
17-05-2007, 19:01
Salve, ho un problema, difficile spiegarlo nel topic:

gestisco classifiche ecc per scommesse sportive, vorrei cambiare metodo, cioè ricavare tutta la classifica attraverso i semplici risultati di ogni giornata.
ho ricavato tutto quanto (vittorie, sconfitte, pareggi ecc) mi manca solo la somma gol.

ho ad esempio questo:

Squadra1 - squadra2 2 - 0
Squadra2 - squadra3 0 - 0
Squadra4 - squadra2 1 - 2

ripetuto ovviamente per tutte le giornate di un campionato.


come faccio a far sommare automaticamente tutti i gol che ha fatto squadra1,2 ecc??


in modo da avere la classifica completa dei gol fatti e subiti...

si potrebbe fare selezionando manualmente tutte le celle con i risultati di ogni squadra, ma sarebbe un lavoro sporco,nonchè lunghissimo, lo scopo è automatizzare tutto quanto e far ricercare le giuste caselle da sommare.


qualcuno ha la soluzione?

GlasgowKiss
17-05-2007, 23:28
raga, ma nessuno sa un metodo? :confused:

akyra
18-05-2007, 09:34
quello che vuoi fare tu si può soltanto se conosci il vba (Visual Basic for Applications) che sta dietro ad Excel e a tutti i software del pacchetto Office.

Così su due piedi mi verrebbe una soluzione di questo tipo: si potrebbe creare una collezione di interi, indicizzabile col nome delle squadre, e ogni volta che una di queste compare in una delle partite, aggiunge al relativo nodo della collezione i gol fatti...

il problema principale sta sul fatto che ci sono (come al solito quando si ha a che fare con automazione su Excel) delle difficoltà implementative dovute a come il foglio è organizzato.
Mi spiego meglio: come sono memorizzati i risultati delle partite?

in un'unica cella? quindi in (ad es.) B10 = "squadra1 - squadra2 = 3-0"

in celle separate? quindi B10 = squadra1 ; C10 = squadra2 ; D10= 3 ; E10 = 0

o in quale altro modo?
...più dati ci sono per cella, più difficile è estrarli, e più possibilità ci saranno che l'algoritmo che esegue il calcolo dia errori imprevisti (ad es: cosa succede se ad un certo punto il separatore delle squadre diventa ":" invece che "-")...tanto per farti capire con un esempio: assumiamo che i dati sian 2 celle separate, in questo modo:

B10 = "squadra1 - squadra2"
C10 = "3 - 0"

bene, per riuscire a carpire i dati che ci interessano occorrerebbe fare un algoritmo di questo tipo (pseudocodice):



1)while(isnull(B10)= false) /*esegue il ciclo finchè non incotra una cella vuota*/

2) nome_squadra = estrai la stringa più lunga dalla cella B10, a SINISTRA del "-"

3) gol_squadra = estrai la stringa più lunga dalla cella C10, a SINISTRA del "-"

4) lista_gol_squadre(nome_squadra).golFatti = lista_gol_squadre(nome_squadra).golFatti
+ Converti_In_Intero(gol_squadra)

5)nome_squadra = estrai la stringa più lunga dalla cella B10, a DESTRA del "-"

6)gol_squadra = estrai la stringa più lunga dalla cella C10, a DESTRA del "-"

7) lista_gol_squadre(nome_squadra).golFatti = lista_gol_squadre(nome_squadra).golFatti
+ Converti_In_Intero(gol_squadra)

8)fine_ciclo_while


Ipotizzando, naturalmente, che tale ciclo si fermi non appena trova una cella vuota, cioè non ci sono più partite da calcolare.

io l'idea l'ho lanciata, bisogna vedere se tu conosci il vba oppure no...

GlasgowKiss
18-05-2007, 11:07
dunque, grazie innazitutto per la risposta.

allora ho giò provveduto ad estrarre il tutto in modo da avere in ogni cella un singolo dato, la situazione al momento è questa:

esempio

|SQUADRA1|....|SQUADRA2|...|2|...|0|

(i puntini sono giusto per far capire il distaco tra le celle)


ho piu o meno capito quello che intendi (qualcosa di VB ne mastico, ma applicato ai fogli di excel ho poca esperienza), l'unica cosa è che facendo come dici, dovrei scrivere una riga di codice per ogni partita giocata, tipo se son 300 partite, devo scrivere un'algoritmo per ognuna :eek: o sbaglio?


#edit

uhm no scusami, non avevo letto del ciclo finche trova una cella vuota!

allora il quesito è un'altro

se tipo le giornate del campionato sono poste cosi:
GIORNATA 1

A-B 2-0
C-D 0-0

GIORNATA 2

A-B 0-0
ecc ecc

cioè tra una giornata e l'altra c'è uno spazio, quindi il ciclo si fermerebbe no?

akyra
18-05-2007, 20:55
per come è concepito il cilco ora sì...se poi vuoi mettere un'altra condizione di fine ciclo, allora se ne può parlare...però su due piedi mi veniva quella...
come hai potuto notare la prima necessità da soddisfare sta nel mettere il foglio in un ordine coerente che sia sempre costante.

GlasgowKiss
18-05-2007, 22:41
uhm ok...diciamo che il foglio è ben ottimizzato,

mi daresti solo una mano a buttare giu un po di codice?
giusto il tempo che prendo un po di dimestichezza con il vba.


io ora ho il foglio in queste due forme:

forma 1:

|squadra1 - squadra2|...|0-0|

e nella forma 2:

|squadra1|...|squadra2|...|0|...|0|


quale mi conviene usare?

:)

akyra
19-05-2007, 10:56
certamente!
soltanto che in questo preciso momento il tempo che ho è molto poco...da martedì ne avrò di più.

sarebbe meglio utilizzare il secondo layout, in quanto più semplice da manipolare. Infatti non richiede l'estrazioni dei dati da una stringa con altri valori, in quanto il dato nella cella è solamente "squadra1" oppure il risultato.

Per prima cosa bisogna inizializzare la struttura che conterrà i gol fatti di ogni squadra.
Quello che mi verrebbe da utilizzare è una collezioni di valori definiti da noi stessi.

Quindi prima di tutto creiamo un oggetto personalizzato che conterrà i dati.
Pertanto crei un nuovo modulo di classe, e sulla sua proprierà name lo chiami "datiSquadra".
Nel oggetto in questione inserisci

public golFatti As Integer
public golSubiti As Integer
End Type


questa oggetto è una struttura dati contenente due interi (golfatti e golsubiti).
A questo punto definiamo la vera e propria funzione che inizializza la collezione delle squadre:

Public Sub initStruttura(coll As Collection)
Dim datiSq As new datiSquadra
'per ogni squadra crea un nodo della collezione
End Sub


Questa routine pubblica prende come parametro una collezione a cui aggiungerà i nodi delle squadre.
qui dobbiamo metterci d'accordo su dove andare a reperire l'elenco delle squadra, e creeremo un ciclo che farà una cosa di questo tipo:


while (ci sono squadre)
datiSq.golFatti = 0
datiSq.golSubiti = 0
coll.add datiSq, "nome_della_squadra"


questo pseudocodice ci dice che alla collezione viene aggiunto un nuovo nodo, con chiave "nome_della_squadra" (che deve essere univoco!!quindi 1 soltanto per ogni squadra), nel quale viene inserita la struttura da noi definita per memorizzare i gol fatti e subiti.

GlasgowKiss
19-05-2007, 11:57
beh certo, ovviamente nei momenti in cui hai tempo eh :) ti ringrazio


allora il tuo metodo mi sembra più che azzeccato, teoricamente ci sono,è molto chiaro, adesso devo solo capire come effettuare praticamente l'estrapolazione dei dati dai fogli di lavoro...

non ho ben capito questa riga però:

Dim datiSq As new datiSquadra

cioè per ogni squadra verrà creato un datiSq o cosa?

poi per comodità ho piazzato i risultati nel foglio "risultati", e le classifiche nel foglio "classifiche".

cmq grazie ancora eh, intanto vedo di smanettare e di cavarci qualcosa..

akyra
19-05-2007, 12:36
azz, ho fatto un errore...

l'istruzione


Dim datiSq As New datiSquadra


dichiara una variabile di tipo datiSquadra e inserisce un nuovo oggetto datiSquadra nella variabile...e come se tu dichiarassi di voler avere un contenitore per scarpe e poi ci mettessi dentro effettivamente le scarpe :)
anche se questo è giusto dal punto di vista sintattico, è concettualemente sbagliato in quanto devo creare un nuovo oggetto datiSquadra per ogni nuovo nodo della collezione...invece con quel codice assegneremmo ad ogni nodo lo stesso oggetto datiSquadra, di conseguenza se andassimo a aumentare i gol fatti di una certa squadra (nel nodo specifico della collezione) andremmo ad aumentare anche i gol di tutte le altre squadre.
In pratica ogni nodo squadra punterebbe allo stesso oggetto datiSquadra, invece che ad uno suo specifico.

quindi bisogna correggere il codice in questo modo:


Public Sub initStruttura(coll As Collection)
Dim datiSq As datiSquadra
'per ogni squadra crea un nodo della collezione
'nel ciclo esegui questa istruzione
set datiSq = new datiSquadra
'ecc ecc...
End Sub


la variaible datiSq viene inizializzata di volta in volta con un nuovo oggetto datiSquadra.
...questa è la teoria alla base della programmazione ad oggetti...