domingo, 27 de noviembre de 2011

Comunicación con Word

OLE (Object Linking and Embdding) es una tecnología que nos permite manipular objetos de otra aplicación directamente desde VBA Excel.

Para poder funcionar se necesita un servidor, llamado servidor OLE.  Este servidor no es más que una aplicación que nos permite manipular sus objetos.

Para tener acceso a los objetos de la aplicación con la que queremos interactuar se debe de referenciar de la siguiente manera:

Nos vamos a la opción Referencias del menú Herramientas y nos aparece el siguiente cuadro.




En él nos aparecen todos los servidores guardados con los que podemos trabajar, en este caso seleccionamos Microsof Word 12.0 Object Library  y   Microsoft ActiveX Data Objects 2.8 Library, puedes encontrarte con alguna versión superior dependiendo de la versión Office que utilices.

En el siguiente procedimiento veremos como pegar un gráfico de una hoja Excel  en un documento Word para presentarlo.

Sub CopiarWord()
Dim appWord As New Word.Application
Dim docWord As New Word.Document
Dim rng As Range

' Agregamos un nuevo documento....
With appWord
    .Visible = True
    Set docWord = .Documents.Add
    .Activate
End With
 With appWord.Selection
    ' Le damos formato al documento......
    .HomeKey unit:=wdLine, Extend:=wdExtend
    .ParagraphFormat.Alignment = wdAlignParagraphCenter
    .Font.Size = 18
    With .Font
    .Name = "Verdana"
    .Size = 18
    .Bold = True
    .Italic = False
    .Smallcaps = True
    End With

' Copiar el grafico de excel.......
ActiveSheet.ChartObjects(1).Activate
ActiveChart.ChartArea.Select
ActiveChart.ChartArea.Copy

' Pegamos el grafico......
.TypeParagraph
.TypeParagraph
.Paste
End With

With docWord

'Guardamos el documento en la misma carpeta que el fichero Excel..
.SaveAs ThisWorkbook.Path & "\Prueba.doc"

' vista previa antes de imprimir
.PrintPreview

End With
Set appWord = Nothing

End Sub

lunes, 21 de noviembre de 2011

Objetos Chart

Una Gráfica está formada por multitud de objetos y cada uno de éstos con sus propiedades y métodos que le son propios. Esto implica que la manipulación de Gráficas en Excel con VBA puede ser tarea compleja.

En Excel podemos ubicar  un Gráfico en dos sitios:

  • Como Objeto incrustado en una Hoja de Cálculo.

Public Sub EmbeddedChart()
  Dim mychart As Chart
  Dim rng As Range
  Set rng = Worksheets(1).Range("A2:E6")
  Set mychart = ActiveSheet.Shapes.AddChart(xlColumn).Chart
  mychart.SetSourceData Source:=rng
End Sub

  • En una Hoja Gráfica.

Sub ChartSheet()
  Dim mychart As Chart
  Set mychart = ActiveWorkbook.Charts.Add
  mychart.SetSourceData Source:=Worksheets(1).Range("A2:E6"),_
PlotBy:=xlRows
End Sub

Jerarquía de Objetos Chart:

Este objeto Worksheet contiene un objeto ChartObject que a su vez contiene el objeto Chart. El objeto Chart tiene un Objeto ChartTitle (el Título del Gráfico) y este contiene una propiedad Text, que guarda el texto que se muestra en el Título.

Ejemplo: si queremos establecer el Título de un Gráfico incrustado ya creado, tendremos que codificar en VBA así:

WorkSheets(1).ChartObjects(1).Chart.ChartTitle.Text=”Ejemplo”

Un pequeño apunte sobre el método muy utilizado de SetSourceData

Está bien para establecer todas las series de datos de una sola toma, en la codificación es eficiente en términos de pequeña longitud, pero es inflexible en términos de su control sobre la salida que produce.

jueves, 17 de noviembre de 2011

Exportar un libro al formato PDF


Hola a tod@s.

Hacemos un alto en el camino para atender una petición que me llego hace unos días, me preguntaban si era posible exportar un archivo Excel o la hoja activa al formato PDF, pues bien lo he estado probando en Excel 2010 y 2007 y funciona perfectamente, os dejo el código para que lo probéis.

Es muy sencillo y fácil de entender por eso no veo necesario extenderme más, si os surge alguna duda me comentáis.

Sub ExporPdf()
    ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, _
    Filename:="Prueba", includedocproperties:=True, openafterpublish:=True
End Sub

viernes, 11 de noviembre de 2011

Crear Procedimientos Function

Ahora que sabemos prácticamente todo de los procedimientos Sub y como crearlos, es el momento de descubrir lo útiles que pueden ser los procedimientos de Function.

Solo los procedimientos de Function pueden hacer lo siguiente:
  • Derivar un valor.
  • Devolver un valor al proyecto.
