Quantcast
Channel: EXCELeINFO
Viewing all 466 articles
Browse latest View live

Actualización 1: Formulario de punto de venta en Excel vba probado con lector de código de barras

$
0
0

Primera versión: Formulario de punto de venta en Excel vba.

En otro artículo publiqué la primera versión de un archivo de Excel para comenzar a armar un Punto de venta para tiendas.

En esta primera actualización incluyo dos nuevas características que harán del archivo una opción más viable para que te animes a hacerlo más robusto.

  1. Los códigos de los productos se pueden capturar mediante lector de código de barras o de manera manual.
  2. Incluyo un botón para eliminar un producto que se haya capturado por error.

image

Figura 1. Formulario de Punto de venta en Excel para usar con lector de código de barras.

Lector de código de barras

Como sabemos los lectores de código de barras son un dispositivo de entrada similar al teclado. Al pasar el lector sobre un código de barras nos devolverá un texto que se capturará en el formulario, por lo que en nuestra hoja de PRODUCTOS deberán estar dados de alta los códigos para que el formulario nos solicite la cantidad de artículos del producto escaneado.

Eliminar productos

Se añade a la derecha del formulario un botón con la leyenda “Eliminar producto”. Si por error capturamos o escaneamos un producto, sólo deberemos elegirlo en la lista y presionar el botón.

Al eliminar el producto se descontará de los totales de la parte inferior llamados ARTÍCULOS y TOTAL.

Código vba

Ubicación: frmVenta (formulario).

'---------------------------------------------------------------------------------------
' Module    : frmVenta
' Author    : MVP Excel, Sergio Alejandro Campos
' Date      : 21/11/2014
' Purpose   : Formulario tipo punto de venta para capturar productos.
'---------------------------------------------------------------------------------------
' Updates   : 18/12/2014. El texto del código del producto se convierte a Double para aceptar códigos largos.
'           : 18/12/2014. Se añade botón para eliminar un producto capturado por error.
'
Option Explicit
'
Private Sub CommandButton1_Click()
'Registrar producto y capturar cantidad
'Declaramos variables
Dim strDescripcion As String
Dim intCantidad As Double
Dim doublePUnitario As Double
Dim intTotal As Double
'
'En caso de error
On Error GoTo ErrorHandler
'
With Application.WorksheetFunction
    '
    'Usamos BUSCARV para encontrar el detalle del producto
    '
    strDescripcion = .VLookup(CDbl(Me.TextBox1.Value), PRODUCTOS.Range("A:C"), 2, 0)
    '
    intCantidad = InputBox(strDescripcion & vbNewLine & vbNewLine & "Ingresa la cantidad.", "Cantidad", 1)
    '
    If intCantidad = 0 Then GoTo ErrorHandler
    '
    'Llenamos el ListBox
    '...CÓDIGO
    Me.ListBox1.AddItem Me.TextBox1.Value
    '
    '...DESCRIPCIÓN
    ListBox1.List(ListBox1.ListCount - 1, 1) = strDescripcion
    '
    '...CANTIDAD
    ListBox1.List(ListBox1.ListCount - 1, 2) = .Text(intCantidad, "#,##0")
    '
    '...P.UNITARIO
    doublePUnitario = .VLookup(CDbl(Me.TextBox1.Value), PRODUCTOS.Range("A:C"), 3, 0)
    ListBox1.List(ListBox1.ListCount - 1, 3) = .Text(doublePUnitario, "$#,##0.00;-$#,##0.00")
    '
    '...TOTAL
    intTotal = doublePUnitario * intCantidad
    ListBox1.List(ListBox1.ListCount - 1, 4) = .Text(intTotal, "$#,##0.00;-$#,##0.00")
    '
    '...ETIQUETAS
    Me.lblProductos = .Text(CInt(Me.lblProductos) + CInt(intCantidad), "#,##0")
    Me.lblTotal = .Text(CDbl(Me.lblTotal) + CDbl(intTotal), "$#,##0.00;-$#,##0.00")
    '
    Me.TextBox1.Value = ""
    Me.TextBox1.SetFocus
    '
End With
'
Exit Sub
'
ErrorHandler:
'
MsgBox "Ha ocurrido un error: " & Err.Description, vbExclamation, "EXCELeINFO"
'
Me.TextBox1.Value = ""
Me.TextBox1.SetFocus
'
End Sub
'
Private Sub CommandButton4_Click()
Unload Me
End Sub
'
Private Sub CommandButton5_Click()
'Guardar compra en tabla
Dim i As Variant
Dim j As Variant
Dim TransRowRng As Range
Dim NewRow As Integer
'
With VENTAS
    '
    For i = Me.ListBox1.ListCount To 1 Step -1
        '
        Set TransRowRng = ThisWorkbook.Worksheets("VENTAS").Cells(1, 1).CurrentRegion
        NewRow = TransRowRng.Rows.Count + 1
        .Cells(NewRow, 1).Value = Date
        .Cells(NewRow, 2).Value = Me.txtConsec.Value
        '
        For j = 0 To 4
            '
            .Cells(NewRow, j + 3).Value = Me.ListBox1.List(Me.ListBox1.ListCount - i, j)
            '
        Next j
        '
    Next i
    '
End With
'
MsgBox "Registros guardados con éxito.", vbInformation, "EXCELeINFO"
'
Unload Me
'
End Sub


Private Sub CommandButton6_Click()
'Eliminar producto capturado erroneamente.
'
'Declaramos variables
Dim Cuenta As Integer
Dim Numero As Integer
Dim j As Integer
Dim i As Integer
Dim strNombreItem As String
Dim CantidadSeleccionado As String
Dim TotalSeleccionado As Double

'
Cuenta = Me.ListBox1.ListCount
Numero = 0
'
'Validamos que haya un elemento seleccionado.
For j = 0 To Cuenta - 1
    If Me.ListBox1.Selected(j) = True Then
        Numero = Numero + 1
    End If
Next j
'
If Numero <> 0 Then
    '
    'La hoja seleccionada se pasará al ListBox de hojas visibles.
    For i = 0 To Cuenta - 1
        If Me.ListBox1.Selected(i) = True Then
            strNombreItem = Me.ListBox1.List(i)
            CantidadSeleccionado = ListBox1.List(i, 2)
            TotalSeleccionado = ListBox1.List(i, 4)
            Me.ListBox1.RemoveItem i
            Me.lblProductos.Caption = _
            WorksheetFunction.Text(Me.lblProductos.Caption - CantidadSeleccionado, "#,##0")
            Me.lblTotal.Caption = _
            WorksheetFunction.Text(Me.lblTotal.Caption - TotalSeleccionado, "$#,##0.00;-$#,##0.00")
        End If
    Next i
    '
End If
'
End Sub

'
Private Sub UserForm_Initialize()
Dim intConsecutivo As String
'
Me.ListBox1.ColumnCount = 5
Me.ListBox1.ColumnWidths = "70 pt; 150 pt; 55 pt; 60 pt; 60 pt"
Me.txtFecha.Value = Date
'
intConsecutivo = VENTAS.Range("I1").Value
'
If intConsecutivo = "CONSECUTIVO" Then
    '
    Me.txtConsec = 1
    '
Else
    '
    Me.txtConsec = intConsecutivo + 1
    '
End If
End Sub

Anexos

:: Descarga Formulario de punto de venta 2.rar


Fórmulas y funciones para manejo de errores en Excel

$
0
0

Excel provee de algunas funciones para manejar errores que puedan causar nuestras fórmulas. Pero al decir errores, no necesariamente son errores que el usuario pueda tener, sino errores que las fórmulas nos arrojan en determinadas situaciones.

Tipos de errores

En Excel encontraremos distintos tipos de errores cuando hacemos uso de fórmulas. Los errores que encontramos son:

  1. #¡NULO! : Se genera cuando especificamos incorrectamente un rango en una fórmula, por ejemplo =SUMA(A4 A5). Si nos fijamos nos hace falta los “dos puntos entre A4 y A5.
  2. #¡DIV/0! : Se genera cuando se detecta una división entre cero.
  3. #¡VALOR! : Se genera cuando se da un tipo de valor incorrecto a lo que espera una función. Por ejemplo =SUMA(“a”,”b”). La función suma espera que los valores sean numéricos.
  4. #¡REF! : Este error sucede cuando una fórmula hace referencia a una celda o un rango que ya no existe o fue borrado.
  5. #¿NOMBRE? : Si intentamos usar una función que no existe, Excel mostrará este error.
  6. #¡NUM! : Se produce cuando se escriben valores numéricos no válidos en una fórmula o una función.
  7. #N/A : Este error se produce cuando se intenta encontrar un valor y éste no existe. Principalmente es usado por las funciones BUSCARV y BUSCARH.
  8. #OBTENIENDO_DATOS : Éste más bien es un mensaje que se muestra temporalmente cuando un libro grande o muy complejo está siendo calculado. El mensaje desaparece cuando el cálculo se completa.

