Funció VBA per posar els números en català a l’Excel

L’Excel no té una funció per escriure els números en lletres, i de molt poques llengües en circulen per la xarxa solucions a mida. Fa anys, quan fèiem rebuts amb l’import en lletres em vaig cansar de canviar a mà la quantitat cada vegada que canviàvem alguna cosa de la factura i vaig fer-me una funció per escriure els números. No està especialment ben feta perquè va ser el meu primer programa amb VBA però funciona.

Per fer servir la funció la podeu copiar en cada llibre on la vulgueu fer servir i pot ser que per executar-les hàgiu de modificar la seguretat de les macros, i amb les darreres versions d’Excel haureu de guardar el llibre com a llibre habilitat per a macros.

  • Amb el llibre obert, obriu l’editor de Visual Basic amb ALT+F11.
  • Seleccioneu Insertar>Mòdul. Apareixerà un full en blanc.
  • Copieu-hi el text del codi que ve a continuació:
'Unitats del 1 al 9
Public Function unitat(num)

numb = unitats(num)
If numb = 0 Then
unitat = ""
Else
unitat = Choose(numb, "UN", "DOS", "TRES", "QUATRE", "CINC", "SIS", "SET", "VUIT", "NOU")

End If

End Function

'Valor de la xifra en una posició
Public Function xifra(num, pos)

intmes = Int(num / 10 ^ (pos + 1)) * 10
intnum = Int(num / 10 ^ pos)
xifra = intnum - intmes

End Function

'Desenes en lletra
Public Function desena(num)

numb = xifra(num, 1)
If numb = 0 Then
desena = ""
Else
desena = Choose(numb, "DEU", "VINT", "TRENTA", "QUARANTA", "CINQUANTA", "SEIXANTA", "SETANTA", "VUITANTA", "NORANTA", "CENT")
End If

End Function

'Separador entre la desena i la unitat
Public Function separa(num)

numb = talla99(num)
If xifra(numb, 0) = 0 Then
separa = ""
ElseIf numb > 30 Then
separa = "-"
Else
separa = "-I-"
End If

End Function

'Darreres dos xifres del número
Public Function talla99(num)

talla99 = Int(num) - 100 * Int(num / 100)

End Function

'Centena en lletres
Public Function centena(num)

cent = xifra(num, 2)
If cent = 0 Then
centena = ""
ElseIf cent = 1 Then
centena = "CENT"
Else
centena = unitat(cent) & "-CENTS"
End If

End Function

'Número de tres xifres en lletres
Public Function Num999(num)

Num999 = centena(num) & separacent(num) & num99(num)

End Function

'Darrera xifra del número
Public Function unitats(num)

unitats = xifra(num, 0)

End Function

'Separació darrera les centenes
Public Function separacent(num)

If xifra(num, 2) = 0 Or talla99(num) = 0 Then
separacent = ""
Else
separacent = " "
End If

End Function

'Nombres fins al 20 en lletres
Public Function num20(num)

numb = talla99(num)
If numb = 0 Then
num20 = ""
Else
num20 = Choose(numb, "UN", "DOS", "TRES", "QUATRE", "CINC", "SIS", "SET", "VUIT", "NOU", "DEU", "ONZE", "DOTZE", "TRETZE", "CATORZE", "QUINZE", "SETZE", "DISSET", "DIVUIT", "DINOU", "VINT")

End If

End Function

'Nombres fins al 100 en lletres
Public Function num99(num)

numb = talla99(num)
If numb < 20 
Then 
num99 = num20(numb) 
Else 
num99 = desena(numb) & separa(numb) & unitat(numb) 
End If 

End Function 

'Nombres fins al 999.999 en lletres 
Public Function nummil(num) 
miln = Int(num / 1000) 
resta = Int(num) - miln * 1000 
If resta > 0 
Then
restax = " " & Num999(num)
Else
restax = ""
End If
If miln = 0 Then
nummil = Num999(num)
ElseIf miln = 1 Then
nummil = "MIL" & restax
ElseIf miln > 1 Then
nummil = Num999(miln) & " MIL" & restax
End If

