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

Video tutorial uso de BUSCARV, CONTARA y ALEATORIO.ENTRE en Excel

$
0
0

El objetivo de este artículo es obtener una lista aleatoria de x cantidad de nombres provenientes de una lista de nombres.

Haremos uso de las funciones BUSCARV, CONTARA y ALEATORIO.ENTRE.

Nombres aleatorios

Para este ejemplo tenemos una lista de 247 nombres y deseamos obtener 20 nombres de manera aleatoria (el 20 es un número de ejemplo) y que la fórmula que usemos detecte si la tabla tiene menos o más nombres para no tener que modificarla cada vez.

Cómo usamos cada función

  1. ALEATORIO.ENTRE: Esta función no dará un número aleatorio de entre un número inicial y un número final.
  2. CONTARA: Con esta función indicaremos el tamaño de la columna A y ese tamaño será nuestro número final.
  3. BUSCARV: Esta famosa función nos arrojará el nombre correspondiente al número aleatorio. El nombre está en la columna B.

En la figura 1 vemos la tabla con los nombres y las celdas donde haremos uso de las funciones que antes mencionamos.

En la celda D2 usamos la siguiente fórmula:

[D2]: =ALEATORIO.ENTRE(1,CONTARA(A:A)-1)

En la celda E2 usamos BUSCARV:

[E2]: =BUSCARV(D2,A:B,2,0)

image

Figura 1. Se muestra la tabla con nombre y el uso de las funciones.

Video tutorial

Este artículo incluye un vide tutorial para seguir el ejemplo paso a paso.


Video tutorial copiar datos de una hoja a otra en Excel con macros

$
0
0

Les comparto un video tutorial de Excel en el cual repasaremos algunos temas como la Grabadora de macros y escribir nuestras propias macros manualmente.

En el video se plantean dos retos, los cuales veremos a continuación:

Reto 1:

Grabar una macro para copiar datos de Hoja1 hacia Hoja2.

Reto 2:

Optimizar la macro creada con el grabador de macros y programarla para copiar los datos hacia Hoja2. La Hoja2 deberá ocultarse para probar la macro.

Código de las macros

Al utilizar la grabadora de macros, vemos que se nos generan 5 líneas de código.

Sub CopiarDatos()
'
' CopiarDatos Macro
'

'
    Range("A1:D12").Select
    Selection.Copy
    Sheets("Hoja2").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
End Sub

Las 5 líneas de código anteriores las optimizaremos y las dejaremos en una sóla línea.

Sub CopiarDatos2()

Sheets("Hoja1").Range("A1:D12").Copy Destination:=Sheets("Hoja2").Range("a1")

End Sub

Video tutorial

Optipe add-ins para aumentar tu productividad en tu trabajo

$
0
0

EXCELeINFO recomienda!!

Optipe-Cinta

Con los addins de Optipe (antes ddTrada) para Microsoft® Excel® podrás aumentar tu productividad en el trabajo diario con datos y tablas.

Usa estos productos para hacer tareas que antes pensabas que eran imposibles de realizar y ahorrar mucho tiempo, optimizando el rendimiento de tu trabajo.

Destácate en tu organización y aporta valor en el logro de los objetivos.

image

Optipe Data Tools Suite es un complemento para Excel (add-in), que agrega 15 aplicaciones y más de 30 funciones de cálculo para el tratamiento y gestión de datos y tablas.

Potencia y facilita tu trabajo como usuario de esta popular herramienta de Microsoft, para que puedas destinar la mayor parte del tiempo a lo que en verdad agrega valor a tu negocio: el análisis de la información y la toma de decisiones.

Multilenguaje: Data Tools Suite está disponible en Español, Inglés, Portugués, Alemán, Francés e Italiano. Nuestra web, los videos y el soporte están disponibles únicamente en español e inglés.

Más de 50 video-ejemplos para obtener el máximo provecho de todas las aplicaciones.

Data Tools Suite se instala en pocos pasos en Excel, y se puede acceder a sus aplicaciones en cualquier momento, puesto que se presenta como una nueva opción del menú de Excel.

Optipe Data Tools Suite para Excel 2007-2010-2013

Características:

  1. Formato: Complemento Excel (xlam)
  2. Compatible con Excel 2007, 2010 y 2013
  3. Precio: USD$39,99
  4. Licencia es individual y permite instalación en 2 computadores para un mismo usuario (por ej., el equipo del trabajo y el de casa).

Descuentos por Volumen

Unidades Precio por unidad Dscto.
1 a 4 USD$ 39,99 0%
5 a 9 USD$ 31,99 20%
10 a 24 USD$ 29,99 25%
25 a 49 USD$ 26,99 33%
50 a 99 USD$ 23,99 40%
100 ó más USD$ 19,99 50%

image

Con Optipe MultiMail Envía reportes y archivos en emails personalizados a una lista de correos en Excel a través de Microsoft Outlook (ambos de la misma suite Office).

Puede personalizar el mensaje para cada destinatario, incluyendo su nombre, cargo, empresa, etc.

Permite definir destinatarios para todos los mensajes (envíe copia a su jefe o asistente).

Opcionalmente puede incluir un mismo archivo para todos los destinatarios.

Si no desea incluir a uno o más destinatarios, sólo oculte las filas respectivas en la lista de correos.

Guarda los datos del MultiMail para utilizarlo nuevamente.

¡¡ No pierda más tiempo !!

 

 

  1. Envíe los informes a los jefes de sucursal o departamento de su empresa en sólo minutos.
  2. Informe personalizadamente a cada trabajador de bonos o aguinaldos.
  3. Envíe a cada destinatario su correspondiente archivo con el reporte de su gestión.
  4. Despache a sus clientes sus estados de pago o facturas.
  5. Promocione sus productos o servicios a sus clientes o lista de contactos.

Optipe MultiMail

Características:

  1. Formato: Complemento Excel (xlam)
  2. Compatible con Excel 2007, 2010 y 2013
  3. Precio: USD$39,99
  4. Requiere Microsoft Excel y Microsoft Outlook, de la misma versión de Office.
  5. Licencia es individual y para un equipo.

Descuentos por Volumen

Unidades Precio por unidad Dscto.
1 a 4 USD$ 39,99 0%
5 a 9 USD$ 31,99 20%
10 a 24 USD$ 29,99 25%
25 a 49 USD$ 26,99 33%
50 a 99 USD$ 23,99 40%
100 ó más USD$ 19,99 50%

Videos de ejemplo

Data Tools Suite:

Cruzar Tablas. Sumar datos ubicados en otra tabla. http://youtu.be/sYpdIK5B4yQ

Eliminar las filas que contienen celdas en blanco. http://youtu.be/njWTFf4aICg

Resumir MúltiplesTablas http://youtu.be/OrF0dsYWQ-4

Extraer los datos de una tabla que cumplan ciertos criterios http://youtu.be/lFGLN7dfZUs

Separar en hojas individuales http://youtu.be/MZN_7GsEV2U

Agrupar datos ubicados en distintas tablas http://youtu.be/-RCghgrVlc8

Copiar las filas de celdas con color de relleno o de fuente o de celdas con algún estilo http://youtu.be/pSOGKr7vD_w

Seleccionar celdas que cumplan ciertos criterios http://youtu.be/FasokvrDKwk

