Excel. Mi primera macro

Antes de empezar a escribir una macro, debemos aclarar algunos conceptos que nos van a estar persiguiendo durante toda nuestra travesía.

Workbook. Este objeto representa un libro de excel en su conjunto, por lo tanto, será nuestra unidad de grabación, será el objeto de partida para cargar un libro, y del que colgaran todos los demás objetos.

ActiveWorkbook.Close False 'Cierra el libro sin salvar
ActiveWorkbook.Close True  'Cierra el libro, salvando
ActiveWorkbook.Close 'Cierra el libro, preguntando al usuario si quiere salvarlo
ActiveWorkbook.Path 'Devuelve el valor de la ruta del libro
ActiveWorkbook.Name 'Devuelve el valor del nombre del libro
ActiveWorkbook,SaveAs "C :/pruebas.xls" 'Guarda en otro fichero

Sheet. Este objeto es la hoja del libro, por lo que un Workbook puede tener cualquier número de Sheets

ActiveSheet.Name 'Devuelve el nombre de la hoja activa

Lista los nombres de todas las hojas del libro

For Each ws In Worksheets
     ws.Select
     Debug.Print ws.Name
Next ws

Borrar una hoja

  Application.DisplayAlerts = False
  Worksheets(shtname).Delete
  Application.DisplayAlerts = True
Worksheets.Add  ' Inserta nueva hoja
Worksheets(1).Name = "Prueba" 'Cambia el nombre a la hoja 1
Worksheets(1).Activate 'Activa (selecciona) la hoja 1
Debug.Print ActiveSheet.Name  'Muestra el nombre de la hoja activa
 Worksheets("Hoja2").Activate Àctiva la hoja llamada Hoja2
 Debug.Print ActiveSheet.Name 'Muestra el nombre externo de la hoja
 Debug.Print Hoja3.Codename ' Mostrara 'Hoja3', el nombre interno de la hoja
 Debug.Print Hoja3.Name 'muestra el nombreexterno de la hoja, por el codename

Chart. Este objeto representa un grafico de excel, y tiene una entidad propia, por lo que lo podremos referenciar dentro de una hoja.

Range(coordenadas) Representa una o mas celdas; como coordenadas podemos especificar «A1″,»A5″,»A7»  – Rango formado por varias celdas separadas «A1:A7» Rango formado por las celdas contenidas entre A1 y A7 Y lo utilizaremos para movernos dentro de la hoja;

Range("B3").AddComment "Esta es una celda de datos"

La sentencia anterior, le añade un comentario a la celda B3. A continuacion presentamos algunos ejemplos de lo que podemos hacer con un rango

Range("B3").Clear                        ' Borra contenido y formato de la celda B3
Range("B3").ClearContents          ' Borra sólo el contenido de la celda B3
Range("B3").ClearComments      ' Elimina el comentario insertado en B3
Range("B3").ClearFormats           ' Borra solo el formato de B3
MsgBox Range("E3").Column      ' Presenta el numero de columna del rango.
MsgBox Range("J3:M21").Column   ' Presenta el numero de columna del inicio rango.

Rango = "D2:F8"
MsgBox Range(Rango).Column              ' Devuelve 4

Rango = "D2:H15"
Range(Rango).Columns(3).Value = "A"      'Carga A en todas las filas, columna 3 del rango
Range(Rango).Rows(3).Value = "B"         'Carga B en todas las columnas de la fila 3 del rango

MsgBox "Ancho de B3" & vbcrlf & Range("B3").ColumnWidth 'Indica el ancho de la columna
Sheets("Hoja2").Range("B1:B6").Copy Destination:=Sheets("Hoja3").Range("E5") 'copia de una hoja a otra

Si se necesita la direccion de una celda, se puede obtener con conversión o sin al idioma local:  a continuación hay una colección de sentencias que muestra los resultados para los dos metodos