End Function

'Nombres fins al 999.999.999.999 en lletres en masculí
Public Function nummilio(num)

miln = Int(num / 1000000)
resta = Int(num) - miln * 1000000
If resta > 0 Then
restax = " " & nummil(num)
Else
restax = ""
End If
If miln = 0 Then
nummilio = nummil(num)
ElseIf miln = 1 Then
nummilio = "UN MILIÓ" & restax
ElseIf miln > 1 Then
nummilio = nummil(miln) & " MILIONS" & restax
End If

End Function

'Unitats en lletres en femení
Public Function unitatfem(num)

numb = unitats(num)
If numb = 0 Then
unitatfem = ""
Else
unitatfem = Choose(numb, "UNA", "DUES", "TRES", "QUATRE", "CINC", "SIS", "SET", "VUIT", "NOU")

End If

End Function

'Nombres fins al 20 en femení
Public Function num20fem(num)

numb = talla99(num)
If numb = 0 Then
num20fem = ""
Else
num20fem = Choose(numb, "UNA", "DUES", "TRES", "QUATRE", "CINC", "SIS", "SET", "VUIT", "NOU", "DEU", "ONZE", "DOTZE", "TRETZE", "CATORZE", "QUINZE", "SETZE", "DISSET", "DIVUIT", "DINOU", "VINT")

End If

End Function

'Nombres fins al 99 en femení
Public Function num99fem(num)

numb = talla99(num)
If numb < 20 
Then 
num99fem = num20fem(numb) 
Else 
num99fem = desena(numb) & separa(numb) & unitatfem(numb) 
End If 

End Function 

'Centenes en lletres en femení 
Public Function centenafem(num) cent = xifra(num, 2) 
If cent = 0 
Then 
centenafem = "" 
ElseIf cent = 1 
Then centenafem = "CENT" 
Else centenafem = unitatfem(cent) & "-CENTES" 
End If 

End Function 

'Nombres fins al 999 en femení 
Public Function Num999fem(num) 
Num999fem = centenafem(num) & separacent(num) & num99fem(num) 

End Function 'Milers en lletres en femení Public Function nummilfem(num) miln = Int(num / 1000) resta = Int(num) - miln * 1000 If resta > 0 Then
restax = " " & Num999fem(num)
Else
restax = ""
End If
If miln = 0 Then
nummilfem = Num999fem(num)
ElseIf miln = 1 Then
nummilfem = "MIL" & restax
ElseIf miln > 1 Then
nummilfem = Num999fem(miln) & " MIL" & restax
End If

End Function

'Nombres fins al 999.999.999.999 en lletres en femení
Public Function nummiliofem(num)

miln = Int(num / 1000000)
resta = Int(num) - miln * 1000000
If resta > 0 Then
restax = " " & nummilfem(num)
Else
restax = ""
End If
If miln = 0 Then
nummiliofem = nummilfem(num)
ElseIf miln = 1 Then
nummiliofem = "UN MILIÓ" & restax
ElseIf miln > 1 Then
nummiliofem = nummil(miln) & " MILIONS" & restax
End If

End Function

'Quantitats de pessetes en lletres
Public Function pessetes(num)

miln = Int(num / 1000000)
resta = Int(num) - miln * 1000000
If resta > 0 Then
pessetes = nummiliofem(num) & " pessetes"
ElseIf miln > 0 Then
pessetes = nummiliofem(num) & " de pessetes"
Else
pessetes = "ZERO pessetes"
End If

End Function

'Quantitats d'euros en lletres
Public Function euros(num)

miln = Int(num / 1000000)
resta = Int(num) - miln * 1000000
If resta > 0 Then
euros = nummilio(num) & " euros"
ElseIf miln > 0 Then
euros = nummilio(num) & " d'euros"
Else
euros = "ZERO euros"
End If
cent = num - Int(num)
cent = Int(cent * 100 + 0.5)
If cent > 0 Then
euros = euros & " amb " & nummilio(cent) & " cèntims"
End If

