Вы находитесь на странице: 1из 15

MACROS: Conceptos bsicos

Esta pgina intenta ser una gua no solo para el que se inicia en el tema VBA sino tambin para aquellos que, conociendo el
tema, no recuerdan tal o cual instruccin o buscan ampliar sus conocimientos con otros ejemplos.
Los temas se encuentran separados en categoras, desde un repaso por las instrucciones bsicas, hasta macros ms
desarrolladas. Desde la seccin Ejemplostambin se pueden descargar libros con ms rutinas.
Como casi siempre hay ms de una forma de programar un evento, podrn observar que a veces se escribe una lnea O la
otra. Quiere decir que puedo utilizar cualquiera de las 2. (Nunca las 2 juntas!)
Los temas estn divididos en 2 grupos principales: Conceptos e Instruccionesbsicas (ver ndice de contenidos en
margen izquierdo)

MACRO:

Una macro es un conjunto de instrucciones escritas en lenguaje Visual Basic, siendo VBA (Visual Basic for
Applications) una variante para el paquete Office.
Este conjunto de instrucciones nos permite automatizar tareas que debemos efectuar peridicamente como as tambin
aquellas que nos pueden insumir tiempo de trabajo (casos como los de comparar datos o filtrar por distintos criterios, etc.)
Ejemplos de tareas que podemos 'programar': ocultar ciertas hojas al abrir el libro, insertar hojas al llenar una celda con
cierto dato, control de contenidos antes de imprimir, crear copia del libro antes de guardar, enviar mails a criterio, y tantas
otras. Son todas tareas que pueden ser automatizadas mediante rutinas o macros.
NOTA: las imgenes se obtuvieron con Excel 2010 por lo que puede variar en otras versiones.
Excel 2003 o anterior: Las opciones de Macros se encuentran desde men Herramientas, Macros.
Excel 2007 o posterior: se encuentran en ficha Programador (o Desarrollador). Si esta ficha no se encuentra visible se la
activa desde men Archivo, Opciones, Personalizar Cinta de Opciones y tildar la ficha Programador (o Desarrollador).

ELEMENTOS DE UNA MACRO: para automatizar una tarea mediante una macrobsicamente se necesitan los
siguientes elementos:
1- un espacio de trabajo donde escribir las instrucciones o rutinas que harn esas tareas: el Editor de Macros. A este
espacio se accede con el atajo de teclado Alt+F11 o desde el men Macros.
Una vez en ese 'espacio' del Editor escribiremos o copiaremos las rutinas y sea en mdulos, o en el objeto HOJA o en
ThisWorkbook, segn el tipo de macro como veremos en el tema siguiente.
2- una accin que har que la tarea programada se ejecute. A esto llamamos 'Eventos'que inician una macro y pueden ser:
abrir o cerrar un libro, entrar o salir de una hoja, cambios o seleccin de celdas, antes de imprimir o guardar, el 'clic' en un
botn de comando, al presionar un atajo de teclado, y otros ms.
3- un lenguaje de programacin. En Excel utilizamos VBA (Visual Basic para Aplicaciones)
4- Ocasionalmente un formulario llamado Userform donde trabajar para luego volcar los resultados en las hojas.

DNDE COLOCAR UNA MACRO:

esto depender de lo que deba ejecutar nuestra rutina.

Si las instrucciones deben ejecutarse, por ejemplo, al abrir o cerrar un libro, se colocan en el objeto ThisWorkbook (o
EsteLibro segn la versin).
Si las instrucciones deben ejecutarse al entrar o salir de una hoja o al seleccionar o modificar una celda, se colocan en
el objeto Hoja. Estos objetos se encuentran en el margen izquierdo del Editor, en la ventana Proyecto-VBAProyect.
Si nuestra rutina ser llamada con un botn, atajo de teclado o desde otra rutina, se colocar en un mdulo (estando en el
Editor, men Insertar, Mdulo).
Las instrucciones para los controles de un formulario o Userforms se colocan en la seccin Cdigo del mismo formulario.

CMO EJECUTAR UNA MACRO:

En el punto anterior se menciona que se necesita una 'accin' que dispare o


