lunes, 27 de febrero de 2012

Acelerando el uso de Excel con macros para envio de direcciones

En este ejemplo vas a asumir que quieres hacer envio de correspondencia de excel a word. Sin embargo, cuando la persona te envia la data, estaba en la secuencia equivocada. En lugar de tener la data distribuida en columnas, la data tenia la informacion en la columna A.
Aunque tu podrias arreglar este tipo de error manualmente, te tomaria mucho tiempo cortar y pegar. Esto se puede automatizar con una macro.

Grabar una macro
La meta es grabar una macro simple que resolvera un registro. Para esto tienes que poner activa la celda con la que vas a comenzar. La macro deberia mover los 2 campos que estan debajo, eliminar las 3 celdas vacias, y terminar con el siguiente nombre. De este modo, tu puedes ejecutar la macro una y otra vez.
Para comenzar vamos a poner la celda activa en A1.
Ahora vamos a Vista-Macros-Grabar Macro.
Le damos un nombre a la macro (sin espacios). Escribimos un atajo de teclado. Dado que para este ejemplo solo usaras una macro, algo como Ctrl+a podria ser facil de recordar.
Una vez que tu haz empezado a grabar una macro, puedes ver el boton de Detener Macro. Abajo esta el boton de Usar Referencias Relativas.
Si tu presionas empiezas a grabar la macro ahora, Excel usaria las direcciones. Esto quiere decir, que asumiria que tu quisiste mover A2 a V1 y A3 a C1. Esto funciona para un registro, pero tu necesitas que la macro funcione para todos los registros. Activa las Referencias Relativas dando click en el boton.

Pasos para completar la tarea
Todo lo que tu hagas sera grabado. De ser posible, usa pulsaciones en vez del mouse.
Acciones Teclas que vas a presionar Que es lo que graba
Bajar una fila
Seleccionar 2 filas
Abajo
Mientras mantienes presionada la tecla Shift, presiona abajo.
ActiveCell.Offset(1, 0).Range("A1:A2").Select
Cortar Ctrl+X Selection.Cut
Mover una fila arriba y a la derecha una columna Arriba, Derecha ActiveCell.Offset(-1, 1).Range("A1").Select
Pegar Ctrl+V ActiveSheet.Paste
Moverte a la fila 2, Columna B Abajo ActiveCell.Offset(1, 0).Range("A1").Select
Cortar Ctrl+X Selection.Cut
Mover una fila arriba y 2 columnas a la izquierda
Selecciona 3 celdas(filas)
Abajo, Izquierda, Izquierda
Mientras se mantiene presionada la tecla shift, presiona abajo, abajo, abajo
ActiveCell.Offset(1, -2).Range("A1:A3").Select
Desde el menu seleccione inicio, eliminar Poner el mouse en el menu inicio, luego poner el mouse en el boton eliminar Selection.Delete Shift:=xlUp
A este punto, esta casi finalizada la macro. El problema es que, como mostramos abajo, tu haz seleccionado 3 celdas y tu solo quieres el nombre seleccionado.
Acciones Teclas que vas a presionar Que es lo que graba
Selecciona el nombre de la persona en el siguiente registro Arriba, Abajo ActiveCell.Select
Detener la grabacion Click en el boton Detener Grabacion

Probar la macro
Es tiempo de ejecutar la macro. Antes que lo intentes, graba todo antes que algo inesperado ocurra.
Pulsa Ctrl+a o ejecuta la macro una vez. Si todo va bien la macro arreglara el siguiente nombre.
Ejecutar la macro muchas veces
Si funciono bien una vez, cada vez que pulses Ctrl+a otro registro sera corregido.
Asi es como se vera el codigo en el editor de Visual Basic.
Sub RearrangeAddressBook()
'
' RearrangeAddressBook. Macro Recorded by XSaint, 27/02/12
'
' Keyboard Shortcut: Ctrl+a
'
ActiveCell.Offset(1, 0).Range("A1:A2").Select
Selection.Cut
ActiveCell.Offset(-1, 1).Range("A1").Select
ActiveSheet.Paste
ActiveCell.Offset(1, 0).Range("A1").Select
Selection.Cut
ActiveCell.Offset(-1, 1).Range("A1").Select
ActiveSheet.Paste
ActiveCell.Offset(1, -2).Range("A1:A3").Select
Selection.Delete Shift:=xlUp
ActiveCell.Select
End Sub
Esta sencilla macro resuelve un problema de la vida real. La clave para lograrlo fue usar el modo de grabacion relativa.