La sintaxis de la instrucción Function consta de las siguientes partes:

[Public | Function nombre [(lista_argumentos)] [As tipo]


Veamos el siguiente ejemplo:


Public Function CalcEdad(fechaNac As Date)
Dim zFecha As Date
'DateDiff especifica el número de intervalos de tiempo entre dos fechas determinadas (yyyy Año).
CalcEdad = Abs(DateDiff("yyyy", fechaNac, Date))
'DateAdd Devuelve un valor de tipo Variant (Date) con una fecha a la que se ha agregado un intervalo de tiempo especificado.
zFecha = DateAdd("yyyy", CalcEdad, fechaNac)
If zFecha > Date Then CalcEdad = CalcEdad - 1
End Function 


Este ejemplo nos muestra la importancia de los argumentos de las funciones, cuanto más explícito sean, más fácil serán de usar en la función.

Todas las funciones declaradas en Public están disponibles en el asistente de funciones en la categoría Funciones Definidas por el Usuario.





El resultado de la formula con esta función quedaría de la siguiente forma en Excel.




domingo, 6 de noviembre de 2011

Cuadro de Diálogo

En la mayoría de aplicaciones Windows el usuario hace uso de los cuadros de diálogo para establecer opciones o introducir información que la aplicación necesita para realizar la acción indicada por el usuario.

La función MsgBox
La función MsgBox muestra información y espera una respuesta.  Es una muy buena forma de distribuir la información y obtener la devolución de una respuesta simple.
La sintaxis de la función MsgBox consta de estos argumentos.

MsgBox(Comentario[, botón][, título del cuadro])

En esta tabla describimos las opciones para los ajustes de botón, el estilo de icono y la asignación de botón predeterminado.

Constante
Valor
Descripción
VbOKOnly
0
Muestra solamente el botón Aceptar.
VbOKCancel
1
Muestra los botones Aceptar y Cancelar.
VbAbortRetryIgnore
2
Muestra los botones Anular, Reintentar e Ignorar.
VbYesNoCancel
3
Muestra los botones Sí, No y Cancelar.
VbYesNo
4
Muestra los botones Sí y No.
VbRetryCancel
5
Muestra los botones Reintentar y Cancelar.
VbCritical
16
Muestra el icono de mensaje crítico.
VbQuestion
32
Muestra el icono de pregunta de advertencia.
VbExclamation
48
Muestra el icono de mensaje de advertencia.
VbInformation
64
Muestra el icono de mensaje de información.
VbDefaultButton1
0
El primer botón es el predeterminado.
VbDefaultButton2
256
El segundo botón es el predeterminado.
VbDefaultButton3
512
El tercer botón es el predeterminado.
VbDefaultButton4
768
El cuarto botón es el predeterminado.
VbApplicationModal
0
Aplicación modal; el usuario debe responder al cuadro de mensajes antes de poder seguir trabajando en la aplicación actual.
VbSystemModal
4096
Sistema modal; se suspenden todas las aplicaciones hasta que el usuario responda al cuadro de mensajes.

Sub Mensaje()
    Dim Respuesta As Integer
    Respuesta = MsgBox("Seleccione Aceptar o Cancelar", vbOKCancel)
    ' verificamos si se presionó 'Cancelar'
If Respuesta = vbCancel Then
    MsgBox "Selecciono Cancelar"   
    End If
    If Respuesta = vbOK Then
    MsgBox "Selecciono Aceptar"  
    End If
End Sub

La función InputBox
La función InputBox crea un cuadro de mensaje especial que hace la siguiente:
  • Muestra un apunte solicitado un solo bit de información con un cuadro de texto vacío.
  • Espera que el usuario introduzca el texto o haga clic en un botón.
  • Devuelve el contenido del cuadro de texto con la respuesta del botón al procedimiento que llamo a la función.

La sintaxis de la función es la siguiente:

InputBox(Comentario[, título del cuadro][, respuesta predeterminada en el cuadro de texto][, Tipo de dato])

Sub Nombre()
Dim Nombre As Variant
Nombre = Application.InputBox(prompt:="Escriba su nombre", Title:="Registro de nombres", Default:="Pedro", Type:=2)
Msgbox Nombre 
End Sub

sábado, 5 de noviembre de 2011

Enfrentarse a los errores

Pueden aparecer los siguientes tipos de errores al escribir y ejecutar procedimientos VBA:

Sintaxis y errores gramaticales:
Estos son los errores más fáciles de corregir, porque el editor ayuda a encontrarlos, si no son corregidos estos provocan un error de compilación, de  ahí el mensaje que aparece.



Errores en tiempo de ejecución:
Estos errores no pueden ser detectados hasta que no se ejecuta el procedimiento en su entorno final.

Errores lógicos:
Estos errores simplemente dan una respuesta equivocada, el procedimiento hace justo lo que le hemos dicho que haga, pero el resultado no es el esperado.

Administración de errores
Hay errores que pueden hacer que VBA se comporte de forma imprevisible.
Para evitar esto, es posible manejar el error con ayuda de las siguientes instrucciones y funciones:

On Error: Indican una secuencia de instrucciones que se ejecutan en caso de error.

Sub GOTOMacro()
Dim X, Y
On Error GoTo CasoError
    Y = [A1] / [B1]
    ' Si diera error, saltaría a la línea 'CasoError'
        For X = 1 To 50
        Cells(X, 1) = X
    Next X
Exit Sub
CasoError:
    MsgBox "Ha surgido un error, intente con otros valores en A1 y B1"
End Sub

Resumen: La instrucción Resumen nos permite seguir con la ejecución del código cuando termina la rutina de administración del error.

Hay tres sintaxis diferentes:
  • Resumen O: reanuda la ejecución del código donde se produjo el error.
  • Resumen Next: reanuda a partir de la instrucción siguiente.
  • Resumen Linea: reanuda en una línea específica.

Sub Macro ()
' Si hay un error lo ignora y continúa ejecutando el resto del código
On Error Resume Next
' Aquí iría el resto del código
End Sub



El Objeto Range.

EL objeto Range representa un rango de celdas y pude estar constituido por:
  • Una celda.
  • Una fila.
  • Una Columna.
  • Un rango de celdas contiguas o no.
  • Un rango 3D.


Esto nos puede dar una idea de que nos encontramos frente al objeto más importante de Excel.

Los siguientes métodos y propiedades devuelven un objeto Range:
  • Propiedad Range
  • Propiedad Cells
  • Range y Cells
  • Propiedad Offset (representa un rango desplazado con respecto al rango especificado)
  • Método Union (Devuelve la unión de dos o más rangos)


El ejemplo siguiente modifica el contenido y el color de celdas.

Sub llenado()
Dim celda As Range
Application.Cells(1, 2) = "Enero"
Application.Range("A1:G10").Cells(2, 2) = "Febrero"
Application.Cells(3, 2) = "Marzo"
    For Each celda In Range("C1:D3")
        celda.Interior.Color = vbRed
    Next celda
End Sub

No profundizaremos más ya que este objeto nos lo iremos encontrando en cada uno de los ejemplos que desarrollaremos.

martes, 1 de noviembre de 2011

El Objeto Workbooks

El objeto Workbook representa un libro Microsoft Excel. La colección Workbooks contiene todos los Workbook objetos abiertos en Microsoft Excel.

Ejemplos de métodos:

Use el método Open para abrir un archivo. Así se crea un libro nuevo para el archivo abierto. En el siguiente ejemplo se abre el archivo Prueba.xls como un libro de sólo lectura.

Workbooks.Open FileName:="Prueba.xls", ReadOnly:=True

Use el método Add para crear un nuevo libro vacío y agregarlo a la colección. En el siguiente ejemplo se agrega un libro nuevo vacío a Microsoft Excel.

Workbooks.Add

Use el método Close para cerrar el  libro. En el siguiente ejemplo se cierran todos los libros abiertos.

Workbooks.Close

Ejemplos de Propiedades:

Use la propiedad Name para que nos devuelva el nombre del libro.

Workbooks.Name

Use la propiedad Path para que nos devuelva la ruta de acceso al archivo del libro.

Workbooks.Path

Use la propiedad Author para que nos devuelva el autor del libro.

Workbooks.Author

Probemos ahora a exportar un libro Excel a formato pdf.

Sub pdf()
ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:="Prueba", includedocproperties:=True, openafterpublish:=True
End Sub

EL Objeto Application

El objeto Application representa la aplicación de Microsoft Excel activa. Es el objeto por defecto y, por lo tanto, es generalmente opcional.

Las principales opciones de Excel  pueden ser definidas a partir de propiedades del objeto Application la mayoría de estas propiedades son de lectura.

Application es el objeto superior, así el primer ejemplo, siguiendo toda la jerarquía de objetos quedaría de la siguiente forma:

Sub Hola ()
Application.WorkBooks(1).WorkSheets(1).Range("A1").Value = "Hola"
End Sub

Las propiedades del objeto Application se divide en cuatro grupos:
  • Propiedades que controlan el estado
  • Propiedades que controlan la presentación
  • Propiedades que devuelven objetos
  • Propiedades que controlan la manipulación de los archivos

Las propiedades que controlan el estado definen el ambiente donde se ejecuta el Excel.

Toquemos un poquito el interfaz

Sub Interfaz()
With Application
.Caption = "Aplicación " & .Name _
& " Versión: " & .Version
.StatusBar = "VB para Aplicaciones (Excel)"
.WindowState = xlMaximized
.StandardFont = "Verdana"
.StandardFontSize = 12
End With
End Sub