Seleccionar celdas cuyas fórmulas cumplan ciertos criterios http://youtu.be/9fTSdc8096k

Rellenar las celdas vacías con el valor de la celda superior http://youtu.be/IuAmOw3MIFs

Estandarizar textos http://youtu.be/NWtHYKKwlZM

Ajustar por un factor los valores de un rango http://youtu.be/JYu-gUHOnTk

Ajustar por un factor y redondear al mismo tiempo http://youtu.be/wzmAhAciIH8

Girar o aplanar columnas http://youtu.be/VyYKc0mljtE

Crear Fórmula Condicional http://youtu.be/CfpfnmO1_EU

Consolidar Plantillas o Formularios http://youtu.be/Xi-yKmTbJMQ

Guardar hojas como archivos individuales http://youtu.be/adWWoeMCEi4

MultiMail:

Enviar Solo Texto http://youtu.be/bBJT4mbR_AQ

Enviar Hojas de un Libro http://youtu.be/OQsMmaHC_x0

MultiMail 3 Enviar Archivos de una Carpeta http://youtu.be/ZP-GDOzRAf0

MultiMail 4 Enviar Rangos Filtrados http://youtu.be/JFnWIEGcBh8

Video tutorial Uso de un Combobox y BUSCARV en Excel con vba

$
0
0

Siguiendo con esta serie de Video tutoriales de Excel y vba, en esta ocasión del comparto un video donde haremos uso de un Formulario y un Combobox y de una manera muy sencilla los haremos funcionar con la función BUSCARV para obtener el dato de un ID correspondiente a un listado de nombres.

El Video y la descarga el ejemplo están al final del artículo.

Reto

El reto que haremos en el video será:

Usar un formulario con un ComboBox el cual se rellene con un listado de nombres.

El formulario deberá tener un botón el cual mostrará el ID correspondiente al nombre.

Rellenar el Combobox con el listado de nombres

Tenemos una tabla sencilla con dos columnas, las cuales son Nombre y ID. Deseamos que el Combobox se rellene con el listado de nombres de nuestra tabla.

image

Figura 1. Lista de nombres

Para este ejemplo contamos con 44 nombres, tal como se muestra en la Figura 1.

Para rellenar la lista haremos uso del evento Initialize del formulario. En dicho evento el rango donde están los nombres será asignado a la propiedad List del Combobox, como se muestra a continuación.

CÓDIGO INITIALIZE

image

Figura 2. Aquí vemos cómo el Combobox se rellena con la lista de nombres.

Buscar ID que corresponda al nombre

La segunda parte del reto nos pide que el Formulario deberá tener un botón el cuál devuelva el valor del ID dependiendo el nombre elegido.

Para devolver el ID usaremos la función BUSCARV dentro del código vba, por lo tanto usaremos VLOOKUP del objeto WorksheetFunction. La función tanto si la usamos en una celda como en vba, tendrá los mismos parámetros.

Recordemos los parámetros de BUSCARV y veamos cómo adecuarlos a este ejemplo. El valor devuelto por VLOOKUP será guardado en una variable, la cual pasará su valor a una etiqueta.

  • valor_buscado: El valor buscado será el texto que se encuentre elegido en el Combobox.
  • matriz_buscar_en: Nuestra matriz serán las columnas A y B completas.
  • indicador_columnas: Este valor será 2, que es la segunda columna donde está el ID.

El botón Obtener ID del Formulario tendrá el siguiente código.

CÓDIGO OBTENER ID

image

Figura 3. En el Formulario vemos cómo al presionar el botón, devuelve el valor del ID del nombre.

Anexos

:: Descarga el ejemplo Combobox y BUSCARV en Excel con vba.rar

Video tutorial

Recupera tus archivos con ExcelFIX

$
0
0

EXCELeINFO recomienda!!

ExcelFIX

Resumen

  1. ExcelFIX es el mejor programa para recuperar los datos de un archivo de Microsoft® Excel que da error al abrirse.
  2. Es el único que recupera gráficas, imágenes, comentarios, celdas combinadas, grupos y esquemas, subtotales y todos los elementos de las fórmulas, incluidos nombres, referencias externas y rangos multi-hoja.
  3. El proceso de recuperación le llevará tan sólo 15 minutos, de forma totalmente segura y confidencial en su propio ordenador.
  4. Funciona con Microsoft® Excel 95, 97, 2000, 2002 (XP), 2003, 2007, 2010 y 2013.

Recupera archivos dañados con ExcelFIX

Figura 1. Recupera archivos dañados con ExcelFIX.

Recomendado

Vea una demo animada.

Pruébelo antes de comprar.

Tienda

Si ha quedado satisfecho con el producto no dude en adquirir una licencia para su empresa o uso personal.

Descargue OfficeFIX para evaluar la línea completa de productos de Cimaware para la recuperación de archivos dañados de Microsoft® Access, Excel, Word y Outlook.

Recupera archivos de Excel y Office

ExcelFIX

AccessFIX

WordFIX

OutlookFIX

OfficeFIX

Aviso de nuevo dominio de EXCELeINFO

$
0
0

Muy buenas tardes a todos. El motivo de este artículo es informarte que desde hace un par de días está operando el nuevo dominio de EXCELeINFO, el cual es http://www.exceleinfo.com.

En esencia nada cambiará, ya que seguiré publicando artículos de Excel y vba que puedan serte útiles con la finalidad de que te vuelvas un experto en Excel.

La actual dirección de este Blog sigue activa y la mantendré igualmente actualizada.

Si aún no te has suscrito, te recomiendo que lo hagas para que tengas en tu correo electrónico todos los artículos que vaya publicando y siempre tengas información fresca para aplicar en tus labores diarias con Excel.

SUSCRÍBETE

Nos vemos en el Blog.

Sergio Alejandro Campos.

Uso de la Ventana Inmediato en Excel para analizar macros

$
0
0

En este artículo les traigo un video donde veremos algunos ejemplos donde usaremos la Ventana Inmediato en el entorno (IDE) de Visual Basic para Aplicaciones.

image

Figura 1. Ventana Inmediato para analizar comportamiento de macros en Excel y Office.

La Ventana Inmediato nos ayudará al momento de escribir nuestras macros y poder evaluarlas antes de pasarlas a producción, como coloquialmente se dice en ambientes Informáticos.

Podemos englobar su uso en 3 oraciones:

    1. Imprimir variables.
    2. Evaluar expresiones.
    3. Ejecutar instrucciones.

Video tutorial

10 atajos de teclado en Excel para sorprender a tus compañeros

$
0
0

Como no me gusta quedarme con las cosas, en este artículo te comparto 10 atajos de teclado en Excel para comiences tu camino hasta ser un experto.

Estos atajos o métodos abreviados los uso de manera cotidiana para interactuar con mis archivos eficientemente.

Anímate a ponerlos en práctica y sorprende a tus compañeros!!

1. Ctrl  + Enter

Introduce un valor o fórmula en varias celdas de Excel a la vez. Elije un rango de celdas e introduce un valor. Presiona Ctrl + Enter y verás que el resto de las celdas se rellenan con el mismo valor.

Atajos de teclado en Excel Ctrl_Enter

2. Ctrl + Shift + L

Ctrl + Shift + L te permitirá activar o desactivar Autofiltros en tu tabla o rango elegido.