domingo, 26 de febrero de 2012

Calcular sumas en Microsoft Excel con funciones y con Visual Basic

en este pequeño tutorial voy a explicar 3 modos para calcular sumas en Excel. Desde el metodo mas facil hasta el mas dificil, los 3 modos son:
  1. Usando un icono para acceder a la funcion suma proporcionada en Excel
  2. Ingresando la funcion Excel manualmente
  3. Creando una funcion suma en Visual Basic y llamandola manualmente
Para este ejemplo utilizaremos un excel de una veterinaria en el cual se graban el numero de animales que son tratados por mes. Aqui lo que se quiere saber es:
  1. Cuantos animales en total son tratados por mes.
  2. El numero de cada especie que ella trata a lo largo del año
Para conseguir las respuestas que se necesita, la Dra. necesita calcular totales o sumas, a lo largo de cada fila y columna con los datos del paciente.
Para entender este ejemplo, por favor ingresa la data exactamente como muestro en la figura de abajo:
Utilizando el icono de autosuma
Calcular totales es una funcion conocida que se realiza con las hojas de Excel por lo que se creo un icono de autosuma para el proceso. El icono que ven en la figura de abajo, esta en la pestaña Inicio de Excel 2007, y es el unico icono con la letra griega Σ. Autosuma funciona en celdas consecutivas de datos, o un rango, ingresado en una fila o columna.
Para utilizar el icono para calcular la suma de numeros ingresados en un rango:
  • Click en la celda vacia que sigue en la ultima celda de esa columna
  • Click en el icono de Autosuma
  • Presiona enter
Por ejemplo, para calcular el numero total de gatos que el doctor atendio a lo largo del año, damos click en la celda B12, y luego hacemos los pasos 2 y 3 (el paso 2 es ilustrado en la figura 3). Excel genera la suma de 2558, y se coloca en la celda B12.
Para usar el icono para calcular la suma de numeros ingresados en una fila de celdas, primeros damos click en la celda vacia adyacente a la ultima celda con datos en esa fila y luego damos click en los pasos 2 y 3 de las instruccciones de arriba.
Nota:
Esta tecnica es solo util cuando la data que necesita ser sumada es ingresada en celdas consecutivas. Si hay una celda en blanco, el icono de autosuma solo calculara la suma del rango que este despues de la celda vacia.

Ingresando una funcion suma manualmente
Excel te da la opcion de ingresar manualmente en funciones que procesara la data definida por el usuario en la hoja de calculo. Para ingresar la funcion suma manualmente que calcula el total de data ingresada en celdas adyacentes en una columna:
  • Click en la celda donde tu quieres que aparezca la suma
  • Escribe =SUMA(aN1,aN2) donde a es la columna o fila en la cual el rango aparece, N1 es la primera celda en el rango y N2 es la ultima celda en el rango
  • Presiona Enter
Por ejemplo, para calcular el numero total de animales que el doctor vio en el mes de enero:
  • Click en la celda G2
  • Escribe =SUMA(B2:E2) como muestra la figura de abajo
  • Presiona Enter
Excel calcula la suma de 389 y lo pone en la celda G2.
Esta tecnica, a diferencia del icono de Autosuma, te permite calcular la suma de data en multiples rangos. La funcion SUMA puede trabajar sobre una coleccion de rangos, y los rangos son especificados en el mismo formato pero separados por coma. Por ejemplo, si tu quisieras calcular el total de numeros de serpientes tratadas a lo largo del año, tienes 2 opciones:
  • Tu podrias ingresar la funcion suma como =SUMA(E2:E13). Excel calculara apropiadamente el total de serpientes tratadas contando al mes de Julio como cero.
  • Podrias ingresar la funcion suma como =SUMA(E2:E7, E9:E13) (mostrada en la figura de abajo)la cual calcula la suma de 2 rangos de celdas y omitiendo la celda del mes de julio.