A continuación vemos algunos ejemplos de las funciones que nos permitirá interactuar con los anteriores mensajes de error.

SI.ND

La función SI.ND se introdujo en Excel 2013 y evalúa si el error devuelto en una fórmula es #N/A. El error #N/A al ser usado principalmente en funciones BUSCARV y BUSCARV, SI.ND queda perfecto para ser usados con dichas funciones.

Ejemplo: Se pretender buscarv un valor dentro de una tabla. Si el valor no se encuentra, deseamos que se muetre el mensaje “NO SE ENCUENTRA”.

=SI.ND(BUSCARV(A1,$H$1:$I$5,2,0),”NO SE ENCUENTRA”)

SI.ERROR

La función SI.ERROR evalúa el resultado de fórmula o expresión y nos permite devolver un valor en caso de ser VERDADERO o ejecutar otra fórmula.

Ejemplo: Como sabemos, si intentamos dividir un número entre cero, el error que Excel nos devolvería será #!DIV/0!. Para el ejemplo queremos que se muestre el mensaje “NO SE PUEDE DIVIDIR ENTRE CERO” en lugar del mensaje de error.

=SI.ERROR(10/0,”NO SE PUEDE DIVIDIR ENTRE CERO”)

ESERROR

La función ESERROR devolverá VERDADERO en caso de que una fórmula genere error o FALSO en caso de que no lo genere. Recomiendo que se utilice en combinación con la función SI, para evaluar el error y mostrar un valor o ejecutar una fórmula en caso de que devuelva VERDADERO.

Esta función puede llegar a ser un tanto larga al momento de evaluarla con un SI. Por fortuna, después de Excel 2007 se introdujo la función SI.ERROR que es la combinación de ESERROR y SI.

Ejemplo: Usaremos la misma fórmula de BUSCARV para evaluarla y mostrar un mensaje en caso de que no se encuentre el valor.

=SI(ESERROR(BUSCARV(A1,$H$1:$I$5,2,0)),”NO SE ENCUENTRA”,BUSCARV(A1,$H$1:$I$5,2,0))

TIPO.DE.ERROR

La función TIPO.DE.ERROR devuelve un número que coincide con un valor de error.

Ejemplo: Usaremos un BUSCARV para traer la descripción coincidente de un error. El BUSCARV buscará el código de error de otra celda que genera un error.

=BUSCARV(TIPO.DE.ERROR(B12),$A$1:$C$9,3,0)

image

Figura 1. Uso de la función TIPO.DE.ERROR combinada con BUSCARV.

EXCELeINFO add-in como herramienta auxiliar para trabajar con celdas con error

En mi add-in EXCELeINFO viene añadida una herramienta que nos ayudará a mostrar un mensaje personalizado en las celdas que estén propensas a errores.

Con EXCELeINFO add-in instalado y el rango de celdas elegido, nos vamos a FÓRMULAS y elegimos la ópción llamada MENSAJE PERSONALIZADO EN FÓRMULAS CON ERROR.

Definimos el mensaje a usar, así como si deseamos usar SI.ERROR o ESERROR.

image

Figura 2. Mensaje personalizado en fórmulas con error.

Anexos

:: Descarga EXCELeINFO add-in

Los números de EXCELeINFO en 2014

$
0
0

Este año 2014 ha sido provechoso para este su Blog, cada vez tenemos más visitas lo cual motiva a seguir compatiendo artículos útiles para volverlos cada día expertos en Excel.

► Por fin me decidí y publiqué el Blog con dominio propio http://www.exceleinfo.com.

► Este 2014 conseguí mi 3er nombramiento como MVP de Excel.

image

► Publiqué 49 artículos.

► En la página de Facebook llegamos a los casi 5 mil likes.

► Cada vez recibo más comentarios positivos acerca de mi EXCELeINFO add-in.

image

► Estos fueron los países de donde se tuvieron más visitas

image

En fin, todo esto ha sido gracias a que existe mucha gente interesada en aprender cosas nuevas sobre Excel y la gran cantidad de cosas que puedes hacer con ésta maravillosa herramienta.

Top 10 de artículos

La siguiente lista tiene los 10 artículos más visitados en el Blog.

Lista completa de artículos publicados en 2014

Macro para tener una ventana y formulario de Excel siempre en primer plano

$
0
0

Comenzando el año 2015 les quiero desear mucha felicidad y éxitos en todos los aspectos de su vida.

Como has visto en este Blog, hay muchos artículos con uso de macros y algunos pueden tomarse como aplicaciones que parecieran que no fueran Excel.

Si tienes algún archivo o aplicativo en Excel, seguramente te hiciste la pregunta de Cómo hago para que los usuarios no puedan cambiarse a otra ventana mientras usan mi archivo.

La pregunta anterior la resolvemos con el uso del procedimiento ShowXLOnTop.

Cómo funciona

Para este ejemplo usaremos un formulario vacío que al inciarse ejecutará una macro que hará lo siguiente:

  1. Pondrá la ventana de Excel en pantalla completa.
  2. La ventana de Excel abierta se matendrá en primer plano, provocando que deje de funcionar la combinación de teclas Alt + TAB.

Al cerrar el formulario se hará el procedimieno contrario.

image

Figura 1. Ventana de Excel en pantalla completa y en primer plano.

Código de las macros

Procedimientos y variables para tener la ventana en primer plano.

Ubicación: Módulo1

Option Explicit
'
'---------------------------------------------------------------------------------------
' Module    : Módulo1
' Date      : 02/01/2015
' Purpose   : Mantener la ventana de Excel siempre en primer plano
'---------------------------------------------------------------------------------------
'
'Declaramos variables para Windows de 32 y 64 bits
'
#If Win64 Then
    Public Declare PtrSafe Function SetWindowPos _
           Lib "user32" ( _
           ByVal hwnd As LongPtr, _
           ByVal hwndInsertAfter As LongPtr, _
           ByVal x As Long, ByVal y As Long, _
           ByVal cx As Long, ByVal cy As Long, _
           ByVal wFlags As Long) _
           As Long
#Else
    Public Declare Function SetWindowPos _
                         Lib "user32" ( _
                             ByVal hwnd As Long, _
                             ByVal hwndInsertAfter As Long, _
                             ByVal x As Long, ByVal y As Long, _
                             ByVal cx As Long, ByVal cy As Long, _
                             ByVal wFlags As Long) _
                             As Long
#End If
'
Public Const SWP_NOSIZE = &H1
Public Const SWP_NOMOVE = &H2
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2
'
'Procedimiento que será usado con True o False para indicar
'si la ventana de Excel se mantendrá en primer plano
'
Sub ShowXLOnTop(ByVal OnTop As Boolean)
Dim xStype As Long
#If Win64 Then
    Dim xHwnd As LongPtr
#Else
    Dim xHwnd As Long
#End If
If OnTop Then
    xStype = HWND_TOPMOST
Else
    xStype = HWND_NOTOPMOST
End If
'
Call SetWindowPos(Application.hwnd, xStype, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE)
'
End Sub
'
'Llamamos el procedimiento con el valor True
'
Sub SetXLOnTop()
ShowXLOnTop True
End Sub
'
'Llamamos el procedimiento con el valor False
'
Sub SetXLNormal()
ShowXLOnTop False
End Sub

Mandar llamar las macros de Pantalla completa y primer plano.

Ubicación: UserForm1.

'Botón cerrar
Private Sub CommandButton1_Click()
Unload Me
End Sub
'
'Al iniciar el formulario se:
'1. Mantiene la ventana en primero plano.
'2. La ventana de Excel se pone en pantalla completa.
'
Private Sub UserForm_Initialize()
Application.DisplayFullScreen = True
Call SetXLOnTop
End Sub
'
'Al cerrar el  formulario se:
'1. Mantiene la ventana en primero plano.
'2. La ventana de Excel se pone en pantalla completa.
'
Private Sub UserForm_Terminate()
Call SetXLNormal
Application.DisplayFullScreen = False
End Sub

Anexos

:: Descarga Ventana y formulario de Excel siempre en primer plano – EXCELeINFO.rar

Actualización: Función EXCELeINFO CONCATENAR ahora omite celdas en blanco

$
0
0

Ésta función que les comparto es una de las que más uso en mis labores diarias, es por eso que procuro actualizarla constantemente. En esta ocasión y en base a un comentario de un visitante del Blog les comparto una actualización que contiene 2 cambios importantes:

  1. Si el rango seleccionado incluye celdas en blanco, éstas son omitidas del texto resultante.
  2. Ahora la función hace dos validaciones dependiendo de si se define un separador o no, para no causar conflictor en el texto resultante.

