Académique Documents
Professionnel Documents
Culture Documents
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
7. Agregar el código “toLeft” al cheurón del lado
izquierdo y “toRight” al cheurón del lado derecho.
8. Hacer clic en el botón del paso 6 para seleccionar la
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
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
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
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
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