ejecute una macro grabada.
Veamos los distintos casos:
1- Una accin automtica resultado de un evento, ya sea a nivel libro, hoja, rango o celda.
En este grupo se encuentran las rutinas que se ejecutan en la apertura o cierre de libro, al entrar o salir de una hoja, al
seleccionar o cambiar valores en celda Son las que se colocan en el objeto HOJA o ThisWorkbook, como se menciona en
tema anterior.
2- Al presionar un botn dibujado en la hoja. Podemos utilizar botones de la barra'Cuadro de controles o ActiveX' o de la
barra 'Formularios'. En versin 2003 se encuentra en Men Ver, Barras de Herramientas. En versin 2007 o posterior desde
la ficha Programador.
Dibujamos el control en la hoja, ajustamos algunas propiedades como texto, tamao, ubicacin. Al hacer clic derecho sobre el
control optamos por 'Ver cdigo' o 'Asignar macro' segn qu barra de herramientas hemos utilizado.
aCuadro de controles: al optar por 'Ver cdigo' nos llevar al Editor, al objeto HOJA donde se generar
automticamente una rutina con estas 2 instrucciones:

Private Sub CommandButton1_click()


'aqu escribiremos nuestras instrucciones
End Sub
bFormularios: ya debemos tener lista la rutina en un mdulo del Editor y la asignaremos cuando optemos
por 'Asignar macro'.
Las rutinas para este caso comienzan con 'Sub' y se ven son como este ejemplo:
Sub nombre_rutina()
'nuestras instrucciones
End Sub
3- Ejecutar un atajo de teclado: En estos casos tendremos ya una rutina como la del punto anterior (b) en un mdulo del
Editor.
Volvemos a la hoja Excel, y desde la ficha Programador, grupo Cdigo, Macros, seleccionamos la nuestra desde la lista que se
nos ofrece. Presionamos el botn 'Avanzadas' e ingresamos una letra, por ejemplo 't' (sin las comillas)
Nota: Si Excel ya tiene asignada esta letra la reemplazar por Ctrl+Maysc +t Esto significa que en el momento que
necesitemos que la macro se ejecute presionaremos juntas las teclas Ctrl + t (o Ctrl+Mayusc+t)
4- Desde el men Macros de la ficha Programador, grupo Cdigo: buscamos la macro desde la lista y presionamos el botn
Ejecutar.

REFERENCIAS:

Veamos algunos ejemplos para observar los diferentes modos de referirnos a libros, hojas y celdas.

Nota: Una vez copiada una instruccin o cdigo en el Editor, colocar el cursor sobre la palabra en negrita y presionar F1 para
acceder a la Ayuda Excel. All se encontrarn ms explicaciones y ejemplos para cada instruccin.

WORKBOOK : Libro de trabajo.


ActiveWorkbook
Workbooks(2)

'Libro activo.
'El segundo libro abierto.

Workbooks("Mio.xlsm")

'Se menciona al libro llamado Mio.

Workbooks(milibro)

'Llamada a un libro cuyo nombre se encuentra en una variable llamada 'milibro' (*)

*Si el nombre del libro se encuenta en una variable, NO lleva comillas.


El nombre debe incluir la extensin.

WORKSHEET : Hoja de trabajo


ActiveSheet
'Hoja activa.
Sheets("Enero")
'Hoja de nombre 'Enero'
Sheets(3)
'Nmero de hoja segn el orden de las pestaas.
[Hoja2]

'La 2da hoja segn orden de las pestaas.

Sheets(hojita) 'Llamada a una hoja cuyo nombre se guard en la variable 'hojita'

Con una variable para el objeto hoja:

Set h3 = Sheets("Hoja3")
luego se hace referencia a ella como: h3.Select

RANGE o CELLS

rango o celda

Activecell
Range("A2")
Cells(2,1)

'la celda activa


'la celda A2
'la celda de fila 2 y columna 1 = A2 .

Cells(3,"D")

'la celda de fila 3 y col D = D3

Nota: mientras en Range se introduce la celda en el orden Col,Fila, en Cells es a la inversa: Cells(fila,col)
Range("A5:B10") 'rango desde A5 hasta B10 inclusive.
Range("E:E")
'columna E
Columns("B:D")
Range("2:2")

'columnas desde B hasta D includas.


'fila 2

Rows("4:7")

'filas 4 hasta 7 includa.

[A3]

'la celda A3

Range("A" & fila)

'celda de la col A y fila segn variable.