Cómo funciona

En este ejemplo la función es llamada EICONCATENAR y cuenta con dos parámetros:

  1. Rango: El conjunto de celdas que la función tomará para unir sus valores.
  2. Separador (opcional) : Caracter que se imprimirá entre cada palabra.

Al usar la función si deseamos podemos usar un caracter separador para que se imprima entre cada palabra, así como en la Figura 1.

image

Figura 1. Función EICONCATENAR con espacio como separador.

Pero como el separador es opcional, no lo usamos si no deseamos, como en la Figura 2.

image

Figura 2. Función EICONCATENAR sin separador.

Código vba de la función

Nombre UDF: EICONCATENAR

Ubicación: Módulo normal.

'---------------------------------------------------------------------------------------
' Module    : Módulo1
' Author    : MVP Excel, Sergio Alejandro Campos
' Date      : 12/01/2015
' Purpose   : Función UDF para concatenar contenido de celdas
'---------------------------------------------------------------------------------------
'
Function EICONCATENAR(Rango As Range, Optional Separador As Variant) As String
Dim t As String
Dim lenTexto As Integer
Application.Volatile
'
For Each Celda In Rango
    If Not IsEmpty(Celda.Value) Then
        If IsMissing(Separador) Then Separador = ""
        t = t & Separador & Celda.Value
    Else
    End If
    '
Next Celda
'
If Separador = "" Then
    '
    EICONCATENAR = t
    '
Else
    '
    lenTexto = Len(t)
    EICONCATENAR = Right(t, lenTexto - 1)
    '
End If
'
End Function

Actualización: Función EXCELeNFO CONCATERNAR2 con separador y rangos no adyacentes para Excel

$
0
0

En el artículo anterior publiqué la función CONCATENAR (UDF) donde informaba que permitía definir un separador y omitía celdas en blanco.

En este artículo publico otra versión de la función CONCATENAR (UDF), pero ésta nos va a permitir elegir rangos no adyacentes y también un separador.

Cómo funciona

A diferencia de la otra función ésta tendrá como primer parámetro el separador, para después elegir la cantidad que deseemos de rangos a concatenar. La estrucutura es la siguiente:

Cabe señalar que el separador para ésta función no es opcional.

=EICONCATENAR2(separador,rango1,[rango2],…)

En la Figura 1 vemos cómo elegimos una coma como separador, y los parámetros son dos rangos.

image

Figura 1. Función EXCELeINFO CONCATENAR2 con separador y rangos no adyacentes.

Código vba de la función UDF

Nombre UDF: EICONCATENAR2.

Ubicación: Módulo1.

'---------------------------------------------------------------------------------------
' Module    : Módulo1
' Author    : MVP Excel, Sergio Alejandro Campos
' Notice    : Código basado en la función MySum de John Walkenbach
' Date      : 15/01/2015
' Purpose   : Función UDF concatenar con parámetros adyacentes, separador
'              y omite celdas en blanco.
'---------------------------------------------------------------------------------------
'
Function EICONCATENAR2(Separador As Variant, ParamArray argumentos() As Variant) As Variant
' Declaración de variables
Dim i As Variant
Dim RangoTemporal As Range, Celda As Range
Dim m, n
'
Application.Volatile
'
' Se procesa cada argumento
For i = 0 To UBound(argumentos)
    ' Se salta argumentos faltantes
    If Not IsMissing(argumentos(i)) Then
        ' Analiza los tipos de argumentos
        Select Case TypeName(argumentos(i))
        Case "Range"
            ' Se crea un rango temporal para manejar rangos completos de filas o columnas
            Set RangoTemporal = Intersect(argumentos(i).Parent.UsedRange, argumentos(i))
            For Each Celda In RangoTemporal
                If Not Celda.Value = "" Then
                    EICONCATENAR2 = EICONCATENAR2 & Separador & Celda
                Else
                End If
            Next Celda
        Case Else
            EICONCATENAR2 = EICONCATENAR2 & " " & argumentos(i)
        End Select
    End If
Next i
'
LargoTexto = Len(EICONCATENAR2)
LargoSeparador = Len(Separador)
EICONCATENAR2 = Right(EICONCATENAR2, LargoTexto - LargoSeparador)
'
End Function

Validar si un texto tiene formato de fecha, número o alfanumérico en Excel con vba

$
0
0

En ocasiones tendrás que validar si un texto que ingresaste tiene formato de fecha, numérico o texto o alfanumérico.

Para este artículo desarrollé un sencillo formulario donde ingresas tu cadena de texto y te valida lo anterior.

Cómo funciona

El formulario tiene un TextBox que será donde ingresaremos el texto a validar. El botón con la leyenda “Validar” mostrará el resultado en un Label de color verde.

image

Figura 1. Validar cadena con formato de fecha, texto o número.

Para la validación usamos un SELECT CASE para comparar cada escenario posible y también usamos las siguiente funciones de comprobación:

  1. IsDate: Validamos si el texto es fecha.
  2. IsNumeric: Validamos si el texto numérico.
  3. WorksheetFunction.IsText: Validamos si el texto es alfanumérico.

Código vba

Ubicación: UserForm1.

'---------------------------------------------------------------------------------------
' Module    : UserForm1
' Author    : MVP Excel, Sergio Alejandro Campos
' Website:  : http://www.exceleinfo.com
' Date      : 22/01/2015
' Purpose   : Validar el tipo de texto ingresado
'---------------------------------------------------------------------------------------
'
Private Sub CommandButton1_Click()
'
'Declaramos variables
'
Dim Valor As Variant
'
Valor = Me.TextBox1.Value
'
'Validamos cada caso y en caso de ser verdadero...
'
Select Case True
    '
Case Valor = ""
    Me.Label1.Caption = "El campo está vacío."
    Me.TextBox1.SetFocus
    '
Case IsDate(Valor)
    Me.Label1.Caption = "El dato ingresado es fecha."
    Me.TextBox1.SetFocus
    '
Case IsNumeric(Valor)
    Me.Label1.Caption = "El dato ingresado es numérico."
    Me.TextBox1.SetFocus
    '
Case WorksheetFunction.IsText(Valor)
    Me.Label1.Caption = "El dato ingresado es texto."
    Me.TextBox1.SetFocus
    '
Case Else
    '
End Select
'
End Sub
'
Private Sub CommandButton2_Click()
'
'Botón Cerrar
'
Unload Me
'
End Sub

:: Descarga el ejemplo Validar si es texto, número o fecha en Excel vba.rar

Usar BUSCARV en formulario de Excel vba e identificar texto, números y fechas

$
0
0

Éste artículo que les comparto es una combinación de dos artículos publicados anteriormente en este mismo Blog y que nos muestran cómo usar la función BUSCARV o VLOOKUP desde vba.

Cómo funciona

Tenemos una lista con dos columnas, donde la primera columna almacenará datos numéricos, alfanuméricos y fechas. La función VLOOKUP arrojará el dato de la segunda columna si la búsqueda fue exitosa.

image

Figura 1. BUSCARV desde formulario de Excel vba.

En caso de que el valor buscado no exista en la tabla, se mostrará la leyenda “El valor [valoe] no fue encontrado”.

image

Figura 2. Al no encontrar el valor, se mostrará una leyenda indicándolo.

Regresar el “foco” al TextBox

Añadí a este ejemplo el procedimiento de regresarle el “foco” al TextBox donde se ingresa el valor a buscar, es decir, que cuando se ingrese el valor, si éste es válido o no, el cursos regresará al mismo TextBox. Esto lo logramos con el método SetFocus aplicado al TextBox:

Me.TextBox1.SetFocus

Código vba

Option Explicit
'
'---------------------------------------------------------------------------------------
' Module    : frmBUSCARV
' Author    : MVP Excel, Sergio Alejandro Campos
' Date      : 26/01/2015
' Purpose   : Uso de VLOOKUP identificando número, letras y fechas
'---------------------------------------------------------------------------------------
'
Private Sub CommandButton1_Click()
'
'Declaramos las variables.
Dim Nombre As Variant
Dim Rango As Range
Dim NombreBuscado As Variant
Dim Titulo As String
'
Titulo = "EXCELeINFO"
'
'En caso de error...
On Error GoTo ErrorHandler
'
Set Rango = Sheets(1).Range("A1").CurrentRegion
'
'Validamos si el valor es numérico.
NombreBuscado = Me.TextBox1.Value
If IsNumeric(NombreBuscado) Then
    NombreBuscado = CDbl(NombreBuscado)
