lunes, 28 de noviembre de 2022

67 - Uso de INPUTBOX para seleccionar un rango

 En la mayoría de las macros, trabajamos con un rango ya previamente seleccionado o  armamos la referencia al rango como una combinación de fila y columna. 

Por ejemplo: dire = Range(Cells(1,1), Cells(20,colx))

A continuación veremos el uso de la función INPUTBOX que nos permitirá seleccionar un rango para continuar con un proceso ya iniciado.

Para este ejemplo tendremos:

1 hoja principal y 1 hoja que se agrega para recibir la copia del rango seleccionado:

Se filtra la columna 2 (Fecha) de la tabla principal, por el año que se obtiene de la celda E9.


En la macro del ejemplo, que colocamos en el Editor de Macros, insertando un módulo, tenemos:

Sub procesoContinuo()

'hoja activa.

    Set hojaTabla = ActiveSheet

'crear una hoja nueva

    Set nvaHoja = Sheets.Add

'volver a la hoja principal

    hojaTabla.Activate

'en este ejemplo se filtra la tabla x algún criterio

    crit = "12/27/" & Year(Range("E9"))

    ActiveSheet.ListObjects("PaymentSchedule3").Range.AutoFilter Field:=2, _

        Operator:=xlFilterValues, Criteria2:=Array(0, crit)

'se selecciona un rango de la tabla filtrada

On Error Resume Next

Set rgox = Application.InputBox("Seleccione una celda o rango", Type:=8)

'si el rango no está vacío lo copiamos en la nueva hoja

If Not IsEmpty(rgox) Then

    rgox.Copy

    nvaHoja.Activate

'se pegan solo valores y formatos de número

    Range("B3").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _

        xlNone, SkipBlanks:=False, Transpose:=False

    Application.CutCopyMode = False

    MsgBox "El rango ya fue copiado. El proceso continúa....", , "Información"

End If

'otras instrucciones. Por ej:

'1- volver a hoja principal y quitar los filtros,

    hojaTabla.Activate

    ActiveSheet.ListObjects("PaymentSchedule3").Range.AutoFilter Field:=2

'2- renombrar la hoja creada,

 '----------

'3- dar formato al rango copiado, etc

 '--------

End Sub

 

NOTA: observar que se pueden seleccionar tanto rangos continuos como discontinuos, desde la ventana del InputBox. 


Descargar libro de ejemplo desde aquí.

Ver Video N° 67 con el desarrollo de 2 ejemplos: macro con selección de rango previo y macro con selección de rango durante un proceso.

viernes, 4 de noviembre de 2022

66 - Nombrando hojas Excel desde VBA.

 Todos los usuarios de Excel seguramente renombran las pestañas que vienen de modo predeterminado al abrir un libro (Hoja1, Hoja2, etc) a su gusto y necesidad.  Así, encontramos nombres como 'Inicio', "Enero', 'Clientes', etc. Esos son los nombres de las 'pestañas'.

¿Pero cómo identificarlas correctamente desde algún código, macro o formulario?

Veremos a continuación las diferentes modos de llamarlas según la tarea que vayamos a realizar.

Modo N° 1:  Por su nombre de pestaña, entre comillasAlgunos ejemplos:

Sheets("PROVEEDORES").Select

Sheets("PROVEEDORES").Unprotect

Sheets("PROVEEDORES").Range(“A:B”).Copy

Selection.Copy Destination:= Sheets("PROVEEDORES").[C5]



Modo N° 2:  Por su código de nombre. Es el texto que antecede al nombre en la lista de hojas del libro. Así por ejemplo Hoja3 será la hoja Presupuesto.

Hoja3.Select

Hoja3.Unprotect

Hoja3.Range("A:B").Copy

Selection.Copy Destination:=Hoja3.[C5]

NOTA: Este método requiere que recordemos a qué hoja corresponde el código Hoja3. Lo que es una dificultad al copiar códigos con esta expresión, ya que podemos no tener los mismos textos.


Modo N° 3: Al inicio de un módulo, se declara una variable del tipo 'hoja' para guardar el nombre. En el resto del módulo se hará mención a la variable en lugar del nombre o código de nombre.

Dim hop As Worksheet      'tipo de variable hoja

Set hop = Sheets("PROVEEDORES")

    hop.Select

    hop.Unprotect

    hop.Range("A:B").Copy

    Selection.Copy Destination:=hop.[C5]


NOTA: Este método es muy práctico a la hora de trabajar con Userforms, donde asignamos la hoja a la variable desde el evento Initialize del Userform. Y en todos los procesos se hará mención a esa variable. Si por alguna razón, más adelante cambiamos de nombre a nuestra hoja, solo habrá que modificar esa línea inicial.


Modo N°4: Llamar a la hoja cuyo nombre se guardó en una variable del tipo String o texto.

Dim hojax As String      'tipo de variable texto

'nombre contenido de una celda de hoja LISTAS:

hojax = Sheets("LISTAS").Range("B1")

'o también obtenido con un InputBox

hojax = InputBox("Ingrese el nombre de la hoja a utilizar.")

    Sheets(hojax).Select

    Sheets(hojax).Unprotect

    Sheets(hojax).Range("A:B").Copy

    Selection.Copy Destination:=Sheets(hojax).[C5]


NOTA: Observar que en este caso, se llama a la hoja con Sheets(variable), sin uso de comillas.

Modo N° 5: Llamar a la hoja haciendo referencia a su índice o ubicación entre las pestañas.

Sheets(1).Select        ‘primera pestaña

Sheets(Sheets.Count).Select    ‘última pestaña. Sheets.Count nos devolverá el total de hojas.



A continuación, algunas instrucciones para obtener información de la hoja activa:

nombre = ActiveSheet.Name

codi = ActiveSheet.CodeName

indi = ActiveSheet.Index