Range("B2").CurrentRegion.Select 'Selecciona la regin que contiene a B2.


Nota: Una regin se extiende hasta encontrar una celda vaca.
ActiveCell.Offset(2,0)

'2 filas debajo de la celda activa.

Range("B2").Offset(0,3) 'se refiere a la celda E2 (3 columnas a derecha)


Nota: Offset con valores negativos har referencia a filas por encima y columnas a laizquierda de la celda activa o
mencionada.

Ampliando un rango seleccionado. El resultado ser la seleccin del rango A1:D10


Range("A1:B5").Select
Selection.Resize(10, 4).Select

TRABAJANDO CON LIBROS:

En esta seccin veremos algunas instrucciones 'bsicas' para ser utilizadas conLIBROS.

Nota: A partir de aqu usar solo el objeto activo considerando que puede usarse algunas de las otras expresiones ya vistas
con anterioridad.

1-Abrir un segundo libro:

Workbooks.Open "C:\Mis docu\Libro1.xlsb"

Nota: Si el nombre se encuentra en una varible NO lleva comillas

Ej. 1: la variable 'librox' contiene el nombre + la extensin.

a- el librox se encuentra en la misma carpeta que el libro activo.


Workbooks.Open ThisWorkBook.Path & "\" & librox
b- la variable 'ruta' indica la carpeta que contiene el librox
Workbooks.Open ruta & "\" & librox
Nota: Si la variable 'ruta' contiene la barra final no es necesario agregarla aqu.

Ej. 2: la variable 'librox' contiene solo el nombre, sin la extensin.

Workbooks.Open ThisWorkBook.Path & "\" & librox & ".xlsm"

2-Activar un segundo libro:


Workbooks("LibroOriginal.xlsm").Activate

'o tambin: Workbooks(2).Activate , en este caso es el 2do libro abierto.

IMPORTANTE: Al abrir un libro, ste pasa a ser el libro activo. Por lo tanto no es necesario activarlo nuevamente.

3-Cerrar un libro

Ej. 1: sin guardar cambios:


Workbooks("Libro1.xlsb").Close False

'o tambin: ActiveWorkbook.Close False


Ej. 2: guardando los cambios:
ActiveWorkbook.Save
ActiveWorkbook.Close

'o en 1 sola lnea: ActiveWorkBook.Close True

4-Guardar un libro con otro nombre o ruta:

Ej. 1: La carpeta y el nombre del libro pueden guardarse en variables, como en este caso:
ruta = ThisWorkbook.Path & "\"
'o quizs: ruta = "D:\Usuarios\"
librox = "LibroCopia.xlsm"
ActiveWorkbook.SaveAs ruta & librox

IMPORTANTE: tener presente que si en las variables no se incluye barra separadora o extensin del libro, deber
agregarse en la instruccin.
ActiveWorkbook.SaveAs ruta & "\" & librox & ".xlsm"

Ej. 2: El nombre del libro (con o sin ruta) se guarda en una celda.
ActiveWorkbook.SaveAs Filename:=Range("A2").Value

Nota: en este caso como no se indica la ruta o carpeta, se lo guarda en la misma carpeta del libro activo.

5-No mostrar aviso al salir, al eliminar hoja, o cualquier aviso que queremos omitir:
Application.DisplayAlerts= False
'volverla a True al finalizar la macro.

6-No mostrar la ejecucin de la macro (movimiento de pantalla):


Application.ScreenUpdating = False
'volverla a True al finalizar la macro.

7- Obtener informacin del libro.

usuario = Application.UserName
nombre = ActiveWorkbook.Name
ruta = ActiveWorkbook.Path

'nombre de usuario del libro


'nombre del libro activo

'ruta completa donde se encuentra alojado el libro


ruta -nbre = ActiveWorkbook.FullName
'ruta y nombre con extensin del libro activo
guarda = ActiveWorkbook.Saved
'devuelve False si el libro sufri cambios desde la ltima vez que fue

8- Cambiar el modo de clculo del libro.

Application.Calculation = xlCalculationManual
'modo manual
Application.Calculation = xlCalculationAutomatic 'modo automtico

TRABAJANDO CON HOJAS

En esta seccin veremos algunas instrucciones para utilizar con HOJAS.

1-Seleccionar hojas:

ActiveSheet.Previous.Select