Atajos de teclado en Excel Ctrl_Shift_L

3. Ctrl + J

Con Ctrl + J podemos rellenar el contenido de una celda hacia las celdas de abajo. Para más opciones de relleno ve a la pestaña INICIO y elige rellenar.

Atajos de teclado en Excel Ctrl_J

4. Alt + Shift + =

Si te posicionas en la parte inferior de una columna con números y presiones Alt + Shift + = tendrás una autosuma de las celdas hacia arriba.

Atajos de teclado en Excel Alt_Shift_=

5. Ctrl + 1

Con Ctrl + 1 podrás mostrar el formulario de Formato de celdas.

Atajos de teclado en Excel Ctrl_1

6. Ctrl + AvPág (RePág)

Este atajo nos ayuda a desplazarnos entre las diferentes hojas de un archivo. Si presionas Ctrl + Shift + AvPág (RePág) podrás hacer grupos de hojas.

7. Ctrl + teclas dirección

Presionando Ctrl + flechas de dirección (arriba, abajo, derecha e izquierda) podrás desplazarte entre los datos de una hoja. Si lo haces dentro de una tabla te posicionará al final de ella, dependiendo la tecla que presiones.

8. F4 (fórmulas)

Al momento de escribir o editar fórmulas, con F4 podrás intercalar entre referencias relativas y absolutas.

9. Ctrl + Tab

Si tienes varios archivos de Excel abiertos, con Ctrl + Tab te podrás desplazar hacia ellos. La diferencia con Ctrl + Tab es que éste atajo te desplaza hacia las demás ventas abiertas de Windows.

10. Alt + F11

Si lo tuyo son las macros, al presionar Alt + F11 se abrirá el IDE (entorno) de programación de Visual Basic para Aplicaciones.


Macro para agregar recordatorios en Outlook desde Excel

$
0
0

Para todos aquellos que usamos Outlook de Office como herramienta principal para administrar nuestro correo electrónico, el ejemplo que  les comparto estoy seguro que le podrán encontrar un uso para administrar sus tareas.

Guardar tareas

La macro principalmente guarda en una hoja de Excel la información correspondiente a tareas que progragremos realizar en algún momento, aunque también podemos guardar información de cumpleaños, pagos de servicios o cualquier actividades que necesitemos recordar.

Adicional podemos elegir que las tareas que agreguemos también se agreguen a Outlook de Office para que podamos ser avisados en la fecha y hora que seleccionemos.

El archivo de ejemplo para agregar tareas

Tenemos un formulario donde llenaremos los datos de la tarea a guardar y estos datos se guardarán en la hoja Actividades.

image

Figura 1. Formulario para agregar tareas en Outlook desde Excel.

En caso de elegir la opción Agregar recordatorio en Outlook, agregará una nueva tarea en Outlook de Office y se asignará un recordatorio a la hora ingresada.

En caso de no ingresar hora, por default se tomará las 12:00 a.m.

image

Figura 2. En el apartado Tareas de Outlook de Office veremos las tareas de dimos de alta.

Código de la macro

Nota: Para que la macro funcione correctamente deberemos agregar la referencia Microsoft Outlook 15.0 Object Library en el menú Herramientas > Referencias del IDE de vba .

El siguiente código deberá ir en un módulo normal.

Option Explicit
'
Sub CreateAppointmentsModificada()
'
'Declaración de variables
Dim oApp As Outlook.Application
Dim tsk As Outlook.TaskItem
Dim strTitulo As String
Dim TransRowRng As Range
Dim NewRow As Integer
Dim FechaHora
'
strTitulo = "EXCELeINFO"
'
On Error GoTo ErrorHandler

'Validamos que haya un asunto de la actividad
If UserForm1.txtAsunto.Value = "" Then
    '
    MsgBox "Debes ingresar un asunto.", vbExclamation, strTitulo
    '
Else
    '
    'En caso de continuar
    Set TransRowRng = ThisWorkbook.Worksheets("Actividades").Cells(1, 1).CurrentRegion
    NewRow = TransRowRng.Rows.Count + 1
    With ThisWorkbook.Worksheets("Actividades")
        .Cells(NewRow, 1).Value = UserForm1.txtAsunto.Value
        .Cells(NewRow, 2).Value = UserForm1.txtDescripcion.Value
        .Cells(NewRow, 3).Value = UserForm1.cmbTipo.Value
        .Cells(NewRow, 4).Value = UserForm1.dtFecha.Value
        .Cells(NewRow, 5).Value = UserForm1.txtHora.Value
    End With
    '
    'Iniciamos Outlook en caso de haber elegido el Checkbox
    '
    If UserForm1.chkRecordatorio = True Then
        '
        Set oApp = GetOutlookApp
        If oApp Is Nothing Then
            MsgBox "No se puede iniciar Outlook.", vbInformation, strTitulo
            Unload UserForm1
            Exit Sub
        End If
        '
        Set tsk = oApp.CreateItem(olTaskItem)
        '
        With tsk
            FechaHora = CDate(UserForm1.dtFecha.Value) & " " & UserForm1.txtHora
            '
            .Subject = UserForm1.txtAsunto.Value
            .ReminderSet = True
            .ReminderTime = FechaHora
            .Body = UserForm1.txtDescripcion.Value
            .Save
        End With
    Else
    End If
    MsgBox "Datos dados de alta.", vbInformation, strTitulo
    Unload UserForm1
    '
End If
'
Exit Sub
'
ErrorHandler:
'
MsgBox "Ha ocurrido un error: ", vbExclamation, strTitulo

End Sub
'
Function GetOutlookApp() As Outlook.Application
'Regresamos el objeto Outlook.Application
On Error Resume Next
Set GetOutlookApp = CreateObject("Outlook.Application")
End Function

Nota 2: Para versiones de Windows de 64 bits deberemos leer el siguiente artículo para poder usar el control de Calendario: Usar el control Date and Time Picker (mscomct2.ocx) en Excel sobre Windows 7 y 8 de 64 bits.

Anexos

:: Descargar el ejemplo Agregar recordatorios en Outlook desde Excel.zip

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

Formulario para mostrar y ocultar hojas en Excel usando ListBox

$
0
0

Siguiendo con el tema de macros y formularios en Excel, en este artículo les comparto un formulario donde prodremos ocultar y mostrar hojas de manera dinámica.

Pasar elementos de un ListBox a otro

Nuestro formulario contrendrá dos ListBox donde los elementos serán los nombres de las hojas que haya en el archivo activo. Si elegimos el nombre de una hoja que se encuntra en el ListBox izquierdo (hojas visibles), lo podremos mover hacia el ListBox derecho (hojas ocultas).

image

Figura 1. Ocultar y mostrar hoja en Excel.

Libros protegidos

Tengamos en cuenta que si nuestro archivo tiene protegida su estructura o sus ventanas, Excel no nos permite realizar esto comandos de ocultar y mostrar hojas.

Para validar la protección del libro usamos la siguiente macro.

Option Explicit
'
Private Sub CommandButton1_Click()
'Declaramos variables
Dim VentanaProtegida As Boolean
Dim EstructuraProtegida As Boolean
'
With ActiveWorkbook
'
    'Damos valores a las variables
    VentanaProtegida = .ProtectWindows
    EstructuraProtegida = .ProtectStructure
    '