Usando Visual Basic para calcular sumas
Si tu conoces Visual Basic, puedes crear funciones personalizadas, o funciones definidas por el usuario en Excel. Estas funciones personalizadas. Estas funciones personalizadas pueden ser usadas en el mismo modo que las funciones implementadas como la funcion Suma, y pueden tener la misma funcionalidad de acuerdo a tus necesidades. Para crear una funcion personalizada:
  • En Excel, presione ALT+F11
  • Selecciona Modulo del menu Insertar.
  • Vamos a escribir codigo Visual Basic en esta ventana.
  • Presionamos ALT+Q para guardar la funcion.
Por ejemplo, para especificar una funcion llamada veterinarysum que calcula la suma de un rango consecutivo de celdas, sigue los pasos de abajo e ingresa el siguiente codigo Visual Basic del paso 3:
Function VeterinarySum(Rcells As Range)

Dim i As Integer
Dim Rcell As Range

For Each Rcell In Rcells
 i = i + Rcell
Next Rcell

VeterinarySum = i

End Function
Para usar una funcion definida por el usuario:
  • En Excel, click en la celda donde tu quieres ubicar los resultados de tus funciones
  • Click en el icono fx
  • En la funcion Insertar de la ventana, selecciona Definidas por el Usuario en el combo al costado de Selecciona una categoria
  • Selecciona tu funcion definida del menu de abajo del combo
  • Click OK
  • Especifica los parametros de la funcion, si es que los hubiera
  • Click OK
Por ejemplo, para usar la funcion VeterinarySum para calcular el total de perros que han sido sanados a lo largo del año:
  • Click en la celda C14
  • Sigue los pasos 2 y 3 de arriba. El paso 3 lo veran en la figura de abajo.
  • Selecciona VeterinarySum del combobox
  • Click en OK
  • Ingresa manualmente C2:C13 en el textbox RCells. Este paso lo veran en la figura de abajo.
  • Click OK.
Excel calculara la suma de 1819 y lo ingresara en la celda C14.

sábado, 18 de febrero de 2012

Unir nombre y apellido con macros en Excel 2007

