You are on page 1of 21

Código Excel

Códigos Útiles de Programación

Inicio Sugerencias Autor

Abrir y Cerrar Procesos


Buscar …
Buscar

desde Excel
Categorí Publicado el octubre 17, 2016 por a18327

as
El siguiente código es útil cuando se nos hace necesario
Elegir categoría recurrir a aplicaciones externas para realizar ciertas tareas
que no se podrían hacer directamente en Excel o que son
complicadas hacerlas, por ejemplo, podríamos necesitar
Entradas
tomar fotos y agregarlas en una carpeta especifica para
recientes
mostrarlas en nuestras hojas de Excel, entonces
necesitaríamos hacer uso de una aplicación externa que
Abrir y Cerrar
tomara las fotos.
Procesos
desde Excel
Para ejecutar aplicaciones y cerrarlas desde Excel
Galeria de
necesitamos hacer uso de las apis de windows,
Imagenes
específicamente CreateProcessA y TerminateProcess, por
Utilizar Paleta
lo que es necesario agregar el siguiente código en un
de Colores
módulo. 
para
Seleccionar C
1 Option Explicit
olor 2   
3 Private Type STARTUPINFO
Sumar Celdas 4  cb As Long
5  lpReserved As String
del 6  lpDesktop As String
7  lpTitle As String
Mismo Color 8  dwX As Long
9  dwY As Long
Obtener datos 10  dwXSize As Long
11  dwYSize As Long
de página web
12  dwXCountChars As Long
(Convertidor 13  dwYCountChars As Long
14  dwFillAttribute As Long
de Divisas) 15  dwFlags As Long
16  wShowWindow As Integer
17  cbReserved2 As Integer
18  lpReserved2 As Long

19  hStdInput As Long
19  hStdInput As Long
Archivos 20  hStdOutput As Long
21  hStdError As Long
22 End Type
octubre 23   
24 Private Type PROCESS_INFORMATION
2016 (1) 25  hProcess As Long
26  hThread As Long
noviembre 27  dwProcessID As Long
28  dwThreadID As Long
2014 (1) 29 End Type
30   
agosto 31 Private Declare Function CreateProcessA Lib "kernel32"
32 Private Declare Function TerminateProcess Lib "kernel32"
2014 (1)
33  
julio 2014 (3) 34 Private Const NORMAL_PRIORITY_CLASS = &H20&
35  
junio 2014 (6) 36 Private hAplicacion As Long

mayo 2014 (6)
abril 2014 (1)
Lo que hace este código es declarar los tipos de variables
enero
STARTUPINFO y PROCESS_INFORMATION que se
2013 (2)
utilizan para almacenar la información de las aplicaciones
que se ejecutan, declarar las apis para poderlas usar en