End With
'
'En caso de que el libro tenga la estructura protegida no contiúa.
If VentanaProtegida Or EstructuraProtegida Then
    MsgBox "Este comando no se puede ejecutar en un libro con estructura protegida.", _
           vbExclamation, "EXCELeINFO"
Else
    UserForm1.Show
End If
'
End Sub

Mostrar y ocultar hojas

Ya vimos que si elegimos un elemento de los ListBox éste se pasará al otro. Para que todo sea dinámico y no tengamos que salir del formulario para ver los cambios, en el momento en el que un elemento se pasa de ListBox veremos la acción de mostrar u ocultar.

Mostrar hojas

Figura 2. Ocultar y mostrar hojas en Excel dinámicamente.

Código de la macro

'---------------------------------------------------------------------------------------
' Module    : UserForm1
' Author    : Sergio Alejandro Campos. http://www.exceleinfo.com
' Date      : 10/10/2014
' Purpose   : Mostrar y ocultar hojas.
'---------------------------------------------------------------------------------------
'
Private Sub CommandButton1_Click()
Unload Me
End Sub
'
Private Sub CommandButton2_Click()
'
'Declaramos variables
Dim Cuenta As Integer
Dim Numero As Integer
Dim j As Integer
Dim i As Integer
Dim strNombreItem As String
'
Cuenta = Me.lstOcultas.ListCount
Numero = 0
'
'Validamos que haya un elemento seleccionado.
For j = 0 To Cuenta - 1
    If Me.lstOcultas.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.lstOcultas.Selected(i) = True Then
            strNombreItem = Me.lstOcultas.List(i)
            Me.lstOcultas.RemoveItem i
            Me.lstVisibles.AddItem strNombreItem
            ActiveWorkbook.Sheets(strNombreItem).Visible = True
        End If
    Next i
    '
End If
'
End Sub

Private Sub CommandButton3_Click()
'
'Declaramos variables
Dim Cuenta As Integer
Dim Numero As Integer
Dim j As Integer
Dim i As Integer
Dim strNombreItem As String
'
Cuenta = Me.lstVisibles.ListCount
Numero = 0
'
'Validamos que haya un elemento seleccionado.
For j = 0 To Cuenta - 1
    If Me.lstVisibles.Selected(j) = True Then
        Numero = Numero + 1
    End If
Next j
'
If Cuenta = 1 Then
    MsgBox "Debe haber por lo menos una hoja visible.", vbExclamation, "EXCELeINFO"
Else
    '
    If Numero <> 0 Then
        '
        'La hoja seleccionada se pasará al ListBox de hojas visibles.
        For i = 0 To Cuenta - 1
            'If ListBox1.Selected(i) Then
            If Me.lstVisibles.Selected(i) = True Then
                strNombreItem = Me.lstVisibles.List(i)
                Me.lstVisibles.RemoveItem i
                Me.lstOcultas.AddItem strNombreItem
                ActiveWorkbook.Sheets(strNombreItem).Visible = False
            End If
        Next i
        '
    End If
End If
'
End Sub
'
Private Sub UserForm_Initialize()
'
Dim Hoja As Object
'
For Each Hoja In ActiveWorkbook.Sheets
    '
    If Hoja.Visible = True Then
        Me.lstVisibles.AddItem Hoja.Name
    Else
        Hoja.Visible = False
        Me.lstOcultas.AddItem Hoja.Name
    End If
    '
Next Hoja
'
End Sub

Anexos

:: Descarga Mostrar u Ocultar hojas.xlsm

Hacer macros compatibles con Excel de 32 y 64 bits

$
0
0

Al momento de crear nuestras macros deberemos tener presente si éstas se correrán sobre Excel de 32 bits o 64 bits.

Hay que tener presente que si tenemos Excel de 32 bits, éste correra perfectamente sobre Windows de 32 y 64 bits, pero si nuestro Excel es de 64 bits, sólo podrá ser instalado en Windows de 64 bits.

Para determinar si tenemos Windows de 32 o 64 bits deberemos ir nuestro Panel de Control y buscamos Sistema. O para más rápido presionamos la combinación de teclas Windows + Pausa.

Esta sección de Windows te dirá si tu equipo es capaz de soportar Windows de 64 bits y qué versión tienes instalada.

Determinar la versión de Excel (Office)

Para saber qué versión de Excel si fuera Excel 2007 o 2010 se elige la opción Ayuda de la pestaña Archivo o botón de Office en 2007 y mostrará algo similar a la Figura 1.

image

Figura 1. En la opción Ayuda vemos que versión de Excel tenemos instalado.

En Excel 2013 nos vamos a la oción Cuenta de la pestaña Archivo y presionamos el botón que dice Acerca de Excel. Como se muestra en la Figura 2.

image

Figura 2. En la opción Cuenta en Excel 2013 vemos la versión de Office.

Macro para saber la versión de Excel (Office) instalada

Con los pasos anteriores podemos saber la versión de Office de nuestro Sistema, pero si eres de lo que quieren más, también podemos validarlo mediante una macro. Como tal no hay una propiedad que nos digas cuál es la versión que tenemos instalada, pero la siguiente macro cumple con el propósito.

Sub EsOffice64Bits()
'
#If VBA7 And Win64 Then
    Office64 = True
#Else
    Office4 = False
#End If
'
If Office64 Then
    MsgBox "Tienes instalado Office de 64 bits.", vbInformation, "EXCELeINFO"
Else
    MsgBox "Tienes instalado Office de 32 bits.", vbInformation, "EXCELeINFO"
End If
'
End Sub

Nota: es importante usar el caracter # tal como se muestra.

Macros compatibles con Excel de 32 y 64 bits

Un archivo de Excel creado en la versión de 64 bits puede funcionar perfectamente en la versión de 64 bits y vicerversa.

El tema lo tenemos cuando programamos macros. Si nuestras macros hacen llamadas a funciones de Windows debemos hacer modificaciones al momento de declararlas.

Por ejemplo, en EXCELeINFO add-in, en la sección Ejecutar, mandamos llamar aplicaciones de Windows como Bloc de Notas o la Calculadora. La función de Windows que mando llamar es ShellExecute.

Para hacerla compatible con Excel de 32 y 64 bits, primero le indico a la macro que detecte la versión de Excel para posteriormente hacer la declaración correcta de la función. Tal como se muestra en el siguiente código.

'Validamos la versión de Office
#If VBA7 And Win64 Then
    'Si es de 64 bits
    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
    'Si es de 32 bits
    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

Para ver una lista sobre las diferentes funciones y cómo declarlas les recomiendo visitar el sitio de Jan Karel Pieterse, JKP.

Ejemplo de formulario de Excel vba con botones de maximizar y minimizar

Para ejemplicar este tema, vamos a repasar los siguiente artículos:

Ya antes había publicado una macro para poner los botones de minimizar y maximizar en un formulario, pero sólo era compatible con Excel de 32 bits. Ahora, tomando de refencia el mismo código, lo adecuamos para que sea compatible con Excel de 64 bits.

Al momento de ejecutar el formulario veremos los botones antes mencionados, además de mostrarse una leyenda informativa sobre nuestra versión de Office.

image

Figura 3. Macros de Excel compatibles con versiones de 32 y 64 bits.

Código de la macro

Para ejecutar el formulario usamos:

Private Sub CommandButton1_Click()
UserForm1.Show
End Sub

En el código del formulario hacemos la declaración de variables.

Option Explicit
'
'Declaramos funciones
#If VBA7 And Win64 Then
    Private Declare PtrSafe Function FindWindow Lib "USER32" _
    Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
#Else
    Private Declare Function FindWindow Lib "USER32" _
    Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) 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 DrawMenuBar Lib "USER32" (ByVal hwnd As Long) As LongPtr
#Else
    Private Declare Function DrawMenuBar Lib "USER32" (ByVal hwnd As Long) As Long
#End If
'
Private Const WS_MINIMIZEBOX As Long = &H20000
Private Const WS_MAXIMIZEBOX As Long = &H10000
Private Const GWL_STYLE As Long = (-16)

Al momento de iniciar el formulario, ejecutamos esta macro:

Private Sub UserForm_Initialize()
Dim Windows64 As Boolean
'
'Validamos la versión de Office
#If VBA7 And Win64 Then
    Dim lngMyHandle As LongPtr, lngCurrentStyle As LongPtr, lngNewStyle As LongPtr
#Else
    Dim lngMyHandle As Long, lngCurrentStyle As Long, lngNewStyle As Long
#End If
'
If Application.Version < 9 Then
    lngMyHandle = FindWindow("THUNDERXFRAME", Me.Caption)
Else
    lngMyHandle = FindWindow("THUNDERDFRAME", Me.Caption)
End If
'
#If VBA7 And Win64 Then
    lngCurrentStyle = GetWindowLongPtr(lngMyHandle, GWL_STYLE)
    lngNewStyle = lngCurrentStyle Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
    SetWindowLongPtr lngMyHandle, GWL_STYLE, lngNewStyle
    '
#Else
    lngCurrentStyle = GetWindowLong(lngMyHandle, GWL_STYLE)
    lngNewStyle = lngCurrentStyle Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
    SetWindowLong lngMyHandle, GWL_STYLE, lngNewStyle
#End If
'
#If Win64 Then
    Windows64 = True
#Else
    Windows64 = False
#End If
'
If Windows64 Then
    Me.Label1.Caption = "Office 64 bits"
Else
    Me.Label1.Caption = "Office 32 bits"
End If
End Sub
Private Sub UserForm_Initialize()
Dim Windows64 As Boolean
'
'Validamos la versión de Office
#If VBA7 And Win64 Then
    Dim lngMyHandle As LongPtr, lngCurrentStyle As LongPtr, lngNewStyle As LongPtr
#Else
    Dim lngMyHandle As Long, lngCurrentStyle As Long, lngNewStyle As Long
#End If
'
If Application.Version < 9 Then
    lngMyHandle = FindWindow("THUNDERXFRAME", Me.Caption)
Else
    lngMyHandle = FindWindow("THUNDERDFRAME", Me.Caption)
End If
'
#If VBA7 And Win64 Then
    lngCurrentStyle = GetWindowLongPtr(lngMyHandle, GWL_STYLE)
    lngNewStyle = lngCurrentStyle Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
    SetWindowLongPtr lngMyHandle, GWL_STYLE, lngNewStyle
    '
#Else
    lngCurrentStyle = GetWindowLong(lngMyHandle, GWL_STYLE)
    lngNewStyle = lngCurrentStyle Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
    SetWindowLong lngMyHandle, GWL_STYLE, lngNewStyle
#End If
'
#If Win64 Then
    Windows64 = True
#Else
    Windows64 = False
#End If
'
If Windows64 Then
    Me.Label1.Caption = "Office 64 bits"
Else
    Me.Label1.Caption = "Office 32 bits"
End If
End Sub

Anexos

:: Descargar el ejemplo Macros compatibles con Excel de 32 y 64 bits.rar

Cambiar nombres a hojas de Excel mediante formulario vba

$
0
0

Desde hace algún tiempo tenía la inquietud de desarrollar un formulario donde pueda cambiarle el nombre a diferentes hojas de Excel sin necesidad de andar moviéndote a las diferentes pestañas para cambiarles el nombre.

Pues este artículo está dedica precisamente a eso, a compartirles el formulario que desarrollé.

Cómo funciona

Lo más difícil es un formulario no es que haga lo que quieras, sino que lo haga de la manera correcta previendo todos los escenarios posibles… pensando en el usuario final. Es decir, desarrollar la lógica adecuada para que funcione como lo deseamos.

Tenemos un formulario que a su vez contiene un ListBox el cual recoge el nombre de todas las hojas de nuestro archivo.

También tenemos un TextBox donde se mostrará el nombre de la hoja que haya elegido de la lista de nombres.

image

Figura 1. Cambiar nombres a las hojas de Excel desde un formulario.

El primer pasó será elegir el nombre del ListBox y después presionar el botón Cambiar nombre. Al presionar el botón veremos que el TextBox se pone disponible para modificar el nombre de la la hoja. Además de que el botón Cambiar nombre ahora cambia a “Guardar”. Tal como lo vemos en la Figura 2.

image

Figura 2. Al elegir el botón Cambiar nombre se habilita el TextBox para el nuevo nombre.

Qué pasa si tengo hojas ocultas

Pensando en casi todo, le añadí un CheckBox que servirá para poder elegir si deseamos que el ListBox también contenga las hojas ocultas.

Código de la macro

Primero validamos que el archivo no tenga la estructura protegida.

Ubicación: Código de la Hoja1.

Option Explicit
'
Private Sub CommandButton1_Click()
'Declaramos variables
Dim VentanaProtegida As Boolean
Dim EstructuraProtegida As Boolean
'
With ActiveWorkbook
'
    'Damos valores a las variables
    VentanaProtegida = .ProtectWindows
    EstructuraProtegida = .ProtectStructure
    '
End With
'
'En caso de que el libro tenga la estructura protegida no contiúa.
If VentanaProtegida Or EstructuraProtegida Then
    MsgBox "Este comando no se puede ejecutar en un libro con estructura protegida.", _
           vbExclamation, "EXCELeINFO"
Else
    frmNombresHojas.Show
End If
'
End Sub

Con la macro MostrarHojas vamos a llenar los nombres de las hojas en el ListBox.

Ubicación: Módulo1.

Public strNombreItem As String
'
Sub MostrarHojas()
frmNombresHojas.lstVisibles.Clear
For Each Hoja In ActiveWorkbook.Sheets
    '
    Select Case frmNombresHojas.CheckBox1.Value
    Case Is = True
        frmNombresHojas.lstVisibles.AddItem Hoja.Name
    Case Is = False
        If Hoja.Visible = True Then frmNombresHojas.lstVisibles.AddItem Hoja.Name
    Case Else
    End Select
    '
Next Hoja
'
End Sub

Con el siguiente código realizamo todas las opciones para cambiar nombre.

Ubicación: Código del formulario.

'---------------------------------------------------------------------------------------
' Module    : frmNombresHojas
' Author    : MVP Excel, Sergio Alejandro Campos
' Date      : 30/10/2014
' Purpose   : Cambiar nombres a hojas de un archivo de Excel mediante formulario de vba
'---------------------------------------------------------------------------------------
'
Private Sub btnCambiar_Click()
NombreActual = Me.txtNombre.Value
'
'En caso de error...
On Error GoTo ErrorHandler
'
If Me.txtNombre.Enabled = False And Me.lstVisibles.ListIndex < 0 Then
    '
    MsgBox "Hay que elegir un nombre de la lista.", vbExclamation, "EXCELeINFO"
    '