End Function

Amb això tindreu quatre funcions:

  • nummilio: els números en masculí
  • nummiliofem: els números en femení
  • euros: un import en euros i cèntims en lletres
  • pessetes: un import en pessetes en lletres

Exemples d’ús:

=nummilio(99987889789,22)

NORANTA-NOU MIL NOU-CENTS VUITANTA-SET MILIONS VUIT-CENTS VUITANTA-NOU MIL SET-CENTS VUITANTA-NOU

=nummiliofem(99987889789,22)

NORANTA-NOU MIL NOU-CENTS VUITANTA-SET MILIONS VUIT-CENTES VUITANTA-NOU MIL SET-CENTES VUITANTA-NOU

=euros(99987889789,22)

NORANTA-NOU MIL NOU-CENTS VUITANTA-SET MILIONS VUIT-CENTS VUITANTA-NOU MIL SET-CENTS VUITANTA-NOU euros amb VINT-I-DOS cèntims

=pessetes(99987889789,22)

NORANTA-NOU MIL NOU-CENTS VUITANTA-SET MILIONS VUIT-CENTES VUITANTA-NOU MIL SET-CENTES VUITANTA-NOU pessetes

Totes les funcions funcionen amb números inferiors al bilió i, excepte la funció euros, ignoren els decimals.

Si heu d’adaptar la funció a un altre idioma us suggereixo simplificar una mica el codi reescrivint la funció num99 (i num99fem si necessiteu números en femení) per que no faci servir funcions auxiliars, i així no haver-les d’adaptar. Podeu fer servir de mostra la funció num20 per posar una instrucció Case amb la llista de tots els números fins al noranta-nou. Així haureu d’escriure més però haureu de programar menys.

 

Important dades d’Excel a R-Commander amb el portapapers

L’R-Commander pot importar fulls de càlcul sencers com a data frames, però quan tenim un full amb dades poc estructurades (o barreja d’una part estructurada i una de no estructurada) o quan volem importar només una part del full, aleshores seleccionar, copiar i importar pot ser molt més pràctic. A més, la mateixa técnica serveix per importar taules des de pàgines web o qualsevol altra font.

Fa temps ho vaig explicar en un vídeo:

Pros i contres de llogar sols

Suposant que la comercialització no la fem millor nosaltres que una agència (que sovint sí), els primer avantatge que té prescindir d’intermediaris és l’atractiu que això té pel llogater, perquè s’estalvia un mes de lloguer que altrament perdria. De fet, quan poso els anuncis miro de posar ben clar i ben gros que és directe de propietaris i que el llogater s’estalvia els honoraris de l’agència. No he provat mai si això permet llogar més car (que potser també), però el que sí que he comprovat és que atreu més clients i ens permet llogar en molt menys temps, que és el nostre objectiu principal, perquè sempre és més rendible un pis llogat ara que un pis llogat una mica més car després de passar-se buit els propers mesos.

Òbviament, la primera pega és el respecte que fa llençar-nos a fer experiments amb una cosa valuosa com un pis, tenint en compte que si ens equivoquem i ens trobem amb un llogater problemàtic ens podem acabar trobant amb un problema difícil de resoldre que ens costi molt més del que anem a guanyar. Aquí la qüestió és assegurar-nos-en bé, igual que ho faríem si el llogater ens l’hagués portat una agència, i demanar justificants d’ingressos i avaladors i plantejar-nos si ens convé una assegurança d’impagats, que si tenim un sol pis i depenem del lloguer de cada mes per pagar-ne la hipoteca, una assegurança pot ser una bona idea.

En sentit contrari, el primer avantatge de tenir una agència és la feina que ens estalvia, feina poc agraïda que suposadament ens surt gratis, perquè els honoraris de l’agència (que solen ser el lloguer d’un mes o més) els paga el llogater. Sobre si és una feina agraïda o no, això va a gustos, però que surti gratis no està tan clar. Si lloguéssim en el mateix temps i amb les mateixes condicions amb agència, potser sí que sortiria gratis, però el que ens hem trobat nosaltres fins ara és que llogar amb agència ens porta més temps i, al principi sorprenentment, els llogaters d’agència demanen més sovint una carència com a condició imprescindible per llogar. Aleshores, si quan el llogater es troba amb que ha de pagar un mes de lloguer a l’agència demana pagar un mes menys al propietari, qui està pagant realment els honoraris de l’agència no és el llogater, sinó el propietari.

