lunedì 8 giugno 2015

Converti Minuti in Ore,Minuti

Capita avvolte di dover convertire un numero di minuti nel corrispondente (ore,minuti).
Se il valore da convertire si trova nella cella "A1", la funzione che esegue la conversione in excel é:

=(TRONCA(A1/60)+(((A1/60)-TRONCA(A1/60)))*60/100)

...ottime conversioni!

domenica 7 giugno 2015

Scacchiera e Dama in Excel

Qualche tempo fa mi venne un idea, quella di sviluppare in Excel il gioco della Dama. Il tempo è poco e l'idea non si è poi concretizzata fino in fondo, è rimasto comunque un po di codice che può sempre tornare utile per altre applicazioni.
La parte di applicazione che pubblico consiste in una scacchiera (8x8) sulla quale vengono disposte delle pedine. L'applicazione consente di spostare le pedine tramite un doppio click del mouse. Il primo doppio click preleva la pedina, il secondo la deposita in una nuova cella.
Per iniziare costruiamo la scacchiera formattando 8 righe e 8 colonne di un foglio di calcolo in maniera che sembrino quadrati. Nella Fig. 1 ho impostato la larghezza delle colonne al valore di 6,57, l'altezza delle righe al valore di 30,75. Successivamente ho impostato il colore di riempimento delle celle con il nero a celle alterne.

Fig. 1 - Costruzione della scacchiera

Impostare il tipo di carattere di queste celle su "Wingdings", dimensione carattere 26.
Definire come colore del carattere di alcune celle ad esempio il rosso, per altre ad esempio il giallo. Sulle celle in cui è stato definito un colore (giallo o rosso) inserire il carattere 108 (ALT +108). Dopo queste operazioni la scacchiera dovrebbe apparire come in Fig. 2

Fig. 2 - Disposizione delle pedine

Aprire ora l'editor VBA e all'interno della finestra di Gestione progetti (tasti veloci CTRL+R se non è visualizzata) dare un doppio click sul foglio in cui è stata disegnata la scacchiera.
Nel primo combo in alto a sinistra dovrebbe essere selezionato l'oggetto "Worksheet" in quello di destra selezionare l'evento "BeforeDoubleClick". L'edito VBA inserisce dunque una routine che si attiva dopo aver fatto doppio click su una qualsiasi cella del foglio selezionato.
Il parametro più importante della routine è "Target" che rappresenta la cella (il range) su cui si è fatto doppio click.
Prima della routine inserire una variabile per il passaggio dei dati tra 2 lanci consecutivi della routine stessa e una costante string come messaggio da visualizzare quando si tenta di spostare una pedina da una cella nera a una bianca.
Il codice completo della routine è allora:

========================================================================
Dim cellaTemp As Range             'variabile temporanea
Const strAvviso As String = "Mossa non consentita!"
_______________________________________________________________________________
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean)
'
If cellaTemp Is Nothing Then  'se cellaTemp è Nothing la mossa è di partenza se Not Nothing è di arrivo
    If ActiveCell.Value = "" Then  'la cella di partenza non deve essere vuota
        MsgBox strAvviso, vbExclamation, "Dama"
    Else
        Set cellaTemp = ActiveCell
    End If
Else
    If ActiveCell.Interior.ColorIndex = 1 Then 'verifica che la cella di arrivo sia nera
        With ActiveCell
            .Value = cellaTemp.Value
            .Font.ColorIndex = cellaTemp.Font.ColorIndex
        End With
        cellaTemp.ClearContents
        Set cellaTemp = Nothing
    Else
        MsgBox strAvviso, vbExclamation, "Dama"
        Set cellaTemp = Nothing
    End If
End If
Range("A1").Select
'
End Sub

========================================================================
(A seconda dello schermo e delle impostazioni del browser in uso il codice può apparire più o meno in linea, eventualmente per un utilizzo conviene fare il copia-incolla)

Salvare il tutto con l'attivazione delle macro, chiudi e riapri il foglio attivando le macro. Una volta fatto il doppio click su una cella contenente una pedina, facendo un nuovo doppio click su una cella vuota la pedina viene spostata.

Buon riutilizzo!

Excel - Riempimento automatico di celle vuote con il valore immediatamente sopra

Excel 2007. Capita avvolte di dover riempire una serie di celle (spesso anche molte) con i valori della cella immediatamente sopra. In generale questo accade quando si utilizza excel come database di dati senza voler digitare di volta in volta i valori corrispondenti per ciascun record inserito, ma soltanto ad ogni variazione di riga.
Prendiamo ad esempio un insieme di celle costituito da 3 colonne x 13 righe. Nell'esempio di Fig. 1 questo insieme è popolato da alcune celle contenenti dei dati (colori) altre vuote. 


Fig. 1 - insieme dati da completare

Se si vuole riempire ogni cella vuota con il contenuto immediatamente sopra, si può procedere in questo modo.
Selezionare con il pulsante SX del mouse l'area rettangolare (righe e colonne) che si vuole popolare, successivamente individua il comando "Trova e Seleziona ->  Vai a formato speciale..." (nelle versioni precedenti di excel, bisogna andare nel "menù modifica -> vai... -> speciale...")

Fig. 2 - comando Vai a formato speciale...

selezionare il pulsante "Celle vuote" come in Fig. 3

Fig. 3 - Pulsante "Celle vuote"

Nell'area individuata ora saranno selezionate solo le celle non contenenti dei dati Fig. 4

Fig. 4 - Selezione di celle vuote

A questo punto digitare "=" e la freccetta "SU" dei tasti direzionale. Questo comando dice ad excel di inserire nella prima cella dei dati una formula che richiama il dato immediatamente sopra. Per ricopiare la formula su tutte le rimanenti celle selezionate al passo precedente bisogna premere la combinazione di tasti "Ctrl + <INVIO>".
Il risultato sarà:

Fig. 5 - Risultato finale

Per rimuovere dall'area le formule e lasciare i valori, basterà riselezionare l'area corrente con il tasto SX del mouse, dare un comando di copia e successivamente incolla valori.

Converti Minuti in Ore,Minuti

Capita avvolte di dover convertire un numero di minuti nel corrispondente (ore,minuti). Se il valore da convertire si trova nella cella ...