ElseIf Me.txtNombre.Enabled = False Then
    '
    Me.txtNombre.Enabled = True
    Me.txtNombre.SetFocus
    btnCambiar.Caption = "Guardar"
    '
    If Me.txtNombre = "" Then
        '
        MsgBox "No puede dejar el campo en blanco.", vbExclamation, "EXCELeINFO"
        '
    Else
        '
    End If
    '
ElseIf Me.txtNombre.Enabled = True Then
    '
    If Me.txtNombre.Value = "" Then
        '
        MsgBox "No puede dejar el campo en blanco.", vbExclamation, "EXCELeINFO"
        '
    Else
        '
        'Recorremos el ListBox y pasamos el nombre del elemento elegido
        For i = 1 To ThisWorkbook.Sheets.Count
            '
            If Sheets(i).Name = strNombreItem Then
                Sheets(i).Name = Me.txtNombre.Value
                Me.txtNombre.Enabled = False
                Me.txtNombre.Value = ""
                Me.btnCambiar.Caption = "Cambiar nombre"
                Call MostrarHojas
            Else
            End If
            '
        Next i
    End If
End If
'
Exit Sub
ErrorHandler:
'
MsgBox Err.Description, vbExclamation, "EXCELeINFO"
'
End Sub

Private Sub CheckBox1_Click()
'
Me.txtNombre.Enabled = False
Me.txtNombre.Value = ""
Me.btnCambiar.Caption = "Cambiar nombre"
Me.txtNombre.Enabled = False
'
Call MostrarHojas
End Sub
'
Private Sub CommandButton5_Click()
Unload Me
End Sub
'
Private Sub lstVisibles_Click()
Me.txtNombre.Enabled = False
Me.btnCambiar.Caption = "Cambiar nombre"
'Al dar click
'
'Declaramos variables
Dim Cuenta As Integer
Dim Numero As Integer
Dim j As Integer
Dim i As Integer
'Dim strNombreItem As String
'
Cuenta = Me.lstVisibles.ListCount
'
'Validamos que haya un elemento seleccionado.
For j = 0 To Cuenta - 1
    If Me.lstVisibles.Selected(j) = True Then
        Numero = Numero + 1
    End If
Next j
'
'La hoja seleccionada se pasará al ListBox de hojas visibles.
For i = 0 To Cuenta - 1
    'If ListBox1.Selected(i) Then
    If Me.lstVisibles.Selected(i) = True Then
        strNombreItem = Me.lstVisibles.List(i)
        Me.txtNombre.Value = strNombreItem
    End If
Next i

End Sub
'
Private Sub UserForm_Initialize()
Me.txtNombre.Enabled = False
Call MostrarHojas
End Sub

Anexos

:: Descarga el ejemplo Cambiar nombres a hojas de Excel en formulario.rar

Cambiar color a hojas de Excel mediante formulario vba

$
0
0

Si eres de los que sigues este Blog, te habrás dado cuenta que llevo con este 3 artículos relacionados a las hojas de un archivo de Excel. Mi objetivo es crear un add-in que contenga las siguientes opciones:

  1. Cambiar color a etiquetas de hojas.
  2. Etc, etc.

Los dos primeros temas ya están publicados para su consulta.

En lo que respecta a este artículo vamos a tener un formulario donde podremos visualizar el color de cada una de las etiquetas de las hojas de nuestro archivo de Excel, pero con la facilidad de poder cambiar el color de cada una de ellas desde el mismo formulario.

image

Figura 1. Formulario en Excel vba para cambiar color a las etiquetas de las hojas

Llamar Diálogos prediseñados de Excel

Par poder cambiar seleccionar el color que tendrán las hojas, haremos uso de la paleta de colores de Excel mediante un cuadro de diálogo prediseñado Colores.

En VBA para poder mandar llamar la paleta de colores de Excel, usamos:

Application.Dialogs(xlDialogEditColor).Show

Cómo funciona el ejemplo

Al mandar llamar al formulario, el ListBox que contiene se llenará con el nombre de todas las hojas del archivo. Tiene un CheckBox que permitirá visualizar las hojas que estén ocultas.

Cada vez que seleccionemos un elemento del ListBox en la parte derecha habrá un TextBox que el color de fondo se llenará con el mismo color de la hoja elegida.

El botón Cambiar color llamadar a la paleta de colores para elegir el nuevo color de la hoja.

image

Figura 2. Eligiendo el color de la paleta de colores de Excel.

Código vba

Validamos si el archivo tiene la estructura protegida.

Ubicación: Hoja1.

Option Explicit
'
Private Sub CommandButton1_Click()
'Declaramos variables
Dim VentanaProtegida As Boolean
Dim EstructuraProtegida As Boolean
'
With ActiveWorkbook
    '
    'Damos valores a las variables
    VentanaProtegida = .ProtectWindows
    EstructuraProtegida = .ProtectStructure
    '
End With
'
'En caso de que el libro tenga la estructura protegida no contiúa.
If VentanaProtegida Or EstructuraProtegida Then
    MsgBox "Este comando no se puede ejecutar en un libro con estructura protegida.", _
           vbExclamation, "EXCELeINFO"
Else
    frmNombresHojas.Show
End If
'
End Sub

Declaración de variables públicas y Subrutina MostrarHojas.

Ubicación: Módulo1.

Public strNombreItem As String
Public longColorActual As Long
'
Sub MostrarHojas()
'
frmNombresHojas.lstVisibles.Clear
frmNombresHojas.txtColor.BackColor = longColorActual
'
For Each Hoja In ActiveWorkbook.Sheets
    '
    Select Case frmNombresHojas.CheckBox1.Value
    Case Is = True
        frmNombresHojas.lstVisibles.AddItem Hoja.Name
    Case Is = False
        If Hoja.Visible = True Then frmNombresHojas.lstVisibles.AddItem Hoja.Name
    Case Else
    End Select
    '
Next Hoja
'
End Sub

Código del formulario

Ubicación: Formulario.

'---------------------------------------------------------------------------------------
' Module    : frmNombresHojas
' Author    : MVP Excel, Sergio Alejandro Campos
' Date      : 07/11/2014
' Purpose   : Cambiar colores a etiquetas de hojas
'---------------------------------------------------------------------------------------
'
Private Sub CheckBox1_Click()
'
Call MostrarHojas
'
End Sub
'
Private Sub CommandButton5_Click()
Unload Me
End Sub
'
Private Sub CommandButton6_Click()
Const BGColor As Long = 13160660    'Color de fondo del diálogo
Const ColorIndexLast As Long = 32    'Índice el último color personalizado de la paleta
'
Dim myOrgColor As Double    'Color original del Index 32
Dim myNewColor As Double    'Color que es elegido en el diálogo
Dim myRGB_R As Integer    'Valores RGB del color que será
Dim myRGB_G As Integer    'mostrado en el diálogo
Dim myRGB_B As Integer    'como el color "Actual"
'
On Error GoTo ErrorHandler
'
'Guadar el color original, porque no lo queremos cambiar
'
myOrgColor = ActiveWorkbook.Colors(ColorIndexLast)
'
i_OldColor = Me.txtColor.BackColor
'
If i_OldColor = xlNone Then
    'Obtener valores RGB del fondo, para que el color original luzca en blanco
    Color2RGB BGColor, myRGB_R, myRGB_G, myRGB_B