Visual Basic para Aplicaciones (o VBA) es especialmente diseñado en un modo que permite a las personas que no tienen experiencia en programacion usarlo - y mejorar su experiencia en el uso de Office inmensamente.
VBA para Excel puede ser dominado a un cierto nivel con lecciones semanales paso a paso por cualquiera. Incluso si tu no haz estudiado ningun lenguaje de computacion no deberias tener dificultades con VBA.
Variables
En este ejemplo se introduciran algunos conceptos de programacion - despues de todo VBA es un lenguaje de programacion. Un concepto muy basico es el de variable. Tecnicamente, este es un espacio en la memoria de la computadora para almacenar cierta data. De este modo, cuando tu accedes a este lugar tu consigues la data actualizada.
Ejemplo.
En la columna C queremos tener el nombre completo de estas personas.
Para esto construiremos una macro. Para esto iremos a Vista->Macros->Ver Macros.
En esta ventana escribimos fullname y le damos click a Crear.
Les aparecera el Editor de Visual Basic y escribiremos los comandos.
Lo que haremos sera reunir los valores de la celda A1 y B1 y colocarlo en C1.
Sub fullname()
Range("A1").Select
fname = ActiveCell.Value
Range("B1").Select
surname = ActiveCell.Value
Range("C1").Select
ActiveCell.Value = fname & surname
End Sub
Como se ve en el codigo de arriba asignamos el valor de las celdas activas a una variable (fname, surname). Luego, en la ultima fila, rellamamos la data de las variables. El signo "&" es usado para separar entre variables y texto. Vamos a ejecutar nuestra macro (F5)y ver el resultado en la ventana Excel.
Como vemos todo salio OK, pero queremos tener un espacio entre el primer nombre y el apellido, asi que vamos a actualizar la ultima fila del codigo
Sub fullname()
Range("A1").Select
fname = ActiveCell.Value
Range("B1").Select
surname = ActiveCell.Value
Range("C1").Select
ActiveCell.Value = fname & " " & surname
End Sub
ejecutamos la macro nuevamente:
Ahora salio OK, pero si cambias el nombre o apellido, la celda C1 no se actualiza. Para cambiarlo, tienes que ejecutar la macro otra vez (aunque no sea muy dificil de hacer). Esto es muy importante de recordar, las celdas las cuales se les asignan valores via macro solo cambian cuando la macro es ejecutada.
Ahora vamos a hacer lo mismo para las filas 2-5. Sin embargo, antes de copiar y pegar el codigo 5 veces vamos a hacerlo un poco mas corto, utilizando la coleccion Cells.
Sub fullname()
fname = Cells(1, 1).Value
surname = Cells(1, 2).Value
Cells(1, 3).Value = fname & " " & surname
End Sub
En Excel VBA, "Cell" es un objeto dentro de la coleccion Cells, el cual tiene ciertas propiedades. Una de tales propiedades es "Value" - el valor de la celda. Recuerda, no la formula, no el formato - solo el valor. Accediendo a una valor de la celda se hace gracias a partir de su ubicacion en su fila y su columna. Cells(1, 1) accedera a la primera fila y la primera columna - A1. Si utilizamos Cells tenemos que indicar primero la fila y luego la columna, asi Cells(1, 2) accedera a B1 y no a A2.
Ahora vamos a copiar y pegar el codigo para cambiar la segunda fila:
Sub fullname()
fname = Cells(1, 1).Value
surname = Cells(1, 2).Value
Cells(1, 3).Value = fname & " " & surname
fname = Cells(2, 1).Value
surname = Cells(2, 2).Value
Cells(2, 3).Value = fname & " " & surname
End Sub
Como puedes ver, hemos cambiado los indices de los objetos de las celdas. Pero como vemos el valor de la variable fname, almacena primero el contenido de la celda A1 (Jhon) y despues de ejecutar la 3 fila, almacena la celda A2 (Sidney).
Para ver esto de otra manera, utilizaremos la ventana de inspecciones.
En tu editor de Visual Basic, vamos a ir al menu principal->Ver->Ventana de Inspecciones.
Veras una ventana nueva en la parte inferior de tu pantalla, la cual se le llama "inspecciones". En esta ventana podemos observar los valores de ciertas variables durante la ejecucion de nuestro codigo. Vamos a agregar nuestra variable. Para hacer eso, click derecho en una variable (fname) y elegir Agregar Inspeccion. Presionan OK en la ventana que aparecera.
Hagan lo mismo con la variable surname.
Al final deberias tener las 2 variables en la ventana de inspecciones.
Ahora vamos a ejecutar el codigo linea por linea (F8). Despues de ejecutar la segunda linea de codigo, mira los valores de las variables.


Sigue presionando F8 hasta llegar al final de la linea y veras que los valores de las variables cambian.
Ahora cuando regresen a la hoja de Excel veran esto.
La segunda fila esta OK.
Ahora una vez que hemos comprendido como trabajan las variables, vamos a copiar y pegar el codigo para todas las 5 variables.
Sub fullname()
fname = Cells(1, 1).Value
surname = Cells(1, 2).Value
Cells(1, 3).Value = fname & " " & surname
fname = Cells(2, 1).Value
surname = Cells(2, 2).Value
Cells(2, 3).Value = fname & " " & surname
fname = Cells(3, 1).Value
surname = Cells(3, 2).Value
Cells(3, 3).Value = fname & " " & surname
fname = Cells(4, 1).Value
surname = Cells(4, 2).Value
Cells(4, 3).Value = fname & " " & surname
fname = Cells(5, 1).Value
surname = Cells(5, 2).Value
Cells(5, 3).Value = fname & " " & surname
End Sub
Pero como puedes ver es una mala idea para escribir un codigo. En estos casos se utiliza un "looping", eso ya lo explicare en otro post.
Ejecuta el codigo y mira el resultado.
pero que sucede si alguien agrega una columna nueva, algo como esto:
Lo que debemos hacer, es establecer una celda activa. Para esto cambiamos nuestra macro agregando la columna inicial:
startcol = ActiveCell.Column
Esto significa que empezaremos numerando la columna de la celda activa. En nuestro caso sera 2(puedes comprobar agregando la variable startcol a la ventana de inspecciones). El codigo de la primera fila lucira asi:
Estamos utilizando la variable startcol para definir la columna del primer nombre (el cual es startcol), columna apellido(el cual es startcol + 1) y la columna de nombre completo (startcol + 2). Ejecutamos el codigo para comprenderlo mejor:
Sub fullname()
startcol = ActiveCell.Column
fname = Cells(1, startcol).Value
surname = Cells(1, startcol + 1).Value
Cells(1, startcol + 2).Value = fname & " " & surname
fname = Cells(2, startcol).Value
surname = Cells(2, startcol + 1).Value
Cells(2, startcol + 2).Value = fname & " " & surname
fname = Cells(3, startcol).Value
surname = Cells(3, startcol + 1).Value
Cells(3, startcol + 2).Value = fname & " " & surname
fname = Cells(4, startcol).Value
surname = Cells(4, startcol + 1).Value
Cells(4, startcol + 2).Value = fname & " " & surname
fname = Cells(5, startcol).Value
surname = Cells(5, startcol + 1).Value
Cells(5, startcol + 2).Value = fname & " " & surname
End Sub
Ojo que la celda active la ponemos en B1. Ejecutamos el codigo y aparecera esto:

Mostrar todas las permutaciones o combinaciones de letras usando Excel VBA

Aqui les paso un ejemplo que encontre hace poco, todos los meritos de este ejemplo son para YOSHIDA, Hajime, aqui solo les comparto el ejemplo que encontre y lo explicare.
En Japon, todos los estudiantes aprenden "Permutaciones y Combinaciones" en el primer grado de la escuela secundaria. Como primera leccion, los profesores muestran todos los patrones de permutacion y combinaciones. Probablemente 4!=24 patrones o 6C3=20 patrones. Despues de mostrar todos los patrones, para calcular el valor de permutaciones o combinaciones es el problema para estudiantes.
Lo que se hace para entender casos como estos aqui cito una parte de un libro "el frasco misterioso de Anno" :

Hay un frasco.
En el frasco, esta el mar.
En el mar, hay una isla.
En la isla, hay 2 paises.
En cada pais hay 3 colinas.
En cada colina, hay 4 castillos.

Este libro muestra desde 1! a 8!=40320 puntos en las paginas. Pero, si queremos mostrar 10! = 3628800, necesitaremos mas de 180 paginas. Esto parece real para los estudiantes.
Aun para los profesores, es duro y doloroso mostrar todos los patrones de 5! o mas a mano. Pero las computadores si pueden hacerlo. Algun programa tiene la funcion de mostrar permutaciones. Desafortunadamente, estos programas no son tan populares en las escuelas. Excel es mas conocido para profesores y estudiantes. Y es una herramienta muy poderosa para la educacion en matematicas. Ademas, Excel VBA (Visual Basic para Aplicaciones) es un lenguaje de programacion poderoso.
JK para Excel es una hoja de trabajo con un programa VBA para mostrar todos los valores al aplicar permutaciones o combinaciones. JK simboliza Junretsu(permutacion) y Kumiawase(combinacion) en japones.
CASO 1
SMILE tiene 5 letras, y todas diferentes. Escribe SMILE y clickea en GO.
Todos los patrones de la permutacion lo veran a continuacion:
Ya que JK es una hoja de Excel, los patrones de salida pueden ser escritos a un archivo de texto.
CASO 2
FOOTBALL tiene 8 letras. 2 O y 2 L son identicas. El numero de permutaciones de "FOOTBALL" es 8!/(2!*2!)=10080. El programa realizado muestra a todos.
Dado que el maximo de filas es 65536 en Excel, JK puede mostrar los siguientes patrones.

8!=40320
9P6=60480
18C9=48620

CASO 3
JK puede mostrar ambos casos, ya sea permutaciones o combinaciones. Mire los siguientes ejemplos.
"CAKE" tiene 4 letras. Y todas son diferentes. Vamos a tomar 2 letras a la vez.
Numero de permutaciones=4P2=12
Numero de combinaciones=4C2=6

El algoritmo principal de JK es una llamada recurrente. No es un algoritmo inusual. Cuando dibujamos un diagrama del arbol, usamos este algoritmo.
Ahora como ya vieron como funciona la macro, les voy a explicar el codigo que tiene.
Al abrir el archivo veran 2 botones (Input Form y Reset)
el codigo que se ejecuta al pulsar el boton Input Form es este:
'// Input Form
  Sheet1.Columns(1).ClearContents
  Label1.Caption = ""
  UserForm1.Show