Un avantatge que podríem esperar en prescindir d’intermediaris és la possibilitat de posar-nos en el seu lloc i cobrar-ne nosaltres els seus honoraris. Ara bé, fent això estaríem perdent l’atractiu que per als llogater té el llogar directament de propietari. Personalment, crec que val la pena mantenir aquest atractiu i fer-lo servir per llogar abans i evitar carències, de manera que globalment hi guanyem no cobrant honoraris.

Un detall a tenir en compte si no tenim agència és que igualment cal fer i registrar el contracte, cosa que porta una feina i un cost. Una possibilitat és tenir un administrador de finques que el faci si aconseguim que ho faci per un preu reduït que no ens espatlli l’atractiu comercial d’evitar-li al llogater els honoraris de l’agència. És probable que amb l’administrador que us dugui la finca el contracte d’un pis barat pugui sortir per menys de 200 euros despeses incloses, tot i que pot ser que per defecte algun administrador pretengui cobrar el mateix que si hagués comercialitzat ell el pis. Una alternativa és fer-nos nosaltres mateixos el contracte a partir d’un model i l’imprès oficial, però hem de tenir en compte que més de la meitat dels 200 euros són impostos i impresos que no ens estalviarem.

Per últim, el fet de conèixer i tractar el llogater és un avantatge però pot tenir algun inconvenient. És un avantatge perquè, a més de permetre’ns fer-nos una idea de qui ens posem a casa, ens permet ser flexibles en la negociació i valorar si ens convé fer canvis de condicions que portin a tancar amb un llogater interessant. D’altra banda, segons diuen alguns agents, el tracte directe podria ser un inconvenient si després hi ha algun problema i s’hi barreja una relació personal, tot i que la veritat és que amb això no m’hi he trobat mai. A més, com visquem a la mateixa escala que on tenim el pis per llogar, al nostre llogater-veí l’acabarem coneixent de totes maneres, de manera que millor haver-lo triar.

D’avantatges i inconvenients de llogar amb una agència se’n podrien explicar molts més, però podeu estar segurs que tan aviat com sigui visible l’anunci del vostre vostre pis directe de propietari unes desenes d’agències us trucaran per explicar-vos els avantatges de fer servir la seva agència. De fet, el darrer inconvenient de llogar directament és precisament que els primers dos dies perdreu algunes hores atenent trucades de comercials a la caça d’un pis. Hauria de ser una molèstia, però pot ser divertit i tot si us ho preneu com un curs gratuït de tècniques viperines, pèrfides i fal·laces de màrqueting telefònic. A veure si un dia faig un post amb els apunts del darrer cop que m’hi vaig trobar.

Un parell de fractals senzills amb R

koch

Del temps en que jo estudiava, cap als anys noranta, i els fractals estaven de moda, m’ha quedat el vici de provar de dibuixar-ne cada cop que descobreixo les possibilitats gràfiques d’un nou llenguatge. Vaig començar amb QBasic i amb Autolist (veure una falguera fractal dibuixada punt a punt amb un plotter de plometes des de l’Autocad és una experiència llarga però inoblidable), i he arribat a dibuixar-ne fins i tot amb Scratch. Em quedava pendent l’R, i m’ha sorprès la simplicitat i compacitat dels programes resultants. Per exemple, el floc de neu de Koch:

func<-function (x) {c(x,x+60,x-60,x)}
v0<-func(func(func(func(func(func(0))))))
df=data.frame(dx=cos(v0*pi/180),dy=sin(v0*pi/180))
punts<-cumsum(df)
plot(x=punts$dx,y=punts$dy,type="l",asp=1)

