You are on page 1of 15

Las UDFs no pueden ser compuestas por la grabadora de macros.

Aunque en
algunos casos se puede grabar una macro y convertirlo en una UDF editando el
cdigo, la mayora del tiempo se crea una UDF
escribiendo el cdigo
directamente en un mdulo estndar.
Anatoma de una UDF
Al disear una UDF, permite para considerar tres preguntas:
Cul es propsito de la funcin, es decir, qu quieres lograr?
Qu argumentos, si aplican, necesita la funcin?
Qu resultado dar la funcin, una frmula o proveer un resultado a su
Call en una macro?
Una UDF siempre comienza con la instruccin Function y termina con la
instruccin End Function. Si no desea que su funcin sea visible slo a otro
cdigo en el mismo mdulo, es mejor declarar la funcin como pblica, u omitir
el calificativo de pblico y privado en conjunto, que por defecto es el alcance
de la funcin pblica. Cuando se declara una UDF como pblico, aparece en la
lista de funciones en el cuadro de dilogo Insertar funcin.
Aqu est un ejemplo de la sintaxis general de una UDF:
Function name([argument list]) as type
'Declaraciones de VBA que conforman la funcin
[name = returned expression]
End Function
Despus de nombre de la funcin es la lista de argumentos, que es incluida
en parntesis. Si tienes dos o ms argumentos, cada uno separado por una
coma y un espacio. No todos UDF requiere argumentos, pero el parntesis se
requiere inmediatamente despus del nombre de la funcin. Siguiendo la lista
de argumentos es opcional (pero muy recomendable) del tipo de datos,
dependiendo del propsito de la funcin.
Aqu es un ejemplo de una UDF que no requiere ningn argumento. Devuelve la
ruta completa de la aplicacin de Microsoft Excel en su computadora:
Function xlPath() As String
xlPath = Application.Path
End Function

Ejemplo Suma en Celdas Sombreadas


Una pregunta que frecuentemente surge es cmo sumar los nmeros que se
encuentran slo en celdas coloreadas de un cierto rango. Si las celdas fueron
coloreadas por formato condicional, la solucin podra ser en definitiva ese
rango de celdas basada en la condicin, como por ejemplo utilizando la funcin
SUMIF. Sin embargo, evaluar la propiedad de una clula - en este caso su color
interior o de relleno es ms difcil porque ninguna funcin incorporada es
capaz de hacer eso.
Por ejemplo, el cuadro anexo muestra una lista de nmeros en la gama de
A2:A15, donde algunas clulas son de color gris y algunos no son. La tarea es
sumar los nmeros en celdas de color gris.

Fuera del rango, celda C1 tiene el doble propsito de obtener el resultado de la


UDF, y tambin mostrar el color que necesita sumar. Con este enfoque, la UDF
slo necesita un argumento para especificar el rango de suma:

Function SumColor(RangeToSum As Range) As Long


'Declaramos las variables necesarias
Dim ColorID As Integer, ColorCell As Range, mySum As Long
'Identificar la variable ColorID para que sepas qu color buscar.
ColorID = Range(Application.Caller.Address).Interior.ColorIndex
' Bucle a travs de cada celda del rango.
For Each ColorCell In RangeToSum
'Si el color de la celda coincide con el color que buscas,
'mantener un subtotal agregando valor de nmero de la clula
'a la variable mySum.
If ColorCell.Interior.ColorIndex = ColorID Then mySum = mySum + ColorCell.Value
Next ColorCell
'Las celdas se han evaluado, por lo que puede definir la funcin SumColor
'igual a la variable mySum.
SumColor = mySum
End Function

La entrada en la celda que C1 es =SumColor(A2:A15) . La UDF recorre cada


celda del rango A2:A15 y en el camino mantiene un funcionamiento total con la
variable mySum cuando se encuentra una celda gris.
Al final del cdigo de la UDF, nombre de la funcin SumColor se encuentra
configurada para coincidir con la variable mySum y permite la UDF devolver 16
como la suma de celdas de color gris.