Else
    'obtener los valores RGB del color anterior
    Color2RGB i_OldColor, myRGB_R, myRGB_G, myRGB_B
End If
'
If Application.Dialogs(xlDialogEditColor).Show(ColorIndexLast, _
                                               myRGB_R, myRGB_G, myRGB_B) = True Then
    'Se presiona "Aceptar"
    NewColor = ActiveWorkbook.Colors(ColorIndexLast)
    '
    Sheets(2).Tab.Color = NewColor
    Me.txtColor.BackColor = NewColor

    For i = 1 To ThisWorkbook.Sheets.Count
        '
        If Sheets(i).Name = strNombreItem Then
            Sheets(i).Tab.Color = NewColor
        Else
        End If
        '
    Next i
Else
    'Se presiona "Cancelar"
    NewColor = i_OldColor
    Me.txtColor.BackColor = i_OldColor
End If
'
Exit Sub
ErrorHandler:
MsgBox "Debes elegir una hoja de la lista", vbExclamation, "EXCELeINFO"
'
End Sub
Sub Color2RGB(ByVal i_Color As Long, _
              o_R As Integer, o_G As Integer, o_B As Integer)
o_R = i_Color Mod 256
i_Color = i_Color \ 256
o_G = i_Color Mod 256
i_Color = i_Color \ 256
o_B = i_Color Mod 256
End Sub
'
Private Sub lstVisibles_Click()
'Al dar click
'
'Declaramos variables
Dim Cuenta As Integer
Dim Numero As Integer
Dim j As Integer
Dim i As Integer
'
Cuenta = Me.lstVisibles.ListCount
'
'Validamos que haya un elemento seleccionado.
For j = 0 To Cuenta - 1
    If Me.lstVisibles.Selected(j) = True Then
        Numero = Numero + 1
    End If
Next j
'
'La hoja seleccionada se pasará al ListBox de hojas visibles.
For i = 0 To Cuenta - 1
    If Me.lstVisibles.Selected(i) = True Then
        strNombreItem = Me.lstVisibles.List(i)
        ColorActual = Sheets(Me.lstVisibles.List(i)).Tab.Color
        If ColorActual = False Then
            '
            Me.txtColor.BackColor = vbWhite
        Else
            Me.txtColor.BackColor = ColorActual
        End If
    End If
Next i
'
End Sub
'
Private Sub UserForm_Initialize()
'
longColorActual = Me.txtColor.BackColor
'
Call MostrarHojas
End Sub

Anexos

:: Descargar Cambiar color a hojas de Excel en formulario.rar

Lanzar tu propio menú contextual al dar click derecho en las etiquetas de hojas de Excel

$
0
0

Les comparto una macro que nos permitirá añadir opciones al menú contextual que por default sale cuando damos click derecho en alguna etiqueta de alguna hoja.

image

Figura 1. Menú contextual al dar click derecho en una etiqueta de hoja.

La macro deberá ejecutarse al momento de abrir el archivo o complemento. Ya vimos en Funciones personalizadas UDF en Excel disponibles en todos los archivos abiertos cómo tener macros disponibles para todos los archivos.

Opciones añadidas

Al momento de abrir el archivo se añadirán 5 opciones al menú, las cuales llamarán a 5 macros de ejemplo.

image

Figura 2. Lanzar macros desde menú de click derecho.

Macros

Al iniciar el archivo lanzamos la macro para crear el menú y al cerrarlo ejecutamos la macro para eliminarlo.

Ubicación: Objetos ThisWorkbook.

Private Sub Workbook_Open()
'
Call AddMenuSheetTab
'
End Sub
'
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'
Call DeleteMenuSheetTab
'
End Sub

Código de la macro para crear el menú.

Ubicación: Módulo1.

'---------------------------------------------------------------------------------------
' Module    : Módulo1
' Author    : MVP Excel, Sergio Alejandro Campos
' Date      : 19/11/2014
' Purpose   : Añadir opciones a menú de click derecho
' Web       : http://www.exceleinfo.com
'---------------------------------------------------------------------------------------
'
'Macro para eliminar el menú
Sub DeleteMenuSheetTab()
On Error Resume Next
'
For i = 1 To 5
'
CommandBars("Ply").Controls("Macro" & i).Delete
'
Next i
'
End Sub
'
'Macro para añadir el menú
Sub AddMenuSheetTab()
'
Dim Bar As CommandBar
Dim NewControl As CommandBarButton
DeleteMenuSheetTab
'
Set Bar = CommandBars("Ply")
'
Set NewControl = Bar.Controls.Add _
(Type:=msoControlButton, _
temporary:=True)
With NewControl
.Caption = "Macro1"
.OnAction = "M1"
.BeginGroup = True
.FaceId = 84 'E
.Style = msoButtonIconAndCaption
End With
'
Set NewControl = Bar.Controls.Add _
(Type:=msoControlButton, _
temporary:=True)
With NewControl
.Caption = "Macro2"
.OnAction = "M2"
.BeginGroup = True
.FaceId = 103 'X
.Style = msoButtonIconAndCaption
End With
'
Set NewControl = Bar.Controls.Add _
(Type:=msoControlButton, _
temporary:=True)
With NewControl
.Caption = "Macro3"
.OnAction = "M3"
.BeginGroup = True
.FaceId = 82 'C
.Style = msoButtonIconAndCaption
End With
'

Set NewControl = Bar.Controls.Add _
(Type:=msoControlButton, _
temporary:=True)
With NewControl
.Caption = "Macro4"
.OnAction = "M4"
.BeginGroup = True
.FaceId = 84 'E
.Style = msoButtonIconAndCaption
End With
'
Set NewControl = Bar.Controls.Add _
(Type:=msoControlButton, _
temporary:=True)
With NewControl
.Caption = "Macro5"
.OnAction = "M5"
.BeginGroup = True
.FaceId = 91 'L
.Style = msoButtonIconAndCaption
End With
'
End Sub

Código de las macros de ejemplo

Ubicación: Módulo2

Sub M1()
'
MsgBox "Mensaje de ejemplo al dar click en el menú", vbInformation, "EXCELeINFO"
'
End Sub
'
Sub M2()
'
MsgBox "Mensaje de ejemplo al dar click en el menú", vbInformation, "EXCELeINFO"
'
End Sub
'
Sub M3()
'
MsgBox "Mensaje de ejemplo al dar click en el menú", vbInformation, "EXCELeINFO"
'
End Sub
'
Sub M4()
'
MsgBox "Mensaje de ejemplo al dar click en el menú", vbInformation, "EXCELeINFO"
'
End Sub
'
Sub M5()
'
MsgBox "Mensaje de ejemplo al dar click en el menú", vbInformation, "EXCELeINFO"
'
End Sub

Anexos

:: Descargar Menú al dar click derecho en etiquetas de hojas en Excel.rar


Formulario de punto de venta en Excel vba

$
0
0

El objetivo de este ejemplo que les comparto es comenzar un Sistema de Punto de venta en el que simulemos el Software que se usa en plazas comerciales, pero a un nivel básico.