D’acord que fer “func(func(func(func(func(func” és una mica un nyap, però diria que és més clar i potser fins i tot més curt que fer un for, i de fet el que volia fer és un programa compacte. Per la resta, la gràcia és l’enfoc de R cap a objectes sencers que estalvia uns quants for i simplifica molt la sintaxi.

Un altre exemple, una fulla construïda a partir de transformacions afins:

matriu1<-matrix(c(0.7,0.2,-0.1,0.92),2,2)
v1<-c(0.005,0.02)
matriu2<-matrix(c(0,-0.4,0.7,0.05),2,2)
v2<-c(0.06,0.003)
pfinal<-matrix(c(0,0),ncol=1,nrow=2)
f1<-function(v) {matriu1%*%v+v1}
f2<-function(v) {matriu2%*%v+v2}
func<-function(p) {cbind(f1(p),f2(p))}
for (i in 1:19) {pfinal<-func(pfinal)}
plot(x=pfinal[1,],y=pfinal[2,],asp=1,pch=46,axes=FALSE)

fulla

Aquí, a més d’aprofitar l’enfoc a objectes, s’aprofita que R ja pot multiplicar matrius tot sol, cosa que avui en dia no és gran cosa, però comparat amb el QBasic i l’Autolisp és una grans simplificació. Un altre canvi respecte aquell temps és que els llibres d’aleshores (i potser els d’ara) recomanaven fer aquests fractals a partir de transformacions afins aplicades aleatòriament i amb pesos segons les àrees. Ara, la potència de R fa molt més pràctic deixar de banda l’aleatoreïtat i aplicar totes les transformacions a la vegada, doblant el nombre de punts amb cada cicle.

L’aventura de llogar pel nostre compte

Teníem pisos però la cerca de llogaters l’havíem deixada sempre en mans de professionals, i la veritat és que tampoc ens anava malament amb l’agència que ens comercialitzava els pisos, perquè els llogaters que ens trobaven no ens havien donat mai cap problema i perquè ens semblava que de preus en sabien més que nosaltres. L’única pega és que trigaven a llogar, però tampoc teníem gaires referències de si unes setmanes (de vegades algun més) era molt o poc, i ens hi jugàvem massa com per tenir ganes de córrer el risc de canviar d’agència per trobar uns llogaters més ràpid però pitjors.

La cosa no va canviar fins que un primer d’agost teníem un pis buit i l’agència, després de no haver trobat llogater en un mes, plegava per vacances. Amb la perspectiva de tenir el pis buit tot el mes estava clar que no hi perdíem res per posar un anunci i ensenyar-lo, perquè el pitjor que podia passar és que tampoc el lloguéssim i l’agència continués ensenyant-lo el setembre, que és el mateix que hauria passat si no haguéssim fet res. A més, el pis era a la mateixa escala on tenim el despatx i a l’agost jo treballava, de manera que em costava poc aixecar-me de la taula quan convingués per pujar un moment a ensenyar-lo, i encara em feia gràcia.

Vaig fer unes fotos, vaig buscar els portals que vaig trobar per posar l’anunci, vaig assegurar-me que tenia qui em fes el contracte si calia i em vaig posar a rebre visites. Tot i que la mestressa de l’agència m’havia dit abans de marxar de vacances que l’activitat a l’agost era nul·la, en una setmana ja havia trobat llogater al mateix preu que l’agència l’havia estat anunciant, i a més m’hi havia divertit.

Des d’aleshores que cada pis que es queda buit el lloguem pel nostre compte, i no crec que lloguem més car que abans (potser més aviat al contrari) però el que és segur és que lloguem molt abans. I és veritat que em costa passar un setmana de vertigen que no em paga ningú amb visites a totes hores que no em deixen fer res més, però també és veritat que acostumat a treballar de cara a l’ordinador, aquesta setmana parlant amb la gent ve a ser com una setmana de vacances. Potser si cada setmana em passés quaranta hores ensenyant pisos no ho trobaria tan divertit, però una vegada de tant en tant és un bon canvi.