Está en la página 1de 17

CODIGOS VBA

IMPRIMIR CELDAS SELECIONADAS, HOJAS Y


LIBROS
A veces vale la pena incluir una función para que el usuario del libro pueda imprimir
cómodamente (y seguro), por ejemplo desde un botón. De esta manera mantenemos el
control sobre lo que se va a imprimir, y de los parámetros que se mandarán a la impresora.

Abajo encontrarás sencillos ejemplos de la aplicación de cómo imprimir desde Excel VBA:

 Selección
 Hojas seleccionadas
 Todas las hojas

Primero ajustamos los parámetros de la impresión, el apartado PageSetup. Luego se


imprime con el método PrintOut.

Marcado VBA para imprimir las celdas seleccionadas


Sub Imprimir_seleccion()

'preparar la hoja para la impresión


With ActiveSheet.PageSetup
.PrintArea = ""
.Orientation = xlPortrait 'xlLandscape
.PaperSize = xlPaperA4 'formato A4
.BlackAndWhite = False 'incluir colores o no
.FitToPagesWide = 1 'reduce el tamaño de la hoja (ancho)
.FitToPagesTall = 1 'reduce el tamaño de la hoja (alto)
.CenterHorizontally = False 'centrar horizontalmente
.CenterVertically = False 'centrar verticalmente
End With

'imprimir las celdas seleccionadas (1 copia)


ActiveWindow.Selection.PrintOut copies:=1, collate:=True

End Sub

Código VBA para imprimir las hojas seleccionadas


Sub Imprimir_seleccion()
'preparar la hoja para la impresión
With ActiveSheet.PageSetup
.PrintArea = ""
.Orientation = xlPortrait 'xlLandscape
.PaperSize = xlPaperA4 'formato A4
.BlackAndWhite = False 'incluir colores o no
.FitToPagesWide = 1 'reduce el tamaño de la hoja (ancho)
.FitToPagesTall = 1 'reduce el tamaño de la hoja (alto)
.CenterHorizontally = False 'centrar horizontalmente
.CenterVertically = False 'centrar verticalmente
End With

'imprimir las celdas seleccionadas (1 copia)


ActiveWindow.SelectedSheets.PrintOut copies:=1, collate:=True

End Sub

Código VBA para imprimir todas las hojas del libro


Sub Imprimir_seleccion()

'preparar la hoja para la impresión


'bucle que repasa todas las hojas
For Each Worksheet In ActiveWorkbook.Sheets
With ActiveSheet.PageSetup
.PrintArea = ""
.Orientation = xlPortrait 'xlLandscape
.PaperSize = xlPaperA4 'formato A4
.BlackAndWhite = False 'incluir colores o no
.FitToPagesWide = 1 'reduce el tamaño de la hoja (ancho)
.FitToPagesTall = 1 'reduce el tamaño de la hoja (alto)
.CenterHorizontally = False 'centrar horizontalmente
.CenterVertically = False 'centrar verticalmente
End With
Next Worksheet 'fin del bucle

'imprimir las celdas seleccionadas (1 copia)


ActiveWorkbook.PrintOut From:=1, To:=1, copies:=1, collate:=True

End Sub

Alineación izquierda/derecha
Sub Ajustar_izq_der()
If Selection.HorizontalAlignment = xlRight Then
Selection.HorizontalAlignment = xlLeft
Else
Selection.HorizontalAlignment = xlRight
End If
End Sub
Convertir pesetas a euro
Sub Convertir()
Set Area = Selection
For Each Cell In Area
z = Round(Cell / 166.386, 2)
Cell.Value = z
Cell.NumberFormat = "#,##0.00"
Next Cell
End Sub

Pegar formato
Sub PegarFormato()
Selection.PasteSpecial Paste:=xlFormats
Application.CutCopyMode = False
End Sub

Pegar valor
Sub PegarValor()
Selection.PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
End Sub

Dos decimales
Sub DosDec()
Dim Area As Range
Set Area = Selection
For Each Cell In Area
z = Round(Cell, 2)
Cell.Value = z
Cell.NumberFormat = "#,##0.00"
Next Cell
End Sub

Separador de miles
Sub SeparadorMil()
Dim Area As Range
Set Area = SelectionIf Area.NumberFormat = "#,##0" Then
Area.NumberFormat = "#,##0.00"
Else
Selection.NumberFormat = "#,##0"
End If
End Sub

Suprimir filas vacías


Sub SuprimirFilasVacias()
LastRow = ActiveSheet.UsedRange.Row - 1 + _
ActiveSheet.UsedRange.Rows.Count
For r = LastRow To 1 Step -1
If Application.CountA(Rows(r)) = 0 Then
Rows(r).Delete
End If
Next r
End Sub

