domingo, 15 de marzo de 2015

Los dados de Excel

!!! Hola !!!


En esta entrada voy a mostrar como es que se generan numeros aleatorios en Excel.

Si no sabes lo que es un numero aleatorio, te dire que son numeros al azar.

Como cuando tu le dices a alguien. "Dime un numero cualquiera entre 1 y 100"


Y para que sirven los numeros aleatorios?
Tal vez estes creando un juego en Excel donde tienes que adivinar un numero generado por el programa.

Quizas desees recrear el juego de bingo, para lo cual es necesario que se muestren numeros al azar.

Es posible que tengas un cuestionario de 100 preguntas de un examen y trates de automatizar el proceso para que a cada estudiante le asignen diez de esas preguntas al azar.

Y si solo quieres aprender un poco mas acerca de las capacidades de Microsoft Excel?, ese seria un buen motivo para leer e implementar los ejemplos que se muestran mas adelante.


Generando numeros aleatorios usando la interfaz de Excel

Microsoft Excel cuenta con dos funciones que permiten generar numeros aleatorios:

ALEATORIO (RAND) - Devuelve un numero aleatorio entre 0 y 1.
Ejemplo - En la celda A1 escribe la siguiente formula
=ALEATORIO()
Te devolvera un numero (no se cual, nadie lo sabe - por eso es aleatorio) entre 0 y 1


ALEATORIO.ENTRE (RANDBETWEEN) - Devuelve un numero entero aleatorio comprendido entre los argumentos
Ejemplo - En la celda A1 escribe la siguiente formula
=ALEATORIO.ENTRE(1, 100)
Te devolvera un numero aleatorio entre 1 y 100

Generando un numero aleatorio comprendido entre 2 rangos no consecutivos.
Excel no incluye funciones que devuelvan valores aleatorios comprendidos entre 2 rangos no consecutivos, sin embargo, con un poco de ingenio esto puede hacerse:

Un numero aleatorio entre [1, 200] o entre [800, 1000]
=SI(ALEATORIO()>0.5, ALEATORIO.ENTRE(1,200), ALEATORIO.ENTRE(800,1000))

Generando numeros aleatorios usando codigo VBA
Los programadores de VBA tienen acceso a las mismas funciones de la hoja de trabajo ya explicadas. desde el objeto Application.WorksheetFunction, usando los nombres en ingles de estas funciones - ver mi entrada Nombre de las funciones de Excel en Ingles dentro de este mismo blog

Application.WorksheetFunction.RAND()
Application.WorksheetFunction.RANDBETWEEN(1,100)

VBA, incluye, ademas la funcion rnd que devuelve un numero aleatorio entre 0 y 1:
rnd().

Tambien podemos emular la funcion ALEATORIA.ENTRE para obtener un numero aleatorio en el rango [a,b): (b-a)*rnd()+a

Eso es todo amigos








sábado, 14 de marzo de 2015

En letras

!!! Hola amigos !!!

El dia de hoy quiero compartir con todos una funcion que permite que podamos escribir un numero usando palabras.

algo asi como:






















donde extracte una seccion simplificada de lo que puede ser un presupuesto de construccion, que es el campo donde me desempeño mejor.

Cualquier usuario de Excel, por nuevo que sea, entiende que si modifico la cantidad o el costo unitario de cualquiera de las actividades, la actualizacion de los subtotales y el costo final es automatica.
Pero lo es tambien el costo total en letras?

Si observas detalladamente el grafico, podras observar en la barra de formulas que la celda activa es en realidad una funcion y no un valor escrito a mano.
Una funcion definida por el usuario que ahora comparto con todos los seguidores del blog.

Solo tienes que agregarla a uno de tus modulos y listo:

Public Function EnLetras(Valor) As String
  Dim Centavos As Integer
  Dim Fraccion As String
  Dim Moneda As String
  
  If Not IsNumeric(Valor) Then
    EnLetras = "ERROR"
    Exit Function
  End If
  Moneda = IIf(Int(Abs(Valor)) = 1, " peso", " pesos")
  If Right(Letras(Abs(Int(Valor))), 6) = "illon " Or Right(Letras(Abs(Int(Valor))), 8) = "illones " Then Moneda = "de" & Moneda
  Centavos = Application.Round(Abs(Valor) - Int(Abs(Valor)), 2) * 100
  Fraccion = IIf(Centavos = 1, " centavo", " centavos")
  Fraccion = IIf(Centavos = 0, "", " con " & Letras(Centavos) & Fraccion)
  EnLetras = Letras(Int(Abs(Valor))) & Moneda & Fraccion
  EnLetras = UCase(Left(EnLetras, 1)) & Mid(EnLetras, 2)
  If Valor < 0 Then EnLetras = "menos " & EnLetras