este codigo lo que hace es limpiar la columna A o 1 de la Hoja1, limpiar el Label1 (es ese rectangulo morado que muestra los resultados) y mostrar el formulario UserForm1.
El formulario que abre es este.
y el codigo que se ejecuta al presionar en el boton Go es este:
'// GO
  Dim OutputStr As String
  Dim SortedStr As String
  Dim startDtm As Date, endDtm As Date 'Process time
  Dim i As Integer
  Dim Msg As String
  Dim TempStr As String
      
  Clr_text
  cnt = 0
  nest = 0
  OverFlowBol = False
  OutputStr = ""
  InputStr = TextBox1.Text
  startDtm = Now()
  Label3.Caption = "Counting ..."
  Label4.Caption = ""
  DupChrChk InputStr, SortedStr

  If JKsw = True Then
     Perm OutputStr, InputStr, r 'Permutations
  Else
     Comb OutputStr, SortedStr, r 'Combinations
  End If
  
  endDtm = Now()
  For i = 1 To 20: Beep: Next i
  
  If OverFlowBol = False Then
    TempStr = cnt & " way"
    If cnt > 1 Then
       TempStr = TempStr & "s."
    Else
       TempStr = TempStr & "."
    End If
    Label3.Caption = TempStr
  Else
    Label3.Caption = "Stop at " & cnt & " "
    Msg = "Process Limit !"
    MsgBox Msg, vbCritical
  End If
  
  Label4.Caption = "Time:" & DateDiff("s", startDtm, endDtm) & " sec."
  Wrt_text
  TextBox1.SetFocus
lo que se hace aqui es inicializar variables con Dim y despues llamar a la macro Clr_Text que contiene este codigo
'// Reset data
  UserForm1.Label3.Caption = ""
  UserForm1.Label4.Caption = ""
  Sheet1.Activate
  Sheet1.Label1.Caption = ""
  Sheet1.Columns(1).ClearContents
  Sheet5.Activate
  Sheet5.Range("B2", "D21").ClearContents
  Sheet5.Range("F7", "H12").ClearContents
  Sheet5.Label1.Caption = ""
  Sheet1.Activate
como se puede ver lo que hace es limpiar ciertos controles, ahora siguiendo con el evento Go de arriba, se almacena la palabra ingresada en InputStr mientras que OutputStr se inicializa como una variable sin caracteres, y se evalua si JKsw es verdadero, esta variable esta inicializada mas arriba por lo que se puede llamar en cualquier funcion, y dado que se inicializo As Boolean por defecto sera verdadera, entonces llamara a la macro Perm la cual se le ingresaran 3 valores y el codigo que ejecutara esta macro sera el siguiente:
Sub Perm(OutNowStr As String, InNowStr As String, sel As Integer)
'// Permutations
  
  Dim k As Integer
  Dim i As Integer
  Dim OutNextStr As String  '
  Dim InNextStr As String   '
  Dim ChkStr As String      '
  Dim chr1Str As String     '
  Dim hit As Integer        '
  
  nest = nest + 1
  If OverFlowBol = True Then
    nest = nest - 1
    Exit Sub
  End If
  
  If sel = 0 Then
    OutProc OutNowStr
  
  Else
    k = Len(InNowStr)
    ChkStr = ""
    
    For i = 1 To k
      chr1Str = Mid(InNowStr, i, 1)
      hit = InStr(ChkStr, chr1Str)
            
      If hit = 0 Then
        ChkStr = ChkStr & chr1Str
'    -------------------------------------------------------------------
        OutNextStr = OutNowStr & chr1Str
        InNextStr = Mid(InNowStr, 1, i - 1) & Mid(InNowStr, i + 1, k - i)
        Perm OutNextStr, InNextStr, sel - 1
'    -------------------------------------------------------------------
      End If
    Next i
  End If
  nest = nest - 1