ElseIf IsDate(NombreBuscado) Then
    'NombreBuscado = CDate(NombreBuscado)
    NombreBuscado = CLng(CDate(NombreBuscado))
End If
'
'Asignamos a la variable Nombre el resultado del BUSCARV.
Nombre = Application.WorksheetFunction.VLookup(NombreBuscado, Rango, 2, 0)
'
'Pasamos el resultado al cuadro de texto (TextBox).
With Me
    .TextBox2.Value = Nombre
    .lblMensaje.Visible = False
    .TextBox1.SetFocus
End With
'
Exit Sub
'
'De haberse encontrado un error mostramos mensajes.
ErrorHandler:
If Err.Number = 1004 Then
    With Me
        .lblMensaje.Caption = "El valor '" & NombreBuscado & "' no fue encontrado."
        .lblMensaje.Visible = True
        .TextBox1.SetFocus
    End With
Else
    MsgBox "Ha ocurrido un error: " & Err.Description, vbExclamation, Titulo
End If
End Sub
'
'
Private Sub UserForm_Initialize()
'
'Ocultamos controles.
With Me
    .TextBox2.Enabled = False
    .lblMensaje.Visible = False
End With
'
End Sub

:: Descarga el ejemplo Formulario de Buscarv con Excel vba identificando números, letras y fechas.rar


Ejecutar macros al iniciar archivo de Excel

$
0
0

Una de las preguntas más socorridas en temas de Excel es Cómo ejecutar una macro al abrir un archivo de Excel.

La respuesta a la anterior pregunta es una de las opciones más sencillas de hacer y la vamos a ver en este artículo.

Cómo lo hacemos

Estando en Excel y con nuestro archivo abierto deberemos de abrir el IDE de vba. Para abrirlo tenemos 2 opciones:

  1. Presionar ALT + F11.
  2. Ir a la pestaña de Desarrollador (en Excel 2010 aparece como Programador) y presionar el botón de Visual Basic.

Cuando tengamos abierto el IDE de vba nos dirigimos al panel izquierdo y veremos una lista con los nombres de los archivos que tengamos abiertos, incluso los complementos instalados.

Ubicamos el nombre de nuestro archivo y damos click en el signo de más ‘+’ a la izquierda del nombre, para desplegar los objetos del archivos.

Damos doble click en el objeto ThisWorkbook.

image

Figura 1. Vemos el objeto ThisWorkbook en el IDE de vba.

Ahora nos iremos a la parte derecha de la ventana, la parte blanca. Damos click en el ComboBox que tiene la leyenda ‘(General)’ y elegimos Workbook.

image

Figura 2. Evento Open en Excel vba.

Al presionar en la opción Workbook notarán que se añade un código en la parte inferior. El código que se añade es el evento Open que servirá para ejecutar las macros que deseemos al abrir el archivo, siempre y cuando estén dentro de ese evento.

Anexos

Artículos donde usamos el evento Open del objeto ThisWorkbook.

  1. Lanzar tu propio menú contextual al dar click derecho en las etiquetas de hojas de Excel
  2. Usar “No volver a mostrar este mensaje” modificando el Registro de Windows desde Excel
  3. Funciones personalizadas UDF en Excel disponibles en todos los archivos abiertos
  4. Mostrar mensaje de los que cumplen años el día de hoy en Excel
  5. Add-in para manipulación de texto en Excel
  6. Mostrar hojas en Excel ingresando una contraseña
  7. Crear categoría y descripción para funciones personalizadas UDF en Excel
  8. Macro para crear un log y saber cuántas veces se abre un archivo de Excel
  9. Prohibir el acceso a las macros de Excel con Alt + F11
  10. Hora real en Excel con OnTime
  11. Ejecutar macro dependiendo del nombre de usuario de Excel

Encuesta sobre el uso de EXCELeINFO add-in

$
0
0

Cómo están todos ? Para este artículo les voy a pedir si son tan amables de contestar una sencilla encuesta sobre el uso de mi add-in EXCELeINFO.

Encuesta sobre EXCELeINFO add-in

Como saben, el add-in tiene algunas opciones que te permitirán ahorrar tiempo en algunas tareas en Excel. Fue creado inicialmente para ahorrarme tiempo en mis labores y como fue creciendo, decidí compartirlo con ustedes.

Si aún no lo has probado, lo puedes descargar aquí.

Figura 1. EXCELeINFO add-in.

Regresando al tema, he creado una encuesta en OneDrive para recoger sus comentarios acera del uso del add-in, ya que pretendo agregarle las opciones más usadas al menú que se despliega al momento de dar click derecho.

También viene una opción para que me digas si te gustaría que el add-in tuvieras otras opciones y cuáles. Esto último lo analizo y decido si se añade.

La encuesta puedes responderla en el siguiente link:

Encuesta sobre EXCELeINFO add-in

Quieres saber cómo se realizó la encuesta, visita: Crear fácilmente encuestas con Excel Web App y compartir un link para capturar respuestas

Aplicar transparencia a formulario de Excel vba

$
0
0

Para este artículo les comparto un tip muy interesante, que seguramente les podrán encontrar un uso útil a sus proyectos y darles un Plus en la presentación.

Pues bien, el tip que les comparto es cómo aplicar transparencia a un formulario desarrollado en vba. Esto mediante la llamada a API’s de Windows.

Lo mejor, y para no hacerles el trabajo complicado, el código es compatible con Windows y Excel de 32 y 64 bits. Para más sobre el tema de compatibilidad visita Hacer macros compatibles con Excel de 32 y 64 bits.

Cómo funciona

El formulario del ejemplo es sencillo y tiene los siguientes controles:

  1. 1 CheckBox.
  2. 1 control Image.
  3. 1 CommandButton.

Al lanzar el formulario usaremos el método vbModeless en valor TRUE para que nos permita seguir utilizando las celdas de Excel sin necesidad de cerrar el formulario.

image

Figura 1. Formulario sin transparencia.

Mediante llamadas a API’s de Windows lograremos que al elegir el CheckBox con la leyenda “Habilitar transparencia” al formulario se le aplique una transparencia del 50% cuando el CheckBox esté en TRUE.

image

Figura 2. Formulario con transparencia.

Código vba del formulario

Ubicación: UserForm1

'Declaramos variables compatibles con 32 y 64 bits.
'----------------------------------

#If VBA7 And Win64 Then

    Private Declare PtrSafe Function GetActiveWindow Lib "USER32" () As Long

#Else
    Private Declare Function GetActiveWindow Lib "USER32" () As Long
#End If