End Function

Private Function Letras(Valor) As String
' Funcion Auxiliar de uso exclusivo de la funcion EnLetras
  Select Case Int(Valor)
    Case 0
      Letras = "cero"
    Case 1
      Letras = "un"
    Case 2
      Letras = "dos"
    Case 3
      Letras = "tres"
    Case 4
      Letras = "cuatro"
    Case 5
      Letras = "cinco"
    Case 6
      Letras = "seis"
    Case 7
      Letras = "siete"
    Case 8
      Letras = "ocho"
    Case 9
      Letras = "nueve"
    Case 10
      Letras = "diez"
    Case 11
      Letras = "once"
    Case 12
      Letras = "doce"
    Case 13
      Letras = "trece"
    Case 14
      Letras = "catorce"
    Case 15
      Letras = "quince"
    Case Is < 20
      Letras = "diez y " & Letras(Valor - 10)
    Case 20
      Letras = "veinte"
    Case Is < 30
      Letras = "veinti" & Letras(Valor - 20)
    Case 30
      Letras = "treinta"
    Case 40
      Letras = "cuarenta"
    Case 50
      Letras = "cincuenta"
    Case 60
      Letras = "sesenta"
    Case 70
      Letras = "setenta"
    Case 80
      Letras = "ochenta"
    Case 90
      Letras = "noventa"
    Case Is < 100
      Letras = Letras(Int(Valor \ 10) * 10) & " y " & Letras(Valor Mod 10)
    Case 100
      Letras = "cien"
    Case Is < 200
      Letras = "ciento " & Letras(Valor - 100)
    Case 200, 300, 400, 600, 800
      Letras = Letras(Int(Valor \ 100)) & "cientos"
    Case 500
      Letras = "quinientos"
    Case 700
      Letras = "setecientos"
    Case 900
      Letras = "novecientos"
    Case Is < 1000
      Letras = Letras(Int(Valor \ 100) * 100) & " " & Letras(Valor Mod 100)
    Case 1000
      Letras = "mil"
    Case Is < 2000
      Letras = "mil " & Letras(Valor Mod 1000)
    Case Is < 1000000
      Letras = Letras(Int(Valor \ 1000)) & " mil"
      If Valor Mod 1000 Then Letras = Letras & " " & Letras(Valor Mod 1000)
    Case 1000000
      Letras = "un millon"
    Case Is < 2000000
      Letras = "un millon " & Letras(Valor Mod 1000000)
    Case Is < 1000000000000#
      Letras = Letras(Int(Valor / 1000000)) & " millones "
      If (Valor - Int(Valor / 1000000) * 1000000) Then
        Letras = Letras & Letras(Valor - Int(Valor / 1000000) * 1000000)
      End If
    Case 1000000000000#
      Letras = "un billon"
    Case Is < 2000000000000#
      Letras = "un billon " & Letras(Valor - Int(Valor / 1000000000000#) * 1000000000000#)
    Case Else
      Letras = Letras(Int(Valor / 1000000000000#)) & " billones"
      If (Valor - Int(Valor / 1000000000000#) * 1000000000000#) Then
        Letras = Letras & " " & Letras(Valor - Int(Valor / 1000000000000#) * 1000000000000#)
      End If
  End Select
End Function


Nota. La funcion no es de mi autoria, tampoco se de quien es. Estuvo dando vuelta en los foros hace un tiempo.

Eso es todo amigos.

viernes, 13 de marzo de 2015

Que dia fue ese dia?

!!!! Hola !!!

Hace un tiempo vi un video de un tipo con una habilidad especial:

Cualquier persona de entre el publico le indicaba una fecha (generalmente su fecha de nacimiento).

El inmediatamente decia que dia de la semana le correspondia.


El algoritmo para realizar ese calculo es simple, lo que impresiona es la capacidad de realizar todos esos calculos mentalmente y de manera inmediata.

Afortunadamente, los que no tenemos esa capacidad podemos hacer lo mismo.
Como?, facil, con la ayuda de Excel y sus funciones.

Ese es el tema de hoy:

Saber que dia de la semana corresponde a una fecha en particular.

Usaremos para esto dos funciones internas de Microsoft Excel:
DIASEM (WEEKDAY) - Devuelve un entero que indica el dia de la semana que se corresponde a una fecha.
ELEGIR (CHOOSE) - Devuelve un valor dependiendo de un indice.

Manos a la obra:
Vamos a calcular, como ejemplo, que dia de la semana correspondera al 7 de abril de 2015, yo se que es martes, pues espero con ansia que llegue ese dia.

Paso 1 - Introducir la fecha
En la celda A1 de una hoja de trabajo, introduce la fecha indicada (o la que tu quieras).
No sabes como introducir una fecha en Excel? escribe 07/04/2015 y listo.

Paso 2 - Calcular el numero correspondiente al dia de la semana
En la celda B1 escribe la siguiente formula: =DIASEM(A1)
El resultado de esta formula es 3, ya que la funcion considera que la semana comienza el dia domingo, asi que el martes le corresponde el dia 3.
Dos comentarios al respecto:
1. El problema ya esta resuelto, ya sabemos que la fecha es un martes, no habria que continuar, sin embargo, lo vamos a hacer, para que la respuesta final sea "Martes" y no el escueto numero 3.
2. Es posible modificar un poco la formula para que no se considere domingo como el primer dia de la semana, si no el lunes (asi se acostumbra en mi pais de origen), pero no es relevante.

Paso 3 - Obtener el nombre del dia con base en el numero del dia
Corrige la fomula de la celda B1 para que quede asi (NO COLOQUES ESPACIOS EN BLANCO SI YO NO LO HAGO)

=ELEGIR(DIASEM(A1), "Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes". "Sabado")

Dependiendo de la configuracion del sistema, es posible que en vez de la coma, debas usar el punto y coma en toda la formula (lo sabras si haces las cosas bien y aun asi obtienes un error).

Eso es todo amigos


jueves, 12 de marzo de 2015

Abrir archivos de excel al compas de una cancion

!!! Hola !!!

Te gustaria que al abrir un archivo de Excel, sonara tu cancion favorita?

podrias incluso asignar a cada archivo de Excel una cancion diferente, tal vez quieras que al abrir un archivo de Excel se escuche una instruccion pregrabada respecto al uso y/o utilidad del archivo.

Voy a enseñarte como hacerlo, es facil.
Como es logico, necesitas tener un archivo mp3 en tu computadora (no creo que sea dificil).

Paso No 1.
Insertar el  control ActiveX llamado "Windows media Player" en una de las hojas del libro de trabajo en cuestion.
















No te preocupes si en vez de la ficha "Programador" tu pantalla muestra "Desarrollador" son nombres diferentes para la misma ficha en diferentes versiones de Excel.
Como? no aparece la ficha programador en tu cinta de opciones? En este caso deberas agregarla. Puedes esperar unos dias a que haga una entrada en el blog explicando como se hace esto o simplemente googlea "Mostrar la ficha programador en Excel", es un procedimiento muy sencillo.

Como se observa en la imagen, no aparece el control ActiveX llamado "Windows media Player", seguramente tambien te pasa lo mismo (lo que sucede es que es un control que no se usa mucho, por eso no esta en la lista. Debes hacer click en la ultima opcion "Mas controles".
Busca en la lista el control "Windows media Player" - es de los ultimos, por que estan en orden alfabetico. Boton aceptar y listo
No es que el control vaya a aparecer en el listado de controles. El puntero del mouse mostrara una pequeña cruz que te permitira hacer la insercion del control con un simple click en la hoja de trabajo:



















Hay esta el control. Realmente no importa mucho el tamaño del control, ni el sitio de la hoja donde lo colocaste - pues vamos a hacerlo invisible. (pero mas adelante)

Paso No 2.
El codigo VBA que permitira activar el control al momento de abrir el archivo











Como vez, es un codigo muy corto y sencillo. Lo importante es que se ubique en el procedimiento de evento Open del libro de trabajo, para que sea leido al momento de abrir el archivo.

Paso No 3. (Si quieres)
Vuelve invisible el control para que no estorbe tu trabajo con el archivo (solamente podras manipularlo usando codigo VBA ). Esto puedes hacerlo desde la ficha Programador:
3.1 selecciona el modo diseño si no lo esta.
3.2 selecciona el control Windows media player de la hoja de trabajo y usa el boton propiedades.
3.3 En el cuadro de dialogo propiedades cambia el valor de la propiedad Visible de True a False
Los tres pasos puedes ejecutarlos mas facilmente escribiendo en la ventana inmediato:
Worksheets("Hoja1").WindowsMediaPlayer1 .Visible=False

Paso 4 (y ultimo)
Graba el archivo con formato xlsm (habilitado para macros). Si lo dejas tipo xlsx no va a funcionar.


Eso es todo amigos






miércoles, 11 de marzo de 2015

encontre una momia milenaria

!!! Hola amigos !!!

Si, ya se que el titulo esta un poquitin exagerado, pero fue lo que senti hace un tiempo cuando tuve acceso a una PC de los años 80, !!! funcionando !!!

Me invadio un sentimiento de nostalgia indescriptible.

Funcionaba con diskette, claro.
El sistema operativo: MS2

Empece a buscar a ver que me encontraba:
!!! Dios mio, como hace de falta el mouse !!!

Y asi, buscando ahi estaban.. - No lo podia creer.
Tres momias queridas trabajando para mi como en los viejos tiempos:

Lotus123

















Este, es como el abuelito de Excel. La primera hoja electronica se llamo VisiCalc, pero esta fue la que popularizo el concepto, mas aun, muchas empresas adquirieron su primer computador, solamente para poder utilizar lotus.



WordStar
El abuelo de Word. Todavia recuerdo que para centrar una linea teniamos que usar la combinacion Ctr-O-C pues no habia mouse ni barra de herramientas.

















GWBasic
Con este hice mis primeros pinitos en programacion. Recuerdo que cuando salio Windows, me di a la tarea de que mis programas mostraran las ventanas tambien. Lo hacia dibujando las rayitas y los bordes.


















dicen que en sistemas informaticos, 6 meses equivalen a 10 años de avance en otros temas. Si esto es cierto, mis momias no son milenaras, pero si podria decir que son prehispanicas.

Para terminar, el link de descarga de lotus123: (pensaban que iba a dejar pasar la oprtunidad de copiarlo)
https://drive.google.com/file/d/0B8SVML6_4SPHYmxseTE3V2tsRWs/view?usp=sharing

No creo que les funcione en Windows 7 y menos en Windows 8 (que ese tema de los 64 bits ya no deja ejecutar programas viejitos), pero si pude hacerlo funcionar en Windows XP.

Saludos,

Nombres de las funciones de Excel (En Ingles)

!!! Hola amigos !!!

Todos los que usamos Excel con cierta frecuencia, sabemos que se distribuye en muchos idiomas.

Aunque esto del idioma es solamente una mascara. Me explico:

Cuando sumas un rango de datos escribes dentro de una celda (a veces con a ayuda de la biblioteca de funciones de la cinta de herramientas) "=SUMA(....)"

Esto es lo que escribes (y lo que observas en la barra de formulas), pero internamente Excel procesa la funcion "=SUM(....)". - Si no eres observador, fijate que le falta la "A" al final

De igual manera, todas las demas funciones se muestran y se usan con el nombre asignado en el idioma de la instalacion del programa, pero internamente Excel las procesa con su nombre en Ingles,

Todos estos procesos son automaticos, incluso si creas un archivo en un computador que tiene instalado Excel en otro idioma, cuando lo abras en tu PC, el archivo mostrara los nombres de funciones en tu idioma.

Bueno y que?
que importancia tiene esto?
de que me sirve saber que la funcion SUMA, se llama SUM, que LARGO es en realidad LEN?

De nada, si no estas interesado en aprender a programar en Excel.

Cuando programas en Excel, tienes que usar el nombre de las funciones con su nombre real - y digo real, por que como mencione al principio, los demas idiomas son una mascara.

Ahora si entremos de lleno en el tema:
Como saber el nombre real de una funcion de nuestra hoja de calculo

1.  Utiliza la funcion dentro de una hoja de calculo - En tu idioma (como lo haces siempre)
por ejemplo escribe en la celda B1 la formula: =PROMEDIO(A1:A5)
Espero que tengas datos en ese rango de celdas, de lo contrario la funcion devolvera un error.

2. Selecciona la celda B1 nuevamente (que sea la celda activa)

3. Carga el Ide de VBA (si no sabes lo que es esto, deberias leer mi entrada anterior)

4. En la ventana inmediato del ide, escribe lo siguiente: (Si no ves esta ventana deberias usar la combinacion de teclas Ctrl - G) : ? ActiveCell.Formula (no te olvides de dar enter al final).

Eso es todo. Si lo hiciste bien, la ventana inmediato mostrara =AVERAGE(A1:A5)

AVERAGE es el nombre real de la funcion PROMEDIO de Excel.

Eso es todo amigos





martes, 10 de marzo de 2015

El cuarto de maquinas de Excel

Si usas Excel en forma ocacional o eres nuevo en el manejo del programa, lo mas seguro es que no conozcas lo que yo llamo El cuarto de maquinas de Excel:


Este es el cuarto de maquinas de Excel, mejor conocido como "Ide de VBA"

La imagen no dice mucho,  y si no sabes que es un Ide y tampoco sabes que es VBA, te va a decir menos todavia.
Aunque no parezca, estamos entrando en terrenos de la programacion:

Ide es una abreviacion de "Entorno de desarrollo Integrado" - En ingles, claro
VBA es un lenguaje de programacion

Es decir dentro del Ide de VBA pueden desarrollarse programas que permitan automatizar, mejorar, ampliar, simplificar (y cualquier otro ar que se te ocurra) el trabajo que realizas con Excel.

Si desperte tu curiosidad, sigue mi blog, que a partir de hoy voy a mostrarte como es que es todo este asunto.

Quieres acceder al Ide de VBA? Pulsa la combinacion de teclas ALT-F11