Meta nuestros códigos, declarar la constante
NORMAL_PRIORITY_CLASS que se utiliza como
Registrarse parámetro de la api CreateProcessA, y por ultimo declarar
Acceder la variable hAplicacion donde se almacena el apuntador de
RSS de las la aplicación que se utilizara para poder cerrarla.
entradas
RSS de los Teniendo ya el código anterior, podemos crear nuestros
comentarios códigos para ejecutar las aplicaciones. 
WordPress.co
1 Sub ejecutar()
m 2     'Se declaran las variables (todas son necesarias)
3     Dim proc As PROCESS_INFORMATION
4     Dim start As STARTUPINFO
5     Dim ReturnValue As Integer
Seguir Código Excel 6  
7     If (hAplicacion = 0) Then
8         ReturnValue = CreateProcessA(0&, "notepad.exe"
9         hAplicacion = proc.hProcess
10     End If
11 End Sub
Sigue
por
Por ultimo creamos el código para cerrar la aplicación. 
Email
1 Sub cerrar()
Introduce tu 2     'Se cierra la aplicación utilizando su apuntador
3     TerminateProcess hAplicacion, 0
dirección de 4     hAplicacion = 0
5 End Sub
correo
electrónico
para seguir mi
Blog y recibir Una vez agregado los códigos podemos agregar botones
las que ejecuten esos códigos para que al hacer clic en un
notificaciones botón se ejecute la aplicación y al hacer clic en otro botón
de las nuevas se cierre.
publicaciones
en tu buzón El código es bastante simple para que sea fácil de utilizar,
de correo su principal limitación es que solo funciona para una sola
electrónico. aplicación, pero se puede mejorar y adaptar dependiendo
del uso que se le vaya a dar.
Introduce tu dirección de correo electrónico
El ejemplo funcionando lo encuentran en el siguiente

Seguir
enlace https://1drv.ms/x/s!ACvMpSG8IKpngU4, espero les
sea útil.

Publicado en VBA | Etiquetado aplicaciones, cerrar, createprocessa, ejecutar,

Licencia procesos, shellexecute, terminateprocess | Deja un comentario

Galeria de Imagenes
Publicado el noviembre 28, 2014 por a18327

Excel a pesar de que no es un software para
presentaciones en ocasiones necesitamos mostrar
imágenes; cuando tenemos espacio suficiente podemos
agregar todas las imágenes que necesitemos sin problema
pero si queremos ahorrar espacio podemos crear una
galería tipo slider haciendo lo siguiente.

1. En una hoja de Excel, insertar un rectángulo y
quitarle el contorno, en este rectángulo se
mostraran las imágenes. 
Redimensionar el rectángulo al tamaño que se
desee. 
Renombrar el cuadro a “Imagen” (sin comillas), esto
para que funcione el código, si se desea poner otro
nombre se debe ajustar el código. 
 
Insertar Quitar Contorno Redimensionar
Rectangulo

Renombrar

2. Insertar un cheurón (véase imagen) a cada lado del
rectángulo, estos servirán para desplazarse por las
imágenes. 
 

Insertar Insertar
Cheuron Cheuron 2

3. Seleccionar una celda y ponerle el nombre de
“Carpeta”, esto para que funcione el código, si se
desea poner otro nombre se debe ajustar el código,
en esta celda se colocara la ubicación de la imagen
mostrada. 
 

Seleccionar
Celda

4. Agregar un rectángulo pequeño al lado de la celda
que seleccionamos, este servirá como botón para
seleccionar la primera imagen. 
 

Insertar Poner
Rectangulo Rectangulo
como Botón
5. En un módulo agregamos los siguientes códigos. 
Apis para busqueda de archivos 

1 Private Declare Function FindFirstFile Lib "kernel32" 
2 Private Declare Function FindNextFile Lib "kernel32" 
3 Private Declare Function FindClose Lib "kernel32" (
4 Const MAX_PATH = 260
5 Const MAXDWORD = &HFFFF
6 Const INVALID_HANDLE_VALUE = ‐1
7 Const FILE_ATTRIBUTE_ARCHIVE = &H20
8 Const FILE_ATTRIBUTE_DIRECTORY = &H10
9 Const FILE_ATTRIBUTE_HIDDEN = &H2
10 Const FILE_ATTRIBUTE_NORMAL = &H80
11 Const FILE_ATTRIBUTE_READONLY = &H1
12 Const FILE_ATTRIBUTE_SYSTEM = &H4
13 Const FILE_ATTRIBUTE_TEMPORARY = &H100
14   
15 Private Type FILETIME
16     dwLowDateTime As Long
17     dwHighDateTime As Long
18 End Type
19   
20 Private Type WIN32_FIND_DATA
21     dwFileAttributes As Long
22     ftCreationTime As FILETIME
23     ftLastAccessTime As FILETIME
24     ftLastWriteTime As FILETIME
25     nFileSizeHigh As Long
26     nFileSizeLow As Long
27     dwReserved0 As Long
28     dwReserved1 As Long
29     cFileName As String * MAX_PATH
30     cAlternate As String * 14
31 End Type
32  
33 Function StripNulls(OriginalStr As String) As 
34     If (InStr(OriginalStr, Chr(0)) > 0) Then
35         OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0
36     End If
37     StripNulls = OriginalStr
38 End Function

 
Código para los botónes 

1 Sub SeleccionarCarpeta()
2     Application.EnableEvents = False
3     Application.ScreenUpdating = False
4     Dim strImagenNew As String
5     Dim i As Integer
6     Dim j As Integer
7     strImagenNew = Application.GetOpenFilename("Archivos de
8     If strImagenNew <> "Falso" 
9         Sheets("Hoja1").Shapes("Imagen").Fil
10         Sheets("Hoja1").Range("Carpeta") = s
11     Else
12         Exit Sub
13     End If
14     Application.EnableEvents = True
15 End Sub
16  
17 Sub toLeft()
18     Dim imagen As String
19     imagen = SiguienteImagen("previous")
20     If imagen <> Empty Then
21         Sheets("Hoja1").Shapes("Imagen").Fil
22         Sheets("Hoja1").Range("Carpeta") = i
23     End If
24 End Sub
24 End Sub
25 Sub toRight()
26     Dim imagen As String
27     imagen = SiguienteImagen("next")
28     If imagen <> Empty Then
29         Sheets("Hoja1").Shapes("Imagen").Fil
30         Sheets("Hoja1").Range("Carpeta") = i
31     End If
32 End Sub

 
Código para obtener las imagenes (usando las
Apis) 

1 Function SiguienteImagen(direccion As String)
2     Dim carpeta As String
3     Dim busqueda As String
4     Dim archivo As String
5     Dim archivoInicial As String
6     Dim extension As String
7     Dim i As Integer
8     Dim resultado As Long
9     Dim WFD As WIN32_FIND_DATA
10     Dim actual As Boolean
11     Dim previous As String
12     Dim cont As Integer
13     archivoInicial = Sheets("Hoja1").Range("Carpe
14     carpeta = Mid(archivoInicial, 1, InStrRev(archivoInicial, &q
15     busqueda = "*.*" 'Todos los archivos
16     If Right(carpeta, 1) <> "\" 
17     'Busqueda del archivo en carpeta actual
18     resultado = FindFirstFile(carpeta & busqueda, WFD)
19     cont = True
20     actual = False
21     If resultado <> INVALID_HANDLE_VALUE 
22         While cont And SiguienteImagen = Empty
23             archivo = StripNulls(WFD.cFileName)
24             If (archivo <> ".") 
25                 extension = Right(archivo, Len(archivo) ‐ InStrR
26                 If extension = "bmp" 
27                     If direccion = "next" 
28                         If actual Then SiguienteImagen = carpeta
29                         If (carpeta & archivo) = archivoInic
30                     ElseIf direccion = "previous" 
31                         If (carpeta & archivo) = archivoInic
32                         previous = carpeta & archivo
33                     End If
34                 End If
35             End If
36             cont = FindNextFile(resultado, WFD)
37         Wend
38         cont = FindClose(resultado)
39     End If
40 End Function

Apis Código Botones Código


Imagenes
6. Agregar el código “SeleccionarCarpeta” al botón
que se agregó en el paso 6. 
 

Asignar Código Asignar Código


Botón

7. Agregar el código “toLeft” al cheurón del lado
izquierdo y “toRight” al cheurón del lado derecho. 
 

Asignar Código Asignar Código


Cheuron Cheuron
Izquierdo Derecho

8. Hacer clic en el botón del paso 6 para seleccionar la
primera imagen.
 

Seleccionar Primera Imagen


Primera Imagen

9. Hacer clic en el cheurón derecho para ver la
siguiente imagen. 
 

Siguiente
Imagen

Si te gusto el artículo no dudes en comentar y compartir.

Publicado en VBA | Etiquetado busqueda archivos, excel, fotos, galeria,

imagenes, macros, slider, VBA | Deja un comentario
Utilizar Paleta de
Colores para
Seleccionar Color
Publicado el agosto 14, 2014 por a18327

En algunos de los proyectos que realizamos en Excel nos
resultara necesario que el usuario pueda elegir un color
para realizar una determinada tarea, por ejemplo para que
el usuario pueda elegir un color de fondo para un formato,
en estos casos podemos hacer uso de la paleta de colores
de Excel y mediante macros obtener el color que el usuario
seleccione. 
Para que el usuario pueda elegir un color primero debemos
especificar que celdas servirán para capturar el color a
esas celdas les podemos llamar “Celdas de Color”, y
debemos tener una macro que nos indique si una celda es
una “celda de color” o no para ello utilizamos la siguiente
macro la cual debe colocarse en un módulo. 

1 Function EsCeldaColor(Celda As Range) As Boolean
2     Dim CeldasColor As Variant
3     Dim i As Integer
4     Dim Resultado As Boolean
5     'Las celdas de color se pueden especificar todas juntas, pero cu
6     CeldasColor = Array(Range("Hoja1!C2:C3,C4"), Range(
7     For i = LBound(CeldasColor) To UBound(CeldasColor)
8         If CeldasColor(i).Parent.Name = Celda.Parent.Name 
9             If Not Application.Intersect(CeldasColor(i), Celda) 
10                 Resultado = True
11             End If
12         End If
13     Next
14     EsCeldaColor = Resultado
15 End Function

Cuando una celda es una “celda de color” y el usuario
seleccione dicha celda se debe mostrar la paleta de colores
y para que eso ocurra necesitamos la siguiente macro que
muestra la paleta de colores y guarda el color en la “celda
de color”, esta macro se debe colocar en modulo 

1 Sub SeleccionarColor(Celda As Range)
2     On Error Resume Next
3     Dim lngResult As Long, lngO As Long, intR As Integer
3     Dim lngResult As Long, lngO As Long, intR As Integer
4     lngO = ThisWorkbook.Colors(1)
5     Err.Clear
6     lngInitialColor = CLng(Celda)
7     If Err.Description = "" Then
8         intR = lngInitialColor And 255
9         intG = lngInitialColor \ 256 And 255
10         intB = lngInitialColor \ 256 ^ 2 And 255
11     End If
12     If Application.Dialogs(xlDialogEditColor).Show(1, intR, intG, in
13         lngResult = ThisWorkbook.Colors(1)
14         Celda = lngResult
15     End If
16     ThisWorkbook.Colors(1) = lngO
17 End Sub

Y también necesitamos la siguiente macro que es la que
detecta cuando el usuario selecciona una celda y decide si
se muestra la paleta de colores o no, esta macro se debe
colocar en el objeto “ThisWorkbook” 

1 Private Sub Workbook_SheetSelectionChange(ByVal Sh As 
2     If EsCeldaColor(Target) Then
3         SeleccionarColor Target
4     End If
5 End Sub

Y con esto cada vez que el usuario seleccione una celda
esta última macro comprobara (con la primera macro) que
la celda es una celda de color y mostrara la paleta de
colores (con la segunda macro).

Y el resultado es el siguiente 

Macro 1 y 2 Macro 3 Paleta de Colores

Publicado en VBA | Etiquetado color, excel, paleta, paleta de colores,

seleccionar color, VBA | Deja un comentario
Sumar Celdas del
Mismo Color
Publicado el julio 23, 2014 por a18327

Cuando trabajamos con Excel la mayoría las veces
necesitamos Sumar celdas que están separadas y para
poder sumarlas es necesario ir agregándolas a la formula
SUMA una por una lo cual cuando son demasiadas celdas
llega a ser fastidioso y más si nos equivocamos y las
celdas que habíamos agregado se quitan de la formula. 
Mediante una UDF (función definida por el usuario) es
posible facilitar esa tarea para solamente sumar las celdas
que tienen el mismo color, es decir, de una sola vez se
agregarían todas las celdas a la función y la propia función
se encargaría de sumar solamente las celdas que tengan el
mismo color. 
La función a utilizar es la siguiente

1 Public Function SumaPorColor(Color As Range, ParamArray
2     On Error Resume Next
3     Application.Calculation = xlCalculationManual
4     Dim celda As Range
5     Dim rango As Variant
6     For Each rango In Valores
7         For Each celda In rango
8             If celda.Interior.ColorIndex = Color.Cells(1, 1).Interio
9                 If IsNumeric(celda) Then
10                     SumaPorColor = SumaPorColor + celda
11                 End If
12             End If
13         Next celda
14     Next rango
15     Set celda = Nothing
16     Set rango = Nothing
17     Application.Calculation = xlCalculationAutomatic
18 End Function

 
La función se debe agregar a un módulo y se utiliza de la
siguiente manera. 
El primer rango que se le pasa como parámetro debe ser la
celda que tiene el color, los demás rangos que se le pasan
son los que se van a sumar, los rangos pueden estar en
diferentes hojas como en la imagen de abajo y solamente
las celdas que tengan el mismo color que el primer rango
se sumaran, en la imagen de abajo solamente se suman
las celdas de color azul (2+4+6+7+2=21). 

Formula

Publicado en VBA | Etiquetado celdas, excel, funcion, sumar, sumar por color,

udf, VBA | Deja un comentario

Obtener datos de página


web (Convertidor
de Divisas)
Publicado el julio 15, 2014 por a18327

En VBA es muy fácil hacer una consulta a una página web,
lo complicado es procesar la respuesta pues por lo general
es un código HTML, aunque también puede estar en
formato json y en ese caso podemos utilizar el código de
Cómo Utilizar JSON en Macros VBA. 
Para hacer una consulta a una página web se utiliza la
siguiente función 

1 Function DatosWeb(url As String) As String
2     On Error Resume Next
3     Dim xml As Object
4     Dim result As String
5     Set xml = CreateObject("MSXML2.ServerXMLHTTP")
6     xml.Open "GET", _
7         url
8     xml.Send
9     ConsultarPagina = xml.responsetext
10 End Function

 
Y utilizamos la función de la siguiente forma para hacer una
consulta a la página de Gmail 
1 Sub ejemplo()
2     Dim codigoPagina As String
3     codigoPagina = DatosWeb("https://www.gmail.com/intl/es/mail/help
4     MsgBox codigoPagina
5 End Sub

 
Y el resultado sería similar a la siguiente imagen 

Resultado HTML
VBA

 
El texto que vemos es el mismo que vemos en el
navegador como código fuente de la página 
 

Código Fuente en
Navegador

 
Un vez que tenemos la respuesta (que es el código fuente
de la página) podemos obtener información de ella
utilizando funciones de texto.

Cuando la respuesta está en formato json es mas facil de
manejar. 
Si queremos obtener el valor del USD en pesos mexicanos
hacemos una consulta a una página web y obtenemos el
código fuente que es un json. 

 
Código Fuente
JSON

 
Podemos utilizar el json como en el siguiente código (Para
que el código funcione se debe crear la clase json y la
función parseJson como se indica en Cómo Utilizar JSON
en Macros VBA) 

1 Sub ejemplo2()
2     Dim strJson As String
3     Dim objJson As Object
4     strJson = DatosWeb("http://devel.farebookings.com/api/curconvers
5     Set objJson = parseJSON(strJson)
6     If Not objJson Is Nothing Then
7         MsgBox "1 USD = " & objJson.Item("MXN") & " MXN"
8     End If
9 End Sub

 
Y el resultado es el siguiente 

Resultado VBA

Publicado en VBA | Etiquetado actualizar monedas, codigo fuente, consultas,

conversiones, divisas, excel, JSON, monedas, VBA, Web | Deja un comentario

Como Utilizar JSON en


Macros VBA
Publicado el julio 11, 2014 por a18327

Cuando utilizamos macros normalmente es para hacer
tareas más complejas como accesar a bases de datos,
utilizar tablas dinámicas, crear contenido dinámico, utilizar
webservices, obtener datos directamente de la web, etc. En
esto último no es una tarea tan fácil de manejar en VBA ya
que cuando hacemos una consulta en la web muy pocas
veces la respuesta es directa si no que la mayoría de las
veces son textos JSON y en VBA no existe una función que
nos permita utilizar JSON. 
Para poder utilizar textos JSON en VBA podemos hacer
uso de librerías (clases), una forma de usar JSON es la
siguiente.

1. Crear una clase de preferencia llamada “json” y
agregarle el siguiente código que encontré aquí,
este código es el que se encarga de convertir el
texto JSON en un objeto Dictionary 

1 Option Explicit
2  
3 Const INVALID_JSON      As Long = 1
4 Const INVALID_OBJECT    As Long = 2
5 Const INVALID_ARRAY     As Long = 3
6 Const INVALID_BOOLEAN   As Long = 4
7 Const INVALID_NULL      As Long = 5
8 Const INVALID_KEY       As Long = 6
9  
10 Private Sub Class_Initialize()
11  
12 End Sub
13  
14 Private Sub Class_Terminate()
15  
16 End Sub
17  
18 '
19 '   parse string and create JSON object (Dictionary or Collecti
20 '
21 Public Function parse(ByRef str As String) As
22  
23     Dim index As Long
24     index = 1
25      
26     On Error Resume Next
27  
28     Call skipChar(str, index)
29     Select Case Mid(str, index, 1)
30     Case "{"
31         Set parse = parseObject(str, index)
32     Case "["
33         Set parse = parseArray(str, index)
34     End Select
35  
36 End Function
37  
38 '
39 '   parse collection of key/value (Dictionary in VB)
40 '
41 Private Function parseObject(ByRef str As String
42  
43     Set parseObject = CreateObject("Scripting.Dictionary"
44      
45     ' "{"
46     Call skipChar(str, index)
47     If Mid(str, index, 1) <> "{" Then Err.Raise vbObjectError +
47     If Mid(str, index, 1) <> "{" Then Err.Raise vbObjectError +
48     index = index + 1
49      
50     Do
51      
52         Call skipChar(str, index)
53         If "}" = Mid(str, index, 1) Then
54             index = index + 1
55             Exit Do
56         ElseIf "," = Mid(str, index, 1) Then
57             index = index + 1
58             Call skipChar(str, index)
59         End If
60          
61         Dim key As String
62          
63         ' add key/value pair
64         parseObject.Add key:=parseKey(str, index), Item:=parseV
65          
66     Loop
67  
68 End Function
69  
70 '
71 '   parse list (Collection in VB)
72 '
73 Private Function parseArray(ByRef str As String
74  
75     Set parseArray = New Collection
76      
77     ' "["
78     Call skipChar(str, index)
79     If Mid(str, index, 1) <> "[" Then Err.Raise vbObjectError +
80     index = index + 1
81      
82     Do
83          
84         Call skipChar(str, index)
85         If "]" = Mid(str, index, 1) Then
86             index = index + 1
87             Exit Do
88         ElseIf "," = Mid(str, index, 1) Then
89             index = index + 1
90             Call skipChar(str, index)
91         End If
92          
93         ' add value
94         parseArray.Add parseValue(str, index)
95          
96     Loop
97  
98 End Function
99  
100 '
101 '   parse string / number / object / array / true / false / nul
102 '
103 Private Function parseValue(ByRef str As String
104  
105     Call skipChar(str, index)
106      
107     Select Case Mid(str, index, 1)
108     Case "{"
109         Set parseValue = parseObject(str, index)
110     Case "["
111         Set parseValue = parseArray(str, index)
112     Case """", "'"
113         parseValue = parseString(str, index)
114     Case "t", "f"
115         parseValue = parseBoolean(str, index)
116     Case "n"
117         parseValue = parseNull(str, index)
118     Case Else
119         parseValue = parseNumber(str, index)
120     End Select
121  
121  
122 End Function
123  
124 '
125 '   parse string
126 '
127 Private Function parseString(ByRef str As String
128  
129     Dim quote   As String
130     Dim char    As String
131     Dim code    As String
132      
133     Call skipChar(str, index)
134     quote = Mid(str, index, 1)
135     index = index + 1
136     Do While index > 0 And index <= Len(str)
137         char = Mid(str, index, 1)
138         Select Case (char)
139         Case "\"
140             index = index + 1
141             char = Mid(str, index, 1)
142             Select Case (char)
143             Case """", "\\", "/"
144                 parseString = parseString & char
145                 index = index + 1
146             Case "b"
147                 parseString = parseString & vbBack
148                 index = index + 1
149             Case "f"
150                 parseString = parseString & vbFormFeed
151                 index = index + 1
152             Case "n"
153                 parseString = parseString & vbNewLine
154                 index = index + 1
155             Case "r"
156                 parseString = parseString & vbCr
157                 index = index + 1
158             Case "t"
159                 parseString = parseString & vbTab
160                 index = index + 1
161             Case "u"
162                 index = index + 1
163                 code = Mid(str, index, 4)
164                 parseString = parseString & ChrW(val(
165                 index = index + 4
166             End Select
167         Case quote
168             index = index + 1
169             Exit Function
170         Case Else
171             parseString = parseString & char
172             index = index + 1
173         End Select
174     Loop
175  
176 End Function
177  
178 '
179 '   parse number
180 '
181 Private Function parseNumber(ByRef str As String
182  
183     Dim value   As String
184     Dim char    As String
185      
186     Call skipChar(str, index)
187     Do While index > 0 And index <= Len(str)
188         char = Mid(str, index, 1)
189         If InStr("+‐0123456789.eE", char) Then
190             value = value & char
191             index = index + 1
192         Else
193             If InStr(value, ".") Or InStr(value, 
194                 parseNumber = CDbl(value)
195             Else
195             Else
196                 parseNumber = CInt(value)
197             End If
198             Exit Function
199         End If
200     Loop
201  
202  
203 End Function
204  
205 '
206 '   parse true / false
207 '
208 Private Function parseBoolean(ByRef str As String
209  
210     Call skipChar(str, index)
211     If Mid(str, index, 4) = "true" Then
212         parseBoolean = True
213         index = index + 4
214     ElseIf Mid(str, index, 5) = "false" Then
215         parseBoolean = False
216         index = index + 5
217     Else
218         Err.Raise vbObjectError + INVALID_BOOLEAN, Description:
219     End If
220  
221 End Function
222  
223 '
224 '   parse null
225 '
226 Private Function parseNull(ByRef str As String
227  
228     Call skipChar(str, index)
229     If Mid(str, index, 4) = "null" Then
230         parseNull = Null
231         index = index + 4
232     Else
233         Err.Raise vbObjectError + INVALID_NULL, Description:=
234     End If
235  
236 End Function
237  
238 Private Function parseKey(ByRef str As String
239  
240     Dim dquote  As Boolean
241     Dim squote  As Boolean
242     Dim char    As String
243      
244     Call skipChar(str, index)
245     Do While index > 0 And index <= Len(str)
246         char = Mid(str, index, 1)
247         Select Case (char)
248         Case """"
249             dquote = Not dquote
250             index = index + 1
251             If Not dquote Then
252                 Call skipChar(str, index)
253                 If Mid(str, index, 1) <> ":" 
254                     Err.Raise vbObjectError + INVALID_KEY, Desc
255                 End If
256             End If
257         Case "'"
258             squote = Not squote
259             index = index + 1
260             If Not squote Then
261                 Call skipChar(str, index)
262                 If Mid(str, index, 1) <> ":" 
263                     Err.Raise vbObjectError + INVALID_KEY, Desc
264                 End If
265             End If
266         Case ":"
267             If Not dquote And Not squote Then
268                 index = index + 1
269                 Exit Do
269                 Exit Do
270             End If
271         Case Else
272             If InStr(vbCrLf & vbCr & vbLf & vbTab & 
273             Else
274                 parseKey = parseKey & char
275             End If
276             index = index + 1
277         End Select
278     Loop
279  
280 End Function
281  
282 '
283 '   skip special character
284 '
285 Private Sub skipChar(ByRef str As String, ByRef
286  
287     While index > 0 And index <= Len(str) And
288         index = index + 1
289     Wend
290  
291 End Sub
292  
293 Public Function toString(ByRef obj As Variant
294  
295     Select Case VarType(obj)
296         Case vbNull
297             toString = "null"
298         Case vbDate
299             toString = """" & CStr(obj) & """"
300         Case vbString
301             toString = """" & encode(obj) & ""
302         Case vbObject
303             Dim bFI, i
304             bFI = True
305             If TypeName(obj) = "Dictionary" Then
306                 toString = toString & "{"
307                 Dim keys
308                 keys = obj.keys
309                 For i = 0 To obj.Count ‐ 1
310                     If bFI Then bFI = False Else
311                     Dim key
312                     key = keys(i)
313                     toString = toString & """"
314                 Next i
315                 toString = toString & "}"
316             ElseIf TypeName(obj) = "Collection"
317                 toString = toString & "["
318                 Dim value
319                 For Each value In obj
320                     If bFI Then bFI = False Else
321                     toString = toString & toString(value)
322                 Next value
323                 toString = toString & "]"
324             End If
325         Case vbBoolean
326             If obj Then toString = "true" Else
327         Case vbVariant, vbArray, vbArray + vbVariant
328             Dim sEB
329             toString = multiArray(obj, 1, "", sEB)
330         Case Else
331             toString = Replace(obj, ",", ".")
332     End Select
333  
334 End Function
335  
336 Private Function encode(str) As String
337      
338     Dim i, j, aL1, aL2, c, p
339  
340     aL1 = Array(&H22, &H5C, &H2F, &H8, &HC, &HA, &HD, &H9)
341     aL2 = Array(&H22, &H5C, &H2F, &H62, &H66, &H6E, &H72, &H74)
342     For i = 1 To Len(str)
343         p = True
343         p = True
344         c = Mid(str, i, 1)
345         For j = 0 To 7
346             If c = Chr(aL1(j)) Then
347                 encode = encode & "\" & Chr(aL2(j))
348                 p = False
349                 Exit For
350             End If
351         Next
352  
353         If p Then
354             Dim a
355             a = AscW(c)
356             If a > 31 And a < 127 Then
357                 encode = encode & c
358             ElseIf a > ‐1 Or a < 65535 Then
359                 encode = encode & "\u" & String
360             End If
361         End If
362     Next
363 End Function
364  
365 Private Function multiArray(aBD, iBC, sPS, ByRef
366     Dim iDU, iDL, i ' Integer DimensionUBound, Integer Dimensio
367     On Error Resume Next
368     iDL = LBound(aBD, iBC)
369     iDU = UBound(aBD, iBC)
370      
371     Dim sPB1, sPB2  ' String PointBuffer1, String PointBuffer2
372     If Err.Number = 9 Then
373         sPB1 = sPT & sPS
374         For i = 1 To Len(sPB1)
375             If i <> 1 Then sPB2 = sPB2 & ","
376             sPB2 = sPB2 & Mid(sPB1, i, 1)
377         Next
378 '        multiArray = multiArray & toString(Eval("aBD(" & sPB2 
379         multiArray = multiArray & toString(aBD(sPB2))
380     Else
381         sPT = sPT & sPS
382         multiArray = multiArray & "["
383         For i = iDL To iDU
384             multiArray = multiArray & multiArray(aBD, iBC + 1, 
385             If i < iDU Then multiArray = multiArray & 
386         Next
387         multiArray = multiArray & "]"
388         sPT = Left(sPT, iBC ‐ 2)
389     End If
390     Err.Clear
391 End Function

2. Crear un módulo y agregar la siguiente función para
no estar declarando la clase cada vez que le
necesitemos y así solamente llamaremos
directamente a la función 

1 Function parseJSON(strJson As String) As Object
2     Dim clsJson As json
3     Set clsJson = New json
4     Set parseJSON = clsJson.parse(strJson)
5 End Function

3. Usar la función de la siguiente forma 

1 Sub PruebaJson()
2     Dim strJson As String
2     Dim strJson As String
3     Dim objJson As Object
4     strJson = "{""response"": {""id"": ""1"",""value"
5     Set objJson = parseJSON(strJson)
6     If Not objJson Is Nothing Then
7         MsgBox "Mi Blog es " & objJson.Item("response"
8     End If
9 End Sub

 
Como se puede observar el texto JSON de ejemplo
tiene dos comillas dobles esto es porque en VBA
para poner comillas en un texto se colocan dos
veces, pero si el texto JSON lo obtenemos de la
web o de algún archivo solamente debe tener una
comilla doble y no dos. 
El texto JSON del ejemplo es el siguiente 

{"response": { 

"id": "1", 
"value": "Código Excel", 
}}

Si queremos obtener el elemento “value”
necesitamos pasar por todos los elementos
superiores hasta llegar a “value”, en esta caso
solamente hay un elemento superior llamado
“response” y por eso se utiliza 
objJson.Item(“response”).Item(“value”) que nos
da como resultado Código Excel

Publicado en VBA | Etiquetado Dictionary, excel, JSON, VBA, Web,

WebServices | 1 comentario

Obtener la Edad con la


Fecha de Nacimiento
Publicado el junio 24, 2014 por a18327
Cuando trabajamos con fechas los cálculos se pueden
hacer muy complejas, no porque se requiera mucho trabajo
si no porque resulta confuso. 
Uno de los cálculos más comunes con las fechas es
obtener la cantidad de años que hay entre dos fechas que
normalmente es para obtener la edad de una persona. 
La tarea parece sencilla pero puede ser algo confuso
desarrollarla y seguramente en nuestro intento
obtendremos resultados incorrectos las primeras veces
pero con varias pruebas obtendremos la función correcta. 
La función que yo utilizo para calcular la edad de una
persona es la siguiente 

1 Function getEdad(fechaNacimiento As Date)
2     Dim año, mes, dia As Integer
3     Dim dAño, dMes, dDia As Integer
4     año = Format(fechaNacimiento, "yyyy")
5     mes = Format(fechaNacimiento, "m")
6     dia = Format(fechaNacimiento, "d")
7     dAño = Format(Date, "yyyy") ‐ año
8     dMes = Format(Date, "mm") ‐ mes
9     dDia = Format(Date, "d") ‐ dia
10     If dMes < 0 Or (dMes = 0 And dDia < 0) Then
11         dAño = dAño ‐ 1
12     End If
13     getEdad = dAño
14 End Function

Es una función pequeña pero la clave esta en la sentencia
IF que es cuando se verifica si se cuenta el año actual o no.

Para usar la función se debe colocar en un módulo y se
llama de la siguiente forma 

1 Dim edad as Integer
2 edad=getEdad("1990‐06‐25")
3 MsgBox "La edad es " & edad & " años"

Publicado en VBA | Etiquetado años, antiguedad, diferencia, edad, excel, VBA

| 7 comentarios

Código Excel

You might also like