End Sub
como se ve aqui este codigo realiza las permutaciones, ahora esto sera en caso de que JKsw sea verdadero que como lo dije sera en su defecto, pero que pasa si es falso vemos que llama a otra macro: Comb. Para ver como cambia el valor de la variable vemos en el formulario 2 radiobutton, estos cambian el valor de la variable JKsw ya que si vemos el codigo:
Private Sub OptionButton1_Click()
'// "Permutations"
  JKsw = True
  JKstr = "Permutations"
End Sub
ahora volvemos a la opcion de que JKsw sea falso, llamara a la macro Sub que ejecutara el siguiente codigo:
Sub Comb(OutNowStr As String, InNowStr As String, sel As Integer)
'// Combinations
  
  Dim k As Integer
  Dim i As Integer
  Dim OutNextStr As String  '
  Dim InNextStr As String   '
  Dim ChkStr As String      '
  Dim chr1Str As String     '
  Dim hit As Integer        '
  
  nest = nest + 1
  If OverFlowBol = True Then
    nest = nest - 1
    Exit Sub
  End If
  
  If sel = 0 Then
    OutProc OutNowStr
  
  Else
    k = Len(InNowStr)
    ChkStr = ""
    
    For i = 1 To (k - sel + 1)         ' <-- Caution!
      chr1Str = Mid(InNowStr, i, 1)
      hit = InStr(ChkStr, chr1Str)
            
      If hit = 0 Then
        ChkStr = ChkStr & chr1Str
'    -------------------------------------------------------------------
        OutNextStr = OutNowStr & chr1Str
        InNextStr = Mid(InNowStr, i + 1, k - i)
        Comb OutNextStr, InNextStr, sel - 1
'    -------------------------------------------------------------------
      End If
    Next i
  End If
  nest = nest - 1
End Sub
ahora como vemos en StartDtm y EndDtm se almacenaron los valores al empezar y terminar el codigo, ahora seguimos en el evento click del boton Go, aqui se evalua si OverFlowBol = False y dado que se inicializo asi muestra el numero de celdas que contienen las permutaciones o combinaciones respectivas asi como los ejemplos anteriores que al poner SMILE salia 120 ways (vean la figura de arriba) y despues mostrara el tiempo que demoro en procesar las permutaciones en el Label4, como vimos antes en 120 permutaciones mostro 0 segundos pero en 10080 permutaciones le tomo 6 segundos, este tiempo lo calcula de restar EndDtm y StartDtm. Ahora si pulsamos Reset se ejecutara este boton
Private Sub CommandButton2_Click()
'// Reset Data
  TextBox1.Text = ""
  TextBox2.Text = ""
  Clr_text
  TextBox1.SetFocus
End Sub
aqui lo que hace es limpiar los textbox, llamar al procedimiento Clr_text y poner el cursor en el textbox1. El boton Close tiene el siguiente codigo
Private Sub CommandButton3_Click()
'// Close Form
  End
End Sub
En el codigo para elegir el numero de combinaciones o permutaciones se utiliza un spinbutton que tiene el siguiente codigo:
Private Sub SpinButton1_Change()
'// Change the value of "r" by spin button
  TextBox2.Text = SpinButton1.Value
End Sub
y vemos que en el evento textchange del textbox2 se llama al spinbutton
Private Sub TextBox2_Change()
'// Chose r
  Dim msgStr As String
  
  r = Val(TextBox2.Text)
  n = Len(TextBox1.Text)
  
  If TextBox2.Text <> "" Then
    If (Not IsNumeric(TextBox2.Text)) Or _
       r < 0 Or r > n Then
      msgStr = "Choose 0 <= r <= " & n
      MsgBox msgStr, vbExclamation
      r = n
      TextBox2.Text = n
    End If
  End If
  
  SpinButton1.Max = n
  SpinButton1.Value = r
End Sub
Ahora al elegir los radiobuttons se llamara a los procedimientos Perm o Comb
Private Sub OptionButton1_Click()
'// "Permutations"
  JKsw = True
  JKstr = "Permutations"
End Sub

Private Sub OptionButton2_Click()
'// "Combinations"
  JKsw = False
  JKstr = "Combinations"