Aclaración: éste ejemplo puede ser el principio de un gran proyecto, así que con toda confianza lo pueden reproducir y adecuar a sus proyector personales.

Cómo funciona

Tenemos una base de datos con un lista de productos donde especificamos el código, la descripción y el precio unitario de cada uno.

image

Figura 1. Tabla de productos.

Desarrollé un formulario donde capturaremos el código de los productos y simularemos una venta en una tienda.

image

Figura 2. Formulario de punto de venta.

El código del producto lo capturaremos en el TextBox CÓDIGO y se nos pedirá la cantidad de artículos de dicho producto.

Cada producto que vayamos registrando se agregará al ListBox del formulario donde se agregará su descripción, la cantidad de artículos, el precio unitario y el total.

En la parte inferior habrá dos etiquetas donde visualizaremos la cantidad de artículos y el total de la compra.

image

Figura 3. Captura de productos en formulario de punto de venta.

Al dar click en el botón GUARDAR, los datos de la compra se darán de alta en la tabla VENTAS donde cada fila será cada uno de los productos y la columna CONSECTIVO nos servirá para hacer reportes y resúmenes por ID (CONSECUTIVO).

image

Figura 4. Tabla de ventas.

Código vba

Y para que hagan todas la variantes posibles, les paso el código utilizado en el ejemplo.

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.
'---------------------------------------------------------------------------------------
'
Option Explicit
'
Private Sub CommandButton1_Click()
'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(CInt(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(CInt(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()
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 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

:: Descargar Formulario de punto de venta.rar

Inmovilizar páneles de todas las hojas de un archivo de Excel mediante un formulario vba

$
0
0

Para este artículo les comparto un formulario realizado en Excel vba para inmovilizar páneles en todas las hojas del archivo activo.

Cómo funciona

Como sabemos la opción de Inmovilizar páneles que se encuentra en la pestaña de VISTA nos ayuda a dejar fijas filas o columnas de nuestra hoja de Excel, útil por ejemplo cuando deseamos que los encabezados de una tabla queden fijos.

En nuestro ejemplo tenemos dos botones los cuales nos servirán para Inmovilizar y movilizar páneles.

image

Figura 1. Ejemplo para inmovilizar y moviliar páneles en Excel.

Si presionamos Movilizar páneles quitará todos los páneles inmovilizados de todas las hojas del archivo.

En cambio, si presionamos Inmovilizar páneles tendremos un formulario donde mediante un control de RefEdit podremos elegir la celda, fila o columna donde deseamos que se inserte la división del pánel y se quede fijo.

image

Figura 2. Inmovilizando páneles en Excel con formulario vba

En Figura 3 vemos el formulario en acción.

Inmovilizar páneles en Excel

Figura 3. Formulario para inmovizar páneles en Excel.

Código vba de la macro

Inmovilzar páneles.

Ubicación: formulario frmInmovilizarPaneles

'---------------------------------------------------------------------------------------
' Module    : frmInmovilizarPaneles
' Author    : MVP Excel, Sergio Alejandro Campos
' Date      : 28/11/2014
' Purpose   : Inmovilizar páneles en todas las hojas
'---------------------------------------------------------------------------------------
'
Option Explicit
'
Private Sub CommandButton1_Click()
'
'Declaramos variables
Dim strHojaActual As String
Dim Hoja As Object
Dim miRango As String
Dim intPosicion As Integer
Dim intLargo As Integer
Dim miRango2 As String
'
'Mandamos llamar el procedimiento para movilizar páneles
Call MovilizarPanales
'
strHojaActual = ActiveWorkbook.ActiveSheet.Name
'
'En caso de error
On Error GoTo ErrorHandler
'
Application.ScreenUpdating = False
'
'Recorremos todas las hojas
For Each Hoja In ActiveWorkbook.Sheets
    '
    If Hoja.Visible = True Then
        '
        miRango = Me.RefEdit1.Value
        '
        intPosicion = WorksheetFunction.Find("!", miRango)
        intLargo = Len(miRango)
        miRango2 = Right(miRango, intLargo - intPosicion)
        '
        Hoja.Activate
        Hoja.Range(miRango2).Select
        '
        ActiveWindow.FreezePanes = True
        '
    Else
    End If
    '
Next Hoja
'
ActiveWorkbook.Sheets(strHojaActual).Activate
'
Unload Me
'
Application.ScreenUpdating = True
'
Exit Sub
'
ErrorHandler:
Application.ScreenUpdating = True
'
MsgBox "Debe elegir un rango válido.", vbExclamation, "EXCELeINFO"
'
End Sub
'
Private Sub CommandButton2_Click()
Unload Me
End Sub

Movizar páneles.

Ubicación: Módulo 1.

'---------------------------------------------------------------------------------------
' Module    : Módulo1
' Author    : MVP Excel, Sergio Alejandro Campos
' Date      : 28/11/2014
' Purpose   : Movizar páneles en todas las hojas
'---------------------------------------------------------------------------------------
'
Option Explicit
'
Sub MovilizarPanales()
'
'Declaramos variables
Dim strHojaActual As String
Dim Hoja As Object
'
strHojaActual = ActiveWorkbook.ActiveSheet.Name
'
Application.ScreenUpdating = False
'
'Recorremos todas las hojas
For Each Hoja In ActiveWorkbook.Sheets
    '
    If Hoja.Visible = True Then
        '
        Hoja.Activate
        ActiveWindow.FreezePanes = False
        '
    Else
    End If
    '
Next Hoja
'
ActiveWorkbook.Sheets(strHojaActual).Activate
'
Application.ScreenUpdating = True
'
End Sub

Anexos

:: Descarga Inmovilizar páneles en todas las hojas.rar

Controles ActiveX deshabilitados en Excel después de aplicar actualización

$
0
0

En dias recientes Microsoft publicó unas actualizaciones de seguridad para Office, las cuales solucionaban algunas cuestiones de seguridad, pero una especial provocó que no pudieran usar los controles ActiveX que son usados cuando se desarrollan macros.

image

Figura 1. Controles ActiveX en Excel.

La actualización mencionada es la KB2553154, la cual se describe en ésta página.

Síntomas

El día de hoy algunos usuarios comenzaron a reportar esta situación con sus archivos de Excel, principalmente con los que tienen controles ActiveX.

El primer síntoma es, por ejemplo, si se tiene un control en una hoja, éste control no puede ejecutar la macro que tenga asociada.

Los comentarios también aputaban a que aparecía la leyenda “No se puede insertar el objeto” cuando querían insertar un control. Tal como se muestra en la Figura 1.

image

Figura 2. Mensaje al querer insertar un control ActiveX.

Solución

Tanto Microsoft como el equipo de desarrollo de Excel están comprometidos a reparar esta situación, pero mientras tanto podemos hacer lo siguiente en las PCs afectadas.

Con Excel y Word cerrados, deberemos eliminar los archivos con extensión .EXD alojados en los siguientes directorios:

C:\Users\[user.name]\AppData\Local\Temp\Excel8.0\MSForms.exd
C:\Users\[user.name]\AppData\Local\Temp\VBE\MSForms.exd
C:\Users\[user.name]\AppData\Local\Temp\Word8.0\MSForms.exd

Una vez eliminados podemos volver a abrir nuestras aplicaciones.

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

Viewing all 466 articles
Browse latest View live