Extraer nmeros o letras de una lnea alfanumrica


Una pregunta comn es cmo extraer los nmeros o las letras de una lnea que
contiene una mezcla de ambos. Si los nmeros o las letras estuviesen en
lugares predecibles u ordenados en forma consistente (como en las placas de
los automviles), las frmulas prediseadas haran el trabajo, pero se vuelve
complicado si la lnea contiene una combinacin impredecible de caracteres
como los siguientes:

Los siguientes son dos UDF similares: una extrae solo los nmeros de una lnea
alfanumrica y otro que extrae solo las letras.
Function ExtractNumbers(strText As String)
'Declara las variables necesarias
Dim i As Integer, strDbl As String
Bucle en cada caracter de la celda
For i = 1 To Len(strText)
'Si el caracter es un dgito, lo aadir a la variable strDbl
If IsNumeric(Mid(strText, i, 1)) Then
strDbl = strDbl & Mid(strText, i, 1)
End If
Next i
'Cada caracter en la celda ha sido evaluado, as que puedes definir la
'funcin ExtractNumbers igualndola a la variable strDbl.
'El propsito de la funcin CDbl es convertir la expresin strDbl
'en un dato numrico tipo Double.
ExtractNumbers = CDbl(strDbl)
End Function

Function ExtractLetters(strText As String)


'Declara las variables necesarias
Dim x As Integer, strTemp As String
Bucle en cada caracter de la celda
For x = 1 To Len(strText)
'Si el caracter es no numrico, debe ser una letra,
'as que adela a la variable strTemp
If Not IsNumeric(Mid(strText, x, 1)) Then
strTemp = strTemp & Mid(strText, x, 1)
End If
Next x
'Cada caracter en la celda ha sido evaluado, as que puedes
'funcin ExtractLetters igualndola a la variable strTemp
ExtractLetters = strTemp
End Function

definir la

PROGRAMANDO TABLAS PIVOTE Y GRFICOS


PIVOTE (TABLAS DINMICAS)
Cuando se crea una tabla dinmica manualmente, Excel no te molesta con los
detalles PivotCache. Si vas a crear una Tabla Dinmica en VBA, necesitars
configurarla en el cdigo. Supongamos que ests creando nueva tabla
dinmica basada en ciertos datos. Su primer paso ser programar VBA para
decirle a Excel cuatro puntos de informacin:
1.
2.
3.
4.

Quieres agregar una cach dinmica (PivotCache) en el libro.


La ubicacin de los datos fuente.
Basado en los puntos 1 y 2, crear la tabla dinmica.
Especificar donde se colocar la tabla dinmica.

Suponiendo que la hoja de clculo con los datos de origen es la hoja activa, y
que desea que tabla dinmica que se ubique junto a los datos de la fuente, la
macro siguiente manejara todas esas instrucciones:
Sub CreatePivot()
ThisWorkbook.PivotCaches.Add _
(SourceType: = xlDatabase, _
SourceData:=Range("A1"). CurrentRegion). CreatePivotTable _
TableDestination: = "R4C" & Range("A1").
CurrentRegion.Columns.Count + 2
End Sub
El resultado que obtienes es una tabla dinmica, pero nunca lo sabras por su
apariencia en el momento, un curioso rango de cuatro celdas parezca fueron
formateados para delgadas fronteras. En este ejemplo, son las cuatro celdas en
el rango H4:I5
En realidad, con la macro anterior ejecutada, se puede seleccionar una de las
cuatro clulas y aparece la lista de campos de tabla dinmica, invitndole a
que arrastre los mismos a su localizacin deseada.

MANIPULANDO LOS PIVOTFIELDS EN VBA


