Excel 2003: indirizzi email come collegamenti ipertestuali, no grazie

Ho sempre odiato questo automatismo di Word e di Excel, che se scrivi un indirizzo email o una url, ti diventa un non richiesto collegamento ipertestuale; e sto sempre attento a spegnere l’apposito segno di spunta nelle opzioni di correzione automatica.

Ma a volte mi arrivano dei fogli già compilati da qualcuno che non si è posto il problema, e mi ritrovo con centinaia di link da toglere.

A mano uno per uno no, non se ne parla nemmeno, che la mia religione me lo vieta. Per fortuna in Excel 2003, in fondo ai diversi formati della Formattazione automatica del menu Formato, c’è l’opzione “Nessun formato”.

Applicando “Nessun formato” alla colonna con le email, riesco a togliere tutti i collegamenti ipertestuali in un colpo solo.

Tra parentesi, in Excel 2007 e 2010 la cosa è molto più semplice: basta applicare alle celle incriminate lo stile Normale.

Ecco, me lo appunto qui che magari ti potrebbe servire. Se tu invece fai in modo diverso, come sempre, facci sapere.

Sono ufficialmente uno smilzo

Da marzo ho perso 6kg e il mio indice di massa grassa è finalmente sceso sotto al fatidico 24. Il mio metodo:

  1. Ho preparato un foglio di Excel dove annotare il peso giornaliero. Importante per rinnovare tutti i giorni i buoni propositi e toccare con mano i risultati.
  2. Ho eliminato i fuoripasto traditori. Le fettazze di salame e i tocchi di grana prima di cena sono stati sostituiti da una verdura o un frutto.

Tutto qui.

Aggiornamento
a grande richiesta (di Giorgio), ecco il file di Excel: Perdita Peso

Excel: doppia convalida da elenco

La convalida da elenco di Excel è una gran bella invenzione. Nell’inserimento di dati in una cella, ti permette di scegliere da un elenco e ti evita di dover scrivere a mano: zero errori, zero fatica, tutti felici. Se però l’elenco dei valori ammessi è molto lungo, come ad esempio per tutte le nazioni del mondo, allora l’uso del menu a tendina diventa troppo complicato rispetto a scrivere direttamente nella cella.

Una strategia interessante potrebbe essere quella di far scegliere prima il continente, e poi restringere la scelta della nazione in base alla scelta precedente. Occorre quindi dividere l’elenco in più colonne, come ho fatto in questo esempio:

La prima convalida in B14 permette di scegliere il continente e ha come origine le celle A1:C1. La seconda convalida in B15 sceglie la nazione e non ha come origine un intervallo, ma una formula che restituisce un intervallo diverso a seconda del contenuto della cella B14:

=SCARTO(A2:C7;0;CONFRONTA(B14;A1:C1;0)-1;7;1)

Non è una formula facile da ricordare o da scrivere, e neanche da controllare. Per fortuna ho trovato un altro modo, molto più semplice, che ho usato sotto.

Prima di tutto ho creato in automatico  i nomi per gli intervalli A2:A7, B2:B7 e C2:C7 prendendoli da A1, B1 e C1. In B19 c’è la stessa convalida che in B14, ma in B20 la formula inserita nella convalida da elenco è semplicissima:

=INDIRETTO(B19)

Siccome la funzione INDIRETTO restituisce il riferimento specificato da una stringa di testo, e siccome nel nostro caso la stringa di testo in B19 corrisponde al nome dell’intervallo, voilà il gioco è fatto. Per la gioja de li piccini, allego il file di Excel 2007 Doppia convalida. Come al solito, se conosci altri modi di fare la stessa cosa, sono interessato.

Tra parentesi, l’esempio è nel formato di Office 2007-2010. Se stai usando versioni precedenti di Excel, e avrai le tue gravissime ragioni, spero tu abbia installato il convertitore gratuito.

Dalla tabella alla lista, revisited

Il post della scorsa settimana su come trasformare una tabella in un elenco ha prodotto commenti interessanti. Marco segnala che si può fare molto prima con R, in sole quattro righe di codice:

library(reshape)
ordini <- read.csv("ordini.csv")
ordini2 <- melt(ordini, id="Prodotto")
names(ordini2) <- c("Prodotti","Taglia","Quantità")
ordini3 <- ordini2[order(ordini2$Prodotti), ]

Robsom con MatLab se la sbriga in due sole righe:

data = load (‘info.dat’);
data_new = reshape (data’,size(data,1)*size(data,2),1);

Massimo Morelli invece prende la strada più difficile e la risolve con le formule di Excel. Allego il file di esempio (Esempio – formule dalla tabella alla lista) per i più avventurosi, ma giusto per darti l’idea ecco la formula in A2 che inserisce le etichette della prima colonna:

=SE(RIF.RIGA()-1<=RIGHE(SCARTO(Tabella!$A$1;1;0;CONTA.VALORI(Tabella!$A:$A)-1;1))*COLONNE(SCARTO(Tabella!$A$1;0;1;1;CONTA.VALORI(Tabella!$1:$1)-1));SCARTO(SCARTO(Tabella!$A$1;1;0;CONTA.VALORI(Tabella!$A:$A)-1;1);TRONCA((RIF.RIGA()-2)/COLONNE(SCARTO(Tabella!$A$1;0;1;1;CONTA.VALORI(Tabella!$1:$1)-1));0);0;1;1);””)

Invece per i meno avventurosi, c’è anche una soluzione dove le prime due colonne sono state inserite a mano, e la terza viene calcolata con una formula che si riesce ascrivere in una sola riga:

=CERCA.ORIZZ(B16;$B$1:$G$8;CONFRONTA(A16;$A$1:$A$8;0);0)

Per quanto riguarda la soluzione originale con la macro in VBA, più la guardo e meno mi piace. Magari uno di questi giorni la rifaccio e la ripubblico.

I drammi in Excel: Reverse Engineering di una tabella riassuntiva

La settimana scorsa, durante un corso di Excel per una azienda del Luganese, mi hanno raccontato una brutta storia. Uno dei lavori ricorrenti più lunghi, ingrati e noiosi affidati in azienda ad alcuni allievi era questo: data una tabella di ordini riempita dal cliente e simile a questa:
Tabella

ottenere un elenco di dati simile a questo:
elenco

La prima domanda, ovviamente, è stata “Perché? Ma soprattutto, perché?” La dura risposta: “Perché il cliente vuole così, e il cliente ha sempre ragione”. Questo restringe molto il campo delle possibili soluzioni, ma almeno si può fare una bella macro. Siccome non c’è stato tempo durante il corso, mi ci sono divertito oggi e ho messo insieme una soluzione “quick & dirty” che farà storcere il naso a tutti i programmatori (io non lo sono), ma che funziona per qualsiasi tabella di qualsiasi dimensione, purché si parta con una cella attiva dentro la tabella da svolgere. Il file di esempio (47KB formato Excel 2003) è dalla tabella alla lista, e il codice è questo:

Sub Tabella_Elenco()


‘ Prende una tabella da un foglio
‘ e la trasforma in un elenco in un altro foglio

On Error Resume Next
Application.ScreenUpdating = False

Dim MioFoglio As Worksheet
Dim MiaTabella As Range
Dim Etichette As Range
Dim colcnt As Integer
Dim rowcnt As Integer

‘   Definisco le variabili e il foglio di destinazione
‘  con le etichette

Set MioFoglio = ActiveSheet
Set MiaTabella = ActiveSheet.Cells(1, 1).CurrentRegion
colcnt = MiaTabella.Columns.Count
rowcnt = MiaTabella.Rows.Count
Set Etichette = MiaTabella.Range(Cells(1, 2), Cells(1, colcnt))
N = 0

Sheets.Add.Name = “Destinazione”
With ActiveWorkbook.Names
.Add Name:=”Prodotto”, RefersTo:=”=Destinazione!A1″
.Add Name:=”Taglia”, RefersTo:=”=Destinazione!B1″
.Add Name:=”Quantità”, RefersTo:=”=Destinazione!C1″
End With
Range(“Prodotto”).FormulaR1C1 = “Prodotto”
Range(“Taglia”).FormulaR1C1 = “Taglia”
Range(“Quantità”).FormulaR1C1 = “Quantità”

‘   Copio e incollo in modo diverso per la prima riga

While N < rowcnt – 1

Application.CutCopyMode = False
MiaTabella.Cells(N + 2, 1).Copy
Application.Goto Reference:=”Prodotto”

If N = 0 Then
Range(“Prodotto”).Offset(1, 0).Range(“A1”).Select

Else
Range(“Prodotto”).End(xlDown).Offset(1, 0).Range(“A1″).Select
End If

Selection.Resize(Selection.Rows.Count + colcnt – 2, Selection.Columns.Count).Select
ActiveSheet.Paste

Application.CutCopyMode = False
Etichette.Copy
Application.Goto Reference:=”Taglia”

If N = 0 Then
Range(“Taglia”).Offset(1, 0).Range(“A1”).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
Else
Range(“Taglia”).End(xlDown).Select
ActiveCell.Offset(1, 0).Range(“A1″).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
End If

Application.CutCopyMode = False
MioFoglio.Select
MiaTabella.Range(Cells(N + 2, 2), Cells(N + 2, colcnt)).Copy
Application.Goto Reference:=”Quantità”

If N = 0 Then
Range(“Quantità”).Offset(1, 0).Range(“A1”).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
Else
Range(“Quantità”).End(xlDown).Select
ActiveCell.Offset(1, 0).Range(“A1”).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
End If

N = N + 1

Wend

Application.CutCopyMode = False

Range(“A1”).Select
Application.ScreenUpdating = True

End Sub

Buon divertimento. Molto volentieri accetto critiche, pomodori e suggerimenti.