' selecciona la hoja anterior a la activa.

ActiveSheet.Next.Select

'selecciona la hoja posterior a la activa.

guardado

Sheets(Sheets.Count).Select

'selecciona la ltima hoja.

2-Obtener informacin de la hoja :

nbre = ActiveSheet.Name

'guarda en variable el nombre de la hoja.

nroH = ActiveSheet.Index

'guarda en variable el nmero de hoja.

If ActiveSheet.AutoFilterMode = True Then MsgBox "SI"


'indica si la hoja tiene activado el Autofiltro.

If ActiveSheet.FilterMode = True Then MsgBox "SI"


'indica si la hoja est en modo de filtro por alguna columna.

3-Copiar datos de una hoja a la siguiente:

Ej. 1: Se copia un rango previamente seleccionado a la hoja sgte.


Selection.Copy

'o tambin: Range("A5:H10").Copy

ActiveSheet.Next.Range("B2").Select
ActiveSheet.Paste

Ej. 2 : Mtodo abreviado, donde se copia en otra hoja a partir de B2


Range("A5:H10").Copy Destination:=Sheets("Base").Range("B2")

NOTA: las 'copias' tienen muchos detalles a considerar: con o sin formatos, con o sin frmulas, solo valores, etc. Todo el
tema Mover-Copiar Datos se desarrolla en la Gua Temtica N 3.

4- Mover o Copiar la hoja entera:

Se realiza una copia de la hoja activa, colocndola al final de todas.

Sheets("Hoja1").Copy After:=Sheets(Sheets.Count)

Nota: recordar que luego de la copia la hoja activa es la que se acaba de crear.

5- Renombrar Hojas:

Luego de crear la copia en el punto anterior, le asignamos nombre:

ActiveSheet.Name = "HojaNueva"

6- Ocultar filas o columnas:

ActiveCell.EntireRow.Hidden=True
ActiveCell.EntireColumn.Hidden= True

' filas
'col

Nota: para volverlas a mostrar utilizar la instruccin en False. Por ej:


Range("C1").EntireRow.Hidden = False

7-Proteger o desproteger una hoja:

ActiveSheet.Protect "contrasea"

'proteger con contrasea

ActiveSheet.Unprotect "contrasea"

'quitar la proteccin

Nota: Para obtener el cdigo con ciertos permisos que se pueden seleccionar desde la ventana de Proteccin, realizar los
pasos con la grabadora de macros.

8-Insertar filas o columnas a partir de cierta ubicacin:

'reemplazar la variable 'i' por el nro de columna


ActiveSheet.Column(i).Select
Selection.EntireColumn.Insert
'reemplazar Column por Row en caso de filas.

9-Eliminar filas o columnas:

Ej. 1: eliminar la fila 7 de hoja activa.


ActiveSheet.Rows("7:7").Select
Selection.EntireRow.Delete
Ej. 2: eliminar cierta fila de hoja 'Base'.
filx = 5
Sheets("BASE").Range("A" & filx).EntireRow.Delete
Nota: observar que no es necesario seleccionar previamente la fila.

10-Insertar una imagen en una hoja:

Ej. 1: se indica la ruta de la imagen en el mismo cdigo.


ActiveSheet.Pictures.Insert ("D:\Mis imgenes\img01.JPG")

Ej. 2: se indica la ruta de la imagen en una celda. Adems la imagen queda seleccionada.
ruta = ActiveSheet.Range("B5")
ActiveSheet.Pictures.Insert(ruta).Select

Nota: la ruta va entre comillas, por ej: "C:\Mis docu\Foto1.jpg"

11-Imprimir (o vista Previa) de la hoja seleccionada:

ActiveWindow.SelectedSheet.PrintOut Copies:=1, Collate:=True


'o tambin: ActiveSheet.PrintOut

Nota: Reemplazar PrintOut por PrintPreview para realizar solo una vista preliminar.

TRABAJANDO CON RANGOS O CELDAS

En esta seccin veremos instrucciones 'bsicas' para utilizar con CELDAS o RANGOS.

1- Guardar la direccin de una celda en una variable:

lugar= ActiveCell.Address
'guarda la referencia absoluta, por ej: $E$2

lugar= ActiveCell.Address(False, False)


'guarda la referencia relativa, por ej: E2

2- Copiar un comentario en otra celda:

ActiveCell.Offset(0,1).Value = ActiveCell.Comment.Text
'copia el comentario de la celda activa en la celda que se encuentra en la columna siguiente.

3-Eliminar o borrar celdas:

Range(rango). Select
Selection.ClearContents

Selection.Clear

'la variable 'rango' guarda una ref


'borra contenidos

'borra todo (contenidos, formatos, etc)

Nota: La expresin Cells indica el total de celdas de una hoja. Entonces la instruccin:

Cells.Clearcontents 'borra el contenido de toda la hoja activa.

4- Combinar - descombinar celdas :

Range("B1:E1").Select
Selection.Merge

Nota: Para quitar la combinacin se utilizar: Unmerge

5- Encontrar fin de rango (o primer fila/col libre) :

Range("A2", Range("A2").End(xlDown)).Select
'seleciona desde A2 hacia abajo

Range("A2", Range("A2").End(xlToRight)).Select
'selecciona desde A2 hacia la derecha

Range("D2", Range("D2").End(xlToLeft)).Select
'selecciona desde D2 hacia la izquierda

Range("A20", Range("A20").End(xlUp)).Select
'selecciona desde A20 hacia arriba

Range("A" & Rows.Count).End(xlup).Row + 1


'selecciona la primer fila libre en col A, en todas las versiones Excel

Nota: si no se suma 1 se obtendr la ltima fila con datos.

6- Algunas opciones de formato:

ActiveCell.Font.Bold = True
Range("A9").Font.Underline = True

'negrita a la celda activa


'subrayado a la celda A9

Selection.Font.Size = 12
'tamao de fuente al rango seleccionado
Selection.Font.Name = "Arial"
'tipo de fuente al rango seleccionado
Selection.Interior.ColorIndex = 3 'color de relleno al rango seleccionado
Selection.Font.ColorIndex = 6
'color de letra a las celdas seleccionadas

Nota: Para obtener formatos de color, bordes o formatos de otros rangos, se pueden realizar los pasos manualmente
con la grabadora de macros encendida. Al finalizar con todos los pasos detener la grabacin y en un mdulo del
Editor se encontrarn todas las instrucciones.

TRABAJANDO CON COLECCIONES (uso de Bucles)

En esta seccin veremos algunas instrucciones 'bsicas' para utilizarlas con COLECCIONES.

Una coleccin es un conjunto de objetos del mismo tipo: hojas, celdas, controles o Shapes, imgenes.

Para trabajar con una coleccin se programa un bucle: es decir repetir la misma instruccin para cada elemento de la
coleccin.

A continuacin algunos ejemplos de los bucles: For Each....Next, For i = n ... Next , While.....Wend

* Todos los tipos de bucles se encuentran desarrollados en la Gua Temtica N 6(+ de 40 ejemplos).

Ejemplo1: introducir un nombre para cada hoja del libro activo. Esta rutina se coloca en un mdulo:

Sub nombraHojas()
Dim MiNombre As String
Dim hoja As Worksheet
'controla posible error al ingresar un nombre de hoja no vlido
On Error Resume Next
For Each hoja In Worksheets
MiNombre = InputBox("Ingrese nombre para esta hoja: ")
If MiNombre <> "" Then hoja.Name = MiNombre
Next hoja
End Sub

Ejemplo2: introducir valores para cada celda de un rango (se coloca en un mdulo)

Sub colocaValores()
Dim celdita as Range
For Each celdita in ActiveSheet.Range("A1:B10")
celdita.Value = InputBox("Ingrese valor: ")
Next celdita
End Sub

Ejemplo3: introducir los mismos valores en celdas de todas las hojas (se coloca en un mdulo)

Sub valoresHoja()
Dim hoja as Sheets
For Each hoja in Sheets
hoja.Range("E3").Value = Date
hoja.Range("F3").Value = Time
Next hoja
End Sub

Ejemplo4: realizar una accin por cada valor que tome una variable i (se coloca en un mdulo)

Sub muestraNombre()
Dim i as Byte
Dim hoja as Worksheet
'se controla posible error de que no existan tantas hojas
On Error Resume Next
For i=1 to 5
Msgbox WorkSheets(i).Name
Next
End Sub

En este ejemplo se muestra el nombre de cada hoja, desde la nro 1 a la 5