PivotFields son las reas de fila y columna en las que se colocan los nombres
de los campos dependiendo de cmo se desea mostrarlos en la tabla dinmica.
Las siguientes piezas de cdigo VBA realizan la colocacin de los PivotFields
como si fueran hechos en forma manual en la tabla dinmica.
Dos campos (Region y StoreID) se colocan como etiquetas de fila y un campo
(When) se coloca como una etiqueta de columna. El campo Revenue se coloca
en el rea de valores (Values), y el rea de filtros (Filters) est poblada por el
campo Items.
With ActiveSheet.PivotTables(1)
'Primer campo de fila (exterior).
With .PivotFields("Region")
.Orientation = xlRowField
.Position = 1
End With
'Segundo campo de fila (interna).
With .PivotFields("Store ID")
.Orientation = xlRowField
.Position = 2
End With
'Campo de columna.
With .PivotFields("When")
.Orientation = xlColumnField
.Position = 1
End With
'rea de filtros.
With .PivotFields("Item")
.Orientation = xlPageField
.Position = 1
End With
'Revenue en el campo Values.
.AddDataField ActiveSheet.PivotTables(1).PivotFields("Revenue"), _
"Sum of Amount", xlSum
End With

MANIPULACIN DE PIVOTITEMS CON VBA


PivotItems son programables en las tablas dinmicas (PivotTables) y como
ejemplo, se pueden arreglar para ver a un PivotItem particular en un campo. En
una tabla dinmica creada anteriormente, agreg un Campo de Regin.
Suponga que slo sedesea ver la actividad spara el PivotItem North y ocultar
los PivotItems South, East y West PivotItems.
La siguiente macro nos sirve:
Sub ShowSingleItem()
Dim objPivotField As PivotField
Dim objPivotItem As PivotItem
Set objPivotField = _
ActiveSheet.PivotTables(1).PivotFields(Index:="Region")
For Each objPivotItem In objPivotField.PivotItems
If objPivotItem.Name = "North" Then
objPivotItem.Visible = True
Else
objPivotItem.Visible = False
End If
Next objPivotItem
End Sub
La macro siguiente muestra todos los PivotItems:
Sub ShowAllItems()
Dim objPivotField As PivotField
Dim objPivotItem As PivotItem
Set objPivotField = _
ActiveSheet.PivotTables(1).PivotFields(Index:="Region")
For Each objPivotItem In objPivotField.PivotItems
objPivotItem.Visible = True
Next objPivotItem
End Sub

CREAR UNA COLECCIN DE TABLAS DINMICAS (PIVOTTABLES)


Las tablas dinmicas son objetos para los cuales hay un objeto Collection, tal
como existe para las hojas de clculo y libros. Como se puede adivinar, el
nombre del objeto Collection para tablas dinmicas es PivotTables , y es posible
recorrer cada tabla dinmica en una hoja de clculo o en el libro si es
necesario.
Por ejemplo, si tienes ms de una tabla dinmica en una hoja de clculo y
estn ligados a la misma fuente que se inicia en la celda A1, este evento
Worksheet_Change actualiza todas las tablas dinmicas en la hoja de clculo
automticamente cuando se modifican los datos de fuente:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A1").CurrentRegion) Is Nothing _
Or Target.Cells.Count > 1 Then Exit Sub
Dim PT As PivotTable
For Each PT In ActiveSheet.PivotTables
PT.RefreshTable
Next PT
End Sub
Supongamos que tenemos varias tablas dinmicas en diferentes hojas de
clculo y deseamos confiar que cada tabla dinmica muestra los datos actuales
de las listas de su respectiva fuente. El siguiente procedimiento
Workbook_Open actualiza cada tabla dinmica del libro de trabajo cuando el
libro se abre:
Private Sub Workbook_Open()
Wks DIM como hoja de clculo, PT como tabla dinmica
Por cada semanas en hojas de clculo
Para cada PT en semanas. Tablas dinmicas
PT. RefreshTable
Siguiente PT
Prximas semanas
End Sub
Puede que necesite borrar todas las tablas dinmicas en una hoja de clculo. Al
eliminar una tabla dinmica, lo que ests realmente haciendo es limpiando las
celdas que estn ocupadas por la tabla dinmica.
La siguiente macro borra todas las tablas dinmicas en la hoja de clculo
activa:

Sub DeleteAllPivotTablest()
Dim objPT As PivotTable, iCount As Integer
For iCount = ActiveSheet.PivotTables.Count To 1 Step -1
Set objPT = ActiveSheet.PivotTables(iCount)
objPT.PivotSelect ""
Selection.Clear
Next iCount
End Sub

Paso a paso
1. Activa la hoja de clculo que contiene la lista de origen de datos y tabla
dinmica.
2. Presione Alt + F11 para ir al Editor de Visual Basic.
3. De la barra de men, haga clic en Insertar mdulo.
4. En el nuevo mdulo, escriba Sub CreatePivotChart y presione Enter.
VBA producir las siguientes lneas:
Sub CreatePivotChart()
End Sub
5. Apague ScreenUpdating para ayudar a que su macro corra ms rpido al
no actualizar la pantalla como objetos en el cdigo creados y manipulados:
Application.ScreenUpdating = False
6. Declare una variable Object para la tabla dinmica existente:
Dim objPT As PivotTable
7. Fijar la variable Objecto para el primer (Index#1) tabla dinmica:
Set objPT = ActiveSheet.PivotTables(1)
8. Seleccione la tabla dinmica:
objPT.PivotSelect ""
9. Aadir el grfico:
Charts.Add
10. Colocar el grfico en la hoja de clculo de la tabla dinmica:
ActiveChart.Location Where: = xlLocationAsObject, _
Name:=objPT.Parent.Name
11. Coloque el grfico dinmico (PivotChart) de modo que su esquina superior
izquierda ocupe H23, unas filas ms abajo de la Tabla dinmica:
ActiveChart.Parent.Left = Range("H23").Left
ActiveChart.Parent.Top = Range("H23").Top
12. Desactive el grfico dinmico:

Range("A1").Select
13. Encender ScreenUpdating:
Application.ScreenUpdating = True
14. Cuando termine la macro, se ve como sigue:
Sub CreatePivotChart()
'Apagar ScreenUpdating.
Application.ScreenUpdating = False
'Declarar una variable de objeto para la tabla dinmica existente.
Dim objPT As PivotTable
'Establece la variable de objeto para la primer (index#1) tabla dinmica.
Set objPT = ActiveSheet.PivotTables(1)
'Seleccionar la tabla dinmica.
objPT.PivotSelect ""
'Aadir el grfico.
Charts.Add
'Colocar en hoja de clculo de la tabla dinmica.
ActiveChart.Location Where:= xlLocationAsObject, _
Name:=objPT.Parent.Name
'Coloca el grfico dinmico de modo que su esquina superior izquierda
'ocupa la celda H23, unas filas ms abajo de la tabla dinmica.
ActiveChart.Parent.Left = Range("H23").Left
ActiveChart.Parent.Top = Range("H23").Top
'Deseleccionar el grfico dinmico.
Range("A1"). Select
'Encender ScreenUpdating.
Application.ScreenUpdating = True
End Sub

15. Presionar Alt + Q para volver a la hoja de clculo y la macro de prueba.

CREACIN DE QUERYTABLES DE CONSULTAS WEB


Supongamos que estamos interesado en el seguimiento de precios de las
acciones empresas tecnolgicas. En vez de extraer la informacin de un sitio
web financiero para cada una de las empresas, se puede automatizar el
proceso con una consulta en la web y actualizar los datos en cualquier
momento.
Cuando se compila una consulta de la web, se necesita indicarle a Excel el sitio
del cual va a extraer la informacin y la ubicacin de la celda en la hoja de
destino donde desea que se descargue la QueryTable.
Alguna informacin sobre sus parmetros y direcciones URL puede ser til para
entender qu pasa.
Si
abres
tu
navegador
web
y
escribes
la
direccin
URL
http://money.cnn.com/quote/quote.html? symb = YHOO + GOOG , llegas a un
sitio que proporciona una tabla de cotizaciones de las acciones de Yahoo! y
Google.
Con este enlace, esencialmente se estn configurando parmetros de URL para
pasar informacin como criterio de bsqueda a un sitio Web. En este caso, los
parmetros que el URL utiliza son los smbolos Yahoo! (YHOO) y Google
(GOOG).
La siguiente macro coloca la QueryTable en la celda A1 y apunta a uno del
grupo de sitios web que proporcionan cotizaciones actuales.
Los smbolos burstiles de las empresas antes mencionadas de las empresas
son los criterios que aplican parmetros de URL al cdigo para recopilar la
informacin del valores de las acciones que rellenar la nuestra tabla.

Sub ImportStocks()
'Declarar variables de hoja de clculo de destino,
'y dos mitades de la cadena de conexin:
'la mitad para la URL y la otra mitad para
'las comillas, para que sea ms fcil de editar.
Dim wsDestination As Worksheet
Dim strURL As String, strStocks As String
'Establecer la hoja de clculo destino preferido; Aqu es Acciones.
Set wsDestination = Worksheets("Acciones")
'Define la URL para conseguir sus cotizaciones.
'Hay muchos sitios web donde se puede hacer esto.
strURL = http://money.cnn.com/quote/quote.html?symb=
'Definir acciones de inters. Se seleccionaron solamente
'como ejemplo empresas de Silicon Valley
strStocks = "AAPL, CSCO, EBAY, GOOG, INTC, ORCL, YHOO"
'Celda destino
Application.Goto wsDestination.Range("A1"), True
'Borrar las celdas de la hoja de clculo para que los datos
'a ser importados no se confundan con otros datos
'importados previamente y an no se hayan eliminado.
Cells.Clear
'Aadir la QueryTable con la cadena de conexin
With wsDestination.QueryTables.Add _
(Connection:="URL;" & strURL & strStocks, _
Destination:=Range("$A$1"))
.BackgroundQuery = True
.SaveData = True
.AdjustColumnWidth = True
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = """wsod_multiquoteTable"""
.Refresh BackgroundQuery:=False
End With
'Liberar la memoria del objeto variable
Set wsDestination = Nothing
End Sub

Con la hoja de clculo activa, puede actualizar los datos haciendo clic en celda
A1 y seleccionar Actualizar.
Como
alternativa,
puede
ejecutar
la
expresin
VBA
Range("A1").QueryTable.Refresh en la ventana inmediato o en una macro. Cada
vez que actualiza los datos, se ver la versin ms reciente de la informacin,
incluyendo cualquier cambio realizado en los datos.

En este ejemplo queremos saber el comportamiento histrico de una accin. El


siguiente cdigo abre un archiva .csv y copia varios aos de precios hacia la
hoja de Histrico del archivo de trabajo:
Sub ImportHistory()
Dim strStockSymbol As String
Dim strURL1 As String, strURL2 As String
'Descargar los ltimos aos de cotizacin burstil de la accin
strURL1 = "http://ichart.finance.yahoo.com/table.csv?s="
strURL2 = "& d = 2 & e = 18 & f = 2010 & g = d & a = 2 y b = 13 y c = 1986 &
ignore = CSV"
strStockSymbol = "EBAY"
Workbooks.Open Filename: = strURL1 & strStockSymbol & strURL2
'Copia los datos desde el archivo csv en la hoja de clculo.
Range("A1"). CurrentRegion.Copy _
ThisWorkbook.Worksheets("Histrico"). Range("A1")
'Cerrar el archivo csv sin guardarlo.
ActiveWorkbook.Close False
'Autoajustar las columnas.
Columns.AutoFit
End Sub

You might also like