Autofilter
Sub FilterExcel()
Selection.AutoFilter
End Sub

Grids (Líneas de división)


Sub Grids()
If ActiveWindow.DisplayGridlines = True Then
ActiveWindow.DisplayGridlines = False
Else
ActiveWindow.DisplayGridlines = True
End If
End Sub

Cambiar A1 a RC (columnas tiene números en vez de


letras)
Sub Rc()
If Application.ReferenceStyle = xlR1C1 Then
Application.ReferenceStyle = xlA1
Else
Application.ReferenceStyle = xlR1C1
End If
End Sub

Modificar paleta de colores


Sub ModificarPaleta()
ActiveWindow.Zoom = 75
ActiveWorkbook.Colors(44) = RGB(236, 235, 194)
ActiveWorkbook.Colors(40) = RGB(234, 234, 234)
ActiveWorkbook.Colors(44) = RGB(236, 235, 194)
End Sub

Mostrar todas las hojas


Sub MostrarHojas()
Set wsHoja = Worksheets
For Each wsHoja In ActiveWorkbook.Worksheets
If wsHoja.Visible = False Then
wsHoja.Visible = True
End If
Next wsHoja
End Sub

WAIT – mostrar un formulario VBA durante un


tiempo predeterminado
Con el método WAIT puedes hacer que un formulario se cierre después de un tiempo
determinado. Esto puede ser útil para presentar información al usuario („La importación ha
terminado con éxito‟, „El archivo está guardado‟ etc). El truco está en utilizar el método
WAIT de VBA.

Procedimiento
Crea un formulario „frmMensaje„ con el mensaje que quieres que aparezca. Añade este
código al formulario. El ejemplo nos dice que la rutina se va a esperar („Wait„) hasta la
hora

Now + TimeValue("00:00:04")

Es decir la hora actual más 4 segundos.

Sub MostrarFormulario()

Private Sub UserForm_Activate()


Application.Wait Now + TimeValue("00:00:04")
frmMensaje.Hide

End Sub

Luego, para mostrar el formulario en cualquier parte de tu programa, aplicas este código.

frmMensaje.Show

