Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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
definir la
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.
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
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.