'----------------------------------
#If VBA7 And Win64 Then
    #If VBA7 Then
        #If Win64 Then
            Private Declare PtrSafe Function SetWindowLongPtr Lib "USER32" Alias "SetWindowLongPtrA" _
                    (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
        #Else
            Private Declare Function SetWindowLongPtr Lib "USER32" Alias "SetWindowLongA" _
                                                      (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
        #End If
    #Else
        Private Declare Function SetWindowLongPtr Lib "USER32" Alias "SetWindowLongA" _
                                                  (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    #End If
#Else
    Private Declare Function SetWindowLong Lib "USER32" Alias "SetWindowLongA" _
                                           (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
#End If
'----------------------------------
#If VBA7 And Win64 Then
    #If VBA7 Then
        #If Win64 Then
            Private Declare PtrSafe Function GetWindowLongPtr Lib "USER32" _
                    Alias "GetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
        #Else
            Private Declare PtrSafe Function GetWindowLongPtr Lib "USER32" _
                    Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
        #End If
    #Else
        Private Declare Function GetWindowLongPtr Lib "USER32" Alias "GetWindowLongA" _
                                                  (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    #End If
#Else
    Private Declare Function GetWindowLong Lib "USER32" Alias "GetWindowLongA" _
                                           (ByVal hwnd As Long, ByVal nIndex As Long) As Long
#End If
'----------------------------------
#If VBA7 And Win64 Then
    Private Declare PtrSafe Function SetLayeredWindowAttributes Lib "USER32" ( _
            ByVal hwnd As LongPtr, ByVal crKey As Integer, _
            ByVal bAlpha As Integer, ByVal dwFlags As Long) As LongPtr
#Else
    Private Declare Function SetLayeredWindowAttributes Lib "USER32" ( _
                                                        ByVal hwnd As Long, ByVal crKey As Integer, _
                                                        ByVal bAlpha As Integer, ByVal dwFlags As Long) As Long
#End If

'----------------------------------
Private Const WS_EX_LAYERED = &H80000
Private Const LWA_COLORKEY = &H1
Private Const LWA_ALPHA = &H2
Private Const GWL_EXSTYLE = &HFFEC
Dim hwnd As Long

Private Sub CheckBox1_Click()
'CheckBox para aplicar transparencia
'
Select Case True
    '
Case CheckBox1.Value
    Call Semitransparent(50)
Case Else
    Call Semitransparent(100)
End Select
'
End Sub
'
Private Sub CommandButton1_Click()
'Cerrar formulario
Unload Me
End Sub

Private Sub Semitransparent(ByVal intLevel As Integer)
'Aplicar transparencia
#If VBA7 And Win64 Then
    Dim lngWinIdx As LongPtr
#Else
    Dim lngWinIdx As Long
#End If
'
#If VBA7 And Win64 Then
    hwnd = GetActiveWindow
    lngWinIdx = GetWindowLongPtr(hwnd, GWL_EXSTYLE)
    SetWindowLongPtr hwnd, GWL_EXSTYLE, lngWinIdx Or WS_EX_LAYERED
    SetLayeredWindowAttributes hwnd, 0, (255 * intLevel) / 100, LWA_ALPHA
#Else
    hwnd = GetActiveWindow
    lngWinIdx = GetWindowLong(hwnd, GWL_EXSTYLE)
    SetWindowLong hwnd, GWL_EXSTYLE, lngWinIdx Or WS_EX_LAYERED
    SetLayeredWindowAttributes hwnd, 0, (255 * intLevel) / 100, LWA_ALPHA
#End If
'
'Label1.Caption = "Semitransparent level is ..." & (100 - intLevel) & "%"
End Sub

:: Descargar el ejemplo Formulario transparente en Excel vba.rar

UDF para obtener la fórmula de una celda como una cadena de texto en versiones previas a Excel 2013

$
0
0

Como anteriormente vimos en este artículo, Excel 2013 incluyó, entre otras, una nueva función llamada FORMULATEXTO, que según la ayuda en línea de Office, se describe como: Devuelve la fórmula en una cadena.

Qué quiere decir lo anterior. Significa que cualquier fórmula que tengamos en una celda, podremos extraerla textual y mostrarla como una cadena de Texto, como lo vemos en la Figura 1.

image

Figura 1. Usando la función FORMULATEXTO en Excel 2013.

Qué sucede si tengo Excel 2010 o anteriores.

Como siempre digo, si Excel no lo tiene, haz una macro. Esto aplica si quieres usar la función FORMULATEXTO, pero tu versión de Excel es 2010 o anterior.

Para esto, realizamos una función personalizada (UDF) media macros de Excel y le pondremos el nombre de ObtenerFormula.

Si estás interesado en el tema de la cración de Funciones (UDF) en Exce y vba, revisa estos artículos de este mismo Blog.

La función ObtenerFormula tiene el mismo comporamiento que FORMULATEXTO y puede ser perfectamente en versiones de Excel previas a 2013.

image

Figura 2. Usando ObtenerFormula (UDF).

Código vba de la función

Ubicación: Módulo1

Function ObtenerFormula(Celda As Range) As String
'
Application.Volatile
'
If Celda.HasArray Then
    ObterFormula = "{" & Celda.FormulaLocal & "}"
Else
    ObtenerFormula = Celda.FormulaLocal
End If
'
End Function

Personalizar menú de click derecho sobre las celdas en Excel con XML y vba

$
0
0

Para este artículo les tengo dos maneras de crear un menú contextual al momento de dar click derecho sobre celdas en Excel. El primer método es en base a código XML incluído en versiones de Excel 2007, 2010 y 2013, el cual explico aquí: Crear menús en Excel 2003 y Ribbon en Excel 2007 y 2010.

Para crear el menú contextual (con vba) al dar click derecho sobre una celda, hay que revisar este artículo: Add-in para manipulación de texto en Excel.

Por qué usar XML para crear menú contextual

Como lo vimos en el link anterior, con XML podemos crear menús para el Ribbon de Excel, así como menús contextuales para click derecho.

Ventajas de usar XML

  1. Podemos modificar los archivos sin necesidad de abrir Excel (esto no se puede si el archivo está guardado como add-in).
  2. Podemos crear menús y Ribbon sin necesidad de vba. El código vba será para las macros que los menús manden llamar.

Cómo lo hacemos

Primero descargaremos el Custom UI Editor For Microsoft Office y lo instalamos en nuestra PC.

Referencia: Insertar botón personalizado en el Ribbon de Excel al abrir un archivo o add-in

Una vez instalado el programa lo abrimos en File > Open.

En la parte izquierda aparecerá el nombre del archivo. Elegimos el menú Insert e insertaremos Office 2010 Custom UI Part y Office 2007 Custom UI Part.

image

Figura 1. Custom UI Editor para Office

Para 2010 ingresamos el siguiente código:

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
	<contextMenus>
		<contextMenu idMso="ContextMenuCell">

		<menu id="MySubMenu" label="EXCELeINFO con XML" insertBeforeMso="Cut"  >

		<button id="btn1" label="Prueba 1" imageMso="E" onAction="Macro1"/>
		<button id="btn2" label="Prueba 2" imageMso="X" onAction="Macro2"/>
		<button id="btn3" label="Prueba 3" imageMso="C" onAction="Macro3"/>
		<button id="btn4" label="Prueba 4" imageMso="E" onAction="Macro4"/>
		<button id="btn5" label="Prueba 5" imageMso="L" onAction="Macro5"/>

		<menuSeparator id="MySeparator2" insertBeforeMso="Cut" />


		<button id="btn6" label="Prueba 6" imageMso="ConstrainNumeric" onAction="Macro6"/>
				 
		</menu>

		<menuSeparator id="MySeparator" insertBeforeMso="Cut" />

		</contextMenu>
	</contextMenus>
	
</customUI>

Para 2007 ingresamos el siguiente código:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
	<contextMenus>
		<contextMenu idMso="ContextMenuCell">

		<menu id="MySubMenu" label="EXCELeINFO con XML" insertBeforeMso="Cut"  >

		<button id="btn1" label="Prueba 1" imageMso="E" onAction="Macro1"/>
		<button id="btn2" label="Prueba 2" imageMso="X" onAction="Macro2"/>
		<button id="btn3" label="Prueba 3" imageMso="C" onAction="Macro3"/>
		<button id="btn4" label="Prueba 4" imageMso="E" onAction="Macro4"/>
		<button id="btn5" label="Prueba 5" imageMso="L" onAction="Macro5"/>

		<menuSeparator id="MySeparator2" insertBeforeMso="Cut" />


		<button id="btn6" label="Prueba 6" imageMso="ConstrainNumeric" onAction="Macro6"/>
				 
		</menu>

		<menuSeparator id="MySeparator" insertBeforeMso="Cut" />

		</contextMenu>
	</contextMenus>
	
</customUI>

Nota: cuando abramos el archivo en Excel hay que procurar cerrarlo en el Custom UI Editor y viceversa.

Al abrir el archivo en Excel, notaremos que se creó el menú contextual al dar click derecho sobre las celdas.

image

Figura 2. Menú contextual creado con XML.

Código vba

El siguiente código de ejemplo son las macros que las opciones del menú mandan llamar.

Public Const Titulo = "EXCELeINFO"

Sub Macro1(control As IRibbonControl)
MsgBox "Macro 1", vbInformation, "Titulo"
End Sub

Sub Macro2(control As IRibbonControl)
MsgBox "Macro 2", vbInformation, "Titulo"
End Sub

Sub Macro3(control As IRibbonControl)
MsgBox "Macro 3", vbInformation, "Titulo"
End Sub

Sub Macro4(control As IRibbonControl)
MsgBox "Macro 4", vbInformation, "Titulo"
End Sub

Sub Macro5(control As IRibbonControl)
MsgBox "Macro 5", vbInformation, "Titulo"
End Sub

Sub Macro6(control As IRibbonControl)
MsgBox "Macro 6", vbInformation, "Titulo"
End Sub

Anexos

Descarga el ejemplo Menú click derecho con vba y XML.rar

Ejecutar macros al abrir un archivo en Excel con el evento Workbook_Open

$
0
0

El evento Workbook_Open lo uso constantemente para ejecutar algunas macros al momento de abrir mis archivos o incluso lo uso cuando toca desarrollar un add-in.

En este mismo Blog, podrás ver que en muchos ejemplos uso este evento. Da click aquí para ver los artículos.

Cómo lo hacemos

Usar el evento Workbook_Open realmente es tan sencillo, que pensarás que por que no habías usado antes.

  • Abrimos el IDE de vba. La manera más sencilla es presionar Alt + F11.
  • En la parte izquiera del IDE ubicamos el nombre del nuestro archivo y damos doble click sobre el objeto ThisWorkbook.

image

Figura 1. IDE de vba.

  • Para activar el evento Workbook_Open nos posicionamos en la parte derecha y damos click sobre el Como que dice (General) y elegimos Workbook.
  • Al dar click se añadirá el código necesario para para el evento.

image

Figura 2. Activando el evento Workbook_Ope en el IDE de vba.

El código que querramos que se ejecute irá entre las líneas Private Sub Workbook_Open() y End Sub.

Código vba de ejemplo

Para este artículo usaremos un ejemplo que mandará un mensaje dependiendo la hora en la que se abre el archivo, siendo Buenos días, tardes o noches.

image

Figura 3. Mensaje de bienvenida al abrir un archivo.

Usaremos el siguiente código vba para lograr lo anterior.

Private Sub Workbook_Open()

Dim HoraActual As Date

    HoraActual = Time

    Select Case HoraActual

    Case "00:00" To "05:59:59"
        MsgBox "Buenas noches"

    Case "06:00" To "11:59:59"
        MsgBox "Buenos días"

    Case "12:00" To "18:59:59"
        MsgBox "Buenas tardes"

    Case "19:00" To "23:59:59"
        MsgBox "Buenas noches"

    End Select

End Sub

Anexos

Artículos donde también usando el evento Workbook_Open:

Asignar Hipervínculo a Label dentro de un formulario de Excel vba

$
0
0

En ocasiones deseamos incluir un Hipervínculo o Link a nuestros formularios, para que cuando se muestre, el usuario pueda dirigirse a nuestra página, Blog u otro Sitio dando clic.

Recomendación: Crear un formulario de introducción o Splash en Excel

Es por eso, que les comparto la manera en la que podemos asignar un Hipervínculo a un control Label en un formulario.

image

Figura 1. Asignamos un Link a un Label dentro de un Formulario.

Cómo lo hacemos

Dentro de nuestro IDE de VBA (Alt + F11) insertaremos un Formulario nuevo y dentro de éste vamos a añadir un Label y le pondremos el nombre lblLink.

Dentro del código del formulario usaremos las siguientes macros de Excel vba:

Primero asignamos las variables para la función ShellExecute:

'Declaración de variables
#If VBA7 And Win64 Then
    Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
            ByVal hwnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, _
            ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr
#Else
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
                                          ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
                                          ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If

Al dar clic sobre el Label se ejecutará la siguiente macro que manda llamar la función ShellExecute:

'Al dar clic sobre el Label
Private Sub lblLink_Click()
'
    ShellExecute 0, "Open", "http://www.exceleinfo.com/", "", "", 1
    '
End Sub

Usaremos el siguiente código para el evento Initialize en el que se cambiará de color al texto del Label además de mostrar un mensaje al pasar el cursos sobre el Label con la Propiedad ControlTipText.

'Al iniciar el formulario
Private Sub UserForm_Initialize()
'
    With Me
        '
        .lblLink.ControlTipText = "Ir a Blog http://www.exceleinfo.com"
        .lblLink.ForeColor = &HFF0000
        '
    End With
    '
End Sub

Anexos

:: Descargar Hipervínculo a Label de Form en Excel.rar


Macro para validar campos vacíos de un formulario al dar de alta en Excel

$
0
0

Ya tenemos un formulario en Excel para dar de alta regitros en hoja de Excel, pero dicho formulario no nos valida cuando tenemos alguna celda en blanco.

Esta adecuación a la macro evitará que los datos se registren cuando hay alguna celda en blanco, lo que forza al usuario final a llenar todos los campos.

image

Figura 1. Formulario de captura en Excel.

Validar campos vacíos

Para efecto de poder validar los 8 campos del formulario, asignamos nombres a las celdas que van desde dato1 hasta dato8.

Para recorrer los 8 campos usamos un constructor For Next el cual validará todos los campos del formulario y cada que encuentre una celda vacía guardará el rango de la celda en una variable para después mediante un MsgBox veamos cuáles celdas detectó como vacías.

For Next para recorrer los campos del formulario

'Recorremos las celdas
For i = 1 To 8
    '
    If Sheets("Captura").Range("Dato" & i).Value = "" Then
        Valor = Sheets("Captura").Range("Dato" & i).AddressLocal
        Valor1 = Valor1 & vbNewLine & Valor
    End If
    '
Next i

image

Figura 2. Vemos como se muestran cuáles celdas están vacías.

Código de la macro

Option Explicit
Sub Captura_Datos()
'Declaración de variables
'
Dim strTitulo As String
Dim Continuar As String
Dim TransRowRng As Range
Dim NewRow As Integer
Dim Limpiar As String
Dim i As Integer
Dim Valor As String
Dim Valor1 As String
Dim Mensaje As String
'
'Asignamos valor a varibles
strTitulo = "EXCELeINFO"
Mensaje = "No se puede continuar. Las siguientes celdas están vacías:"
'
'Recorremos las celdas
For i = 1 To 8
    '
    If Sheets("Captura").Range("Dato" & i).Value = "" Then
        Valor = Sheets("Captura").Range("Dato" & i).AddressLocal
        Valor1 = Valor1 & vbNewLine & Valor
    End If
    '
Next i
'
If Not Valor1 = "" Then
    '
    MsgBox Mensaje & vbNewLine & Valor1, vbExclamation, "EXCELeINFO"
    '
Else
    '
    Continuar = MsgBox("Dar de alta los datos?", vbYesNo + vbExclamation, strTitulo)
    If Continuar = vbNo Then Exit Sub
    '
    Set TransRowRng = ThisWorkbook.Worksheets("Datos").Cells(1, 1).CurrentRegion
    NewRow = TransRowRng.Rows.Count + 1
    With ThisWorkbook.Worksheets("Datos")
        .Cells(NewRow, 1).Value = Date
        .Cells(NewRow, 2).Value = Format(Date, "dd")
        .Cells(NewRow, 3).Value = Format(Date, "mm")
        .Cells(NewRow, 4).Value = Format(Date, "yy")
        .Cells(NewRow, 5).Value = [dato1]
        .Cells(NewRow, 6).Value = [dato2]
        .Cells(NewRow, 7).Value = [dato3]
        .Cells(NewRow, 8).Value = [dato4]
        .Cells(NewRow, 9).Value = [dato6]
        .Cells(NewRow, 10).Value = [dato7]
        .Cells(NewRow, 11).Value = [dato8]
    End With
    '
    MsgBox "Alta exitosa.", vbInformation, strTitulo
    Limpiar = MsgBox("Deseas limpiar los campos de la captura?", vbYesNo, strTitulo)
    If Limpiar = vbYes Then
        With ActiveWorkbook.Sheets(1)
            .Range("C6").ClearContents
            .Range("C9").ClearContents
            .Range("C12").ClearContents
            .Range("C15").ClearContents
            .Range("F9").ClearContents
            .Range("F12").ClearContents
            'ClearContents no funciona en celda combinada...
            .Range("F15").Value = ""
        End With
    Else
    End If
End If
'
End Sub

Anexos

Descarga Formulario de captura en hoja de Excel Validando campos vacíos.xlsm

Identificar los tipos de controles que tenemos en un Formulario de Excel vba

$
0
0

En este artículo les comparto unas macros en Excel que nos permitirán identificar los diferentes tipos de controles ActiveX que podemos utilizar en Formularios u hojas de Excel.

Cómo lo hacemos

Tenemos un formulario de Excel con 4 diferentes tipos de controles ActiveX: TextBox, CheckBox, ComboBox y Label. Primeramente haremos uso de la intrucción For Each…Next para recorrer todos los controles que tenemos en el formulario.

image

Figura 1. Formulario de Excel vba con diferentes tipos de controles.

Para poder identificar el tipo de Control haremos uso de la instrucción TypeOf nombre_objeto Is tipo_objeto.

Ejemplos con la instrucción TypeOf

Cambiar el efecto a Cuadro de texto

El primer tipo que usaremos será el TextBox que hace referencia a Cuadro de texto. Le cambiaremos la propiedad SpecialEffect a todos los TexBox que haya en el formulario:

image

Figura 2. Cambiando la propiedad SpecialEffect de un TextBox.

A continuación la macro usada:

'Botón Efecto
Private Sub CommandButton3_Click()
'
    For Each Control In Me.Controls
        '
        If TypeOf Control Is MSForms.TextBox Then
            '
            Control.SpecialEffect = fmSpecialEffectEtched
            '
        End If
        '
    Next Control
    '
End Sub

Mostrar el nombre de CheckBox

El siguiente tipo será CheckBox, que son los cuadros de chequeo. Mostraremos en un mensaje el nombre de los 4 CheckBox del formulario:

image

Figura 3. Mostrando nombre de CheckBox con MsgBox.

A continuación la macro usada:

'Botón Nombres
Private Sub CommandButton4_Click()
'
    For Each Control In Me.Controls
        '
        If TypeOf Control Is MSForms.CheckBox Then
            '
            Nombre = Control.Name
            Nombre2 = Nombre2 & " " & Nombre
            '
        End If
        '
    Next Control
    '
    MsgBox Nombre2, vbInformation

End Sub

Contar Combos

Otro tipo de control es el ComboBox. Para este ejemplo mostraremos un mensaje indicando cuántos Combos hay:

image

Figura 4. Contar Combos en el formulario.

Ahora les comparto el código vba usado:

'Botón Contar
Private Sub CommandButton1_Click()
'
Dim CuentaCombo As Integer
    '
    CuentaCombo = 0
    '
    For Each Control In Me.Controls
        '
        If TypeOf Control Is MSForms.ComboBox Then
            CuentaCombo = CuentaCombo + 1
        End If
        '
    Next Control
    '
    MsgBox CuentaCombo & " Combos", vbInformation
    '
End Sub

Cambiar color a Etiquetas

Para este último ejemplo usaremos el tipo de control Label o etiquetas. Le cambiaremos el color a rojo a todas las etiquetas del formulario modificando la propiedad ForeColor:

image

'Botón Color
Private Sub CommandButton2_Click()
'
    For Each Control In Me.Controls
        '
        If TypeOf Control Is MSForms.Label Then
            '
            Control.ForeColor = vbRed
            '
        End If
        '
    Next Control
    '
End Sub

Figura 5. Modificar color de texto a etiquetas.

Anexos

:: Descargar Identificar Controles.rar

Entrevista a Abraham Valencia

$
0
0

Abraham Valencia desde muy pequeño se interesó en temas de computación, principalmente en temas de programación. Conoció Excel cuando éste ya iba en la versión 95 y por ahí del año 2002 fue cuando decidió entrar en el tema de la programación de macros.

“Cuando conocí las Macros en Excel fue partir de ese momento sentí que podía hacer TODO con Excel”

Abraham fue miembro activo en diversos foros de Excel donde compartió su conocimiento con la comunidad Latina y Española. Los foros donde se le conoce son Microsoft Community, emagister, todoexcel.com, todoexpertos.com, ayudaexcel.com, lawebdelprogramador.com.

Y por supuesto, en su página compartió valiosísimos ejemplos en Excel.

Actualmente Abraham ha estado distanciado de temas informáticos por dedicarle tiempo o su otra pasión: La política; pero está pensando seriamente en volver a compartir sus conocimientos de Excel con la comunidad.

Entrevista

[P]: ¿Cuándo comenzó el gusto por Excel y cómo?

[R]: Empecé a estudiar computación a los 10 años, Logo y Basic, a los 12 años ya sabía, también, Turbo Basic y conocí lo que era el Lotus. El año 1990 fue mi primer contacto con una hoja de cálculo. Pocos años después, en 1994, tuve mi primer encuentro con Excel pero fue en 1995 que comencé a aprenderlo realmente (Versión 5.0). Creo que fue desde ahí que mi relación con Excel no se separó, pero reconozco que se incrementó cuando entre al mundo del VBA, aproximadamente el año 2002. A partir de ese momento sentí que podía hacer “todo” con Excel y hasta el día de hoy es probablemente el programa que más uso.

[P]: ¿Cuáles son tus 3 funciones favoritas?

[R]: Yo diría que las tres funciones que me parecen más potentes y llaman más mi atención, por decirlo de un modo, son INDICE, COINCIDIR e INDIRECTO. Es increíble todo lo que se puede hacer con ellas, tanto en formular individuales como en aquellas anidadas. Búsquedas con más de una coincidencia, ayudar a mejorar las listas desplegables haciéndolas dependientes, y varias otras cosas más que a veces tengo la impresión que no se conoce en general.

[P]: ¿Durante qué periodo fuiste MVP de Excel?

[R]: Fui nombrado MVP 2010, fue la única vez que postule para ello. Esa denominación fue vigente hasta el año 2011.

 

[P]: ¿Qué tecnologías crees que se desarrollarán a corto o mediano plazo como base Excel?

[R]: Recuerdo que hace años, cuando a uno le hacían esa pregunta, resultaba relativamente fácil de responder. Era evidente que Microsoft le daría más filas y columnas a las hojas de Excel y que además se desarrollarían mayores herramientas para la interconexión de Excel con la web. Hoy en día, con todo lo que ahora trae Excel, las nuevas herramientas como PowerQuery, las mejoras que hay en los gráficos, en las tablas dinámicas, etc. hace que uno casi se quede sin poder pensar que más podría incluírsele. Creo que es en la parte para desarrolladores en donde potenciaran aún más dicho programa si Microsoft lo deseara.

[P]: ¿Qué nos puedes platicar sobre las herramientas PowerPivot, PowerQuery y PowerView, cuál ha sido tu experiencia con estas herramientas?

[R]: PowerPivot definitivamente es una gran herramienta de análisis de datos, la cantidad de ellos que puede trabajar a una velocidad envidiable hace que uno no extrañe software especializado en esos temas. Es importante la interacción que puede lograrse con bases de datos, hojas de cálculo, archivos de texto e incluso Internet.

Claro que yo diría que PowePivot no tendría tal potencia si no existiese PowerQuery. Gracias a ese complemento podemos extraer datos de diversas fuentes que incluyen XML y otros; se puede transformar esos datos (combinarlos, redistribuirlos, etc.) e incluso cargar los datos para usarlos en Excel.

Sobre PowerView, aún no uso dicha herramienta de tal modo que pueda emitir una opinión con el suficiente conocimiento, pero, esta entrevista me ha animado y comenzaré a usarla más.

[P]: ¿El nombramiento como MVP ayudó en tu vida profesional para conseguir algunas metas?

[R]: Nunca me he dedicado sólo a Excel o en general a la programación, pero reconozco que en general el ser MVP, además del orgullo evidente, me genero una suerte de reconocimiento a distintos niveles, desde el entorno inmediato personal hasta un reconocimiento muy abundante en espacios virtuales en donde he estado involucrado muchos años. Gente de diversos países me reconocía por tan sólo escribir y/o comentar.

[P]: Si soy novato en Excel, ¿por dónde me recomendarías comenzar?

[R]: Yo sugiero no comenzar con el VBA. Excel es conocer sus funciones, convertirlas y usar sus formular y es importante comenzar por ellas. Practicar, leer, mucho ensayo-error, consultar en foros y otros, conversar con amigos y amigas que les guste el tema, ver ejemplos, así aprenderás realmente. Ya el segundo paso, si lo deseas, es el mundo de las macros.

Lean, lean mucho, hay abundante material hoy en día en internet.

[P]: Alguna cosa que desees compartir a los lectores de EXCELeINFO.com.

[R]: No dejen de visitar páginas de Excel, los ayudara increíblemente a aprender sobre Excel.

Diseño y Formato de una Tabla Dinámica en Excel

$
0
0

Por: Miguel Ángel Caballero.

Cuando creamos una tabla dinámica el formato y diseño del reporte por defecto no es el óptimo para su lectura, por lo anterior es importante tomarnos unos segundos llevar acabo unos arreglos mínimos que debemos hacer para que su presentación facilite su lectura.

Si deseas llevar realmente la presentación de una tabla dinámica más allá de lo convencional, dale un vistazo al primer capítulo del Libro: Tablas Dinámicas, La Quinta Dimensión en su Preview y mira cuantas cosas diferentes podemos lograr.

Al insertar una tabla dinámica su aspecto por defecto es el siguiente:

Imagen 01

Cambiar el diseño de una Tabla Dinámica

La funcionalidad de Tablas Dinámicas nos proporciona 83 estilos prediseñados aparte del que se aplica por defecto y, en general, cualquiera de estos es mejor que el estándar.

Para seleccionar un estilo diferente, simplemente ubicamos la Celda Activa en la tabla dinámica, luego vamos a la pestaña Diseño, grupo Estilos de Tabla Dinámica desplegamos para ver todas las opciones que tenemos.

Para este ejemplo seleccionaremos el Estilo de Tabla Dinámica Medio: 6 véase la imagen a continuación:

Imagen 02

Automáticamente, la apariencia cambia:

Imagen 03

El resultado nos proporciona un apariencia un poco más amigable para nuestra presentación del reporte.

Aplicar Bandas a la Cuadricula

Si la tabla dinámica cuenta con numerosas filas y columnas, es una buena práctica agregarle filas con bandas para que así la vista pueda hacer un seguimiento de los datos sin mayores complicaciones, para habilitarlos ubicamos la Celda Activa sobre la tabla dinámica, después vamos a la pestaña Diseño, grupo Opciones de Estilo de Tabla Dinámica, y activamos las casillas Filas con Bandas y Columnas con Bandas.

Imagen 04

La opción de columnas con bandas generalmente es omitida dado que la opción filas con bandas brinda las características suficientes para que el reporte sea entendible con mayor comodidad.

Imagen 05

Aplicar Formato al Área de Valores

Evidentemente no es solamente la apariencia por lo cual nos debemos preocupar sino también por el formato de los valores.

Clic derecho sobre la tabla dinámica -> seleccionamos Formato de Numero -> y en el cuadro de dialogo Formato de Celdas que aparece elegimos la categoría número y disminuimos la posición de decimales a 0 -> Pulsamos Aceptar).

Imagen 06

Imagen 07

Ahora apliquemos el formato moneda:

Imagen 08

Como la tabla dinámica de este ejemplo resume unidades vendidas, el formato número es el indicado.

Quitar celdas Vacías

Cuando aparecen celdas en blanco en nuestra tabla dinámica significa que esos valores son equivalentes a 0.

Imagen 09

Siempre que ocurra esto, se recomienda mostrar un carácter diferente a la celda blanco, como pro ejemplo el número 0.

Para ello pulsamos Clic derecho sobre la Tabla Dinámica -> Opciones de Tabla Dinámica -> en el cuadro de dialogo Opciones de Tabla Dinámica nos dirigimos a la pestaña Diseño y Formato -> habilitamos la casilla Para celdas Vacías Mostrar -> y escribimos en el cuadro de texto el número 0 -> Presionamos Aceptar)

Imagen 10

Imagen 11

Etiquetas

Cuando creamos una tabla dinámica las etiquetas para las distintas áreas de colocación no son muy descriptivas por lo que hacer este sencillo cambio siempre proporcionara una presentación más clara. Para modificarlas, simplemente ubicamos la celda activa sobre la etiqueta que se quiere cambiar, luego nos dirigimos a la barra de fórmulas y allí renombramos.

image

Totales Generales

Dependiendo de lo que se quiera presentar podemos omitir o no los totales generales de las filas y las columnas, en cuyo caso nos dirigimos a la pestaña Diseño, grupo Diseño y presionamos el botón Totales Generales , y en la lista desplegable escogemos la opción que necesitemos, para este caso Desactivado para Filas y Columnas.

image

Y como vemos en la tabla dinámica ya no aparecen los totales generales.

image

Para visualizarlos nuevamente, repetimos el procedimiento pero ahora seleccionamos Activado para Filas y Columnas

image

Diseño de Informe

En la pestaña Diseño, grupo Diseño, botón Diseño de Informe, existen varias opciones para cambiar la estructura de la Tabla Dinámica.

Imagen 16

Mostrar en Forma Compacta

Es la configuración por defecto que asigna Excel cuando se crea una Tabla Dinámica, y agrupa todos los elementos que se encuentran en el campo fila, es recomendada esta configuración para ahorrar espacio en la hoja de cálculo:

Imagen 17

Mostrar en Forma de Esquema

Selecciona cada campo del área de filas y lo agrega a una columna individual:

Imagen 18

Ahora bien, si queremos una tabla para hacer un análisis de datos más profundo, podemos presionar la opción Repetir todas las etiquetas de elementos que se encuentra en el mismo botón Diseño de Informe y observemos que ocurre:

Imagen 19

Rellena con el nombre los campos correspondientes, esto nos permitirá manipular con mayor facilidad los datos para análisis posteriores.

Mostrar en Formato Tabular

Al igual que el formato en forma de esquema, divide los campos de fila en diferentes columnas y además siempre muestra los subtotales de cada categoría:

Imagen 20

El diseño de la tabla dinámica que seleccionemos depende del escenario en el que nos encontremos, por ello es conveniente saber las características de cada uno para así elegir el más adecuado.

Muy bien esta son las características básicas en diseño y formato de una tabla dinámica y aunque es sencillo, es algo de lo cual no podemos prescindir.

Si deseas llevar realmente la presentación de una tabla dinámica más allá de lo convencional, dale un vistazo al primer capítulo del Libro: Tablas Dinámicas, La Quinta Dimensión en su Preview y mira cuantas cosas diferentes podemos lograr.

Macro en Excel para restablecer formato de celdas, usando formulario con opciones combinables

$
0
0

En ocasiones me he topado con archivos de Excel en los que requiero eliminar algún formato, es decir, dejar el formato por default de celdas. Hacer esta tarea en Excel es relativamente sencilla, como lo veremos a continuación.

Restablecer formatos de celdas con las opciones de Excel

La primera opción que podemos usar para restablecer formatos de celdas es usando la opción Borrar formatos dentro de INICIO > Borrar.

Borrar formatos en Excel

Figura 1. Borrar formatos en Excel

La siguiente opción que podemos usar es Copiar y Pegar el formato de una celda sin formato a las celdas que queramos restablecer el formato.

Copiar y pegar formatos en Excel

Figura 2. Copiar y pegar formatos en Excel.

Elegir los formatos a restablecer con macros en Excel

Como vimos en las opciones anteriores, Excel nos permite restablecer formatos de celdas, con la salvedad de que restablece todo a su formato original.

He desarrollado un formulario en Excel vba en el que podemos elegir el tipo de formato que queramos restablecer mediante 5 Cuadros de opción.

Cómo funciona

El formulario contiene 5 CheckBoxes los cuales nos van a permitir restablecer hasta 6 opciones de Formato de celdas. Éstos controles nos permitirán hacer combinaciones. Las opciones que se podrán restablecer son:

    1. Formato de número.
    2. Alineación.
    3. Tipo y color de fuente.
    4. Bordes.
    5. Relleno.

Las opciones anteriores también se podrán encontrar en Formato de celdas con la combinación [Ctrl] + 1.

Restablecer formatos de celda con macros en Excel

Figura 3. Restablecer formatos de celda con macros en Excel.

Código de las macros de vba

Código del formulario

'---------------------------------------------------------------------------------------
' Module    : frmFormato
' Author    : MVP Sergio Alejandro Campos
' Date      : 21/08/2015
' Purpose   : Formulario para restablecer formatos de celdas
'---------------------------------------------------------------------------------------
'
'Mandar llamar el Procedimieno para restablecer Formatos
Private Sub CommandButton1_Click()
'
Call RestablecerFormatos
'
End Sub
'
'Cerrar el Formulario
Private Sub CommandButton2_Click()
'
    Unload Me
    '
End Sub
'
'Elegir todas las opciones del Formulario
Private Sub CommandButton3_Click()
'
With Me
    .chkAlineacion.Value = True
    .chkBordes.Value = True
    .chkFuente.Value = True
    .chkNumero.Value = True
    .chkRelleno.Value = True
End With
'
End Sub

Código del Módulo1

'---------------------------------------------------------------------------------------
' Module    : Módulo1
' Author    : MVP Sergio Alejandro Campos
' Date      : 21/08/2015
'---------------------------------------------------------------------------------------
'
Sub LlamarFormulario()
'Mandar llamar el formulario
    frmFormato.Show vbModal = False
'
End Sub
'
Sub RestablecerFormatos()
'
'Restablecer Formato de número
If frmFormato.chkNumero.Value = True Then
'
For Each Celda In Selection
'
If IsDate(Celda.Value) Then
    Celda.NumberFormat = "d-mmm"
Else
    Celda.NumberFormat = "General"
End If
Next Celda
'
End If
'
'Restablecer Alineación
If frmFormato.chkAlineacion.Value = True Then
'
    With Selection
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
'
End If
'
'Restablecer Fuente
If frmFormato.chkFuente.Value = True Then
'
    With Selection.Font
        .Name = "Calibri"
        .FontStyle = "Normal"
        .Size = 11
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
        .ThemeFont = xlThemeFontMinor
    End With
'
End If
'
If frmFormato.chkBordes.Value = True Then
'
With Selection
    .Borders(xlDiagonalDown).LineStyle = xlNone
    .Borders(xlDiagonalUp).LineStyle = xlNone
    .Borders(xlEdgeLeft).LineStyle = xlNone
    .Borders(xlEdgeTop).LineStyle = xlNone
    .Borders(xlEdgeBottom).LineStyle = xlNone
    .Borders(xlEdgeRight).LineStyle = xlNone
    .Borders(xlInsideVertical).LineStyle = xlNone
    .Borders(xlInsideHorizontal).LineStyle = xlNone
End With
'
End If
'
'Restablecer color de relleno
If frmFormato.chkRelleno.Value = True Then
'
    With Selection.Interior
        .Pattern = xlNone
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
'
End If
'
End Sub

Anexos

:: Descargar Restablecer formato de celdas en Excel con macros – EXCELeINFO.rar

Viewing all 466 articles
Browse latest View live