En el ejemplo de abajo, el formulario se mostrará al abrir el libro (ponemos el código en el


contenedor de código VBA „EsteLibro„.

Private Sub Workbook_Open()


frmMensaje.Show
End Sub

Scrollrow – Imagen fija a un costado de la


pantalla
Si queremos que el usuario vea una imagen en el costado superior izquierdo de la pantalla,
esté donde esté en la hoja, podemos aplicar el siguiente código.

Trata de utilizar la propiedad SCROLLROW, que nos da la celda superior izquierdo de la


pantalla visible. Y SCROLLCOLUMN de la columna por supuesto. Luego insertamos un
comentario, en la cual ponemos una imagen y un poco de texto.

El resultado será algo como

El código
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim strRuta As String
Dim intRowActual as Double, intColumnActual As Double
Dim intRow as Double, intColumn As Double

'ruta a imagen
strRuta = "C:\imagen.jpg"

'fila/columna actual
intRowActual = ActiveCell.Row
intColumnActual = ActiveCell.Column
'fila/columna de scrollRow
intRow = ActiveWindow.ScrollRow + 1
intColumn = ActiveWindow.ScrollColumn

'insertamos comentario
Cells.ClearComments
With Cells(intRow, intColumn)
.AddComment
.Comment.Text Text:="Hola"
.Comment.Visible = True
End With

'añadimos imagen al comentario


Cells(intRow, intColumn).Comment.Shape.Select True
Selection.ShapeRange.Fill.UserPicture strRuta

'aparcamos en celda actual


Cells(intRowActual, intColumnActual).Select

End Sub

Sumar rangos variables con VBA Excel

Sumar un rango en Excel es fácil. Sumar un rango expresado por una variable en VBA es
un poco más complicado (pero sigue siendo fácil).

No siempre se sabe de antemano que celdas formarán parte del rango a sumar. Entonces
tenemos que expresar el rango de forma variable.

En Excel es fácil sumar este rango mediante una sencilla fórmula. Pero VBA no contiene
ninguna función igual. Entonces hay que hacer que VBA utilice las funciones de Excel.

Utilizar funciones Excel en VBA


Tenemos un rango varSuma, el rango a sumar. Para sumar las celdas de este rango tenemos
que llamar a la función SUM de Excel.

Application.WorksheetFunction.Sum(varSuma)

De esta manera puedes aplicar cualquier fórmula de Excel en VBA, con tal de que
empieces la línea de código con

Application.WorksheetFunction...
Nuestro ejemplo
En este ejemplo el rango que nos interesa sumar son los valores correspondientes a “BB”,
es decir C8:C13.

Escribir la suma (en celda)


'el rango a sumar
varSuma = Range(Cells(8, 3), Cells(13, 3))
'sumar el rango
Cells(1, 1) = Application.WorksheetFunction.Sum(varSuma)

<h2>Escribir la suma (variable)</h2>


<div class="cb">
<pre>

'el rango a sumar


varSuma = Range(Cells(8, 3), Cells(13, 3))
'sumar el rango
SUMA = Application.WorksheetFunction.Sum(varSuma)

Introducción a los formatos personalizados


¿Qué son los formatos personlizados?
A veces los formatos predefinidos de Excel no dan – hace falta aplicar un formato
personalizado a tus celdas.
Con bastante frecuencia quiero que celdas que contienen fechas tengan el formato AAAA-
MM-DD (año-mes-día, 2004-01-17) como algunos sistemas informáticos trabajan con este
formato.

Pero hay un problema; este formato no siempre está presente en todos los ordenadores.
Entonces se crea su propio formato AAAA-MM-DD.

Crear un formato personlizado


El diálogo de Formatos se abre tecleando Ctrl+1 o desde el menú contextual (click derecho
en celda, Formato de celdas, Número, Personalizada. A la derecha, en la caja de texto Tipo
se entra el formato.
Unos ejemplos sencillos
Empezamos con unos ejemplos para que veas el efecto del formato.

Formato Valor celda Output celda

AAAA-MM-DD 17-ene-04 2004-01-17

MMMM 17-ene-04 Enero

DDD 17-ene-04 Sab

[Azul][>0,00]0%;[Rojo]-[<0,00]0%;- -0,45 -45%

El ejemplo arriba: Azul/formato porcentaje sin decimales si mayor que 0,00. Rojo si menor que
0,00.
‘-’ si equivale a 0,00.

#.##0,00 1125100012,2587 1.125.100.012,26

#.##0,00 52,21 52,21

0000,00 52,21 0052,21

#” “??/?? =7/2 3 1/2

##0,0E+0 100000 100,0E+3

Números
Aquí decides la presentación de números (valores). Intenta encontrar formatos que sean
“fáciles” y eficaces. Un formato extendido en contabilidad es:

Número: Decimales = 2, Separador de miles = Sí

En vez de presentar un dinero así: 125050000,7 debes aplicar un formato como:


125.050.000,69

Como puedes ver en el primer ejemplo, la celda contiene un valor que termina en ,69.
Luego el formato dice cuántos decimales se van a mostrar.

Hay unos atajos rápidos para formatear celdas.


CTRL + SHIFT + ! = 2 decimales/separador miles
CTRL + SHIFT + % = porcentaje
CTRL + SHIFT + # = formato fecha

Algunos códigos útiles de Macros de Excel + Libro Macros

Estoy armando un listadito de códigos muy útiles para usar cuando estás
desarrollando una macro.
Los voy compartiendo y actualizando a medida que voy avanzando.
A fines del año pasado empecé a hacer varias macros en el laburo, y la verdad
que ahora quiero hacer todo con macros.
Hace mucho tiempo que uso Excel, y la verdad que las macros le dan un giro muy
groso, y eso que apenas estoy aprendiendo!!!

Además subo y comparto un libro en .pdf que está muy bueno, con el cual estoy
aprendiendo "formalmente", y no solo por prueba-error. Lamentablemente el libro
está en inglés, así que no va a ser útil para todos. Pero como para escribir macros
hay que usar comandos en inglés supongo que muchos lo van a aprovechar.

Una aclaración que no está de más, soy un simple usuario de Excel, del palo de la
contabilidad y los números, que sabe algo de inglés, y que tiene una curiosidad
enorme.Si alguien anda por un camino parecido al mio, ánimo que muchas veces
parece que no damos pie con bola, pero al final sale!

El Grabador de macros que trae Excel...


A ver, alguien que estudio o que ya tiene un manejo avanzado de macros va a
decir que es una porquería, y algo de razón tiene.
Pero a favor tengo que decir que me ha resultado muy útil para empezar, y que
me sigue siendo útil cuando quiero hacer algo que no sé con qué código será. Una
vez que aprendes a leerlo y corregirlo el grabador de macros es una herramienta
más.

Bueno, aquí van los primeros códigos

Codigo

No mostrar el trabajo de la Macro


-No se ve lo que va ejecutando-
Application.ScreenUpdating = False

No calcular automaticamente
-Es igual a configurar en las opciones de Excel "Calcular=Manual"-

Application.Calculation = xlManual

Pegar formulas
-Es lo mismo a "Pegado especial -> Fórmulas"-

Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, SkipBlanks_


:=False, Transpose:=False
Application.CutCopyMode = False

Pegar valores
-Es lo mismo a "Pegado especial -> Valores"-

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks_


:=False, Transpose:=False
Application.CutCopyMode = False

Ocultar hoja
-En este caso oculta Hoja1-

Worksheets("Hoja1" ).Hidden True

Mostrar el trabajo de la Macro


-Deshace lo que hicimos con ocultar-

Application.ScreenUpdating = True

Guardar como y cerrar


-Aquí va a abrir dos cuadros pidiendo al usuario que ingrese una nombre primero y después una
carpeta, guarda y cierra-

Dim NombreLibro As String


Dim RutaGuardado As String
NombreLibro = InputBox(""Guardar como:"" ) & "".xlsm""
RutaGuardado = InputBox(""Guardar en la carpeta:"", , ""C:Mis documentos"" )
Dim NombreyRuta As String
NombreyRuta = RutaGuardado & NombreLibro
ActiveWorkbook.SaveAs Filename:=NombreyRuta
ActiveWorkbook.Close False

Ocultar varias hojas


-Lo mismo que ocultar una, pero para varias usando un Array-
Sheets(Array(""Hoja1"", ""Hoja2"", ""Hoja3"" ).Select
ActiveWindow.SelectedSheets.Visible = False

Encontrar Ultima fila


-Este código es muy bueno porque encuentra la última fila, cosa que puede variar entre un reporte
y otro-

Dim ULTIMAFILA as String


ULTIMAFILA = Cells(Rows.Count, 1).End(xlUp).Row

Filtrar y copiar registros unicos


-En este caso filtra el rango A1:A4 y copia valores únicos a G1

Range(""A1:A4"" ).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range(""G1"" _


), Unique:=True

Programar una función de redondeo

R edondear un número es una tarea común que podemos hacer con la fórmula de Excel
REDONDEAR. En éste post nos proponemos programar una función en VBA, mediante una macro,
que produzca el redondeo.

Redondear a cero decimales


Comencemos redondeando a cero decimales. Así el número 3,14159 (¡me suena este número!) se
puede redondear a cero decimales como 3. Y el número 2,7182818 (y éste ¿me debería sonar?) se
puede redondear a cero decimales como 3.
Código:

Function Redondealo(n As Double) As Double


If n >= Int(n) + 0.5 Then
Redondealo = Int(n) + 1
Else
Redondealo = Int(n)
End If
End Function

El primer número visto es pi que se obtiene con la función de Excel

=PI()

El segundo número visto es e, que es la base de los logaritmos neperianos. También podemos
decir que es la exponencial de 1. En Excel se puede calcular con la siguiente expresión:

=EXP(1)

Si aplicamos la función definida por el usuario Redondealo obtendremos en ambos casos el valor
de 3.

=Redondealo(PI())
=Redondealo(EXP(1))

Redondear invocando la función de Excel


Todas las funciones disponibles en Excel se pueden invocar mediante una macro. El código
requiere que la función a la que llamemos esté escrita en inglés. Para obtener un listado de la
funciones en inglés puede consultar el siguiente enlace.

http://trucosexcel.blogspot.com/2008/10/glosario-traduccin-de-funciones.html

La función REDONDEAR en español equivale a la función ROUND en inglés. La expresión que


hemos de utilizar en VBA para invocar a esta función es la siguiente:

Application.WorksheetFunction.round(número, precisión)
Código:

Function SuRedondeo(numero, precision)


SuRedondeo = Application.WorksheetFunction.Round(numero, precision)
End Function

Programemos la función
Con la función Redondealo fuimos capaces de redondear a cero decimales. En esta ocasión vamos
a introducir la variable p que recoge la precisión del redondeo. La función se llama MiRedondeo y
el código es el siguiente.

Código:

Function MiRedondeo(n As Double, p As Single) As Double


If n * 10 ^ p >= Int(n * 10 ^ p) + 0.5 Then
MiRedondeo = Int(n * 10 ^ p + 1) / (10 ^ p)
Else
MiRedondeo = Int(n * 10 ^ p) / (10 ^ p)
End If
End Function

Podemos ver el resultado aplicado a Pi y a e.


Public Function redn(nnum As Double, nxx As Single) As Double

cal0 = Int(nnum)

cal1 = dec(nnum)

cal2 = cal1 * 10 ^ nxx

cal3 = Int(cal2)

cal4 = cal2 * 10 ^ (nxx - 1)

cal5 = Int(cal4)

cal6 = dec(cal5 / (10 ^ (nxx - 1)))

cal7 = cal6 / (10 ^ nxx)

comp = 5 / (10 ^ (nxx + 1))

If cal7 >= comp Then

cal8 = cal3 + 1

Else
cal8 = cal3

End If

redn = cal0 + (cal8 / (10 ^ nxx))

End Function

También podría gustarte