Ejemplo5: realizar una accin mientras se cumpla una condicin (se coloca en un mdulo)

Sub recorreRango()
'Se recorre la col A a partir de la fila 2 hasta encontrar una celda vaca.
'El valor de cada celda se incrementa en 1
Range("A2").Select
'se controla posible error de que la celda contenga texto
On Error resume next
While Activecell.Value <> ""
ActiveCell.Value = ActiveCell.Value + 1
'pasa a la fila siguiente
ActiveCell.Offset(1,0).Select
Wend
End Sub

TRABAJANDO CON OBJETOS


A continuacin veremos algunos ejemplos de cmo llamar a objetos insertados en la hoja. Botones de comando, cuadros de
texto, Listas o Cuadros combinados, grficos y otros.

1- Uso de botn de comando:

En una hoja de Excel, los botones que lanzan una accin, pueden ser colocados con labarra de Formularios o ActiveX (Cuadro
de Controles).
a. Botn de formulario: con clic derecho sobre el control, opcin 'Asignar Macro' , seleccionar de la lista y Aceptar.
Previamente ya tendremos nuestra macro en un mdulo del Editor de Visual Basic.
Ej.1
Sub mostrando ()
'nombre del Userform que se desea mostrar
UserForm1.Show
End Sub
Ej.2
Sub ejecutando ()
Msgbox "Ests por ejecutar el pase a libro Diario."
'llamar a otra macro
Call ejecutaDiario
End Sub

b.
Ej.1

Botn ActiveX: una vez dibujado en la hoja, clic derecho, opcin 'Ver cdigo' nos llevar al Editor, a la seccin Cdigo
del objeto Hoja donde se encuentre el control.
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub

Ej.2
Private Sub CommandButton1_Click()
Msgbox "Ests por ejecutar el pase a libro Diario."
'llamar a otra macro
Call ejecutaDiario
End Sub

2- Asignando valores a Cuadros de texto:

Ejemplos de cmo colocar datos en Textbox dibujados en hoja con la barra ActiveX o 'Cuadro de controles'.
Nota: Estas instrucciones como las del punto 3 y 4, se colocan dentro de alguna rutina general, como puede ser un botn
para guardar o aceptar.
TextBox1.Value = "CANCELADO"
TextBox2 = Sheets("Hoja3").Range("A5").Value
TextBox2 = Range("C1").Value + Range("C2").Value

Nota: En Textbox2 se omiti la expresin 'value' ya que esa es su propiedad predeterminada. Puede colocarse o no.

3- Volcar datos de controles Textbox y Combobox a la hoja:


Estos controles han sido dibujados con la barra ActiveX o 'Cuadro de controles'
'pasar datos de un control Textbox a la celda indicada :
Range("B5") = TextBox1.Value
'pasar el valor de un combo a la fila siguiente de la indicada en Cells(fil, col)
Sheets("Hoja1").Cells(fila, col).Offset(1, 0).Value = Combobox1.Value
Nota: previamente se habr asignado un valor de fila y columa a las variables fil y col respectivamente.

4- Asignar rango a un control Listbox y Combobox:


Ej 1:
En una hoja, dibujar un Cuadro de lista y un Cuadro combinado, con la barra 'Formularios'.
En un mdulo, colocar esta macro que asignar un rango de valores a los controles dibujados.
Sub Lista()
'asignar rango de entrada al control Lista
ActiveSheet.Shapes("List Box 1").Select
Selection.ListFillRange = "$F$1:$F$4"
'asignar rango de entrada al control Combobox
ActiveSheet.Shapes("Drop Down 1").Select
Selection.ListFillRange = "$K$1:$K$7"
End Sub

Ej 2:
En este caso el control Lista se dibuj con la barra ActiveX o Cuadro de Controles:
Sub ListaX()
'asignar rango de entrada al control Lista
ActiveSheet.ListBox1.ListFillRange = "$F$1:$F$4"
End Sub

5- Cambiar color a serie de un grfico.


Sub colorSeries()
ActiveSheet.ChartObjects("3 Grfico").Activate
ActiveChart.SeriesCollection(1).Select
With Selection.Format.Fill
.ForeColor.RGB = RGB(0, 255, 0)
End With
Range("A1").Select
End Sub

http://aplicaexcel.galeon.com/index.htm

Вам также может понравиться