Set mc = Worksheets(1).Cells(1, 1)
    MsgBox "Local" & vbCrLf & mc.AddressLocal()                         ' $A$1
    MsgBox "Address" & vbCrLf & mc.Address()                         ' $A$1
    MsgBox "Local RowAbsolute" & vbCrLf & mc.AddressLocal(RowAbsolute:=False)      ' $A1
    MsgBox "Addres RowAbsolute" & vbCrLf & mc.Address(RowAbsolute:=False)      ' $A1
    MsgBox "Local ReferenceStyle xlR1C1" & vbCrLf & mc.AddressLocal(ReferenceStyle:=xlR1C1)  ' Z1S1
    MsgBox "Address ReferenceStyle xlR1C1" & vbCrLf & mc.Address(ReferenceStyle:=xlR1C1)  ' Z1S1
    MsgBox "Local Relativo" & vbCrLf & mc.AddressLocal(ReferenceStyle:=xlR1C1, _
        RowAbsolute:=False, _
        ColumnAbsolute:=False, _
        RelativeTo:=Worksheets(1).Cells(3, 3))       ' Z(-2)S(-2)
    MsgBox "Adress Relativo" & vbCrLf & mc.Address(ReferenceStyle:=xlR1C1, _
        RowAbsolute:=False, _
        ColumnAbsolute:=False, _
        RelativeTo:=Worksheets(1).Cells(3, 3))       ' Z(-2)S(-2)

Todo lo que hemos hecho hasta ahora ha sido posible porque en excel los objetos tienen métodos y propiedades para interactuar con ellos; por ejemplo el objeto Workbook tiene propiedades como ActiveSheet (Hoja activa), Name (Nombre), ReadOnly (Solo Lectura), Saved (Guardado) y algunos de sus métodos son Save (Guardar), Close (Cerrar), PrintOut(Imprimir), Protect (Proteger), Unprotect (Desproteger).

Respecto a Range, os dejo la página de microsoft que nos presenta este objeto.http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range_members(v=office.11).aspx

Despues de presentaros algunas posibilidades, vamos a hacer nuestro primer ejercicio de macros.

Aqui tenemos nuestro primer ejemplo

Sub cargarDatos()
    ActiveCell.FormulaR1C1 = "Meses"
    Range("A2").Select
    ActiveCell.FormulaR1C1 = "Importes"
    Range("A3").Select
    ActiveCell.FormulaR1C1 = "Personas"
    Range("B1").Select
    ActiveCell.FormulaR1C1 = "3"
    Range("B2").Select
    ActiveCell.FormulaR1C1 = "4832"
    Range("B3").Select
    ActiveCell.FormulaR1C1 = "5"
    Range("B1:B3").Select
    Selection.Style = "Comma"
End Sub

Si os fijais, voy selecionando cada celda, y despues utilizo ActiveCell para llenarla.
Aunque la solucion funcione, creo que sería mejor optimizarla

Sub cargarDatos()
    Range("A1").FormulaR1C1 = "Meses"
    Range("A2").FormulaR1C1 = "Importes"
    Range("A3").FormulaR1C1 = "Personas"
    Range("B1").FormulaR1C1 = "3"
    Range("B2").FormulaR1C1 = "4832"
    Range("B3").FormulaR1C1 = "5"
    Range("B1:B3").Style = "Comma"
End Sub

Dado que cada selecciòn solo me sirve para una acción, me ahorro el ir seleccionando y actuando, y actúo directamente sobre el rango.

Por ultimo, se podria hacer una optimización más, teniendo en cuenta que voy a cargar valores, puedo utilizar la propiedad value, con lo que las instrucciones serian:

Range("A1").Value = "Meses"
    Range("A2").Value = "Importes"
    Range("A3").Value = "Personas"
    Range("B1").Value = "3"
    Range("B2").Value = "4832"
    Range("B3").Value = "5"
    Range("B1:B3").Style = "Comma"

y hasta aquí nuestra primera macro, si vais ejecutando la macro, vereis que todas las versiones funcionan, solo se trataba de ver las posibilidades del sistema, en próximas entregas nos enfrentaremos a métodos mas difíciles.

Acerca de Miguel Garcia

Programador, Desarrollador web, Formador en distintas areas de informatica y director de equipos multidisciplinares.
Esta entrada fue publicada en Excel, Formacion y etiquetada , , . Guarda el enlace permanente.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.