End Sub
y este es el codigo con el que se inicializa el formulario
Private Sub UserForm_Initialize()
'// Initialize
  OptionButton1.Value = True
  OptionButton1_Click   'Set "Permutation"
  CalSheetBol = True    'Write to CalcSheet
  n = 0
  r = 0
  UserForm1.SpinButton1.Max = 0
  UserForm1.SpinButton1.Value = 0
  Load UserForm1
End Sub
no tengo mucho tiempo para explicar el resto de codigo, asi que aqui les dejo el ejemplito para que se guien y espero les haya servido esta pequeña explicacion que hice.

Metodo securo para ocultar hojas en Excel 2007

A menudo se ocultan las hojas de Excel, pero cualquier usuario no autorizado puede desocultarla rapidamente. Si desean utilizar un metodo mas seguro para ocultar hojas, tienen que utlizar el editor de Visual Basic (VBE). Afortunadamente, esta es una tecnica para ustedes, y que los intrusos no sospecharan.
Primero, vamos a ocultar una hoja por el metodo mas inseguro:
  • Abrimos un archivo Excel.
  • Damos click derecho en la Hoja2
  • Seleccionamos Ocultar
  • OH QUE METODO MAS SEGURO :)
Ahora para mostrar la hoja oculta, damos click derecho en otra hoja, y nos saldra en el menu la Opcion Mostrar, le damos click y seleccionamos la hoja que queremos ver.
Como ven esta opcion es muy insegura si realmente deseamos proteger datos.
Excel tiene una opcion mas segura conocida como Muy Oculta o Very hidden. Una hoja en la opcion very hidden no puede ser desocultada utilizando la interface de usuario de Excel porque no aparece en la ventana de Mostrar asi que el usuario de nivel promedio no sabra nisiquiera que la hoja existe.
Para lograr esto necesitaras el Editor de Visual Basic para aplicar esta propiedad.
  1. Presiona ALT+F11

  2. En la ventana Explorador de Proyectos, seleccionas la hoja que seas desocultar. Yo elegi la hoja 2.

  3. En la ventana de propiedades, en la propiedad Visible seleccionan 2- xlSheetVeryHidden del dropdownlist
  4. . Excel aplica esta propiedad y luego seleccionara la primera hoja, Hoja1, lo cual quiza te desconcierte un poco. Este tipo de accion es normal.
Cuando retornen a Excel veran que la Hoja2 no aparecera, y si se van a la Opcion Mostrar solo saldran otras hojas que hayan ocultado por el metodo simple.

Macro para calcular el promedio en Excel 2007

Voy a poner algunos conceptos previos.
  • Una macro es una rutina programada por el usuario que puede ser llamada mediante atajos de teclado
  • Visual Basic para Aplicaciones (VBA) es un lenguaje de programacion utilizado por los Programas de Microsoft Office que permite al usuario desarrollar rutinas personalizadas y funciones
  • Funciones son rutinas que devuelven valores
Ahora si vamos con el ejemplo.
Primero abrimos una hoja de calculo y la llenamos con 7 numeros en forma vertical, asi como en la figura:
ahora seleccionamos la celda superior de la derecha, asi como ven arriba (celda B2)
Ahora vamos a grabar la macro seleccionando Vista->Macro->Grabar Macro y modifican las propiedades (en metodo abreviado escriban la letra que deseen, con esa combinacion de teclas llamaran a la macro mas adelante)
Ahora escribimos la formula de entrada en la celda B2 y luego detenemos la macro yendo a Vista->Macro->Detener Macro

Para detener la macro, tambien puedes utilizar el boton Stop que esta en la parte inferior izquierda de la hoja de Excel.
Vamos a probar la macro ubicandonos en otra columna, escribimos 7 numeros y en la celda del primer numero nos movemos a la derecha y pulsamos el atajo de teclado que les indique en la figura de arriba (Ctrl+a)
y veran que aparece el mismo resultado
Ahora presionamos ALT+F11 para acceder al modulo de Visual Basic como muestra la figura:
eliminen la ultima linea
Range("C2").Select
de lo contrario, al presionar Ctrl+a siempre retornara a la celda C2.
Para grabar la macro como un archivo Visual Basic, vayan a Archivo->Exportar Archivo y grabenlo como un archivo Basic [*.bas] (asegurense que el Modulo1 este remarcado).
Espero les haya servido este pequeño ejemplito :)