tag:blogger.com,1999:blog-82639440108883064332024-03-13T05:46:50.395+01:00ExcelAvanzado.comUn juego de niños ...Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.comBlogger263125tag:blogger.com,1999:blog-8263944010888306433.post-50389138744911519202021-01-21T18:45:00.001+01:002022-06-14T09:30:32.407+02:00Criba de Eratóstenes para obtener números primos en Excel<div>Puede descargar el archivo con el código VBA: <a href="https://www.dropbox.com/s/lhtgadgyesec8j2/eratostenes.xlsm?dl=1">eratostenes.xlsm</a></div><div><br /></div>La <a href="https://es.wikipedia.org/wiki/Criba_de_Erat%C3%B3stenes">criba de Eratóstenes</a> es un método algorítmico que nos permite obtener los números primos inferiores a un valor dado eliminando sucesivamente todos los múltiplos anteriores.<div><br /><span class="letrag"></span><div>En nuestro ejemplo vamos a obtener los números primos anteriores a 200, que son:</div></div><div><br /></div><div>2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199.</div><div><br /></div>
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"> Option Explicit
Sub cribado()
Dim A(200) As Integer
Dim i As Integer, j As Integer
Dim color
Range("B4:K23").Interior.Pattern = xlNone
For i = 2 To 200
A(i) = i
Next i
For i = 2 To 200
If A(i) <> 0 Then
color = RGB(Rnd * 256, Rnd * 256, Rnd * 256)
For j = i + 1 To 200
If j Mod i = 0 Then
Call colorines(A(j), color)
A(j) = 0
End If
Next j
End If
Next i
End Sub
Sub colorines(n, color)
Dim fila As Integer, columna As Integer
For fila = 4 To 23
For columna = 2 To 11
If Cells(fila, columna).Value = n And n <> 0 Then
Cells(fila, columna).Interior.color = color
End If
Next columna
Next fila
End Sub
</code></pre>
<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzcKnB-Pdn61mCHbK8vHCejSGx-KcchFJouqrRv1LDUAuj6JXN3h2H-p0x6_yHpDbLDeYWVfsggIG4vgaDPTrMIKvoPAh1AUXIHrtKjr58076paiSQazatRlAaMELC3PwoJwydZgeruojy/s576/criba.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="576" data-original-width="562" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzcKnB-Pdn61mCHbK8vHCejSGx-KcchFJouqrRv1LDUAuj6JXN3h2H-p0x6_yHpDbLDeYWVfsggIG4vgaDPTrMIKvoPAh1AUXIHrtKjr58076paiSQazatRlAaMELC3PwoJwydZgeruojy/s16000/criba.png" /></a></div><br /><div>Se van coloreando los múltiplos de los diferentes primos que nos encontramos. Finalmente, los números que quedan sin colorear son los números primos.</div><div><br /></div>Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com2tag:blogger.com,1999:blog-8263944010888306433.post-84552304259095442312020-11-29T23:09:00.004+01:002022-06-14T09:33:36.499+02:00Sumar las celdas de la diagonal de una tablaPuede descargar el archivo <a href="https://www.dropbox.com/s/hl5qjxtn5cfoj43/suma_diagonal.xlsm?dl=1" target="_blank">suma_diagonal.xlsm</a><div><br /></div><div>Deseamos sumar los valores de las celdas de la diagonal de una tabla. La tabla que usamos de ejemplo está formada por números aleatorios que varían si pulsamos la tecla F9 de recálculo manual.</div><div><br /></div><h2 style="text-align: left;"><span style="color: #ffa400;">Con la función INDIRECTO</span></h2><div>Vamos a resolverlo utilizando la función INDIRECTO.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrGmvZBRYMpijFtVJwC1BXAKGcNrZ-eFSpL8anGAg9irbffCk9ZIiRGL6av-yRXYmGkzC32wT0XKCAnaKXUJCmxTv4CNi_xGheZGnDMOeDS2_33l8LSl5ydY2yAlMVX0ReBBBmngKjxBZK/s480/suma.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="357" data-original-width="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrGmvZBRYMpijFtVJwC1BXAKGcNrZ-eFSpL8anGAg9irbffCk9ZIiRGL6av-yRXYmGkzC32wT0XKCAnaKXUJCmxTv4CNi_xGheZGnDMOeDS2_33l8LSl5ydY2yAlMVX0ReBBBmngKjxBZK/s16000/suma.jpg" /></a></div><br /><div><br /></div>
<br />
<br /><div style="text-align: center;"><iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/3jNYuEHPJ64" width="560"></iframe>
</div>
<br /><div>En este ejemplo la celda de la primera esquina (celda D6) se encuentra en la fila 6, columna 4, por lo que en la función INDIRECTO de la celda O2 hemos tenido que restar -2.</div><div><br /></div><div>=INDIRECTO("F"&FILA()&"C"&FILA()-2;0)</div><div><br /></div><div>Si la tabla estuviera en otro sitio y la primera esquina estuviera en la columna 10 tendríamos que sumar 4. Veamos el motivo:</div><div><br /></div><div>Si la celda de la primera esquina es la celda J6 los valores serían</div><div><ul style="text-align: left;"><li>Fila 6</li><li>Columna 10</li><li>Tendremos que sumar: 10 - 6 = 4</li></ul></div><div><br /></div><h2 style="text-align: left;"><span style="color: #ffa400;">Con Macro</span></h2><div class="separator" style="clear: both; text-align: left;">Podemos crear una macro utilizando código VBA para Excel que nos pregunte por los dos extremos de la diagonal. Primero nos preguntará por la esquina superior izquierda de la tabla.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjON2RO4XqSaxuoPowVEP-HPNH7kQinJv9NXqU8qqS9e-V9h6sIW5itoNc3OX_sFfN4tThh1xW6UjznYri6jLsQIoVKk69z-_Y3rIx4ZQP15e6czW3A09I8KvqMFZAhxmepUrF7biGxCLWW/s281/e1.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="129" data-original-width="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjON2RO4XqSaxuoPowVEP-HPNH7kQinJv9NXqU8qqS9e-V9h6sIW5itoNc3OX_sFfN4tThh1xW6UjznYri6jLsQIoVKk69z-_Y3rIx4ZQP15e6czW3A09I8KvqMFZAhxmepUrF7biGxCLWW/s0/e1.jpg" /></a></div><div><br /></div>Luego nos preguntará por la esquina inferior derecha de la tabla.<div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBB0xzYDreybKu5BSa70nXl83BRjFZ2TtKUNfGEistpIKzUyzdhA8hnu6cbUjMFq18kbLEiM42qfsoqEhrFDjt6IN0wpEv4HgLXW5aQBCfZL91GDkzAazimWP1tPzbhuLUCGevBq6sHfxT/s337/e2.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="129" data-original-width="337" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBB0xzYDreybKu5BSa70nXl83BRjFZ2TtKUNfGEistpIKzUyzdhA8hnu6cbUjMFq18kbLEiM42qfsoqEhrFDjt6IN0wpEv4HgLXW5aQBCfZL91GDkzAazimWP1tPzbhuLUCGevBq6sHfxT/s320/e2.jpg" width="320" /></a></div><div><br /></div><div>La tabla ha de ser cuadrada, en nuestro ejemplo estamos trabajando con una tabla 10x10. Se trata de una tabla de 10 filas y 10 columnas, que tendrá necesariamente 10 celdas en la diagonal.</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho_Pxsl2jTYfjgchJp-ICPwmq2V-ZJH51FIsLvIfbfyOywcyfywWWiKRo89uof9QU6DXdfznFZa4SGjwLgPpCCN7fFfasEuZMK5RlsO662rmuSyTXzdUF2tkfo96Fi2UunkTnNnSZc1Wfo/s479/msgbox.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="358" data-original-width="479" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho_Pxsl2jTYfjgchJp-ICPwmq2V-ZJH51FIsLvIfbfyOywcyfywWWiKRo89uof9QU6DXdfznFZa4SGjwLgPpCCN7fFfasEuZMK5RlsO662rmuSyTXzdUF2tkfo96Fi2UunkTnNnSZc1Wfo/s16000/msgbox.jpg" /></a></div><div><br /></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div>Veamos el código del procedimiento que permite realizar la suma de la diagonal proporcionando las dos esquinas.<br /><br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"> Sub Informa_suma_diagonal()
Dim total, E1 As Range, E2 As Range
Dim i As Long, fila As Long, columna As Long
Set E1 = Application.InputBox(prompt:="Seleccione la celda superior izquierda de la tabla." & _
vbLf & "La tabla debe ser cuadrada.", Title:="Suma de la diagonal de una tabla", Type:=8)
'el 8 se usa cuando se toma una referencia a una celda como un objeto Range
Set E2 = Application.InputBox("Seleccione la celda inferiror derecha de la tabla." & _
vbLf & "Las dos esquinas de la tabla deben estar en la misma diagonal.", "Suma de la diagonal de una tabla", , , , , , 8)
If E2.Row - E1.Row <> E2.Column - E1.Column Then 'si la tabla no es cuadrada finaliza el programa
MsgBox "ERROR: estas dos esquinas no pertenecen a la misma diagonal." & _
vbLf & "El programa finalizará.", , "Suma de la diagonal de una tabla"
End 'finaliza la ejecución del programa ya que se ha detectado un error
End If
total = 0
For i = 1 To E2.Row - E1.Row + 1 'hasta el número de elementos de la diagonal
fila = E1.Row + i - 1 'contador de fila que comienza en la fila de la esquina superior izquierda
columna = E1.Column + i - 1 'contador de columna que comienza en la columna de la esquina superior izquierda
total = total + Cells(fila, columna).Value
Next i
MsgBox "La suma de la diagonal es " & total, , "Suma de la diagonal de una tabla"
End Sub
</code></pre> <div><br /></div><div></div>
<div style="text-align: center;"><iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/6APGqUwzQiY" width="560"></iframe></div><div style="text-align: center;"><br /></div><div style="text-align: center;"><br /></div><h2 style="text-align: left;"><span style="color: #ffa400;">Con función programada</span></h2><div>Posiblemente es más útil trabajar con una función creada por el usuario. La función tiene dos parámetros que son las dos esquinas de la diagonal.</div></div><div><ul style="text-align: left;"><li>Esquina_1 es la esquina superior izquierda de la diagonal</li><li>Esquina_2 es la esquina inferior derecha de la diagonal</li></ul></div><div>Si las dos celdas que se proporcionan no están en la misma diagonal se mostrará un aviso de error diciendo:</div><div><br /></div><div>ERROR: no diagonal</div><br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"> Function SumaDiagonal(Esquina_1 As Range, Esquina_2 As Range) As Variant
Dim total As Double
Dim i As Long, fila As Long, columna As Long
total = 0
For i = 1 To Esquina_2.Row - Esquina_1.Row + 1
fila = Esquina_1.Row + i - 1
columna = Esquina_1.Column + i - 1
If Application.WorksheetFunction.IsNumber(Cells(fila, columna).Value) Then
total = total + Cells(fila, columna).Value
End If
Next i
If Esquina_2.Row - Esquina_1.Row <> Esquina_2.Column - Esquina_1.Column Then
SumaDiagonal = "ERROR: no diagonal"
Else
SumaDiagonal = total
End If
End Function
</code></pre><br /><h2 style="text-align: left;"><span style="color: #ffa400;">Alternativa propuesta</span></h2>
Le propongo que intente crear una macro que ponga de color amarillo, o el que usted prefiera, las celdas de la diagonal de una tabla. A la macro la tendríamos que proporcionar las dos esquinas de la diagonal, o bien, seleccionar una única celda de la tabla y luego que se señalara toda la tabla, tal como hace el atajo de teclado CONTRO+SHIFT+* de esta forma podríamos ahorrar que la macro nos pida parámetros.<div><br /></div><div>Luego tendríamos que usar las ideas que se proporcionan en el siguiente post del blog:</div><div><br /></div><div><a href="https://www.excelavanzado.com/2009/12/contar-y-sumar-los-valores-de-las.html">Contar y Sumar los valores de las celdas según su Color</a></div>Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com0tag:blogger.com,1999:blog-8263944010888306433.post-57303861077327155822020-08-27T19:11:00.003+02:002022-06-14T15:52:44.659+02:00Extraer elementos aleatoriamente sin repeticiónPuede descargar el archivo <a href="https://www.dropbox.com/s/5j35g0l0gqhqno7/extrae_aleatoriamente.xlsm?dl=1">extrae_aleatoriamente.xlsm<span class="letrag"></span></a><div><br /></div><div>Disponemos de una columna con datos y queremos extraer en otra columna una serie de datos elegidos de forma aleatoria.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk_jiecJAJkr0THqTol9d_jJuCZ9fuVZPz22SaY_mKBqIHhlaIfxcty_i2E5UYnySoVVM1FBDuaglBUrOkVU7PIS_31aEMxZA0RMYxB3q0nk4noq4hQ1iALKfiuvJhnTA9zYro7pLHKKAb/s703/extraer_aleatoriamente.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="703" data-original-width="473" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk_jiecJAJkr0THqTol9d_jJuCZ9fuVZPz22SaY_mKBqIHhlaIfxcty_i2E5UYnySoVVM1FBDuaglBUrOkVU7PIS_31aEMxZA0RMYxB3q0nk4noq4hQ1iALKfiuvJhnTA9zYro7pLHKKAb/s640/extraer_aleatoriamente.jpg" /></a></div><br /><div><br /></div><div><br /></div><h1 style="text-align: left;"><span style="color: #ffa400;">Pasos a seguir</span></h1><div><ol style="text-align: left;"><li>En la celda amarilla (E4) escribimos cuantos datos queremos extraer. El número puede variar entre 1 y 20. No olvidar pulsar ENTER después de introducir el número.</li><li>Pulsamos sobre el botón que lanza la macro: donde pone Extraer en rojo.</li><li>Con esto ya tendremos una extracción. Pulsando el botón de la macro podremos extraer otra nueva muestra aleatoria.</li></ol><h1 style="text-align: left;"><span style="color: #ffa400;">Código</span></h1></div><div>El código contiene dos partes.</div><div><ul style="text-align: left;"><li>Para manejar la celda amarilla hemos creado un código que maneja un evento. Además la celda amarilla está tratada con Datos/Validación para que únicamente admita números enteros entre 1 y 20.</li></ul></div>
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal;"> Private Sub Worksheet_Change(ByVal Target As Range)
Worksheets("Hoja1").Activate
If Not Intersect(Target, Range("E4")) Is Nothing Then
Target.Interior.ColorIndex = 45
Range("E7:G26").ClearContents
For i = 1 To Target
Cells(i + 6, 5) = i
Next i
End If
End Sub
</code></pre><ul style="text-align: left;"><li>Para la macro que se lanza con el botón hemos creado un procedimiento en VBA que se basa en la idea siguiente. Metemos la columna con los datos de entrada en la matriz A(). Creamos la matriz B() con un listado de los números desde el 1 hasta el 20, ordenados. Nos metemos en un bucle For que recorre la matriz B() comenzando por el final, desde la posición 20 hasta la posición 2. Por cada ciclo del bucle va permutando el valor de esa posición, inicialmente B(20), luego B(19), y así hasta llegar a la última con la que se trabaja que es B(2), con alguno de los valores previos elegidos aleatoriamente. Por ejemplo, el valor de B(20) se permuta con B(7), luego B(19) se permutará con B(15), etc., hasta llegar a B(2) cuyo valor se permutará con B(1). Para hacer estas permutaciones necesitaremos la variable auxiliar aux.</li></ul><div>Es una forma curiosa de barajar las cartas de una baraja, y nos ha permitido crear un algoritmo eficiente. Al final del bucle For obtendremos una matriz B() perfectamente aleatorizada. En el último bucle For lo que hacemos es mostrar en la columna G los valores extraidos simplemente consultando las posiciones correspondientes de la matriz A().<br /><br /></div>
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal;"> Option Explicit
Option Base 1
Sub extrae()
Dim num_datos As Long
Dim num_extraidos As Long
Dim rango_origen As Range
Dim A()
Dim B() As Long 'contiene los números del 1 hasta num_datos, inicialmente ordenados
Dim i As Long, r As Long, aux
num_extraidos = [E4]
Set rango_origen = Range("C7:C26") '<-- El usuario debe cambiar este valor por el de su caso
num_datos = rango_origen.Count
ReDim B(num_datos)
For i = 1 To num_datos
B(i) = i 'asignamos a B() los números del 1 hasta num_datos
Next i
A = rango_origen
Randomize
'vamos a desordenar los valores de la matriz B()
For i = num_datos To 2 Step -1 'i varia disminuye desde n hasta 2
aux = B(i) 'la variable auxiliar captura el valor último, el i-ésimo
r = Int(RND() * i) + 1 'r es un aleatorio entero entre 1 e i
B(i) = B(r) 'el valor i-ésimo será el que tenía A(r,1) que es previo
B(r) = aux 'para finalizar la permuta, el valor A(r,1) toma el valor que teníamos guardado en la variable auxiliar
Next i
For i = 1 To num_extraidos
Cells(i + 6, 6) = B(i)
Cells(i + 6, 7) = A(B(i), 1)
Next i
Range("E4").Interior.ColorIndex = 36
End Sub
</code></pre>
<br /><div style="text-align: center;"><iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/sx685J5dOX8" width="560"></iframe></div>
Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com2tag:blogger.com,1999:blog-8263944010888306433.post-59874979714124762662020-03-09T13:18:00.006+01:002022-06-14T15:54:03.200+02:00Lanzar una macro al producirse un evento de tipo ChangePuede descargar el archivo <a href="https://www.dropbox.com/s/l8waqytwllqtims/target.xlsm?dl=1">target.xlsm</a><span class="letrag"></span><br />
<div>
<br />
<h2>
<span style="color: orange;">Hoja 1</span></h2>
<br /></div>
<div>
Vamos a crear el rango de color amarillo donde al escribir algo se lance automáticamente una macro que nos saluda. Esto se consigue con la programación por eventos que tiene Excel.<br />
<br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4ZPp9fd0f8fYJ2jbJG6_VJ9VLREA_Pxe6b6rfLXaQFxO_ErTsXGgsTe9Q_S35ZB6ijuDvFnDAjydTUcBrZIL7pXR7khG7CCP6iIT2WmcLHvrPz9p-a57AJ8IZN8XCQsO1eE4uZR6yfvbm/s1600/SNAG-0257.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="372" data-original-width="695" height="171" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4ZPp9fd0f8fYJ2jbJG6_VJ9VLREA_Pxe6b6rfLXaQFxO_ErTsXGgsTe9Q_S35ZB6ijuDvFnDAjydTUcBrZIL7pXR7khG7CCP6iIT2WmcLHvrPz9p-a57AJ8IZN8XCQsO1eE4uZR6yfvbm/s320/SNAG-0257.jpg" width="320" /></a></div>
<br /></div>
<div>
Primero programamos la macro 'saluda' en un módulo de nuestro editor de Visual Basic (VBA).</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4-zaN0AOwi7gyd-mQHQUNMVUIUvZRvp1JOYH-62ySbe8AgYHA8qIvy2J-w_BLMmda1nlFHOvarS3wW1q3NGrZYVIbW4LH30Bu_e1oYSTW1ZtxzCS7mZmBr2SrREqlZrCsNmWQAthKhrhX/s1600/SNAG-0259.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="311" data-original-width="572" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4-zaN0AOwi7gyd-mQHQUNMVUIUvZRvp1JOYH-62ySbe8AgYHA8qIvy2J-w_BLMmda1nlFHOvarS3wW1q3NGrZYVIbW4LH30Bu_e1oYSTW1ZtxzCS7mZmBr2SrREqlZrCsNmWQAthKhrhX/s320/SNAG-0259.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div>
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"> Sub saluda()
MsgBox ("Hola, ¿qué tal?")
End Sub
</code></pre>
</div>
<div>
<br />
Luego nos vamos a la zona de programación para la Hoja1 que es en la que nos encontramos y creamos un evento de tipo Change. Es el siguiente.</div>
<div>
<br />
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"> Private Sub Worksheet_Change(ByVal Target As Range)
Dim R As Range
Set R = Range("$B$6:$B$8")
If Intersect(Target, R) Is Nothing Then
Application.EnableEvents = False
Target.Value = UCase(Target.Value)
Application.EnableEvents = True
Target.Font.ColorIndex = 5
Else
If Target.Value > 1000 Then
Target.Font.ColorIndex = 3
Else
Target.Font.ColorIndex = 0
End If
saluda
End If
End Sub
</code></pre>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjazJWFtrFU6u5qS_lYqmYQwOjYT07bgGABO5Ipp_m3M1zP1DNZSmbW9Bc9jqzkpJPMDt2MkfVwGs_R3eD0dfG9S23kWGS5F777ZwCNOk3ROyJRO_EhNLGpFAcZR74oODqTFCZgDBI5159Q/s1600/SNAG-0260.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="417" data-original-width="821" height="162" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjazJWFtrFU6u5qS_lYqmYQwOjYT07bgGABO5Ipp_m3M1zP1DNZSmbW9Bc9jqzkpJPMDt2MkfVwGs_R3eD0dfG9S23kWGS5F777ZwCNOk3ROyJRO_EhNLGpFAcZR74oODqTFCZgDBI5159Q/s320/SNAG-0260.jpg" width="320" /></a></div>
<br /></div>
<div>
<h2>
<span style="color: orange;">Hoja 2</span></h2>
<div class="separator" style="clear: both; text-align: left;">
Otro método para poder actuar sobre un rango concreto consiste en definir el rango indicando las columnas y filas en las que se encuentra.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeJMkVRg57ZCb2kGJ-P7qKMS9Q7reZxdtw9Kzv7qjAyKFDpaDdlUN5Gr1e6A24mRaac2V4ZQy9FMu7gLS_Vstu5wEk5YjN8Ymamz1rSojaGARvT7c4mjqeNAi4lXSQTGLBteMxQSZSDKRh/s1600/SNAG-0261.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="361" data-original-width="779" height="148" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeJMkVRg57ZCb2kGJ-P7qKMS9Q7reZxdtw9Kzv7qjAyKFDpaDdlUN5Gr1e6A24mRaac2V4ZQy9FMu7gLS_Vstu5wEk5YjN8Ymamz1rSojaGARvT7c4mjqeNAi4lXSQTGLBteMxQSZSDKRh/s320/SNAG-0261.jpg" width="320" /></a></div>
<br /></div>
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"> Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 And Target.Row >= 5 And Target.Row <= 8 Then
[E5] = Application.WorksheetFunction.Sum(Range("B5:B8"))
End If
End Sub
</code></pre>
Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com1tag:blogger.com,1999:blog-8263944010888306433.post-32037471591283022882019-10-22T22:26:00.001+02:002020-03-08T11:05:48.685+01:00Creación del Libro Personal en el Excel de un MacPreviamente hemos conseguido la pestaña Programador siguiendo los pasos de este post:<br />
<div>
<ul>
<li><a href="https://www.excelavanzado.com/2019/10/obtener-la-ficha-programador-en-el.html">Obtener la ficha Programador en el Excel de un Mac</a></li>
</ul>
</div>
<div>
<br /></div>
<div>
Vamos a crear una macro con grabadora. La macro será enormemente sencilla, simplemente situaremos el cursor en alguna celda y con ello finalizaremos la grabación de la macro. Lo interesante no será la macro que hemos creado en sí misma, sino que hemos dicho que se grabe en el libro Personal de forma que si previamente no estaba creado en este ordenador conseguiremos que se cree.</div>
<div>
<br /></div>
<div>
Los pasos a seguir son los siguientes.</div>
<div>
<br /></div>
<div>
<h2>
<span style="color: orange;">Paso 1</span></h2>
</div>
<div>
Ir a la ficha Programador<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1rJmtAuT6iZqbv4O6CVkPVI3ZPMDh-oiKab5GHR9C27f9e8TK1CXlQ30bkKA64ceHT15bUJ2cd1bJc5UnGZmdPHGeOE-RJcmnq7N6iiofcQuOIeGThwAVceY5oKRQ1erlNiHMOIKrpqqq/s1600/Captura+de+pantalla+2019-10-10+a+las+23.20.53.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="317" data-original-width="951" height="106" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1rJmtAuT6iZqbv4O6CVkPVI3ZPMDh-oiKab5GHR9C27f9e8TK1CXlQ30bkKA64ceHT15bUJ2cd1bJc5UnGZmdPHGeOE-RJcmnq7N6iiofcQuOIeGThwAVceY5oKRQ1erlNiHMOIKrpqqq/s320/Captura+de+pantalla+2019-10-10+a+las+23.20.53.png" width="320" /></a></div>
<br />
<h2>
<span style="color: orange;">Paso 2</span></h2>
Crear macro<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPQCFLIA7AheeaJ8lWGvv-WXR0nGlWjzl-HhuTFIab5BswJtscwehyphenhyphenqiVziHB2AnXADcA2Tt4oJoSMYQaaTPMLNhIFRmfKgGI52TXzJqv9T97tJZIMjya1eQzuGCpej6v-H1ZdaczHhl9-/s1600/Captura+de+pantalla+2019-10-10+a+las+23.21.56.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="534" data-original-width="561" height="304" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPQCFLIA7AheeaJ8lWGvv-WXR0nGlWjzl-HhuTFIab5BswJtscwehyphenhyphenqiVziHB2AnXADcA2Tt4oJoSMYQaaTPMLNhIFRmfKgGI52TXzJqv9T97tJZIMjya1eQzuGCpej6v-H1ZdaczHhl9-/s320/Captura+de+pantalla+2019-10-10+a+las+23.21.56.png" width="320" /></a></div>
<h2>
<span style="color: orange;">Paso 3</span></h2>
<div class="separator" style="clear: both; text-align: left;">
No cambiaremos el nombre de la macro que vamos a crear. El nombre Macro1 nos vale perfectamente.</div>
<div class="separator" style="clear: both; text-align: left;">
Lo que sí haremos es elegir que se grabe en el "<b>Libro de macros personal</b>". Esto se hace así para que obliguemos a Excel a que cree el libro en nuestro ordenador por si previamente no existía.</div>
<div class="separator" style="clear: both; text-align: left;">
Aceptar.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX1E0D0Wgpi4zarpMrjkhFMd_7X64ODmsh-Ro_cmR2sw1shyphenhypheneO1Ym7Fa1Nhb8qi2NHj4tLy98L_qBE5s7vSViaPDjffYL_HCBzPvuUQoKLqj9EyvqTQpJdJa3DY3lf9DCoHc8EvHZ2Yq3J/s1600/Captura+de+pantalla+2019-10-10+a+las+23.22.17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="537" data-original-width="577" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX1E0D0Wgpi4zarpMrjkhFMd_7X64ODmsh-Ro_cmR2sw1shyphenhypheneO1Ym7Fa1Nhb8qi2NHj4tLy98L_qBE5s7vSViaPDjffYL_HCBzPvuUQoKLqj9EyvqTQpJdJa3DY3lf9DCoHc8EvHZ2Yq3J/s320/Captura+de+pantalla+2019-10-10+a+las+23.22.17.png" width="320" /></a></div>
<h2>
<span style="color: orange;">Paso 4</span></h2>
Comprobemos que se ha creado el Libro de macros Personal. Para ello en la pestaña Programador elegimos <b>Visual Basic</b>, que es el icono que hay a la izquierda.<br />
Al hacer esto veremos el Editor de Visual Basic que es el de la siguiente imagen.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCVBmORUHii0basduQyfE0602rWmc3CMcnf_RyBYqd9X23JEfcHHjvVIhbxxotMpXl-zu9CKv4bF-Nmm3BAr6uyXFgAUgE-4eHvKtwqMaMC368kCiW_T2eyupUAIbJxHE6DQObx5RX312I/s1600/Captura+de+pantalla+2019-10-10+a+las+23.24.04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="618" data-original-width="1047" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCVBmORUHii0basduQyfE0602rWmc3CMcnf_RyBYqd9X23JEfcHHjvVIhbxxotMpXl-zu9CKv4bF-Nmm3BAr6uyXFgAUgE-4eHvKtwqMaMC368kCiW_T2eyupUAIbJxHE6DQObx5RX312I/s400/Captura+de+pantalla+2019-10-10+a+las+23.24.04.png" width="400" /></a></div>
<h2>
<span style="color: orange;">Paso 5</span></h2>
A la izquierda podremos ver que pone <code><b>VBAproject(PERSONAL.XLSB)</b></code> eso quiere decir que se ha creado bien el libro personal.<br />
Pulsaremos sobre el signo + que aparece a la izquierda del libro personal para que se abra ese desplegable.<br />
También pulsaremos sobre el signo + que aparece a la izquierda de la palabra Módulos, y así podremos ver el Módulo1 que aparece en la imagen.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-RVmeEe2tYYmXtqYFnoFYjJwRDUVgjpUQ0gGmcdFo-7HsWTqQFAIMoKpZGFumnumzNv6HyD2DYjYVXuM5n8c5vST4V4k8ynRXyi2XD92AN7YjLJeUzA-ahHMTiO-SR4U9t2dbJzq7Cgcf/s1600/Captura+de+pantalla+2019-10-10+a+las+23.24.48.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="623" data-original-width="1049" height="237" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-RVmeEe2tYYmXtqYFnoFYjJwRDUVgjpUQ0gGmcdFo-7HsWTqQFAIMoKpZGFumnumzNv6HyD2DYjYVXuM5n8c5vST4V4k8ynRXyi2XD92AN7YjLJeUzA-ahHMTiO-SR4U9t2dbJzq7Cgcf/s400/Captura+de+pantalla+2019-10-10+a+las+23.24.48.png" width="400" /></a></div>
<br />
<br />
<h2>
<span style="color: orange;">Paso 6</span></h2>
Hacemos doble click sobre el Módulo1. No basta con hacer un solo click, debe ser doble click. De esta forma llegaremos a ver las macros que contiene este módulo. En la imagen siguiente únicamente se muestra una macro que contiene este Módulo1. Se trata de la macro que se creó con la grabadora de macros.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhndgrViVxUPTS4OgP11vocvHIdsdwKr-9bnhJDgrZ-dse4VIXUddOAUqYbPSquCC18tV-xRfqa6vEGJqsgpAEOlIBJm-Z2AZo_sSUrmxkEwnMwJIcsPd8rowVkgbR3g2Ddt5hyaBtHJOnc/s1600/Captura+de+pantalla+2019-10-10+a+las+23.25.07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="618" data-original-width="1044" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhndgrViVxUPTS4OgP11vocvHIdsdwKr-9bnhJDgrZ-dse4VIXUddOAUqYbPSquCC18tV-xRfqa6vEGJqsgpAEOlIBJm-Z2AZo_sSUrmxkEwnMwJIcsPd8rowVkgbR3g2Ddt5hyaBtHJOnc/s400/Captura+de+pantalla+2019-10-10+a+las+23.25.07.png" width="400" /></a></div>
<br />
<h2>
<span style="color: orange;">Paso 7</span></h2>
La macro que se creó con la grabadora de macros denominada Macro1 no nos sirve para nada ya que únicamente se creó en el libro personal para forzar a Excel a que creara el libro Personal. Ahora, si así lo queremos <b>podemos borrar la macro</b>. Como es texto, simplemente la seleccionamos y la borramos con la tecla suprimir del teclado.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj_-3djgL9d36IOv8GDIx6kSLZASjzDAgz0YG79PQCg_-lGjF6fPuBDCK2Yh-pm9OEFKtN1L-cHV-gkoZ_M_-8_W6PMchoRaFCclqOW27iDz5OgCFRbushLXU1EyZ2mzFMzxURfRG2Ssvg/s1600/Captura+de+pantalla+2019-10-22+a+las+21.35.54.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="640" data-original-width="915" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj_-3djgL9d36IOv8GDIx6kSLZASjzDAgz0YG79PQCg_-lGjF6fPuBDCK2Yh-pm9OEFKtN1L-cHV-gkoZ_M_-8_W6PMchoRaFCclqOW27iDz5OgCFRbushLXU1EyZ2mzFMzxURfRG2Ssvg/s320/Captura+de+pantalla+2019-10-22+a+las+21.35.54.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<h2>
<span style="color: orange;">Paso 8</span></h2>
Es ese Módulo1 escribiremos nuestro código VBA (Visual Basic for Applications) que en este caso en lugar de ser una macro será unas funciones que luego podremos usar.<br />
En nuestro caso crearemos dos funciones una para calcular el valor actual de una renta geométrica y otra para calcular el valor final de este tipo de rentas. El código es el siguiente.<br />
<br />
<br />
<code>Function VAgeo(C, q, n, i)<br />
If q = 1 + i Then<br />
VAgeo = C * n / (1 + i)<br />
Else<br />
VAgeo = C * (1 - (q / (1 + i)) ^ n) / (1 + i - q)<br />
End If<br />
End Function<br />
<br />
Function VFgeo(C, q, n, i)<br />
VFgeo = VAgeo(C, q, n, i) * (1 + i) ^ n<br />
End Function</code><br />
<br />
Este código se ha de incluir en nuestro módulo quedando así.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRLbehk2Bf3fiGU8NyQvCSftts-kHUWiTPqxlrEyI7mRdaqb3uJQX6y5kornLMkNhfiTuP8sq1zZCc27hTDAYarJ_dsO2pjJwWyzId9fKu7aCrqHdEbMNbmDMTTmUDe_4ZbLc09h1t6kmr/s1600/Captura+de+pantalla+2019-10-22+a+las+21.34.33.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="640" data-original-width="915" height="278" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRLbehk2Bf3fiGU8NyQvCSftts-kHUWiTPqxlrEyI7mRdaqb3uJQX6y5kornLMkNhfiTuP8sq1zZCc27hTDAYarJ_dsO2pjJwWyzId9fKu7aCrqHdEbMNbmDMTTmUDe_4ZbLc09h1t6kmr/s400/Captura+de+pantalla+2019-10-22+a+las+21.34.33.png" width="400" /></a></div>
<h2>
<span style="color: orange;">Paso 9</span></h2>
Grabamos el código que hemos creado pulsando arriba el icono que representa un disquete.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidvxS9DCEiLhCgrDINfn6OHQsfDUAVvCi2-ufwEDgGhuA0FWNLPAtctKC73-w-8pfpjcmGBnHApTJygRB0hLT006oG2PdwRixVJVYo6Z2f1Lf7K_dhjJZl1fwSekBla_zNMAptR2j7zoq3/s1600/Captura+de+pantalla+2019-10-22+a+las+21.44.05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="84" data-original-width="155" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidvxS9DCEiLhCgrDINfn6OHQsfDUAVvCi2-ufwEDgGhuA0FWNLPAtctKC73-w-8pfpjcmGBnHApTJygRB0hLT006oG2PdwRixVJVYo6Z2f1Lf7K_dhjJZl1fwSekBla_zNMAptR2j7zoq3/s1600/Captura+de+pantalla+2019-10-22+a+las+21.44.05.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<h2>
<span style="color: orange;">Paso 10</span></h2>
Comprobemos que todo funciona bien. En la hoja de cálculo en una celda escribimos:<br />
<br />
=personal.xlsb!vageo(1000;1,1;8;5%)<br />
<br />
Con ello estamos pidiendo a Excel que calcule el valor actual de una renta geométrica pospagable de 8 términos anuales, donde el primero de ellos es de 1.000 €, y el resto se incrementan anualmente un 10%, por lo que la razón de la renta geométrica es 1,1 y donde todo ello se valora al 5% anual.<br />
<br />
Los datos son:<br />
<br />
<ul>
<li>C=1000</li>
<li>q=1,1</li>
<li>n=8</li>
<li>i=0,05</li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO_CJYCDVOi7TZh-rVYGyqNTf5eQ7YhjMMLmuXiXlZuLEEWg2AdUsFt6qG52WtZN_w8W-01K6CiqD4XOpUia-d-FJi4UlKofVt_blN8OW5p4g1wIpyt5PQWYeGzljpqlH9_ZUl42Zx-Zur/s1600/Captura+de+pantalla+2019-10-22+a+las+21.46.46.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="200" data-original-width="735" height="87" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO_CJYCDVOi7TZh-rVYGyqNTf5eQ7YhjMMLmuXiXlZuLEEWg2AdUsFt6qG52WtZN_w8W-01K6CiqD4XOpUia-d-FJi4UlKofVt_blN8OW5p4g1wIpyt5PQWYeGzljpqlH9_ZUl42Zx-Zur/s320/Captura+de+pantalla+2019-10-22+a+las+21.46.46.png" width="320" /></a></div>
<br />
<h2>
<span style="color: orange;">Paso 11</span></h2>
Si todo va bien el resultado obtenido, usando los datos anteriores, es 9017,305652.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibAhLvyl2SKiWLw4D_oNXU967dGuGS-HI4R_inYtYfcdJRy5DUOzkQ6XlbK07o6WeWOVovH1dPT2c1OKmsoivuZFWNtfCizNo6S9pvV2NumGqvrY89IAodohkX-9X82fgkTx-ELshHCGbh/s1600/Captura+de+pantalla+2019-10-22+a+las+21.52.11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="200" data-original-width="735" height="87" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibAhLvyl2SKiWLw4D_oNXU967dGuGS-HI4R_inYtYfcdJRy5DUOzkQ6XlbK07o6WeWOVovH1dPT2c1OKmsoivuZFWNtfCizNo6S9pvV2NumGqvrY89IAodohkX-9X82fgkTx-ELshHCGbh/s320/Captura+de+pantalla+2019-10-22+a+las+21.52.11.png" width="320" /></a></div>
<h2>
<span style="color: orange;">Paso 12</span></h2>
Comprobación. Veamos qué resultado se obtiene al calcular el valor actual de esta renta utilizando el VAN con la función de Excel VNA. La fórmula sería<br />
<br />
=VNA(5%;D3:D10)<br />
<br />
En la imagen se puede ver que el resultado obtenido es de 9.017,31 € que redondeado a dos decimales y con formato de euros, coincide con el anteriormente obtenido con el VAgeo programado.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCp-LNdBDPl8Fer8gVIQeYyBWuKciEte1OeNyY2oa3lZ2w35NhM5Cj6QUSgxVpABgJfZjcdj16ZoyUM8nuZd_Pa4Q7Uml7dbjkl_hv7-l0BQHFWHohwCpcemSERaKW666dDgCy2mZUnak-/s1600/Captura+de+pantalla+2019-10-22+a+las+21.55.14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="340" data-original-width="343" height="317" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCp-LNdBDPl8Fer8gVIQeYyBWuKciEte1OeNyY2oa3lZ2w35NhM5Cj6QUSgxVpABgJfZjcdj16ZoyUM8nuZd_Pa4Q7Uml7dbjkl_hv7-l0BQHFWHohwCpcemSERaKW666dDgCy2mZUnak-/s320/Captura+de+pantalla+2019-10-22+a+las+21.55.14.png" width="320" /></a></div>
<br />
<h3>
<span style="color: purple;">Notas</span></h3>
<br />
<ul>
<li>Los pasos iniciales se deben realizar solo una vez para conseguir crear el libro PERSONAL.XLSB en nuestro ordenador. Posteriormente, si deseamos incluir más fórmulas en el libro Personal simplemente las iremos añadiendo como texto unas debajo de otras en el Módulo1.</li>
<li>El libro Personal tiene la ventaja de que todas las fórmulas y macros que incluyamos en él estarán disponibles para los nuevos libros de Excel que creemos en el futuro. Esto supone que, en ese ordenador cualquier libro nuevo que se cree permitirá utilizar las funciones programadas, y evitaremos tener que estar incluyendo estas macros en todos los libros que las necesiten.</li>
<li>En principio las macros y funciones creadas en el libro Personal estarán disponibles únicamente para los libros nuevos que se creen en el futuro. Pero para los libros antiguos, los que ya teníamos grabados antes de crear el libro Personal es posible que no tengamos operativas las fórmulas programadas, del tipo VAgeo. Esto lo podemos comprobar y si realmente no nos funciona VAgeo en los libros antiguos existen dos soluciones. La primera de ellas es que si en el libro antiguo ya teníamos creada la macro asociada a ese libro, ésta seguirá funcionado y no necesitaremos hacer nada. La segunda solución, en caso de que no tengamos las funciones ya programadas en el libro antiguo consiste en hacer un duplicado del libro antiguo y grabarlo con otro nombre. De esta forma al grabar el duplicado con un nuevo nombre ya se tratará de un libro nuevo donde funcionará perfectamente toda fórmula que tengamos creada en el libro Personal.</li>
<li>No olvidemos que al grabar los libros que usan macros deben ser grabados con la extensión .<b>xlsm</b> en lugar de la habitual para hojas de cálculo sin macros que es .xlsx. La extensión en ocasiones no está visible en nuestro ordenador en cuyo caso nos tenemos que fijar en que al grabar ponga "Libro de Excel habilitado para macros".</li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcuPAGqqk7qukUQl4p2zwIQ6vNcdflElOlzWS5fIH10UZmvEM3hNN5yAUn1fU3mX4H16XEzVPzOsmcBEfdcMOINOnKk3U3OBuqeozSuaHT-cCWAiNqqJ7dyL3ORr62GzwfqC9eYlbfMap4/s1600/Captura+de+pantalla+2019-10-22+a+las+22.12.28.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="697" data-original-width="732" height="380" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcuPAGqqk7qukUQl4p2zwIQ6vNcdflElOlzWS5fIH10UZmvEM3hNN5yAUn1fU3mX4H16XEzVPzOsmcBEfdcMOINOnKk3U3OBuqeozSuaHT-cCWAiNqqJ7dyL3ORr62GzwfqC9eYlbfMap4/s400/Captura+de+pantalla+2019-10-22+a+las+22.12.28.png" width="400" /></a></div>
<br /></div>
Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com0tag:blogger.com,1999:blog-8263944010888306433.post-88913172606575877882019-10-11T21:20:00.000+02:002019-10-11T21:20:23.069+02:00Obtener la ficha Programador en el Excel de un Mac<div class="separator" style="clear: both; text-align: justify;">
Queremos instalar o habilitar la pestaña o ficha PROGRAMADOR en el Excel de nuestro Mac. Existen algunas diferencias entre el Excel de Windows y el Excel que utilizamos en Apple.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Para obtener la ficha Programador en el Excel de MacOS sigue estos pasos:</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
</div>
<h3>
Paso 1</h3>
<div class="separator" style="clear: both; text-align: justify;">
Excel / Preferencias</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvCckUMyXpuU8WWiBq8ntb6qEdC7zslvnkqlPxigNNGVsE_h-3ZzWRgQaZ39THe75bQpRgUIHmHNlac2LCM4tkV6I9NQ-vGgiFUVX752fwEtbNmgwcU9JskNvEzGX2XztmeQuP0hOobdGy/s1600/Captura+de+pantalla+2019-10-10+a+las+23.00.13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="378" data-original-width="800" height="188" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvCckUMyXpuU8WWiBq8ntb6qEdC7zslvnkqlPxigNNGVsE_h-3ZzWRgQaZ39THe75bQpRgUIHmHNlac2LCM4tkV6I9NQ-vGgiFUVX752fwEtbNmgwcU9JskNvEzGX2XztmeQuP0hOobdGy/s400/Captura+de+pantalla+2019-10-10+a+las+23.00.13.png" width="400" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipMdDSxBtyBLTkrgOUg8FENT3FZGqUqsO-SrCQtvHjGq22IPP9UPR6eiu4kIX9bvXr7fTkjgPKjxQzjpbtYA1ZwoBfBlV0dpgBQ0ShTNoePOiDNP6LCMeHvMIX2E86X2fDFKr4JValbVMu/s1600/Captura+de+pantalla+2019-10-10+a+las+23.03.56.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="714" data-original-width="782" height="365" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipMdDSxBtyBLTkrgOUg8FENT3FZGqUqsO-SrCQtvHjGq22IPP9UPR6eiu4kIX9bvXr7fTkjgPKjxQzjpbtYA1ZwoBfBlV0dpgBQ0ShTNoePOiDNP6LCMeHvMIX2E86X2fDFKr4JValbVMu/s400/Captura+de+pantalla+2019-10-10+a+las+23.03.56.png" width="400" /></a></div>
<br />
<br />
<span style="text-align: justify;"></span><br />
<h3>
<span style="text-align: justify;">Paso 2</span></h3>
<br />
<span style="text-align: justify;">Barra de herramientas y cinta de opciones.</span><br />
<span style="text-align: justify;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9DVDYBTnMjln0LIJ-JjkvhooOQC4bULz3HVWY0nOjI0mlwNo1GfFr6I28rWdiYPBee8spt3TygyXWdHGYL_BuEX6NSNncIYUnxw85KMhqpm21s4yHUr9ph5-IklyjPPvn4oYEwsfq35w7/s1600/Captura+de+pantalla+2019-10-11+a+las+14.39.11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="74" data-original-width="129" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9DVDYBTnMjln0LIJ-JjkvhooOQC4bULz3HVWY0nOjI0mlwNo1GfFr6I28rWdiYPBee8spt3TygyXWdHGYL_BuEX6NSNncIYUnxw85KMhqpm21s4yHUr9ph5-IklyjPPvn4oYEwsfq35w7/s1600/Captura+de+pantalla+2019-10-11+a+las+14.39.11.png" /></a></div>
<span style="text-align: justify;"><br /></span>
<span style="text-align: justify;"></span><br />
<h3>
<span style="text-align: justify;">Paso 3</span></h3>
<br />
<span style="text-align: justify;">Marcar la casilla correspondiente a Programador que estará inicialmente desmarcada.</span><br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5kLzP6LnAUQUISq5axOCT_sYhh5TeF7TOhYyqDkW1B-27pAU613BpehHCEq_fDs-Mu0dl50xO7KXq8biV4Jx4VvV3TQMFb1By26rsOTugHq-zPtJi-sjeavszCtl91onra5cecodnLWFs/s1600/Captura+de+pantalla+2019-10-10+a+las+23.06.44.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="659" data-original-width="692" height="380" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5kLzP6LnAUQUISq5axOCT_sYhh5TeF7TOhYyqDkW1B-27pAU613BpehHCEq_fDs-Mu0dl50xO7KXq8biV4Jx4VvV3TQMFb1By26rsOTugHq-zPtJi-sjeavszCtl91onra5cecodnLWFs/s400/Captura+de+pantalla+2019-10-10+a+las+23.06.44.png" width="400" /></a></div>
<br />
<h3>
Paso 4</h3>
Comprobar que ahora ya dispondremos de la pestaña Programador.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlbz_L5ONl5W5HiwGK_b1PHExYqN2baDXq5TU1eCxqaYSi_o5c7WBj1jvT5-_S9tJ3Kf50xUKlaWtW87oN0D7zvxVL0eiF9JKjGLC3aQuCy83-HeQRkWgEm1HcYnnZz95MNH3QD-js5-eZ/s1600/Captura+de+pantalla+2019-10-10+a+las+23.07.16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="361" data-original-width="810" height="177" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlbz_L5ONl5W5HiwGK_b1PHExYqN2baDXq5TU1eCxqaYSi_o5c7WBj1jvT5-_S9tJ3Kf50xUKlaWtW87oN0D7zvxVL0eiF9JKjGLC3aQuCy83-HeQRkWgEm1HcYnnZz95MNH3QD-js5-eZ/s400/Captura+de+pantalla+2019-10-10+a+las+23.07.16.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<h3>
Versión utilizada</h3>
<div class="separator" style="clear: both; text-align: left;">
Las imágenes anteriores corresponden a la versión 16.29.1 del Microsoft Office a fecha octubre 2019.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxfH_QwUrqY8hXDovTE7h_PLg-QTumUygpExSieWoRC4yh_K0LgsTtawdppiR4Hi3JmjF7B-y9n4sgfmrwSk5vGbEfkmMKHBOHVOeeyP64mCC0vDojT-79lXxQidNA5LKDsFIojHqCYadT/s1600/Captura+de+pantalla+2019-10-11+a+las+14.49.46.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="518" data-original-width="377" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxfH_QwUrqY8hXDovTE7h_PLg-QTumUygpExSieWoRC4yh_K0LgsTtawdppiR4Hi3JmjF7B-y9n4sgfmrwSk5vGbEfkmMKHBOHVOeeyP64mCC0vDojT-79lXxQidNA5LKDsFIojHqCYadT/s320/Captura+de+pantalla+2019-10-11+a+las+14.49.46.png" width="232" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<span class="letrag"></span>Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com0tag:blogger.com,1999:blog-8263944010888306433.post-58045012608417123342019-05-02T09:27:00.001+02:002019-05-02T09:36:39.822+02:00VAN a tipo variablePuede descargar el archivo <a href="https://www.dropbox.com/s/1v224e92u0gq6ui/VanTir.xlsm?dl=1">VanTir.xlsm</a><span class="letrag"></span><br />
<div>
<br /></div>
<div>
El Valor Actual Neto (VAN) habitualmente se calcula utilizando un tipo de interés fijo. En esta ocasión vamos a calcular el VAN utilizando una tasa de descuento variable. Lo haremos montando en Excel una tabla con los factores de descuento y usando la función SUMAPRODUCTO para calcular el valor actual. También afrontaremos la resolución utilizando una función programada por el usuario denominada <b>VANvariable</b>. Veamos los dos métodos.</div>
<div>
<br /></div>
<h2>
<span style="color: orange;">Método 1 (resolución manual)</span></h2>
<div>
<div class="separator" style="clear: both; text-align: left;">
Como datos manejamos la columna C con los flujos de caja y la columna D con la tasa de descuento k. Se ha de cumplir que si los flujos de caja comienzan en t=0 con el desembolso inicial y terminan en t=n con el último flujo de caja, podamos disponer de n tasas de descuento, uno por cada periodo, salvo el instante t=0 donde no se requiere ninguna tasa de descuento. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgasNZhWLJenb0gZ0LFFaTWR9SlSfzP-iAtwKLbBYWyQ9kaZXwUzmOTRQ5N6RHNSaOdH4loyocz-Hz_f_gUokq3Eom2yHxvL4OGFE6DknVdaOBJjgfTf7arFyZ_DU92P7T7Lokw6dXez8lb/s1600/SNAG-1292.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="303" data-original-width="520" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgasNZhWLJenb0gZ0LFFaTWR9SlSfzP-iAtwKLbBYWyQ9kaZXwUzmOTRQ5N6RHNSaOdH4loyocz-Hz_f_gUokq3Eom2yHxvL4OGFE6DknVdaOBJjgfTf7arFyZ_DU92P7T7Lokw6dXez8lb/s1600/SNAG-1292.png" /></a></div>
<br /></div>
<div>
La columna D contiene la tasa de descuento k.<br />
<br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmQTwlQFPuVWPVAPKtqIBoxfkTlrXtkvX3lkJS72iFgiXwsuRpX46IxYWuMAZavkeDuM7pDknZmeTWsHqpgY5S-oEKNYUkCGjcygHr_7QUXs64MA8L-JlsDxR22V3BIX1I7wUQEFzF84bt/s1600/SNAG-1291.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="298" data-original-width="542" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmQTwlQFPuVWPVAPKtqIBoxfkTlrXtkvX3lkJS72iFgiXwsuRpX46IxYWuMAZavkeDuM7pDknZmeTWsHqpgY5S-oEKNYUkCGjcygHr_7QUXs64MA8L-JlsDxR22V3BIX1I7wUQEFzF84bt/s1600/SNAG-1291.png" /></a></div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
<br /></div>
<div>
La función SUMAPRODUCTO multiplica por parejas los flujos de caja por el factor de descuento.</div>
<div>
<br /></div>
<h2>
<span style="color: orange;">Método 2 (programando una función)</span></h2>
<div>
La función programada VANvariable no incluye el desembolso inicial que se ha de sumar fuera de la función. En nuestro ejemplo sumamos los -4.000 € que al ser negativo minoran el valor obtenido.<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjgXTvVi_RQSw-za28J6XFi5pyY6JVNDVHqeLAYio1sEiz6NyNOfS-4KHiJmUIwOBJwEBjUB6m8hCwvaKrtqCIULJU9SocGgAP-0mYSZi2xCfMsAJRcrkhAOasP9HpW1-hvFmLefL5vqVM/s1600/SNAG-1289.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="83" data-original-width="364" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjgXTvVi_RQSw-za28J6XFi5pyY6JVNDVHqeLAYio1sEiz6NyNOfS-4KHiJmUIwOBJwEBjUB6m8hCwvaKrtqCIULJU9SocGgAP-0mYSZi2xCfMsAJRcrkhAOasP9HpW1-hvFmLefL5vqVM/s1600/SNAG-1289.png" /></a></div>
<div>
<br /></div>
<div>
Veamos el código.</div>
<br />
<pre style="background: #f0f0f0; border: 10px dashed #f0f0f0; color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;">Function VANvariable(flujos As Range, tasas As Range) As Double
'tasas es el rango donde se encuentran las tasas de descuento
'Los flujos de caja son todos menos el desembolso inicial
Dim n As Long
Dim fDto As Double 'factor de capitalización
Dim VA As Double 'Valor Actual
'n = nº de celdas que contienen los flujos de caja, NO incluido el desembolso inicial
n = flujos.Rows.Count
VA = 0 'inicializamos el VA a cero
If n = tasas.Rows.Count Then
fDto = 1 'inicialmente el factor de descuento es 1
For i = 1 To n
fDto = fDto / (1 + tasas(i)) 'el factor de descuento es acumulativo
VA = VA + flujos(i) * fDto
Next i
Else
'mensaje que sale si el nº de filas de los rangos tasas y flujos no coincide
VANvariable = "rangos no coinciden"
End If
VANvariable = VA
End Function
</code></pre>
<br />Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com0tag:blogger.com,1999:blog-8263944010888306433.post-83229500665624646132019-04-16T12:13:00.002+02:002019-04-24T22:30:23.233+02:00TIR modificada a tipo variablePuede descargar el archivo <a href="https://www.dropbox.com/s/1v224e92u0gq6ui/VanTir.xlsm?dl=1">VanTir.xlsm</a><span class="letrag"></span><br />
<br />
Disponemos de una inversión a 20 años con flujos de caja unos positivos y otros negativos. En este caso si calculamos la TIR obtenemos un caso de TIR múltiple con tres puntos de corte en el eje de abcisas. Vea la hoja denominada 'TIR MULTIPLE'.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9WgHwprhxvV-qfOZscqGnBkfUonNlQGQRg4U0cyOhJYLMIJZKMfKyWMmmrwdt_0ogkqtht42BR3wEufoP2SnTkYaqAR6sNh5yYg3uTxStB6Oykm2dHo3u3zETOUdaSiSJ0X9A1_8Snjfo/s1600/SNAG-1268.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="560" data-original-width="978" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9WgHwprhxvV-qfOZscqGnBkfUonNlQGQRg4U0cyOhJYLMIJZKMfKyWMmmrwdt_0ogkqtht42BR3wEufoP2SnTkYaqAR6sNh5yYg3uTxStB6Oykm2dHo3u3zETOUdaSiSJ0X9A1_8Snjfo/s1600/SNAG-1268.png" width="600" /></a></div>
<br />
<div>
<br />
Podemos resolver la incoherencia que haber obtenido tres valores para la TIR utilizando la denominada TIR modificada o corregida. Consiste en descontar los flujos de caja negativos hasta el instante t=0 a cierta tasa de descuento y capitalizar los flujos de caja positivos hasta su valor final en t=n a cierta tasa de capitalización también conocida. De esta forma habremos conseguido tener únicamente dos capitales, uno inicial Co y otro final Cn. Para calcular la TIR modificada únicamente tendremos que aplicar la ley de la capitalización compuesta a esos capitales durane el número de peridos n y despejar el tipo de interés <i>i</i> necesario para que la ecuación se cumpla.<br />
<br />
Esto lo podemos ver en la hoja denominada 'TIRM'.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2PPXoT4p6rpqMcFzl5ebOUrid1U27wYwr7eJlfJthanThSYNy737hJ5_GN2Innd0H8Ixhen4tXOwypmX9t1pxk8jkt4INkflkwu4yQd_QIO_vMd2w3BQjY5B0eet9Mvm802eqJPmI3xl1/s1600/SNAG-1269.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="626" data-original-width="1167" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2PPXoT4p6rpqMcFzl5ebOUrid1U27wYwr7eJlfJthanThSYNy737hJ5_GN2Innd0H8Ixhen4tXOwypmX9t1pxk8jkt4INkflkwu4yQd_QIO_vMd2w3BQjY5B0eet9Mvm802eqJPmI3xl1/s1600/SNAG-1269.png" width="600" /></a></div>
<br />
<br />
Si deseamos calcular la TIR modificada o corregida a tipo variable tanto para la tasa de descuento como para la de capitalización seguiremos los siguientes pasos que se pueden ver en la hoja denominada 'TIRM variable'.<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN5zOaqRTfeQsCF-PqI-wImXgZgQjrChEqcqzx9Nci-8YUiGbUdPxTtvdklb6iBvcUCAFItGt-y5TYuzbGlNvyAACpGUmhJj7SvDKgW0Fzxo8CraUPlteFtrqVwlH0-VuMIqhvFChxvUo6/s1600/SNAG-1279.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="493" data-original-width="841" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN5zOaqRTfeQsCF-PqI-wImXgZgQjrChEqcqzx9Nci-8YUiGbUdPxTtvdklb6iBvcUCAFItGt-y5TYuzbGlNvyAACpGUmhJj7SvDKgW0Fzxo8CraUPlteFtrqVwlH0-VuMIqhvFChxvUo6/s1600/SNAG-1279.png" width="600" /></a></div>
<br />
Pasos a seguir.<br />
<ol>
<li>En las columnas D y E separamos los flujos de caja positivos y negativos</li>
<li>En las columnas F y G escribimos la tasa de descuento k1 y la tasa de capitalización k2 que son datos que debemos obtener.</li>
<li>En las columnas H e I calculamos los factores 1/(1+k1) para el descuento de un periodo y (1+k2) para la capitalización de un periodo.</li>
<li>En las columnas J y K calculamos el factor de descuento y el factor de capitalización para multiples periodos. Por ejemplo, para la cuantía que vence el sexto año, en t=6, que es de -200 € tendremos que descontarla multiplicando por el producto siguiente =PRODUCTO($H$7:H13)</li>
<li>Calculamos la TIRM variable en la celda K2 con la fórmula TASA siguiente =TASA(20;;SUMAPRODUCTO(D7:D27;J7:J27);SUMAPRODUCTO(E7:E27;K7:K27))</li>
</ol>
<div>
<h2>
<span style="color: orange;">Programación de una función</span></h2>
También disponemos de una función programada en código de Excel VBA que nos permite calcular la TIR modificada usando tipos de interés variables.<br />
<br />
Podemos verla trabajando en la celda K3.<br />
<br />
=TIRMvariable(C7:C27;F8:F27;G8:G27)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYrJuejJc0keRFzv3N15Z55YL73FPs41vIPYOKZwUtrL0CHt72GSoluk5KIBFtsRvwyHYUX3gxE9OaFjilOvcFva0X4_JLZowyw_e6PURlsancTpBVH3UnttiwCy6lIet8_B-TGVDQQpqU/s1600/SNAG-1280.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="493" data-original-width="702" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYrJuejJc0keRFzv3N15Z55YL73FPs41vIPYOKZwUtrL0CHt72GSoluk5KIBFtsRvwyHYUX3gxE9OaFjilOvcFva0X4_JLZowyw_e6PURlsancTpBVH3UnttiwCy6lIet8_B-TGVDQQpqU/s1600/SNAG-1280.png" width="600" /></a></div>
<br />
Los argumentos son los siguientes.<br />
<br />
=TIRMvariable(flujos de caja;rango de tasas de descuento;rango de tasas de capitalización)<br />
<br />
Los flujos de caja son un rango que incluye el desembolso inicial. En nuestro ejemplo, es el rango C7:C27 que está compuesto por 21 celdas. La macros de la fórmula usa la variable n para calcular el número de esas celdas. En este ejemplo n será igual a 21.<br />
<br />
n=21<br />
<br />
Los rangos k1 y k2 son los que contienen las tasas de descuento y de capitalización respectivamente y en el ejemplo son los siguientes.<br />
<br />
<br />
<ul>
<li>k1 → Rango F8:F27 → número de celdas = 20</li>
<li>k2 → Rango G8:G27 → número de celdas = 20</li>
</ul>
<br />
Observe que el número de tasas de capitalización o descuento son 20 cuando n hemos visto que es 21. Por tanto, siempre se ha de cumplir que el número de tasas de descuento o capitalización han de ser iguales a n-1.<br />
<br />
Existe un caso de error, cuando al indicar los argumentos de la función no se cumple que las filas del rango de k1 han de ser las mismas que las filas del rango k2 y ambas han de ser iguales al número de filas del rango que indica los flujos de caja menos uno. Cuando se produce el error la función responde con el texto "rangos no coinciden".<br />
<br />
El código de la macro que contiene la función es la siguiente.</div>
<br />
<pre style="background: #f0f0f0; border: 10px dashed #f0f0f0; color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;">Function TIRMvariable(flujos As Range, k1 As Range, k2 As Range)
'k1 es el rango donde se encuentran las tasas de descuento
'k2 es el rango donde se encuentran las tasas de capitalización
Dim n As Long
Dim fDto As Double 'factor de capitalización
Dim fCap As Double 'factor de descuento
Dim VA As Double 'Valor Actual
Dim VF As Double 'Valor Final
'n = nº de celdas que contienen los flujos de caja incluido el desembolso inicial
n = flujos.Rows.Count
VA = flujos(1) 'inicializamos el VA con el desembolso inicial
VF = 0 'inicializamos el VF a cero
'pedimos que el rango de los flujos de caja tenga una celda más que
'los rangos de las tasas de descuento y capitalización
If n = k1.Rows.Count + 1 And n = k2.Rows.Count + 1 Then
fDto = 1 'inicialmente el factor de descuento es 1
For i = 2 To n 'comienza en 2 porque i=1 ya se recogió con el desembolso inicial
fDto = fDto / (1 + k1(i - 1)) 'el factor de descuento es acumulativo
'Si el flujo de caja es negativo se calcula el VA acumulando
If flujos(i) < 0 Then VA = VA + flujos(i) * fDto
Next i
'Al finalizar del bucle anterior ya tenemos calculado el VA de los flujos negativos
fCap = 1 'inicialmente el factor de capitalización es 1. Se comienza por el final
For j = n To 1 Step -1 'Los calculos comienzan por el final
fCap = fCap * (1 + k2(j)) 'el factor de capitalización es acumulativo
'Si el flujo de caja es positivo se calcula el VF acumulando
If flujos(j) > 0 Then VF = VF + flujos(j) * fCap
Next j
'Al finalizar del bucle anterior ya tenemos calculado el VF de los flujos positivos
'Llamamos a la función TASA que en inglés es RATE
TIRMvariable = WorksheetFunction.Rate(n - 1, 0, VA, VF)
'Nper es n-1 ya que los flujos de caja comienzan en 0 con el desembolso inicial
Else
'mensaje que sale si los rangos de k1 y k2 no son de longitud n-1
TIRMvariable = "rangos no coinciden"
End If
End Function
</code></pre>
<br />
También disponemos de una macro de prueba que lanza la instrucción <span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Debug.Print</span>.<br />
<br />
<pre style="background: #f0f0f0; border: 10px dashed #f0f0f0; color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;">Sub prueba()
Debug.Print TIRMvariable(Range("C7:C27"), Range("F8:F27"), Range("G8:G27"))
End Sub
</code></pre>
<br />
Esto permite ejecutar la función que mostrará en la ventana Inmediato el resultado de la TIR.Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com0tag:blogger.com,1999:blog-8263944010888306433.post-58399535927664049162019-04-15T10:28:00.001+02:002019-04-22T09:53:04.140+02:00Valor Actual en Excel y en PythonPuede descargar el archivo <a href="https://www.dropbox.com/s/6nof0vi0cbrq6s1/ValorActual.xlsx?dl=1">ValorActual.xlsx</a><span class="letrag"></span><br />
<div>
<br /></div>
<div>
Veamos cómo calcular el valor actual de un capital y de una renta en varios casos.<br />
<ol>
<li>un capital</li>
<li>una renta pospagable</li>
<li>una renta pospagable con un valor final adicional</li>
<li>una renta prepagable con un valor final adicional</li>
</ol>
</div>
<div>
Se calculará usando los recursos siguientes.<br />
<ol>
<li>La función VA de Excel</li>
<li>La función VNA de Excel que calcula el VAN</li>
<li>Programando en Python usando la librería NumPy</li>
<li>Programando en Python una función def</li>
</ol>
</div>
<div>
<br /></div>
<div style="text-align: center;">
<iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/ODo4GfMSPEY" width="560"></iframe>
</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
El código en Python se encuentra en los siguientes enlaces.</div>
<div style="text-align: left;">
<br />
<ol>
<li><a href="https://repl.it/@valoro/VA-capital-unico-numpy">https://repl.it/@valoro/VA-capital-unico-numpy</a></li>
<li><a href="https://repl.it/@valoro/VA-capital-unico-funcion">https://repl.it/@valoro/VA-capital-unico-funcion</a></li>
<li><a href="https://repl.it/@valoro/VA-renta-numpy">https://repl.it/@valoro/VA-renta-numpy</a></li>
<li><a href="https://repl.it/@valoro/VA-renta-VF-numpy">https://repl.it/@valoro/VA-renta-VF-numpy</a></li>
<li><a href="https://repl.it/@valoro/VA-renta-VF-pre-numpy">https://repl.it/@valoro/VA-renta-VF-pre-numpy</a></li>
<li><a href="https://repl.it/@valoro/VA-funcion">https://repl.it/@valoro/VA-funcion</a></li>
</ol>
<br />
<br />
Si está interesado en aprender a programar en Python le recomiendo el siguiente recurso.<br />
<br />
<ul>
<li><a href="https://altocodigo.blogspot.com/p/aprender-haciendo.html">Retos en Python</a></li>
</ul>
</div>
Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com0tag:blogger.com,1999:blog-8263944010888306433.post-20285683869635396462019-02-11T01:03:00.000+01:002019-03-10T09:43:04.966+01:00La diversificación reduce el riesgo financieroPuede descargar el archivo de Excel: <a href="https://www.dropbox.com/s/s5m7w5flpo92mal/reaseguro.xlsx?dl=1">reaseguro.xlsx</a><br />
<br />
En finanzas representamos el riesgo por la varianza σ<sup>2</sup> o su raíz cuadrada, la desviación estándar σ.<br />
<br />
Supongamos dos carteras A y B que proporcionan una cierta rentabilidad en términos esperados del 10% cada una de ellas, y donde ambas tienen el mismo riesgo expresado por una desviación estándar de 0,4 o lo que es lo mismo expresado en porcentaje, del 40%. Vamos a simular mediante una distribución normal inversa las posibles rentabilidades. En principio vamos a generar 5.000 valores para cada cartera. Lo ideal sería generar muchos más si lo soportan la memoria RAM y la capacidad de cálculo de nuestro computador.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAp3onQ4xUmpSthuThBpUr_-5TFJ77PHL9IqJXCUsFkSlI9SNoc_CfHcvqOw71rCYGMNOHOfvQ26SpwsYQyzc1CP81-wKlqkQO8paV8RgfdVVkdLtw9tGijDGBN1-UDjhS3trOv9I-3gzf/s1600/SNAG-1181.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="488" data-original-width="1232" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAp3onQ4xUmpSthuThBpUr_-5TFJ77PHL9IqJXCUsFkSlI9SNoc_CfHcvqOw71rCYGMNOHOfvQ26SpwsYQyzc1CP81-wKlqkQO8paV8RgfdVVkdLtw9tGijDGBN1-UDjhS3trOv9I-3gzf/s1600/SNAG-1181.png" width="600" /></a></div>
<br />
La celda B5 tiene la siguiente fórmula que usa la distribución normal inversa.<br />
<br />
=INV.NORM(ALEATORIO();$H$7;$H$9)<br />
<br />
Suponemos que las rentabilidades de las carteras A y B no están correlacionadas por pertenecer a activos y mercados muy diferentes. Observe que en la celda H11 se obtiene una correlación cercana a cero, ya que la función usada en Excel para generar las rentabilidades esta arrojando valores aleatorios que siguen una distribución normal, siendo la campana de Gauss de la cartera A y B independientes entre si.<br />
<br />
Vamos a realizar un intercambio de carteras de forma que la cartera A pasará a convertirse en la cartera A', y la cartera B se convertirá en la cartera B'.<br />
<br />
Tanto la cartera A' como B' se forman realizando una mezcla al 50% de las carteras anteriores A y B. De esta forma, la cartera A' estará formada por un 50% de sus propios activos A, más otro 50% de los activos de la cartera B. Sucediendo lo mismo en la formación de la cartera B' que también estará formada por 0,5A+0,5B.<br />
<br />
Veamos que la esperanza matemática o media de rentabilidades esperadas μ se comporta de forma lineal ya que la media es una magnitud lineal, proporcional. De esta forma podemos expresar la esperanza de las nuevas carteras A' y B' con las siguientes ecuaciones.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbpOW8_lXvUk5UlM6qAlSc5Ug4-6Rn8dD8T_Xau9IPbPoaK5fx62NMkDEF5VoLmbMBSiRjDUDwvW5Lpcbf3ofVh_wZoVqq1vnQp5Bz6llo_Ay6eNYd6W6buyTkRSSvZMX07oEK7U-rFAgT/s1600/SNAG-1182.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="148" data-original-width="255" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbpOW8_lXvUk5UlM6qAlSc5Ug4-6Rn8dD8T_Xau9IPbPoaK5fx62NMkDEF5VoLmbMBSiRjDUDwvW5Lpcbf3ofVh_wZoVqq1vnQp5Bz6llo_Ay6eNYd6W6buyTkRSSvZMX07oEK7U-rFAgT/s1600/SNAG-1182.png" /></a></div>
El valor 1/2 hace referencia al 50%, que en tanto por uno es 0,5, ya que estamos suponiendo que las nuevas carteras A' y B' participan en un 50% de las viejas carteras A y B.<br />
<br />
Otra forma de interpretarlo sería suponer carteras de dos compañías de seguros con la misma esperanza de rentabilidad (10%), la misma desviación estándar (40%) y totalmente incorrelacionadas. Estas compañías de seguros deciden efectuar un reaseguro mutuo intercambiando el 50% de sus carteras con la otra compañía. De forma que las nuevas carteras que se alcanzan son A' y B'.<br />
<br />
Veamos ahora que el riesgo expresado por la desviación estándar no se comporta de forma lineal ya que la varianza es una medida cuadrática. Justo esta propiedad es la que justifica que el reaseguro o la diversificación hacen que el riesgo disminuya.<br />
<br />
En el caso de la varianza:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQaidiNaYioVAiA_SBPv-bMKjmWk4Z0TBmsoTsulUiizInp-FRePLfyhTu_RAURsFW4UBqveeEZ-O676FsycAkSrLFL9TI4vsLZfCeDV4GwDT8lUxQLH8lTESVP57iSiU2IlWwj5AXh45H/s1600/SNAG-1183.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="145" data-original-width="314" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQaidiNaYioVAiA_SBPv-bMKjmWk4Z0TBmsoTsulUiizInp-FRePLfyhTu_RAURsFW4UBqveeEZ-O676FsycAkSrLFL9TI4vsLZfCeDV4GwDT8lUxQLH8lTESVP57iSiU2IlWwj5AXh45H/s1600/SNAG-1183.png" /></a></div>
<br />
Supongamos que hacemos que coincidan las dos desviaciones. En nuestro caso ambas σ serían 0,4.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitcCUUPPSPYRuWfn0WhK8GTsyKcmkNB_uaiJFDto-EKW5mr8O8c4JKdMMS7jWnyzBfD99ty4iYlNjOP5LgCGbS-CyP1xKwiRQgAVDS4W-b-a-teW5yA-3a7XMEcXHZoOpXZlpuVUhG1YY9/s1600/SNAG-1184.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="36" data-original-width="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitcCUUPPSPYRuWfn0WhK8GTsyKcmkNB_uaiJFDto-EKW5mr8O8c4JKdMMS7jWnyzBfD99ty4iYlNjOP5LgCGbS-CyP1xKwiRQgAVDS4W-b-a-teW5yA-3a7XMEcXHZoOpXZlpuVUhG1YY9/s1600/SNAG-1184.png" /></a></div>
<br />
De aquí, operando, se siguen estas expresiones:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz_hjAaXE7vtkawjyDn10nG9Hj4a12bxOIJGgsRuFKK-C2s2aEPb6NcIAZNPFlD2bzVqCEy3uZPoXU-BTkmD892j5gxQ_nRWXEWWswX2mOLZHJsw5a6MXCUUd_rltpJBc_6zaCCXFkizHr/s1600/SNAG-1185.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="334" data-original-width="433" height="246" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz_hjAaXE7vtkawjyDn10nG9Hj4a12bxOIJGgsRuFKK-C2s2aEPb6NcIAZNPFlD2bzVqCEy3uZPoXU-BTkmD892j5gxQ_nRWXEWWswX2mOLZHJsw5a6MXCUUd_rltpJBc_6zaCCXFkizHr/s320/SNAG-1185.png" width="320" /></a></div>
<br />
<br />
Esta es la justificación formal de que es posible reducir el riesgo de una cartera mediante la diversificación o mediante el reaseguro con otra cartera con la que mantenga una reducida correlación.<br />
<br />
Veamos el ejemplo numérico que hemos creado en Excel donde se obtiene precisamente que el nuevo riesgo de la cartera diversificada es igual al anterior dividido entre raíz de dos.<br />
<br />
<br />
<br />
<br />
<br />Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com0tag:blogger.com,1999:blog-8263944010888306433.post-45546832018521831912018-07-23T21:47:00.003+02:002022-06-14T16:13:38.541+02:00Variable lógica de controlPuede descargar el archivo <a href="https://www.dropbox.com/s/85gy9tc0wwdkh2g/booleanoPorDefecto.xlsm?dl=1">booleanoPorDefecto.xlsm</a><span class="letrag"></span><br />
<div>
<br /></div>
<div>
<br /></div>
<div>
Generamos siete números aleatorios entre 1 y 10 en las celdas del rango B4:H4. En la celda amarilla (B6) generamos otro número en el mismo rango y deseamos conocer si este valor se encuentra entre los siete números generados de la fila 4.</div>
<div>
<br /></div>
<div>
Veamos varias formas de abordar el caso práctico con macros de VBA para Excel.</div>
<div>
<br /></div>
<div>
<h1>
<span style="color: orange;">Caso 1</span></h1>
</div>
<div>
El primer caso imprime en la celda C6 la frase 'Se ha encontrado' cuando el valor de la celda B6 coincide con alguno de los siete números de la fila 4. En la fila 4 pueden darse valores repetidos como se puede ver en la imagen siguiente.</div>
<div>
<br /></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdv8r4Se24O4XP_6z32KanHFJdGpdkAiV0_HrloQFkUr9QaJcVZOJdSF_WOsTjH8bVzdnT1IkuF_t_R2qQ2KWQc8FMtNwHE9y3LcjIeX58ECKRgpSUw_QbmEVJTd6Z9LuziA2g1_h8meJ_/s1600/SNAG-1080.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="433" data-original-width="424" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdv8r4Se24O4XP_6z32KanHFJdGpdkAiV0_HrloQFkUr9QaJcVZOJdSF_WOsTjH8bVzdnT1IkuF_t_R2qQ2KWQc8FMtNwHE9y3LcjIeX58ECKRgpSUw_QbmEVJTd6Z9LuziA2g1_h8meJ_/s320/SNAG-1080.png" width="313" /></a></div>
<br />
El inconveniente de este método reside en que cuando la celda amarilla no coincide con ninguno de los números de la fila 4, en la celda C6 no se imprime nada, ya que no se entra dentro del condicional <code>if</code> en ningún momento. Nos gustaría que si no encuentra coincidencia pusiera una frase indicando que así ha sido. Pero no podemos incluir en el condicional <code>if</code> un <code>else</code> ya que al analizar los siete números cada vez que uno de ellos no coincida con la celda amarilla escribiría la frase indicando que no coinciden. Esto supondría un funcionamiento incorrecto del código. Veamos el segundo caso donde esto se soluciona con la ayuda de una variable booleana.<br />
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub rastrea()
For i = 1 To 7
Cells(4, i + 1) = Int(Rnd() * 10) + 1
Next i
n = WorksheetFunction.RandBetween(1, 10)
Range("B6") = n
Range("C6").ClearContents
For i = 1 To 7
If Cells(4, i + 1) = n Then
Range("C6") = "Se ha encontrado"
End If
Next i
End Sub
</code></pre>
<br />
<br />
<div>
<h1>
<span style="color: orange;">Caso 2</span></h1>
</div>
El código de este caso parte del anterior si bien añade una variable lógica denominada <code>distintos</code> que se inicializa como <code>True</code>. Esto supone que de entrada supondremos que los valores son distintos. Por tanto, supondremos inicialmente que no existe coincidencia de valor entre la celda amarilla y las siete previas de la fila cuatro. Nos metemos en un bucle <code>for</code> que recorre las siete posiciones comprobando con un condicional <code>if</code> si existe coincidencia. Si se detecta alguna coincidencia la variable lógica distintos se torna en <code>False</code>. Finalmente, fuera del bucle, añadimos un nuevo condicional <code>if</code> que analizará si la variable booleana distintos es verdadera y en caso afirmativo imprimirá en la celda B6 la frase 'NO se ha encontrado'.<br />
Observe que en el último condicional <code>if</code> no es necesario poner como condición <code>distintos=True</code>, ya que la variable lógica ya es en si misma <code>True</code> o <code>False</code>.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMB1GwUrbqheB1MYLLnQiPg6mmmBBK3osK8y6wn4SFDq1jiP4zcq2Qx6mdBMlJoT_yfSsTm8s1KPbpQatdAtxhC_0U5-3DCii46knHVWJTESFRApnvpe7MChfjfjOrLYGN022wosugDW11/s1600/SNAG-1081.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="433" data-original-width="419" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMB1GwUrbqheB1MYLLnQiPg6mmmBBK3osK8y6wn4SFDq1jiP4zcq2Qx6mdBMlJoT_yfSsTm8s1KPbpQatdAtxhC_0U5-3DCii46knHVWJTESFRApnvpe7MChfjfjOrLYGN022wosugDW11/s320/SNAG-1081.png" width="309" /></a></div>
<div>
<br />
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub analiza()
Dim distintos As Boolean
distintos = True
For i = 1 To 7
Cells(4, i + 1) = Int(Rnd() * 10) + 1
Next i
n = WorksheetFunction.RandBetween(1, 10)
Range("B6") = n
Range("C6").ClearContents
For i = 1 To 7
If Cells(4, i + 1) = n Then
distintos = False
Range("C6") = "Se ha encontrado"
End If
Next i
If distintos Then
Range("C6") = "NO se ha encontrado"
End If
End Sub
</code></pre>
<br />
<h1>
<span style="color: orange;">Caso 3</span></h1>
</div>
Este caso es una variante del anterior donde no usamos variable lógica. Lo que hacemos es escribir en la celda C6 de entrada, y como valor por defecto, la frase 'NO se ha encontrado'. Luego, si al analizar la coincidencia de valores se verifica que existe alguna coincidencia lo que se hace es reescribir esa celda con la frase 'Se ha encontrado'. Con este método lo que conseguimos es que si no se encuentra coincidencia de valores la frase inicialmente escrita es válida y se muestra en pantalla sin necesidad de añadirla porque ya existía desde un principio.<br />
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="overflow-wrap: normal; word-wrap: normal;"><span style="font-size: 12px;">Sub noEncontradoPorDefecto()
For i = 1 To 7
Cells(4, i + 1) = Int(Rnd() * 10) + 1
Next i
n = WorksheetFunction.RandBetween(1, 10)
Range("B6") = n
Range("C6") = "NO se ha encontrado"
For i = 1 To 7
If Cells(4, i + 1) = n Then
Range("C6") = "Se ha encontrado"
End If
Next i
End Sub</span><span style="font-family: "arial";"><span style="font-size: 12px;">
</span></span></code></pre>
<br />Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com0tag:blogger.com,1999:blog-8263944010888306433.post-19862261646066462262018-07-23T13:37:00.002+02:002022-06-14T16:14:55.846+02:00Pasar argumentos por valor (ByVal) o por referencia (byRef) en VBA para ExcelPuede descargar el archivo <a href="https://www.dropbox.com/s/a1tk96lq1xnd2rj/ReferenciaValor.xlsm?dl=1">ReferenciaValor.xlsm</a><br />
<br />
En el lenguaje de programación VBA para Excel podemos elegir entre pasar parámetros o argumentos a las funciones o subprocedimientos por valor (<code>ByVal</code>) o por referencia (<code>ByRef</code>). Veremos las diferencias de ambos métodos y pondremos varios ejemplos.<br />
<br />
<br />
<ul>
<li><b><code>ByVal</code></b>. Cuando se pasa un parámetro por valor lo que se hace es enviar un número si la variable es numérica o un string si la variable es una cadena, o del tipo que sea. No son la misma variable la interna al subprocedimiento o función que la del procedimiento principal, por lo que al terminar el subprocedimiento y retornar el flujo del programa al procedimiento principal la variable no retorna con el valor con el que hubiera acabado el subprocedimiento. Al retornar al procedimiento principal la variable continúa valiendo lo mismo que valía cuando se envió como parámetro. Por ejemplo, si la variable <code>i</code> se envía como parámetro con el valor 5, y al terminar el subprocedimiento o función finaliza con el valor 10, al retornar al procedimiento principal la variable <code>i</code> continuará con el valor 5.</li>
<li><b><code>ByRef</code>.</b> Cuando se pasa un parámetro por referencia lo que hacemos es enviar una variable con un cierto valor, el que tenga en el momento del envío. Al retornar al procedimiento principal la variable viene con el valor con el que hubiera terminado en el subprocedimiento o función. Por ejemplo, si la variable <code>i</code> se envía como parámetro con el valor 5, y al terminar el subprocedimiento o función finaliza con el valor 10, al retornar al procedimiento principal la variable <code>i</code> vendrá con el valor 10.</li>
</ul>
<br />
<blockquote>
<span style="color: grey; font-size: large;" text-align:="">Por defecto los parámetros en VBA se pasan ByRef</span></blockquote>
<br />
<br />
<br />
<h1>
<span style="color: orange;">Caso 1</span></h1>
Disponemos de un procedimiento principal que contiene un bucle <code>for</code> que se repite cuatro veces. Dentro del bucle únicamente tenemos una línea de código que llama al subprocedimiento <code>Saluda</code> y le pasa el valor de <code>i</code> como parámetro.<br />
El subprocedimiento <code>Saluda</code> recoge el parámetro <code>i</code> como valor (<code>ByVal</code>). Mediante un <code>MsgBox</code> mostrará en una pequeña ventana emergente un saludo diciendo <i>Hola</i> junto al valor de <code>i</code>, que será un número de 1 al 4. Luego, y dentro del subprocedimiento, se asigna a <code>i</code> el valor 100.<br />
<br />
<ul>
<li><b>ByVal</b>. Si pasamos el valor de <code>i</code> por valor, al lanzar el procedimiento principal la macro nos saludará cuatro veces y al final ejecutará la última línea del procedimiento principal y nos dirá que <code>i</code> es igual a 5.</li>
<li><b><code>ByRef</code></b>. Si pasamos el valor de <code>i</code> por referencia, al lanzar el procedimiento principal únicamente nos saludará una vez diciendo <span style="font-family: "courier new" , "courier" , monospace;">Hola1</span>, pero no seguirá con los siguientes ciclos del bucle <code>for</code> ya que la variable <code>i</code> vuelve con el valor 100. Como 100 es superior al límite dado en el bucle <code>for</code> que es cuatro, se considera que el bucle ha finalizado y por tanto se ejecutará la última línea del procedimiento principal que hace que se muestre en pantalla el valor 101.</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWRFJBU0RWXDF_ZEi9LsmRYA1BcQgYsNnKsumUk-CsyD9G5kNB4ltfa-ypmAbOGPMjzEfRuWK9NccyPDyptKrzfhFyyO4gPMqjLt1l_7Rcqwx7r2oSM76hhGF9UuMFtw6DDN6KCCT-bEUr/s1600/byref1.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="370" data-original-width="213" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWRFJBU0RWXDF_ZEi9LsmRYA1BcQgYsNnKsumUk-CsyD9G5kNB4ltfa-ypmAbOGPMjzEfRuWK9NccyPDyptKrzfhFyyO4gPMqjLt1l_7Rcqwx7r2oSM76hhGF9UuMFtw6DDN6KCCT-bEUr/s320/byref1.gif" width="184" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdgnFzGz_NA4nGIGyo2IeUIFgdk9cMBT8VyS9XJ3lLiQAP390AjJ_aDca8X8tZB7z1t54jfaIlFj_Bo17C7Cg3k5PKR2Vk8dLgoqs74fAKFiceA6HLhX8TWiTYEnPlxUHqpO6FC4fwr_B4/s1600/byval1.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="375" data-original-width="226" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdgnFzGz_NA4nGIGyo2IeUIFgdk9cMBT8VyS9XJ3lLiQAP390AjJ_aDca8X8tZB7z1t54jfaIlFj_Bo17C7Cg3k5PKR2Vk8dLgoqs74fAKFiceA6HLhX8TWiTYEnPlxUHqpO6FC4fwr_B4/s320/byval1.gif" width="192" /></a></div>
<br />
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Principal_1()
For i = 1 To 4
Call Saluda(i)
Next i
MsgBox (i)
End Sub</code></pre>
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Saluda(ByVal i)
MsgBox ("Hola" & i)
i = 100
End Sub</code></pre>
<br />
<br />
<br />
<h1>
<span style="color: orange;">Caso 2</span></h1>
En el procedimiento principal asignamos a las variables <code>x</code>, <code>y</code>, <code>z</code> el valor 5. Imprimiremos su valor empleando para la variable <code>x</code> la columna A, para la variable <code>y</code> la columna B y para la variable <code>z</code> la columna C. Llamamos al subprocedimiento <code>Dobla</code> y le pasamos como parámetros los valores <code>x</code>, <code>y</code>, <code>z</code>.<br />
El subprocedimiento <code>Dobla</code> recibe el parámetro <code>x</code> por referencia (<code>ByRef</code>), el parámetro <code>y</code> por valor (<code>ByVal</code>) y el parámetro <code>z</code> lo recibe sin indicar nada para ver cómo trata VBA por defecto los parámetros que se pasan a un subprocedimiento o función. Se dobla el valor de <code>x</code>, <code>y</code>, <code>z</code>. Se imprime nuevamente el valor de <code>x</code>, <code>y</code>, <code>z</code> en la fila dos de las columnas A, B, C respectivamente. Veremos que los valores impresos son 10, 10, 10, esto es así ya que estamos imprimiendo el valor de la variable interna del subprocedimiento y en los tres casos esta variable es el doble de cinco.<br />
Finalizado el subprocedimiento se vuelve al procedimiento principal y en la fila tres se imprimen nuevamente los valores de <code>x</code>, <code>y</code>, <code>z</code>. Pero ahora vemos que lo que se imprime es 10, 5, 10. Veamos el motivo de esta diferencia.<br />
<br />
<br />
<ul>
<li><b>ByRef.</b> El parámetro <code>x</code> se pasó por referencia. Continúa siendo la misma variable la que se definió inicialmente en el procedimiento principal, la que luego se usa en el subprocedimiento y la que finalmente retorna al procedimiento principal. Al retornar, vuelve con el valor 10.</li>
<li><b>ByVal.</b> El parámetro <code>y</code> se pasó por valor y por tanto lo que se hace es pasarlo como si fuera un número sin que quede vinculación con la variable inicialmente definida en el procedimiento principal. En el subprocedimiento se dobla el valor <code>y</code> para de 5 a 10, pero al retornar al procedimiento principal no se retorna ningún valor, y la variable <code>y</code> en el procedimiento principal sigue valiendo 5 que es tal y como se definió en un principio.</li>
<li><b>Por defecto.</b> El parámetro <code>z</code> se pasó sin indicar nada y al final se ha comportado como la variable <code>x</code>. Esto indica que si no ponemos nada, por defecto VBA pasa los parámetros por referencia (ByRef).</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJja1TlOQj7zH55zRrZu8W_Vl0P35E39T0jS25mY72el8C69vzE1ZCUOlShzMApBVKOhdzwFY2DQxlcl9HPgCgbyxvSJFnisk3GuGXOOun0E0oAaNaL7ivbjrRnQmnISyM-2l6QapT1mlL/s1600/SNAG-1079.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="87" data-original-width="126" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJja1TlOQj7zH55zRrZu8W_Vl0P35E39T0jS25mY72el8C69vzE1ZCUOlShzMApBVKOhdzwFY2DQxlcl9HPgCgbyxvSJFnisk3GuGXOOun0E0oAaNaL7ivbjrRnQmnISyM-2l6QapT1mlL/s1600/SNAG-1079.png" /></a></div>
<br />
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Principal_2()
x = 5: y = 5: z = 5
Cells(1, "A") = x: Cells(1, "B") = y: Cells(1, "C") = z
Call Dobla(x, y, z)
Cells(3, "A") = x: Cells(3, "B") = y: Cells(3, "C") = z
End Sub
Sub Dobla(ByRef x, ByVal y, z)
x = 2 * x: y = 2 * y: z = 2 * z
Cells(2, "A") = x: Cells(2, "B") = y:: Cells(2, "C") = z
End Sub</code></pre>
<br />
<br />
<br />
<h1>
<span style="color: orange;">Caso 3</span></h1>
<div class="separator" style="clear: both; text-align: left;">
Queremos listar los números del 10 al 20. Disponemos de un procedimiento principal que llama a un subprocedimiento que se denomina <code>Listado</code>, al que se pasan dos parámetros <code>a</code> y <code>b</code>. El parámetro <code>b</code> se puede pasar por valor o por referencia. Si se pasa por valor la lista impresa se genera en vertical y si se pasa por referencia la lista impresa se muestra en diagonal.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
En el procedimiento principal inicializamos la variable </div>
b haciendo que su valor se igual a uno. Nos metemos en un bucle <code>for</code> donde la variable a varía entre 10 y 20. Dentro del bucle se llama al subprocedimiento Listado pasándole los parámetros <code>a</code> y <code>b</code>.
<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
El subprocedimiento <code>Listado</code> escribe el valor de <code>a</code> en la fila <code>a</code> y columna <code>b</code>. Finalmente tiene una línea de código que incrementa el valor de <code>b</code> en una unidad.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<ul>
<li><b>ByRef. </b>Si pasamos el parámetro b por referencia el incremento de la variable b en una unidad que se hace en la última línea de código se recordará en el procedimiento principal y por tanto la variable b en el primer ciclo del bucle for valdrá 1, pero en el segundo ciclo ya valdrá 2, en el tercero 3, y así sucesivamente. Esto hace que al ejecutar reiteradamente el subprocedimiento y escribir con cells cada vez se haga en una fila más a la derecha, lo que provoca que el resultado se vea en diagonal.</li>
<li><b>ByVal</b>. Si pasamos el parámetro b por valor la última línea de código que hace que b se incremente en una unidad no se recordará al llegar la procedimiento principal y por tanto b continuará valiendo 1 que es el valor con el que se inicializó. Esto provoca que al ser b siempre igual a uno, no nos movamos de la columna uno, y por tanto la serie de números se imprima en vertical todos ellos en la columna uno.</li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf9ROqcSf_JUplZnhyphenhyphenoFEwiohtxgETAptKGyRPWX0tAwR_A19R5CtWzsu_g8zyCuh5d68alWCi-Fuf3_qnJVDOCc7q6MH9Gx7KB39VEwZY9Hq9MgtOjVfTQzsPlIQy2EgkY0pBRCc_zcAw/s1600/byvalref3.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="269" data-original-width="669" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf9ROqcSf_JUplZnhyphenhyphenoFEwiohtxgETAptKGyRPWX0tAwR_A19R5CtWzsu_g8zyCuh5d68alWCi-Fuf3_qnJVDOCc7q6MH9Gx7KB39VEwZY9Hq9MgtOjVfTQzsPlIQy2EgkY0pBRCc_zcAw/s1600/byvalref3.gif" width="600" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Principal_3()
b = 1
For a = 10 To 20
Call Listado(a, b)
Next a
End Sub
Sub Listado(a, ByRef b)
Cells(a, b) = a
b = b + 1
End Sub</code></pre>
<br />
<br />
<br />
<h1>
<span style="color: orange;">Caso 4</span></h1>
<div class="separator" style="clear: both; text-align: left;">
Vamos a calcular el montante final al que se llega aplicando la ley de capitalización compuesta con los siguientes datos.</div>
<div class="separator" style="clear: both; text-align: left;">
Capital inicial C = 1.000 €</div>
<div class="separator" style="clear: both; text-align: left;">
tipo de interés i = 0,15</div>
<div class="separator" style="clear: both; text-align: left;">
tiempo años t = 3</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Disponemos de un procedimiento principal que llama dos veces a la función Montante. En la función existe una última línea de código que hace que el valor del tipo de interés i se reduzca en un 5%.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<ul>
<li><b>ByRef.</b> Si pasamos el parámetro i por referencia la primera vez el tipo de interés valdrá 15% y la segunda vez valdrá 10% ya que se ha reducido el valor del tipo de interés y el procedimiento principal toma ese valor ya que no olvida el último valor con el que quedó la variable. Esto provoca que los dos montantes sean diferentes, el primero calculado al 15% y el segundo al 10%.</li>
<li><b>ByVal.</b> Si pasamos el parámetro <code>i</code> por valor la última línea del subprocedimiento no se recordará al llegar al procedimiento principal y por tanto el valor del tipo de interés no se reducirá y continuará siendo del 15%. Esto provoca que los dos montantes sean iguales, ambos calculados al 10%.</li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioIvsu-d35va4fLsReOX-U8GCQLA6bL7MsiC09KyKUc5gfCpNFxSdtOKbg5KQ1YFWuHGeDWaA1vhcPXRZvHMWSMylUDvPkPliPapHk-OfTSZf3SR1SF6rRSd8ACCcEZKhpBalbHGCtkZRm/s1600/byrefval4.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="234" data-original-width="635" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioIvsu-d35va4fLsReOX-U8GCQLA6bL7MsiC09KyKUc5gfCpNFxSdtOKbg5KQ1YFWuHGeDWaA1vhcPXRZvHMWSMylUDvPkPliPapHk-OfTSZf3SR1SF6rRSd8ACCcEZKhpBalbHGCtkZRm/s1600/byrefval4.gif" width="600" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Principal_4()
i = 0.15
t = 3
C = 1000
Cells(1, "H") = Montante(i, t, C)
Cells(2, "H") = Montante(i, t, C)
End Sub
Function Montante(ByVal i, t, C)
Montante = C * (1 + i) ^ t
i = i - 0.05
End Function
</code></pre>
<br />Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com2tag:blogger.com,1999:blog-8263944010888306433.post-88014002273282555502018-07-17T20:37:00.001+02:002022-06-14T16:16:03.617+02:00Bucles For anidadosPuede descargar el archivo <a href="https://www.dropbox.com/s/ev0ywyl6bip2ro8/BuclesForAnidados.xlsm?dl=1">BuclesForAnidados.xlsm</a><span class="letrag"></span><br />
<div>
<br /></div>
<div>
Vamos a trabajar con dos bucles For...Next anidados. Realizaremos unos ejercicios con macros Excel programando en VBA.</div>
<div>
<br /></div>
<div>
Llegaremos a realizar la siguiente figura con números que van entre 1 y 9, tanto en horizontal como en vertical.</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Pero antes de llegar a obtener esa imagen que hemos denominado 'Bandera Color' vamos a ir paso a paso.<br />
<br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN_5LExhZdRZ5iBpOCAtvVcgnH0ZGiwNn6GQEvMmsUeHS198_eNI5Xse0ReI40ICxKPC1RwhXd1afU-ZB8D0MHKmHg2-AqFL3d4q03aD9Kpdq1w7Qu0ZD5V3XfOjmJRHaQj8suNXL0GUlb/s1600/SNAG-1063.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="383" data-original-width="596" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN_5LExhZdRZ5iBpOCAtvVcgnH0ZGiwNn6GQEvMmsUeHS198_eNI5Xse0ReI40ICxKPC1RwhXd1afU-ZB8D0MHKmHg2-AqFL3d4q03aD9Kpdq1w7Qu0ZD5V3XfOjmJRHaQj8suNXL0GUlb/s1600/SNAG-1063.png" /></a></div>
<br /></div>
<div>
<br /></div>
<h2>
<span style="color: orange;">Borra</span></h2>
<div>
Como vamos a trabajar en varios casos, antes de comenzar nos interesa borrar el contenido del rango A1.I9. También vamos a borrar el color de fondo de las celdas.</div>
<div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZD5V26JP-tyymUQNrcmR6JJEUo1yVHz3LLKrMjYNb3f8jqaiS77GqjZak9BMefkeOWR3_NNOgUCx3cxGEjJsxAtqvt6PrxNjZW6lw4rBLR7-vmyImk1egzTONpHP9tJs02WflvnQK7vPZ/s1600/SNAG-1072.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="379" data-original-width="479" height="253" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZD5V26JP-tyymUQNrcmR6JJEUo1yVHz3LLKrMjYNb3f8jqaiS77GqjZak9BMefkeOWR3_NNOgUCx3cxGEjJsxAtqvt6PrxNjZW6lw4rBLR7-vmyImk1egzTONpHP9tJs02WflvnQK7vPZ/s320/SNAG-1072.png" width="320" /></a></div>
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Borra()
Dim R As Range
Set R = Range("A1:I9")
R.ClearContents
R.Interior.Pattern = xlNone
End Sub</code></pre>
<br />
<br /></div>
<h2>
<span style="color: orange;">Completo</span></h2>
<div>
<div class="separator" style="clear: both; text-align: left;">
Anidamos dos bucles For para conseguir imprimir en cada una de las celdas del cuadrado de 9 filas y 9 columnas, los números i j.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmlbFT3e3qtsD_cVXCwQbdyDuMsuXH-UVyiQEoMKF3oRNeVDW1_-eMJdVtccqLxmq4r_qVyd3_UXf7JmYwL_gFTAktncP8unODn3oMVQh3yhV_GX6NdrBulFPQRoeE3A5Q2dtgcFJuCeTE/s1600/SNAG-1065.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="379" data-original-width="478" height="253" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmlbFT3e3qtsD_cVXCwQbdyDuMsuXH-UVyiQEoMKF3oRNeVDW1_-eMJdVtccqLxmq4r_qVyd3_UXf7JmYwL_gFTAktncP8unODn3oMVQh3yhV_GX6NdrBulFPQRoeE3A5Q2dtgcFJuCeTE/s320/SNAG-1065.png" width="320" /></a></div>
<br />
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Completo()
Dim i As Byte, j As Byte
Call Borra
For i = 1 To 9
For j = 1 To 9
Cells(i, j) = Str(i) & " " & Str(j)
Next j
Next i
End Sub</code></pre>
<br />
<br /></div>
<h2>
<span style="color: orange;">Caja</span></h2>
<div>
<div class="separator" style="clear: both; text-align: left;">
Ahora queremos que no se imprima el cuadrado completo, únicamente deseamos imprimir los bordes. Para ello precisamos incluir dentro de los bucles anidados un condicional if que imprima únicamente los índices i j cuando se cumpla que el primero es igual a 1 o 9, o bien el segundo sea igual a 1 o 9. De esta forma conseguimos imprimir solo el perímetro del cuadrado.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEfeu-cjuWyBPixDsL7pjTGPB8l84kx0X1lTuUQxd29UKx0GVOTQyuPLP4hrvqvSJ0gpLaIEpgBTQvqafXugKWGPsG5_9xIRRptbrdkXxMqaC9d5V0BFI2bs7dM1sIVkpZ702bMruFvouZ/s1600/SNAG-1066.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="379" data-original-width="476" height="254" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEfeu-cjuWyBPixDsL7pjTGPB8l84kx0X1lTuUQxd29UKx0GVOTQyuPLP4hrvqvSJ0gpLaIEpgBTQvqafXugKWGPsG5_9xIRRptbrdkXxMqaC9d5V0BFI2bs7dM1sIVkpZ702bMruFvouZ/s320/SNAG-1066.png" width="320" /></a></div>
<br />
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Caja()
Dim i As Byte, j As Byte
Call Borra
For i = 1 To 9
For j = 1 To 9
If i = 1 Or i = 9 Or j = 1 Or j = 9 Then
Cells(i, j) = Str(i) & " " & Str(j)
End If
Next j
Next i
End Sub</code></pre>
<br />
<br /></div>
<h2>
<span style="color: orange;">Diagonal 1</span></h2>
<div>
<div class="separator" style="clear: both; text-align: left;">
Queremos imprimir únicamente la diagonal primera que se consigue haciendo que el condicional if filtre únicamente aquellos valores donde los índices i j coincidan.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuFfaNIR7ozLzn7gLlBWqVOetPFaVJK4ElRYWStjtYHZdqsxZlmqqp6J-m9VTYyeSNcbrrHVyyz8E7GmXwsQnO_UGYso4KA7e3piWAa1hYPPunv4vCbdilHne1l2lAw25Yo1-4mjqqo3UF/s1600/SNAG-1067.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="379" data-original-width="478" height="253" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuFfaNIR7ozLzn7gLlBWqVOetPFaVJK4ElRYWStjtYHZdqsxZlmqqp6J-m9VTYyeSNcbrrHVyyz8E7GmXwsQnO_UGYso4KA7e3piWAa1hYPPunv4vCbdilHne1l2lAw25Yo1-4mjqqo3UF/s320/SNAG-1067.png" width="320" /></a></div>
<br />
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Diagonal_1()
Dim i As Byte, j As Byte
Call Borra
For i = 1 To 9
For j = 1 To 9
If i = j Then
Cells(i, j) = Str(i) & " " & Str(j)
End If
Next j
Next i
End Sub</code></pre>
<br />
<br /></div>
<h2>
<span style="color: orange;">Diagonal 2</span></h2>
<div>
<div class="separator" style="clear: both; text-align: left;">
La segunda diagonal se consigue buscando qué tienen en común los índices i j. Observamos que esta diagonal cumple que al sumar ambos índices la suma siempre es igual a 10. Esta será la condición que impondremos en el condicional if.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV2HakdHmpuF8hQvLNHs__3REbieKOzirTTLZhM7kneRQt5ukhGB6QF_vEtfJLuxEBSV37LZVkOmfXPGZys05ubg0IaRQsbZI-NY7_TX6y3olFx8oADdSI423z12CjVdmj6vM7SPNsU5xC/s1600/SNAG-1068.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="384" data-original-width="476" height="258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV2HakdHmpuF8hQvLNHs__3REbieKOzirTTLZhM7kneRQt5ukhGB6QF_vEtfJLuxEBSV37LZVkOmfXPGZys05ubg0IaRQsbZI-NY7_TX6y3olFx8oADdSI423z12CjVdmj6vM7SPNsU5xC/s320/SNAG-1068.png" width="320" /></a></div>
<br />
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Diagonal_2()
Dim i As Byte, j As Byte
Call Borra
For i = 1 To 9
For j = 1 To 9
If i + j = 10 Then
Cells(i, j) = Str(i) & " " & Str(j)
End If
Next j
Next i
End Sub</code></pre>
<br />
<br /></div>
<h2>
<span style="color: orange;">Bandera</span></h2>
<div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Deseamos imprimir únicamente los bordes y las dos diagonales. A esta figura la hemos llamado bandera. Observe que se consigue incluyendo en el if seis condiciones concatenadas con el operador lógico Or.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-6TA1_qXxSgOCwFdknpxAU0J-5VxrCDjnUQrbozcOsRkVCWivTmttcnUiMjbgdrkd8vfi-CGARpwZf5srkMpOe6E1XQVKUHW6H0LoqZZkyDwFo_crZC7sdMV5l_MGZm7JYQY-fsVAMs8-/s1600/SNAG-1069.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="382" data-original-width="483" height="253" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-6TA1_qXxSgOCwFdknpxAU0J-5VxrCDjnUQrbozcOsRkVCWivTmttcnUiMjbgdrkd8vfi-CGARpwZf5srkMpOe6E1XQVKUHW6H0LoqZZkyDwFo_crZC7sdMV5l_MGZm7JYQY-fsVAMs8-/s320/SNAG-1069.png" width="320" /></a></div>
<br />
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Bandera()
Dim i As Byte, j As Byte
Call Borra
For i = 1 To 9
For j = 1 To 9
If i = 1 Or i = 9 Or j = 1 Or j = 9 Or i = j Or i + j = 10 Then
Cells(i, j) = Str(i) & " " & Str(j)
End If
Next j
Next i
End Sub</code></pre>
<br />
<br /></div>
<h2>
<span style="color: orange;">Bandera Color</span></h2>
<div>
<div class="separator" style="clear: both; text-align: left;">
Nos gustaría que la bandera tuviera colores. Los colores de fondo de cada celda se consiguen con Interior.ColorIndex=número. Donde el número nos da el color.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxZcnmKVVbwp1gyTVV_SN4VpybCN7DWjnuYOpasz8kIRboFritlgDO5_zVLb2YP8ACiGi7VHyIagbjJRw95CRybVJJW9SBk4N6XJOzhBKDR7eu5N8_XvJDaBd_6J0ZaoiqhkFLqZ9klY9h/s1600/SNAG-1073.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="425" data-original-width="470" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxZcnmKVVbwp1gyTVV_SN4VpybCN7DWjnuYOpasz8kIRboFritlgDO5_zVLb2YP8ACiGi7VHyIagbjJRw95CRybVJJW9SBk4N6XJOzhBKDR7eu5N8_XvJDaBd_6J0ZaoiqhkFLqZ9klY9h/s320/SNAG-1073.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuzd5RdsQtBiV-yPJYczIA5eQ-EIrysr7to2GtEeQnPZxzSicoLcp1ke9UchNK4T5Palnl09JprmKGC06Rdn-EjatLshuv-CQUpBJDgjBuNTAmoqUj_3rmzJ4oVPMzy93E7Ev6znkF_KnY/s1600/SNAG-1070.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="380" data-original-width="478" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuzd5RdsQtBiV-yPJYczIA5eQ-EIrysr7to2GtEeQnPZxzSicoLcp1ke9UchNK4T5Palnl09JprmKGC06Rdn-EjatLshuv-CQUpBJDgjBuNTAmoqUj_3rmzJ4oVPMzy93E7Ev6znkF_KnY/s1600/SNAG-1070.png" /></a></div>
<br />
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub BanderaColor()
Dim i As Byte, j As Byte
Call Borra
For i = 1 To 9
For j = 1 To 9
If i = j Or i + j = 10 Then
Cells(i, j) = Str(i) & " " & Str(j)
Cells(i, j).Interior.ColorIndex = 3 'rojo
ElseIf i = 1 Or i = 9 Or j = 1 Or j = 9 Then
Cells(i, j) = Str(i) & " " & Str(j)
Cells(i, j).Interior.ColorIndex = 6 'amarillo
Else
Cells(i, j).Interior.ColorIndex = 8 'azul
End If
Next j
Next i
End Sub</code></pre>
<br />
Ya tenemos bandera.<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsS8W7N1AsbJ3DJj41DDWFQmUpr-ZIlx6mYL95jjKiQf6If-q23Df9KtaGNoVc_29T0HfNwYQ0_CKCVMcZTmqJjfHWTbpcFCmhQ9z1t-ifZdk6J3Uz_ng2WTFdF1_5XxMk1RlF6QIgTktx/s1600/SNAG-1064.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="342" data-original-width="432" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsS8W7N1AsbJ3DJj41DDWFQmUpr-ZIlx6mYL95jjKiQf6If-q23Df9KtaGNoVc_29T0HfNwYQ0_CKCVMcZTmqJjfHWTbpcFCmhQ9z1t-ifZdk6J3Uz_ng2WTFdF1_5XxMk1RlF6QIgTktx/s1600/SNAG-1064.png" /></a></div>
Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com2tag:blogger.com,1999:blog-8263944010888306433.post-87320204945349787482018-06-04T00:18:00.001+02:002022-06-14T16:17:19.295+02:00Triángulo de FloydPuede descargar el archivo <a href="https://www.dropbox.com/s/5y1ley0sfa7qf3v/trianguloFloyd.xlsm?dl=1">trianguloFloyd.xlsm</a><span class="letrag"></span><br />
<div>
<br /></div>
<div>
El <a href="https://es.wikipedia.org/wiki/Tri%C3%A1ngulo_de_Floyd">triángulo de Floyd</a> para cuatro filas es el siguiente.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE1mhQgf32qIqDc0tv-lIDEA2OkcUztLP9H05Ri4zz01u8mOTF4ChvG02XamEJ-1xhUPNkXIpCiXuxpTaNpKk7bSNdyBAEUeysj39B0HgGkIflVGaD0FxWotGLjBwNV-Sao6V8Rg9wZbZW/s1600/SNAG-1028.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="82" data-original-width="146" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE1mhQgf32qIqDc0tv-lIDEA2OkcUztLP9H05Ri4zz01u8mOTF4ChvG02XamEJ-1xhUPNkXIpCiXuxpTaNpKk7bSNdyBAEUeysj39B0HgGkIflVGaD0FxWotGLjBwNV-Sao6V8Rg9wZbZW/s1600/SNAG-1028.png" /></a></div>
<div>
<br /></div>
<div>
Se construye con los números naturales en forma de triángulo rectángulo. Se suele utilizar como ejercicio para los que están aprendiendo a programar en un cierto lenguaje.</div>
<div>
<br /></div>
<div>
El triángulo de Floyd se resuelve con un algoritmo que ideó el <a href="https://es.wikipedia.org/wiki/Robert_W._Floyd">Dr. Floyd</a>, científico e informático que fue compañero de habitación de <a href="https://es.wikipedia.org/wiki/Carl_Sagan">Carl Sagan</a> cuando ambos estudiaban en la universidad.</div>
<div>
<br /></div>
<h3>
<span style="color: orange;">Hoja 1</span></h3>
<div>
Resuelto usando fórmulas de Excel y sin usar macros.</div>
<div>
<br /></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAVA96H7Aj2y8VlgoyRlegSlTORZ54uisvGm4fTAJRvCD_NbZJOUUxkC96z07SjB60uB7abvlCz1lbkXsK7Aj016XZk8azIykKIXv_jLaD32H7uW8AUynP3W5jVEOuMng1W7lNlxXWk_4U/s1600/SNAG-1026.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="377" data-original-width="587" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAVA96H7Aj2y8VlgoyRlegSlTORZ54uisvGm4fTAJRvCD_NbZJOUUxkC96z07SjB60uB7abvlCz1lbkXsK7Aj016XZk8azIykKIXv_jLaD32H7uW8AUynP3W5jVEOuMng1W7lNlxXWk_4U/s1600/SNAG-1026.png" /></a></div>
<div>
<br /></div>
<div>
La fórmula de la celda C5 calcula el máximo de la fila anterior para saber con qué número se ha de comenzar la fila actual.</div>
<div>
<br /></div>
<div>
=MAX(C4:P4)+1</div>
<div>
<br /></div>
<div>
La celda D5 suma 1 al valor previo y usa un condicional SI para saber hasta que valor se ha de continuar sumando 1.</div>
<div>
<br /></div>
<div>
=SI(CONTAR($C5:C5)<$A5;C5+1;"")</div>
<div>
<br /></div>
<h3>
<span style="color: orange;">Hoja 2</span></h3>
<div>
También resuelve el triángulo con fórmulas y sin usar macros.</div>
<div>
<br /></div>
<div>
En este caso las celdas de la primera columna se obtienen con una fórmula que indica que nos da el último valor de la fila precedente y le suma 1. Se cumple que los últimos valores de cada fila son los llamados <a href="https://es.wikipedia.org/wiki/N%C3%BAmero_triangular">números triangulares</a>, que se obtienen como n*(n+1)/2. Siendo n el número de fila.<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr4aPTg21V1lt2yca_esKnFbGGb5CUt8GaoJMnquMxjMu0Om_MKdV6Kq_Hxerb7NsFPBWQ4mCK6GymC4f9vyTonhbFyMx_oXnriiCeX8o2nOYAyjoWoP0nRXT3-LA7Ww7iIJgYtYS6d4UY/s1600/N%25C3%25BAmeros_triangulares.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="393" data-original-width="285" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr4aPTg21V1lt2yca_esKnFbGGb5CUt8GaoJMnquMxjMu0Om_MKdV6Kq_Hxerb7NsFPBWQ4mCK6GymC4f9vyTonhbFyMx_oXnriiCeX8o2nOYAyjoWoP0nRXT3-LA7Ww7iIJgYtYS6d4UY/s320/N%25C3%25BAmeros_triangulares.png" width="232" /></a></div>
<div>
<br /></div>
<div>
En nuestro caso la celda C5 tiene la siguiente expresión.</div>
<div>
<br /></div>
<div>
=(A5*(A5-1)/2)+1</div>
<div>
<br /></div>
<div>
La celda D5 se calcula con la siguiente fórmula, que es igual a la empleada en la Hoja1.</div>
<div>
<br /></div>
<div>
=SI(CONTAR($C5:C5)<$A5;C5+1;"")</div>
<div>
<br />
<h3>
<span style="color: orange;">Hoja3</span></h3>
Se construye el triángulo de Floyd mediante macro.<br />
<br /></div>
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Floyd1()
Dim n As Long, i As Long, j As Long, n_max As Long
Dim R As Range
Worksheets("Hoja3").Activate
Set R = Range("B3")
n_max = 24: j = 1
R.Offset(1, -1).Resize(n_max+2, n_max+2).ClearContents
For n = 1 To n_max
R.Offset(n, -1) = n 'imprimimos la columna A
For i = 1 To n 'i recorre los elementos de cada fila
R.Offset(n, i) = j 'imprimimos el valor de j en la celda que toca
j = j + 1 'j proporciona los números naturales correlativos
Next i
Next n
End Sub
</code></pre>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3SqU2zJ0L3Meg_8QqdRB6eEiq43Xz8KjqCXwuvXoeQXM-p-_apB37PWSe4IPlXuCHNPtQvtG6O7WmGN0K33i3AoB-vncm-qO6X2gOL5zkpWNvWjr4vnqLGbNId2VcA0C9Dn4CsgaQdcOg/s1600/SNAG-1027.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="573" data-original-width="946" height="241" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3SqU2zJ0L3Meg_8QqdRB6eEiq43Xz8KjqCXwuvXoeQXM-p-_apB37PWSe4IPlXuCHNPtQvtG6O7WmGN0K33i3AoB-vncm-qO6X2gOL5zkpWNvWjr4vnqLGbNId2VcA0C9Dn4CsgaQdcOg/s400/SNAG-1027.png" width="400" /></a></div>
<h3>
<span style="color: orange;">Hoja4</span></h3>
Dada una fila n, podemos calcular el último valor de su fila usando los números triangulares que son los siguientes.<br />
<br />
<br />
<ol>
<li>Para n=1 el número triangular es 1</li>
<li>Para n=2 el número triangular es 3</li>
<li>Para n=3 el número triangular es 6</li>
<li>Para n=4 el número triangular es 10</li>
<li>Para n=5 el número triangular es 15</li>
</ol>
<br />
A esos valores e le suma 1 para saber cuál es el primer valor de la fila siguiente.<br />
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Floyd2()
Dim n As Long, i As Long, j As Long, n_max As Long
Dim R As Range
Worksheets("Hoja4").Activate
Set R = Range("B3")
n_max = 24
R.Offset(1, -1).Resize(n_max+2, n_max+2).ClearContents
For n = 1 To n_max
R.Offset(n, -1) = n
'primera columan del triángulo
R.Offset(n, 1) = (n * (n - 1) / 2) + 1
For i = 2 To n
R.Offset(n, i) = R.Offset(n, i - 1) + 1
Next i
Next n
End Sub
</code></pre>
<br />
<h3>
<span style="color: orange;">Hoja5</span></h3>
<br />
Una pequeña variante para poder elegir el número de filas desde un control numérico que se encuentra en la propia hoja de cálculo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjqRM4HZEAep9vGwvP1g9b4gh3mWtAm6CLzc19bk6XoaJ2pdQtp2H6dQW5RqjGdSPc26ODHc88ILhMYUv1Eyq9a_SKO1-nJ3VrpwzIQWXekA1oHmOGFK5ziKN3_0wLzkad0wtEEktXEkEG/s1600/GIFtrianguloFloyd.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="375" data-original-width="587" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjqRM4HZEAep9vGwvP1g9b4gh3mWtAm6CLzc19bk6XoaJ2pdQtp2H6dQW5RqjGdSPc26ODHc88ILhMYUv1Eyq9a_SKO1-nJ3VrpwzIQWXekA1oHmOGFK5ziKN3_0wLzkad0wtEEktXEkEG/s1600/GIFtrianguloFloyd.gif" /></a></div>
<br />
También está disponible en un lenguaje de programación que está muy de moda.<br />
<br />
<ul>
<li><a href="http://altocodigo.blogspot.com/2018/06/triangulo-de-floyd-en-python.html">Triangulo de Floyd en Python</a></li>
</ul>
Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com0tag:blogger.com,1999:blog-8263944010888306433.post-50027627565767604392018-06-03T11:00:00.003+02:002022-06-14T16:18:20.740+02:00Seleccionar tabla sin cabeceraPuede descargar el archivo <a href="https://www.dropbox.com/s/6i9ns9y83071c64/seleccionaTabla.xlsm?dl=1">seleccionaTabla.xlsm</a><span class="letrag"></span><br />
<div>
<br /></div>
<div>
Primero generamos una tabla con valores aleatorios y con un número de filas que podemos elegir, con un control numérico, entre 1 y 20.<br />
<br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDeAW9K1sw2b0PLn-4CPYLIxGRNaFs3oaFpS7SSPYMXAGSP3m4hH5rE6WWfonaxz3rOlfc1HBEMMF3XJG6CNvstjnxpfPyNv7JyFQJ3HDPIvfceOQqj_86x5E-kDi2d_kfLeklpIMdFl4w/s1600/SNAG-1025.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="305" data-original-width="523" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDeAW9K1sw2b0PLn-4CPYLIxGRNaFs3oaFpS7SSPYMXAGSP3m4hH5rE6WWfonaxz3rOlfc1HBEMMF3XJG6CNvstjnxpfPyNv7JyFQJ3HDPIvfceOQqj_86x5E-kDi2d_kfLeklpIMdFl4w/s1600/SNAG-1025.png" /></a></div>
<br /></div>
<div>
La macro que genera la tabla con valores aleatorios es la siguiente.</div>
<br />
Observe que se define la celda B4 como la esquina superior izquierda y en base a ella se genera toda la tabla. Esta esquina sería fácil de variar en el código de la macro, gracias al uso de <code>Offset</code>.<br />
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub generaTabla()
Dim n As Byte, i As Byte
Dim R As Range
Set R = Range("B4")
n = [I2]
Range("B5:F24").ClearContents
For i = 1 To n
R.Offset(i, 0) = i
R.Offset(i, 1).Value = WorksheetFunction.Choose(Int(Rnd() * 3) + 1, "Norte", "Sur", "Centro")
R.Offset(i, 2).Value = Date - i + 1
R.Offset(i, 3).Value = WorksheetFunction.Choose(Int(Rnd() * 3) + 1, "Libros", "Comic", "Web")
R.Offset(i, 4).Value = (Int(Rnd() * 100000) + 20000) / 100
Next i
End Sub
</code></pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht1J6vJPiwqn3g5cfkcSG1-4zGvhEvIkf07SrCD5tybi5KCGYsj4E9ZfQxrggb67mRGf3JX4QpCPQVbF4kb1AfXqvZXMAV5NCSL0GMqfTOyRvOiVobbzwTG_MTvJtk_UXLNYpLjIJ8-F28/s1600/GIFseleccionaTabla.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="351" data-original-width="526" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht1J6vJPiwqn3g5cfkcSG1-4zGvhEvIkf07SrCD5tybi5KCGYsj4E9ZfQxrggb67mRGf3JX4QpCPQVbF4kb1AfXqvZXMAV5NCSL0GMqfTOyRvOiVobbzwTG_MTvJtk_UXLNYpLjIJ8-F28/s1600/GIFseleccionaTabla.gif" /></a></div>
<br />
<div>
El código VBA que selecciona la tabla sin incluir la cabecera es la siguiente.</div>
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub seleccionaTablaSinCabecera()
Worksheets("Hoja1").Activate
'el cursor inicialmente tiene que estar dentro de la tabla
Range("B5").Select
Set R = ActiveCell.CurrentRegion
R.Offset(1, 0).Resize(R.Rows.Count - 1, R.Columns.Count).Select
End Sub
</code></pre>
<br />
Aquí vemos otro uso estupendo de <code>Offset</code> combinado con <code>Resize</code>, propiedad de los rangos que hemos visto recientemente. Puede verlo en el post siguiente.<br />
<ul>
<li><a href="http://www.excelavanzado.com/2018/05/propiedad-resize-para-manejar-rangos-en.html">Propiedad Resize para manejar rangos en Excel</a></li>
</ul>
Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com0tag:blogger.com,1999:blog-8263944010888306433.post-62203088230641850342018-06-01T14:45:00.002+02:002022-06-14T16:19:15.550+02:00Árbol binomial generado con una macroPuede descargar el archivo <a href="https://www.dropbox.com/s/kyv87zk5u1wigja/arbolBinomial.xlsm?dl=1">arbolBinomial.xlsm</a><span class="letrag"></span><br />
<div>
<br /></div>
<div>
Vamos a crear un árbol binomial usando una macro de Excel, con un poco de código VBA. Lo interesante del caso es que al variar el número de periodos n el árbol se recalcula y se redimensiona en tamaño.</div>
<div>
<br /></div>
<div>
Partimos de un precio de una acción de S=100 €. Este precio puede subir o bajar en cada periodo. Suponemos que si sube lo hará con incrementos del 25% (u=1,25) y si baja lo hace con disminución del 20% (d=0,80).</div>
<div>
<br /></div>
<div>
Se cumple que d=1/u</div>
<div>
<br /></div>
<div>
1 / 1,25 = 0,80</div>
<div>
<br /></div>
<h3>
<span style="color: orange;">n=1</span></h3>
<div>
<br /></div>
<div>
El árbol para un periodo sería el siguiente.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCCbl4-fLdkQVzakccd4ITX4fyTKrnHT19pRRVp8jT_5scFKc-lGa1JAYJnxfLJ6KKcmC2QzXp_Qgctl16JGz8T_UcSzXsqHW0XNdTrfEVsc6vja4FKvMKDpLdjUwC9g7wzOtbtQDi31x2/s1600/SNAG-1015.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="289" data-original-width="208" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCCbl4-fLdkQVzakccd4ITX4fyTKrnHT19pRRVp8jT_5scFKc-lGa1JAYJnxfLJ6KKcmC2QzXp_Qgctl16JGz8T_UcSzXsqHW0XNdTrfEVsc6vja4FKvMKDpLdjUwC9g7wzOtbtQDi31x2/s1600/SNAG-1015.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
<br /></div>
<div>
Donde</div>
<div>
125 = 100 * 1,25</div>
<div>
80 = 100 * 0,80</div>
<div>
<br /></div>
<div>
Partiendo del precio inicial de 100, transcurrido un periodo pueden suceder dos cosas, o bien, el precio se incrementa y 25% pasando a ser 125 €, o bien se reduce un 20% pasando a ser 80 €.</div>
<div>
<br /></div>
<h3>
<span style="color: orange;">n=2</span></h3>
<div>
Si hacemos el árbol para dos periodos.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV4Nvh6sKRibzKwJflT4fsFt-mi79_SROOXTXbibMIKe2evHp6YkYGgdZywix4mtnhhyphenhyphenKa_WYUR0c6VHjidh0Orp8VIq2OnjTD6-hzG4fvhjPN78AhSEii2dVcgpFKJdeuipFmfIzAyU_E/s1600/SNAG-1014.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="330" data-original-width="258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV4Nvh6sKRibzKwJflT4fsFt-mi79_SROOXTXbibMIKe2evHp6YkYGgdZywix4mtnhhyphenhyphenKa_WYUR0c6VHjidh0Orp8VIq2OnjTD6-hzG4fvhjPN78AhSEii2dVcgpFKJdeuipFmfIzAyU_E/s1600/SNAG-1014.png" /></a></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
Donde</div>
<div>
156,25 = 125 * 1,25</div>
<div>
100 = 125 * 0,80 o bien 100 = 80 * 1,25</div>
<div>
64 = 80 * 0,80</div>
<div>
<br /></div>
<div>
Para el periodo 2, el valor mayor (156,25) se obtiene incrementando un 25% más el precio superior del periodo anterior. También se puede ver como que 156.25 = 100 * 1,25 * 1,25, ya que se parte de un precio inicial de 100 y se experimentan dos incrementos del 25%.</div>
<div>
<br /></div>
<div>
El valor de 100 € del periodo 2 se alcanza por uno de los dos siguientes caminos.</div>
<div>
<ul>
<li>100 = 100*1,25*0,80 Partimos de 100, subimos a 125 y luego volvemos a bajar a 100.</li>
<li>100 = 100 *0.80*1,25. Partimos de 100, bajamos a 80 y luego volvemos a subir a 100.</li>
</ul>
<div>
El valor de 64 se puede entender que se alcanza partiendo del precio inicial de 100 y experimentando dos reducciones consecutivas del 20%. 64 = 100 * 0,80 * 0,80</div>
</div>
<div>
<h3>
<span style="color: orange;">n=3</span></h3>
<div>
Si hacemos el árbol para tres periodos.</div>
</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKozvrMuvHoS8I8lNeHDU3NKFGdzCllzUsZQPxRiSIoSG9oc6vClJFnYM3gH1AgCIqpR0jwufTAAHPNfVoQj6eWgsl70ZXUkB8wBo4LnUdjDU4w7z08M_tHdyA-WYKVkO6s2Jvyj_BykaJ/s1600/SNAG-1013.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="371" data-original-width="319" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKozvrMuvHoS8I8lNeHDU3NKFGdzCllzUsZQPxRiSIoSG9oc6vClJFnYM3gH1AgCIqpR0jwufTAAHPNfVoQj6eWgsl70ZXUkB8wBo4LnUdjDU4w7z08M_tHdyA-WYKVkO6s2Jvyj_BykaJ/s1600/SNAG-1013.png" /></a></div>
<div>
<br /></div>
<div>
Donde</div>
<div>
195,3125 = 100 * 1,25<sup>3</sup></div>
<div>
125 = 100 * 1,25<sup>2</sup> * 0,80</div>
<div>
80 = 100 * 1,25 * 0,80<sup>2</sup></div>
<div>
51,2 = 100 * 0,80<sup>3</sup></div>
<div>
<br />
<h3>
<span style="color: orange;">Para n>3</span></h3>
La macro funciona hasta n=40, y no por la limitación de la propia macro sino porque hemos limitado hasta 40 el valor que se puede poner en la celda amarilla (C7) usando el control numérico que está a su lado.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi73alqpJn6_uhyphenhyphennjE8b8BSklWLZyqpdNz8CuZaa_Q70TIXwEihSA5KKUnRlwFOXyXjxl5wo2SugR__x0vHROxRcx-sdCQksljBc4hLPo4T5Byo0G0L0KiFBWC_v2lVcSNd9HWfg_9BG951/s1600/GIFarbolBinomial.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="569" data-original-width="516" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi73alqpJn6_uhyphenhyphennjE8b8BSklWLZyqpdNz8CuZaa_Q70TIXwEihSA5KKUnRlwFOXyXjxl5wo2SugR__x0vHROxRcx-sdCQksljBc4hLPo4T5Byo0G0L0KiFBWC_v2lVcSNd9HWfg_9BG951/s1600/GIFarbolBinomial.gif" /></a></div>
<br />
<br /></div>
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Option Explicit
Public n As Integer 'número de etapas del árbol, hasta 40
Public A() As Double 'matriz que contiene el árbol
Sub arbol()
Dim i As Integer, j As Integer
Dim u As Double, d As Double
Worksheets("Hoja1").Activate
n = [C7]: u = [C4]: d = [C5]
Call borra
Call cabeceras
ReDim A(2 * n, n) 'el árbol tiene el doble de filas que de columnas
A(n, 0) = 100 'valor inicial en la columna cero
For j = 1 To n 'columnas de la matriz
For i = 0 To 2 * n 'filas
If j = n - i Then 'primero calculamos la diagonal superior
A(n - j, j) = A(n - j + 1, j - 1) * u
ElseIf j >= n - i + 2 And j <= i + n Then 'calculamos el resto
A(i, j) = A(i - 1, j - 1) * d
End If
Next i
Next j
Call imprimeA
End Sub
Sub borra()
Range("C10:AR91").Clear ' borra hasta n=40
End Sub
Sub cabeceras()
Dim i As Integer
Range("A1").Copy ' copiamos A1 para luego pegar el formato
'pegamos el formato de A1 a la columna C
Range(Cells(10, "C"), Cells(2 * n + 11, "C")).PasteSpecial Paste:=xlPasteFormats
'pegamos el formato de A1 a la fila 10
Range(Cells(10, 4), Cells(10, n + 4)).PasteSpecial Paste:=xlPasteFormats
Application.CutCopyMode = False 'elimina la fila de hormigas
For i = 0 To n
'generamos los números 0 a 2n de la columna C
Cells(i + 11, 3) = i 'vertical, los n primeros
Cells(i + n + 11, 3) = i + n 'vertical, los n últimos
'generamos los números 0 a n de la fila 10
Cells(10, i + 4) = i 'horizontal
Next i
Range("C10").Activate 'situamos el cursor en C10
End Sub
Sub imprimeA()
Dim i As Integer, j As Integer
For j = 0 To n
For i = 0 To 2 * n 'recorremos toda la matriz A
If A(i, j) <> 0 Then 'imprimimos solo los no vacios
Cells(i + 11, j + 4) = A(i, j)
End If
Next i
Next j
End Sub
</code></pre>
<br />
La idea básica para hacer el árbol es que la diagonal superior se obtiene como el precio anterior por u. Y el resto de los valores del árbol se obtienen como el precio superior del periodo anterior por d.<br />
<br />
Ejemplo para n=4.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5_-iSQaUjJ7IOeI4KqxgAe_ygbbJ_FOu8K4PJj_gtZoAgQL0t31nXgNf97r0XZAIaQ2ovLys57Tf4dulJeh23Owv5qxt6wNJmpOFYHZ68qGaZTbFWCLWtucuf-prv1a2ORY3D6YkKByJD/s1600/SNAG-1017.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="412" data-original-width="339" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5_-iSQaUjJ7IOeI4KqxgAe_ygbbJ_FOu8K4PJj_gtZoAgQL0t31nXgNf97r0XZAIaQ2ovLys57Tf4dulJeh23Owv5qxt6wNJmpOFYHZ68qGaZTbFWCLWtucuf-prv1a2ORY3D6YkKByJD/s1600/SNAG-1017.png" /></a></div>
<br />
244,1 se obtiene como 195,3 * 1,25<br />
El resto de valores se obtienen multiplicando por 0,80, así tenemos los siguientes.<br />
156,3 = 195,6 * 0,80<br />
100 = 125 * 0,80<br />
64 = 80 * 0,80<br />
40,96 = 51,2 * 0,80<br />
<br />
Este es el método que usa la macro para obtener todos los valores del árbol binomial.<br />
<br />
Lo que más esfuerzo ha costado es calcular bien las celdas donde se han de escribir los valores del árbol ya que al crecer n el árbol va aumentando de tamaño y es necesario ir bajando la celda inicial.Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com0tag:blogger.com,1999:blog-8263944010888306433.post-63652405994744040062018-05-31T22:33:00.004+02:002022-06-14T16:20:09.258+02:00Manejar matrices con VBAPuede descargar el archivo <a href="https://www.dropbox.com/s/wippfs9i2lr7ggf/manejarMatrices.xlsm?dl=1">manejarMatrices.xlsm</a><span class="letrag"></span><br />
<div>
<br /></div>
<div>
Vamos a trabajar con matrices en Excel programando en VBA (Visual Basic for Applications).</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjuIHEePAaNsACSD6_9m7rc3zCMlfV2oulpKl8L8OUBggjrMYyFAhhRIfrVEp6IADfubRcE6qDF62OygGeOdOqQGjLccgZQORxpTuyeeBAjdS9ea6Rywix2sKUhAGwHhVi6ZQ1E6ThMTq-/s1600/GIFmanejaMatrices.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="566" data-original-width="1016" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjuIHEePAaNsACSD6_9m7rc3zCMlfV2oulpKl8L8OUBggjrMYyFAhhRIfrVEp6IADfubRcE6qDF62OygGeOdOqQGjLccgZQORxpTuyeeBAjdS9ea6Rywix2sKUhAGwHhVi6ZQ1E6ThMTq-/s1600/GIFmanejaMatrices.gif" width="600" /></a></div>
<div>
<br /></div>
<div>
Lo interesante de este caso es ver que para dejar el contenido de una matriz en la hoja de cálculo lo que debemos hacer es lo que nos dice la intuición.<br />
<br />
<code>Rango = Matriz 'respetando las dimensiones</code><br />
<br /></div>
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Option Base 1 'Las matrices empiecen en 1 y no en 0
Sub manejaMatriz()
Dim A As Variant
Dim B As Variant
'para asignar un rango a una matriz
A = Range("B4:E9")
'para asignar una matriz a un rango
B = WorksheetFunction.Transpose(A)
'para imprimir una matriz en un rango
Range("B11:G14") = B
End Sub
Sub aleatorios()
Dim A(6, 4) As Double
Dim inicio As Range
Dim final As Range
Randomize 'para mejorar la aleatoriedad
For i = 1 To 6
For j = 1 To 4
'números aleatorios [0,1) a dos decimales
A(i, j) = Int(Rnd() * 100) / 100
Next j
Next i
Set inicio = Cells(4, "B")
Set final = Cells(9, "E")
Range(inicio, final) = A
End Sub
Sub multiplicaMatriz()
Dim A() As Variant
Dim B() As Variant
Dim C() As Variant
A = Range("B4:E9")
B = Range("B11:G14")
C = WorksheetFunction.MMult(A, B)
Range("B16:G21") = C
End Sub
Sub invierteMatriz()
Dim A() As Variant
A = Range("B23:D25")
Range("B27:D29") = WorksheetFunction.MInverse(A)
Range("B27:D29").Interior.Color = 6750156
Call extraeElementos
End Sub
Sub extraeElementos()
Dim A() As Variant
Dim origen As Range
Range("M4:AC30").Clear
Range("M4:AC30").Interior.Color = 13434879 'amarillo
Set origen = Range("L3")
A = Range("B27:D29")
fila = [L14]
columna = [S2]
For i = 1 To 3 'recorremos las 3 filas de la matriz
For j = 1 To 3 'recorremos las 3 columnas de A
With origen.Offset(fila + i - 1, columna + j - 1)
.Value = A(i, j)
.Borders(xlEdgeLeft).LineStyle = xlContinuous
.Borders(xlEdgeRight).LineStyle = xlContinuous
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeBottom).LineStyle = xlContinuous
End With
Next j
Next i
Range(origen.Offset(fila + i - 4, columna + j - 4), origen.Offset(fila + i - 2, columna + j - 2)).Interior.Color = 6750156
End Sub
Sub copia()
Dim A As Variant
A = Range("B4:D6")
Range("B23:D25") = A
Range("B4:D6,B23:D25").Interior.ColorIndex = 8
End Sub
Sub Borra()
Range("B4:AD32").ClearContents
[S2] = 1: [L14] = 1
Range("B4:G29").Interior.Pattern = xlNone
Range("M4:AC30").Clear
Range("M4:AC30").Interior.Color = 13434879 'amarillo
End Sub
</code></pre>
<br />
También es interesante ver el pos siguiente.<br />
<br />
<ul>
<li><a href="http://www.excelavanzado.com/2018/05/propiedad-resize-para-manejar-rangos-en.html">Propiedad Resize para manejar rangos en Excel</a></li>
</ul>
Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com3tag:blogger.com,1999:blog-8263944010888306433.post-53675227912816449242018-05-31T00:09:00.003+02:002022-06-14T16:21:31.948+02:00Propiedad Resize para manejar rangos en ExcelPuede descargar el archivo <a href="https://www.dropbox.com/s/1rd0re7edamqgl8/resize.xlsm?dl=1">resize.xlsm</a><span class="letrag"></span><br />
<div>
<br /></div>
<div>
Cuando programamos macros en Excel usando VBA es muy habitual trabajar con rangos. Una propiedad de los rangos que modifica su tamaño es resize.</div>
<div>
<br /></div>
<div>
<code>Rango.Resize(filas, columnas).Select</code></div>
<div>
<br /></div>
<div>
Veamos algunos ejemplos de su uso.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6jy3YGq0Jm3PX6Rvb6fjDIG4uYx9u8gb_X4H-xguJJyktdYVhLeQ4lh8k1UliNqsLYm4-SS1Vy9cgL_Vr7kCHWYy17iYWIGfV98fq28ckIvu1QAVU6gpB2wgh8CbTVEc7ziRK1nHWX_U5/s1600/SNAG-1001.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="562" data-original-width="1131" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6jy3YGq0Jm3PX6Rvb6fjDIG4uYx9u8gb_X4H-xguJJyktdYVhLeQ4lh8k1UliNqsLYm4-SS1Vy9cgL_Vr7kCHWYy17iYWIGfV98fq28ckIvu1QAVU6gpB2wgh8CbTVEc7ziRK1nHWX_U5/s1600/SNAG-1001.png" width="600" /></a></div>
<br />
<br />
<h3>
<span style="color: orange;">Resize1</span></h3>
Da color aleatorio a las celdas del rango B4:E8.<br />
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Resize1()
Dim rojo As Byte, verde As Byte, azul As Byte
Dim R As Range
Set R = Range("B4")
Range("A1").Select
Randomize 'elegimos colores aleatorios
rojo = Int(Rnd() * 100) + 100
verde = Int(Rnd() * 100) + 100
azul = Int(Rnd() * 100) + 100
R.Resize(5, 4).Interior.Color = RGB(rojo, verde, azul)
End Sub
</code></pre>
<br />
Observe que después de <code>Resize(5.4)</code> se ha de poner algo, o bien, <code>.Select</code> para seleccionar, o bien, <code>.Interior.Color=RGB(rojo, verde, azul)</code> como en este caso. Pero si después de <code>Resize</code> se deja sin poner nada nos dará error.<br />
<h3>
<span style="color: orange;">Resize2</span></h3>
Permite seleccionar un rango de 3 filas y 2 columnas usando como celda de origen la B4.<br />
<br />
<code>Range("B4").Resize(3, 2).Select</code><br />
<div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOnNBWAlNDsMOMbwV0WrlmYkAHCNgckDtXVJHJkrdosin-Uh5T6crc3f-3gRdxhqHyMVUT_JsNVAttsxiOAIkmh1Y-SqvQvbzW7Wsu7eE0oN-qPdGnQeGX2rNWfnq3opyDrNygRy5_IaC-/s1600/SNAG-1003.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="197" data-original-width="365" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOnNBWAlNDsMOMbwV0WrlmYkAHCNgckDtXVJHJkrdosin-Uh5T6crc3f-3gRdxhqHyMVUT_JsNVAttsxiOAIkmh1Y-SqvQvbzW7Wsu7eE0oN-qPdGnQeGX2rNWfnq3opyDrNygRy5_IaC-/s1600/SNAG-1003.png" /></a></div>
<br /></div>
<br /></div>
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Resize2()
'Seleccionamos un rango de 3 filas y 2 columnas
'La celda de origen es B4
Range("B4").Resize(3, 2).Select
End Sub
</code></pre>
<br />
<div>
<h3>
<span style="color: orange;">Resize3</span></h3>
Permite seleccionar un rango de 3 filas en la primera columna usando como celda de origen la B4.<br />
<code><br /></code>
<code>Range("B4").Resize(3).Select</code><br />
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeGjRC61yMNQ7q-laDUGvYEeWt3zvuSkskoEOI7am4RbWw7yCmplQYy0AJozS8pVTmJe_43KRTYzlknNPWTZ0OXQ6MYBu25dAbOjq72RB2FUwExZuA2nLmTQoI_FsoeGZViOcyJfo-r9TS/s1600/SNAG-1004.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="196" data-original-width="365" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeGjRC61yMNQ7q-laDUGvYEeWt3zvuSkskoEOI7am4RbWw7yCmplQYy0AJozS8pVTmJe_43KRTYzlknNPWTZ0OXQ6MYBu25dAbOjq72RB2FUwExZuA2nLmTQoI_FsoeGZViOcyJfo-r9TS/s1600/SNAG-1004.png" /></a></div>
<br /></div>
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Resize3()
'Seleccionamos un rango de 3 filas de la primera columna
'La celda de origen es B4
Range("B4").Resize(3).Select
End Sub
</code></pre>
<br />
<div>
<h3>
<span style="color: orange;">Resize4</span></h3>
Permite seleccionar un rango de 3 columnas en la primera fila usando como celda de origen la B4.<br />
<br />
<code>Range("B4").Resize(, 3).Select</code><br />
<div>
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgztEBeXcowbNBaNMUNytPbbR-EE4byzFstNHlsLbEKsMScTqWDwPVw-2pZ4R3RSYerDVWcj_oP4G5p2PWN00n5glcAzvDcoKh_YpAH31nlTt5Xp02FAgWRGA8JSowCvzKHT_yTF7dAFwZS/s1600/SNAG-1005.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="199" data-original-width="365" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgztEBeXcowbNBaNMUNytPbbR-EE4byzFstNHlsLbEKsMScTqWDwPVw-2pZ4R3RSYerDVWcj_oP4G5p2PWN00n5glcAzvDcoKh_YpAH31nlTt5Xp02FAgWRGA8JSowCvzKHT_yTF7dAFwZS/s1600/SNAG-1005.png" /></a></div>
<br /></div>
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Resize4()
'Seleccionaremos un rango de 3 columnas de la primera fila
'La celda de origen es B4
Range("B4").Resize(, 3).Select
End Sub
</code></pre>
<br />
<div>
<h3>
<span style="color: orange;">Resize5</span></h3>
Permite seleccionar un rango de 2 columnas en la primera fila usando como celda de origen la B4 y hasta la fila 8, ya que el rango indicado es hasta la E8.<br />
<br />
<code>Range("B4:E8").Resize(, 2).Select</code><br />
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRtEySEBpfpWHsey_hFyl4BGjfGTM0iXUx0FGsB8_s1H__3enQCRb2UJOqyhUT1RN1bxOUDZBzQwzroOGTz7leX1t7-04jaft6lHJMCy0oFwjX2bAzqA9Aq-0cc94xkH1DduP8uiUznAQE/s1600/SNAG-1006.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="194" data-original-width="366" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRtEySEBpfpWHsey_hFyl4BGjfGTM0iXUx0FGsB8_s1H__3enQCRb2UJOqyhUT1RN1bxOUDZBzQwzroOGTz7leX1t7-04jaft6lHJMCy0oFwjX2bAzqA9Aq-0cc94xkH1DduP8uiUznAQE/s1600/SNAG-1006.png" /></a></div>
<br /></div>
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Resize5()
Range("B4:E8").Resize(, 2).Select
End Sub
</code></pre>
<br />
<div>
<h3>
<span style="color: orange;">Resize6</span></h3>
Permite seleccionar un rango de 3 columnas en la primera fila usando como celda de origen la A4.<br />
<br />
<code>Range("B4").Offset(, -1).Resize(, 3).Select</code><br />
<div>
<br />
Es una maravilla poder usar Offset para cambiar el rango de referencia, y usar, como en el ejemplo, valores negativos. Esto aporta flexibilidad al manejar gran cantidad de rangos cambiantes.<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgebmDZzczqMhpqROqqMAZnXeEI6zOKfR5P0iNMGzrJwUpAuITtl67ggbGfldb_f3ZsDV8CI-p53TxouY3MtPcrtq0uQSZ0MKQLjyMVQGt82DOpXJOgsZVxWZGvkYxLRYNLFET2r1Ne34We/s1600/SNAG-1007.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="195" data-original-width="366" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgebmDZzczqMhpqROqqMAZnXeEI6zOKfR5P0iNMGzrJwUpAuITtl67ggbGfldb_f3ZsDV8CI-p53TxouY3MtPcrtq0uQSZ0MKQLjyMVQGt82DOpXJOgsZVxWZGvkYxLRYNLFET2r1Ne34We/s1600/SNAG-1007.png" /></a></div>
</div>
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Resize6()
Range("B4").Offset(, -1).Resize(, 3).Select
End Sub
</code></pre>
<br />
<div>
<h3>
<span style="color: orange;">Resize7</span></h3>
Copia el rango amarillo (B11:E15) en el rango superior (B4:E8).<br />
<br />
<code>Range("B4").Resize(5, 4) = A</code><br />
<div>
<br />
Este es un uso muy útil de la propiedad <code>Resize</code> ya que nos permite depositar (imprimir) de golpe todo un rango o el contenido de una matriz.<br />
<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHju7sqXvdLEjoX0dmNvEX8TLvA0i2wNaQ0EREER63xl_rMz3N619Rj1Bx7o1YYkwgDzIYeoAjXhALQswOrlY_xAAL6bZ_iU0NY2B5gsVZiHzAxKsFpD2HUFpZKr6HyjlSH7yE6uTLFqyU/s1600/SNAG-1008.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="335" data-original-width="365" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHju7sqXvdLEjoX0dmNvEX8TLvA0i2wNaQ0EREER63xl_rMz3N619Rj1Bx7o1YYkwgDzIYeoAjXhALQswOrlY_xAAL6bZ_iU0NY2B5gsVZiHzAxKsFpD2HUFpZKr6HyjlSH7yE6uTLFqyU/s1600/SNAG-1008.png" /></a></div>
</div>
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Resize7()
Dim A As Variant
Worksheets("Hoja1").Range("A1").Select
A = Range("B11:E15")
Range("B4").Resize(5, 4) = A
End Sub
</code></pre>
<br />
<div>
<h3>
<span style="color: orange;">Resize8</span></h3>
Hace lo mismo que la macro anterior, copia el rango amarillo (B11:E15) en el rango superior (B4:E8).<br />
<br />
<code>Range("B4").Resize(R.Rows.Count, R.Columns.Count) = A</code><br />
<div>
<br /></div>
Este procedimiento realiza el mismo trabajo que el anterior aunque lo hemos programado de otra forma. En este caso, creamos las variables <code>n</code> y <code>m</code> que calculan el número de filas y columnas respectivamente del rango <code>R</code>. De esta forma hacemos más flexible el código ya que evitamos tener que dar nosotros los parámetros a la propiedad <code>Resize</code>.</div>
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Resize8()
Dim A As Variant
Dim R As Range
Worksheets("Hoja1").Range("A1").Select
Set R = Range("B11:E15")
A = R
n = R.Rows.Count
m = R.Columns.Count
Range("B4").Resize(n, m) = A
End Sub
</code></pre>
<br />
<div>
<h3>
<span style="color: orange;">Resize9</span></h3>
<div class="separator" style="clear: both;">
Genera una matriz de números aleatorios y la imprime en una posición inicial variable y con un tamaño variable.</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
<code>Range(Cells(pf, pc), Cells(pf, pc)) .Resize(n, m) = A</code></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUJoAq6Mf2N23pDi1N3tAKyrMhIJ8pa7YKjXU-G3Ro5yZjFHK7arUVCM9PvWnn3lnY3gf2HSvdbV6TCYxBtBYbdtnjAiAo_jwZDzYRk8JvUdg1MS8IlCuPDuF68rSw9DweDggaMrwtTwJA/s1600/SNAG-1002.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="397" data-original-width="698" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUJoAq6Mf2N23pDi1N3tAKyrMhIJ8pa7YKjXU-G3Ro5yZjFHK7arUVCM9PvWnn3lnY3gf2HSvdbV6TCYxBtBYbdtnjAiAo_jwZDzYRk8JvUdg1MS8IlCuPDuF68rSw9DweDggaMrwtTwJA/s1600/SNAG-1002.png" width="600" /></a></div>
<br />
Seguidamente se muestra el código de ejemplo utilizado para ilustrar la versatilidad de la propiedad <code>Resize</code>.</div>
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 10px dashed rgb(240, 240, 240); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">Sub Resize9()
Dim A As Variant
Dim R As Range
Dim tf As Byte, tc As Byte, pf As Byte, pc As Byte
Worksheets("Hoja2").Activate
Range("E7:AQ45").Clear
Randomize
Range("A1").Select
tf = Int(Rnd() * 20) + 1 'tamaño:fila
tc = Int(Rnd() * 20) + 1 'tamaño: columna
pf = Int(Rnd() * 20) + 7 'posición inicial: fila
pc = Int(Rnd() * 20) + 5 'posición inicial: columna
[C6] = tf
[D6] = tc
[C5] = pf
[D5] = pc
Set R = Range(Cells(pf, pc), Cells(pf + tf - 1, pc + tc - 1))
R.Interior.Color = RGB(0, 255, 100)
A = R
n = R.Rows.Count
m = R.Columns.Count
ReDim A(n, m)
For i = 1 To n
For j = 1 To m
A(i, j) = Int(Rnd() * 100)
Next j
Next i
Range(Cells(pf, pc), Cells(pf, pc)).Resize(n, m) = A
End Sub
</code></pre>
<br />
Veamos un GIF animado donde se aprecia que el rango varía en posición y tamaño de forma aleatoria.<br />
<br />
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoGFtaPKtdgWR5ZpKwi-o4rOyrQxOg-tNzJKk3UDxAA0LoLeWm4aGlFMYMQ_5icOCKWv3QQjJH5KQUoV3OXBEtSUA4dr5HYZY0TcinojCLHh50gB9A6QMC4Q8RQ76J_Gr4jP6xAuDtKURE/s1600/GIFresize.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="797" data-original-width="1110" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoGFtaPKtdgWR5ZpKwi-o4rOyrQxOg-tNzJKk3UDxAA0LoLeWm4aGlFMYMQ_5icOCKWv3QQjJH5KQUoV3OXBEtSUA4dr5HYZY0TcinojCLHh50gB9A6QMC4Q8RQ76J_Gr4jP6xAuDtKURE/s1600/GIFresize.gif" width="600" /></a></div>
<br />
Conviene ver cómo se resolvió en otros casos la necesidad de imprimir de golpe toda una matriz, incluso de gran tamaño. Recomiendo ver los siguientes enlaces a otros post publicados.<br />
<br />
<ul>
<li><a href="http://www.excelavanzado.com/2008/10/transferir-los-datos-de-un-rango-un.html">Transferir los datos de un Rango a un Array</a></li>
<li><a href="http://www.excelavanzado.com/2013/10/ordenar-un-millon-de-valores.html">Ordenar un millón de valores</a></li>
</ul>
</div>
Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com0tag:blogger.com,1999:blog-8263944010888306433.post-48125586432530260862018-05-13T12:56:00.004+02:002022-06-14T16:24:24.162+02:00Puntos linealmente separablesPuede descargar el archivo <a href="https://www.dropbox.com/s/4coitylgxhn65rh/separarPuntos.xlsm?dl=1">separarPuntos.xlsm</a><br />
<div>
<br /></div>
<div>
Vamos a generar 1000 puntos en un plano cartesiano unos rojos y otros azules. Las coordenadas de los puntos se generan de forma aleatoria pero lo que diferencia su color es que pueden ser separados por una línea recta.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkDGEqmKdti-Kg3b2WLy2jVO77G-D-x6HbF58UZFhU9nWonfos_JkBQvN-lfDSZ58zo2fDo30WxXQscfy4Og1ohvZFKJtZyHQVJoSAGY8GoF2ECc9nIqYpolI68dZN2of-TNwBQeZ3J1M2/s1600/SNAG-0991.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="637" data-original-width="680" height="373" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkDGEqmKdti-Kg3b2WLy2jVO77G-D-x6HbF58UZFhU9nWonfos_JkBQvN-lfDSZ58zo2fDo30WxXQscfy4Og1ohvZFKJtZyHQVJoSAGY8GoF2ECc9nIqYpolI68dZN2of-TNwBQeZ3J1M2/s400/SNAG-0991.png" width="400" /></a></div>
<div>
<br /></div>
<div>
Disponemos de una macro que genera los puntos y los parámetros de la recta en su forma implícita. La macro se denomina <i>nuevaRecta</i> y se lanza con un botón con el mismo nombre.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhE4RtZqtVPSBqCIK3hHudciv_zZFfu8ecLTL3r4G3OR9G461IuEpbwWBCdTuYHrXJdiYrLH_ELgQvnCB1w6OIGRtjf8FNWrvqHHU2BK5sLKkjTXQof7p-a9wk6IL7sv8X_wjTo7yPXX_CQ/s1600/SNAG-0992.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="283" data-original-width="687" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhE4RtZqtVPSBqCIK3hHudciv_zZFfu8ecLTL3r4G3OR9G461IuEpbwWBCdTuYHrXJdiYrLH_ELgQvnCB1w6OIGRtjf8FNWrvqHHU2BK5sLKkjTXQof7p-a9wk6IL7sv8X_wjTo7yPXX_CQ/s1600/SNAG-0992.png" width="600" /></a></div>
<div>
<br />
La ecuación implícita de la recta es la siguiente.<br />
<br />
ω<sub>0 </sub>+ ω<sub>1 </sub>x<sub>1 </sub>+ ω<sub>2 </sub>x<sub>2 </sub>= 0<br />
<br />
De ella despejamos la variable dependiente y obtenemos la ecuación explícita de la recta.<br />
<br /></div>
x<sub>2 </sub>= - (ω<sub>1</sub> / ω<sub>2</sub>) x<sub>1</sub> - (ω<sub>0</sub> / ω<sub>2</sub>)<br />
<br />
Los parámetros que manejaremos para obtener la recta son ω<sub>0</sub>, ω<sub>1</sub>, ω<sub>2</sub>.<br />
<br />
La macro que genera los puntos y la recta de forma aleatoria es la siguiente.
<br />
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"> Sub nuevaRecta()
Dim i As Integer
Dim R1 As Range, R2 As Range
Dim A, B
Set R1 = Range("B40:B1039")
Set R2 = Range("C40:C1039")
A = R1
B = R2
Randomize
For i = 1 To 1000
A(i, 1) = Rnd() * 10 - 5
B(i, 1) = Rnd() * 10 - 5
Next i
R1 = A
R2 = B
[C35] = Int(Rnd() * 80 - 40) / 10 'w0
[C36] = Int(Rnd() * 80 - 40) / 10 'w1
[C37] = Int(Rnd() * 80 - 40) / 10 'w2
End Sub
</code></pre>
<br />
Esta recta generada de forma aleatoria no separa bien los puntos rojos y azules, por lo que será necesario recurrir a algún procedimiento que nos de una nueva recta que si separe los puntos por colores.<br />
<br />
Para conseguir separar los puntos mediante una recta procedemos a calcular en la celda amarilla (Q12) el número de errores cometidos. Cada punto rojo que esté por debajo de la recta y cada punto azul que esté por encima de la recta supondrán un error.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYYk1XTBzSKLU9dvUKrc5kSVdCRsyFt314xEVt55rl2gZZWUPbUxZu5kuwFjX6LuzGy-nBcYXbktleIO6IjAQuRLeGD2e9OORyuTX-B1zO2iaXHHu4OJpn0D8qdY2wZiZIjtaNMQv2AW2s/s1600/SNAG-0993.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="466" data-original-width="514" height="290" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYYk1XTBzSKLU9dvUKrc5kSVdCRsyFt314xEVt55rl2gZZWUPbUxZu5kuwFjX6LuzGy-nBcYXbktleIO6IjAQuRLeGD2e9OORyuTX-B1zO2iaXHHu4OJpn0D8qdY2wZiZIjtaNMQv2AW2s/s320/SNAG-0993.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Para conseguir que el número de errores sea cero y que por tanto los puntos rojos queden por encima de la recta y los azules por debajo, recurrimos a una fantástica herramienta de Excel denominada 'Tabla de datos' que podemos encontrar en Datos / Análisis de hipótesis /Tabla de datos.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXpgRfXwL5ugZN8UdTvsj4CRG6Mo9nZr08WdEA6iBXYLNrBn7UFVbPehg3DJf5VIb-vE54HqDyVNFbr77hgSoaTSOGjrXVLypE2eTmF0pZJh-s03lPSjff3dDs_UrcGj8e-YWMP1eJNfJj/s1600/SNAG-0994.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="262" data-original-width="745" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXpgRfXwL5ugZN8UdTvsj4CRG6Mo9nZr08WdEA6iBXYLNrBn7UFVbPehg3DJf5VIb-vE54HqDyVNFbr77hgSoaTSOGjrXVLypE2eTmF0pZJh-s03lPSjff3dDs_UrcGj8e-YWMP1eJNfJj/s400/SNAG-0994.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Lo que hacemos es calcular el error mínimo que se comete según diferentes valores de los parámetros de la recta ω<sub>0</sub>, ω<sub>1</sub>, ω<sub>2</sub>. La macro que se lanza con el botón 'mínimos' realiza la búsqueda de los errores mínimos. Este botón se ha de lanzar varias veces hasta conseguir que el error (celda amarilla) sea cero.<br />
<br />
Este es un ejemplo que muestra la potencia de la herramienta <i>Tabla de datos</i>.<br />
<br />
Veamos un gif animado donde se generan nuevos puntos y una nueva recta pulsando sobre el botón que llama a la macro <i>nuevaRecta</i> y luego pulsamos reiteradamente sobre el botón <i>mínimos</i> que lanza la macro que va minimizando los errores hasta que el error de la celda amarilla se hace cero. En ese momento tendremos la recta que separa completamente los puntos de colores en el plano.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibRfo7G6gGJWCpLSN2_VGl72csaQc9Cu8KAmyKn5qTbqslCCAK00Qoo_W8Wndsmn7CQG_QDwmVUJPb66vxl01FK9WB7ugqcPUTq-Dv4wjYSNutSIBvoieaFn4hjU8wIWGH-80m4byNssKF/s1600/separarPuntos.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="826" data-original-width="997" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibRfo7G6gGJWCpLSN2_VGl72csaQc9Cu8KAmyKn5qTbqslCCAK00Qoo_W8Wndsmn7CQG_QDwmVUJPb66vxl01FK9WB7ugqcPUTq-Dv4wjYSNutSIBvoieaFn4hjU8wIWGH-80m4byNssKF/s1600/separarPuntos.gif" width="600" /></a></div>
<br />Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com0tag:blogger.com,1999:blog-8263944010888306433.post-54514388645190634172018-05-11T12:00:00.001+02:002022-06-14T16:25:13.658+02:00Máquina de Galton en Excel<div>
Puede descargar el archivo <a href="https://www.dropbox.com/s/2krr3unpoy8ijzv/maquinaGalton.xlsm?dl=1">maquinaGalton.xlsm</a></div>
<div>
<br /></div>
La <a href="https://es.wikipedia.org/wiki/M%C3%A1quina_de_Galton">máquina de Galton</a> nos permite ver cómo una distribución binomial tiende a una distribución normal cuando el número de tiradas va creciendo.<span class="letrag"></span><br />
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU6R15E68ylgDCotzl_4rd5nLvMaiYEn74Mk2abZ_28Mfwae6zsDmhkzjvn_Dq2XVqzno1zyC-aU5RHJWYam3nFzwPphlGQYb6cA5OPm2xrJtuTcR39VZUCQFCqccKQujrn92J6ddPg9g_/s1600/Galton_box.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="886" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU6R15E68ylgDCotzl_4rd5nLvMaiYEn74Mk2abZ_28Mfwae6zsDmhkzjvn_Dq2XVqzno1zyC-aU5RHJWYam3nFzwPphlGQYb6cA5OPm2xrJtuTcR39VZUCQFCqccKQujrn92J6ddPg9g_/s400/Galton_box.jpg" width="221" /></a></div>
<div>
<br /></div>
<div>
La máquina se puede ver en algunos museos de ciencias. También podríamos construirla nosotros con un tablero inclinado con una ranura superior por la que van cayendo bolitas que rebotan en una serie de clavos o pivotes. En cada rebote la bola tiene probabilidad 1/2 de ir hacia la izquierda o hacia la derecha. Esto se repite una y otra vez hasta que al final la bola termina en una cierta posición y cae por un carril que hemos construido con unas tablas verticales para separar unos de otros. Lo que vemos, si lanzamos un gran número de bolitas, es que los carriles de abajo forman una campana de Gauss. La distribución normal se forma como si de un histograma de frecuencias se tratara.</div>
<div>
<br /></div>
<div>
Vamos a construir una máquina de Galton virtual utilizando Excel y una macro que nos permite hacer el trabajo de la iteraciones de una forma rápida.</div>
<div>
<br /></div>
<h3>
<span style="color: orange;">Hoja1</span></h3>
<div>
Primero creamos la macro que hace la que bolita baje rebotando entre los pivotes. En cada movimiento hacia abajo la bola tiene una probabilidad del 50% de ir hacia la izquierda y otro 50% de ir hacia la derecha. Es similar a un árbol binomial.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkamdyFg_H0dDZSiH2KegY3j-6c7DQeQg8oNQhosj8TM4H3rKoxlajeNAkQyW5aBz252dV1e8m6AYFxOQCfrU6pgMCpIUKA9bQljyd0WCoYvF2uEY4TgvZHJ_A8RggyJQNYFDyc6EBd6kZ/s1600/lanzaBolas.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="788" data-original-width="1299" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkamdyFg_H0dDZSiH2KegY3j-6c7DQeQg8oNQhosj8TM4H3rKoxlajeNAkQyW5aBz252dV1e8m6AYFxOQCfrU6pgMCpIUKA9bQljyd0WCoYvF2uEY4TgvZHJ_A8RggyJQNYFDyc6EBd6kZ/s1600/lanzaBolas.gif" width="600" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div>
<br /></div>
<div>
La macro que hace que la bola baje es la siguiente.</div>
<div>
<br /></div>
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"> Sub baja()
'árbol binomial de 32 etapas
Dim col As Byte
Worksheets("Hoja1").Activate
Randomize
Range("B2:BN68").Font.Bold = False
col = 34
Cells(2, 34) = "O"
Cells(4, 34) = "O"
Cells(4, 34).Font.Bold = True
For i = 1 To 32
If Rnd < 0.5 Then
col = col - 1
Else
col = col + 1
End If
Cells(i * 2 + 4, col) = "O"
Cells(i * 2 + 4, col).Font.Bold = True
Next i
End Sub
</code></pre>
<br />
<h3>
<span style="color: orange;">Hoja2</span></h3>
Creamos un bucle FOR...NEXT que lanza un gran número de bolas, por ejemplo, 1000. De esta forma podemos ver en que columna ha quedado cada una de ellas al realizar el recorrido hacia abajo.<br />
<br />
Veamos el código, similar al anterior pero incluyendo el bucle.<br />
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"> Sub baja2()
Call BorraO
'árbol binomial de 32 etapas
Dim n As Long 'nº de tiradas
Dim col As Byte
Worksheets("Hoja2").Activate
Randomize
n = 1000
Application.ScreenUpdating = False
For j = 1 To n
col = 34
Cells(2, 34) = "O"
Cells(4, 34) = "O"
For i = 1 To 32
'una forma alternativa de sumar o restar 1 de forma aleatoria
col = col + WorksheetFunction.RandBetween(0, 1) * 2 - 1
Cells(i * 2 + 4, col) = "O"
Next i
'anotamos en la fila 99 los resultados
Cells(99, col) = Cells(99, col) + 1
Next j
Application.ScreenUpdating = True
End Sub
</code></pre>
<br />
Este es un proceso que puede tardar bastante tiempo en función del valor que demos a n. Para intentar reducir el tiempo de proceso podemos incluir al inicio la siguiente línea.<br />
<br />
<pre><code>Application.ScreenUpdating = False</code></pre>
<br />
<br />
Con ella lo que hacemos el anular el envío de refresco a la pantalla de nuestro ordenador. Al final de la macro, dejamos el refresco activado para poder ver el resultado.<br />
<br />
<pre><code>Application.ScreenUpdating = True</code></pre>
<br />
Veamos el resultado tras lanzar 10.000 veces la bola.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtNYC-0XDY-ghsUPbDtgg_Ngor3s-iO9YyPa6WoftR-ZWA1ALemQFeH1819JhPQYJNVNu9UHB-CVLANQkdDMyNqRp2rMmICmqsSorYKKZonjpK3ewtnvQlxPjIQX8zdUMyDiD6YHcKm3K0/s1600/SNAG-0987.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="69" data-original-width="1237" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtNYC-0XDY-ghsUPbDtgg_Ngor3s-iO9YyPa6WoftR-ZWA1ALemQFeH1819JhPQYJNVNu9UHB-CVLANQkdDMyNqRp2rMmICmqsSorYKKZonjpK3ewtnvQlxPjIQX8zdUMyDiD6YHcKm3K0/s1600/SNAG-0987.png" width="600" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br />
<h3>
<span style="color: orange;">Hoja3</span></h3>
Nos gustaría poder ver la campana de Gauss que se forma con las tiradas. En la Hoja3 hemos creado unas columnas que se van rellenando con las bolas en vertical hasta que la columna más alta llegue a una altura de 30 bolas.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQSAiYse-nGUPGsXyWlyGcgxvYa6OmX1Pqm1F2i3CzWAxiUCZNElcv8fr9y4YwUED9k4fiQ1XbF4D0Zct1FCv1qSlWHiMznGPNXrqcESecwjclCSXjDQc8uzSUkB_7c5LOt-SECXDKu11c/s1600/SNAG-0988.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="908" data-original-width="878" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQSAiYse-nGUPGsXyWlyGcgxvYa6OmX1Pqm1F2i3CzWAxiUCZNElcv8fr9y4YwUED9k4fiQ1XbF4D0Zct1FCv1qSlWHiMznGPNXrqcESecwjclCSXjDQc8uzSUkB_7c5LOt-SECXDKu11c/s400/SNAG-0988.png" width="386" /></a></div>
<br />
Con algo de imaginación podemos ver el bosquejo de una campana de Gauss. Para que veamos algo que nos recuerde más a la curva de una distribución normal tendríamos que usar muchas más tiradas.<br />
<br />
Veamos el código.<br />
<br />
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"> Sub baja3()
'árbol binomial de 32 etapas
Dim col As Byte
Call BorraO
Worksheets("Hoja3").Activate
Randomize
Do
col = 34
Cells(2, 34) = "O"
Cells(4, 34) = "O"
For i = 1 To 32
If Rnd < 0.5 Then
col = col - 1
Else
col = col + 1
End If
Cells(i * 2 + 4, col) = "O"
Next i
Cells(99, col) = Cells(99, col) + 1
miMax = Application.WorksheetFunction.Max(Range("Z99:AP99"))
Call BorraTri
Cells(98 - Cells(99, col), col) = "O"
Loop While miMax < 30
End Sub
</code></pre>
<br />
<br />
<h3>
<span style="color: orange;">Hoja4 y Gráfico</span></h3>
En la Hoja4 lo que hacemos es traernos los valores obtenidos en la Hoja2, y presentarlos en forma de columna. Para ello usamos la siguiente expresión en la celda C4.<br />
<br />
<pre><code>=INDIRECTO("Hoja2!"&"F99C"&B4*2;0)</code></pre>
<br />
Podemos ver aquí un potente uso de la función indirecto que toma valores de otra hoja para trasponerlos.<br />
<br />
Con los valores obtenidos hacemos un histograma de frecuencias que se asemeja a una campana de Gauss. La apariencia será tanto mejor cuanto mayor sea el valor de tiradas (n).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS47Is3rmHNDnFILgCFM5kVEifct9RPhcGiq34tGgCF8BhlQ7kTcndfXDj4pV5mS4JcxlmK-nRmO8WEZZ6w2N88QlhglXQ2JMJ5wq3lRMk5B7lM45Al0IJ_VrF2POWvByVm1_bFX3QiG-0/s1600/SNAG-0989.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="900" data-original-width="1600" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS47Is3rmHNDnFILgCFM5kVEifct9RPhcGiq34tGgCF8BhlQ7kTcndfXDj4pV5mS4JcxlmK-nRmO8WEZZ6w2N88QlhglXQ2JMJ5wq3lRMk5B7lM45Al0IJ_VrF2POWvByVm1_bFX3QiG-0/s400/SNAG-0989.png" width="400" /></a></div>
<br />
<br />Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com1tag:blogger.com,1999:blog-8263944010888306433.post-26543236233310313842018-05-03T15:56:00.004+02:002022-06-14T16:28:22.510+02:00Pesos y umbralesPuede descargar el archivo <a href="https://www.dropbox.com/s/8cvysxzuuiakudw/pesosUmbrales.xlsm?dl=1">pesosUmbrales.xlsm</a><span class="letrag"></span><br />
<div>
<br /></div>
<div>
He leído el siguiente artículo que es una introducción a la inteligencia artificial.</div>
<div>
<br /></div>
<div>
<a href="https://www.xataka.com/robotica-e-ia/las-redes-neuronales-que-son-y-por-que-estan-volviendo">Las redes neuronales: qué son y por qué están volviendo</a></div>
<div>
<br /></div>
<div>
En el artículo se plantea un caso sencillo que podría resolver un perceptrón. Se trata de entender el comportamiento de una única neurona que tiene dos entradas con sus pesos omega 1 (<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω1</span>) y omega 2 (<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω2</span>), y un umbral de activación.</div>
<div>
<br /></div>
<h3>
<span style="color: orange;">Planteamiento del problema</span></h3>
<div>
Un profesor realiza dos exámenes y pone la calificación final sin explicar cómo ha obtenido ésta. En la calificación final únicamente dice si el alumno ha aprobado o ha suspendido. Los alumnos desean averiguar que pesos da el profesor en cada examen (<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω1 y </span><span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω2</span>) para obtener la calificación media y con que nota media aprueba el profesor. Esa nota de corte sería el umbral de activación. Por ejemplo, una respuesta al problema podría ser la siguiente.</div>
<div>
<br /></div>
<div>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω1=0,30 </span><span face=""segoe ui" , "arial" , sans-serif" style="background-color: white; color: #333333; font-size: 15px;">→ El primer examen pesa un 30% en la nota final</span></div>
<div>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω2=0,70</span><span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"> </span><span face=""segoe ui" , "arial" , sans-serif" style="background-color: white; color: #333333; font-size: 15px;">→ El segundo examen pesa un 70% en la nota final</span></div>
<div>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">u=0,4 </span><span face=""segoe ui" , "arial" , sans-serif" style="background-color: white; color: #333333; font-size: 15px;">→ La asignatura se aprueba con un 4</span></div>
<div>
<span face=""segoe ui" , "arial" , sans-serif" style="background-color: white; color: #333333; font-size: 15px;"><br /></span></div>
<div>
<span face=""segoe ui" , "arial" , sans-serif" style="background-color: white; color: #333333; font-size: 15px;">Los pesos </span><span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω1 y </span><span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω2 se expresan en tanto por uno y su suma siempre es 1, que equivale al 100%.</span></div>
<div>
<span face=""arial" , "helvetica" , sans-serif" style="color: #555555;"><span style="background-color: white; font-size: 14px;">La notas de los exámenes van entre 0 y 10, pero se divididen entre 10 para que su rango de variación esté entre 0 y 1. Lo mismo sucede con el umbral de activación (u), también se divide entre 10, por lo que aprobar con un 4 equivale a tener un umbral de 0,4.</span></span></div>
<div>
<span face=""arial" , "helvetica" , sans-serif" style="color: #555555;"><span style="background-color: white; font-size: 14px;"><br /></span></span></div>
<h3>
<span face=""arial" , "helvetica" , sans-serif" style="color: orange;"><span style="background-color: white; font-size: 14px;">Solución en Excel</span></span></h3>
<div>
<span face=""arial" , "helvetica" , sans-serif" style="color: #555555;"><span style="background-color: white; font-size: 14px;">No vamos a plantear la resolución en Excel mediante el uso de redes neuronales. Simplemente pretendemos plantear este caso sencillo mediante el uso de la hoja de cálculo. Es una pequeña aproximación a los fundamentos que rigen el comportamiento de una única neurona en un perceptrón sencillo de una capa. En lugar de ir buscando el camino más apropiado para llegar a la solución lo que hacemos es explorar todos los casos dentro de los valores que damos a </span></span><span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω1, </span><span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω2 y u.</span><br />
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimq3OLW0C8VhZavkenn6WCISpHZ6ZmcIPxJ06EudmnxtApraqtrG_GwlbyVmyyyXRvEdhJdRzD0YTj5Trj-RqOiqpW-siyq6NKmcni8dKIwgvhznw4f2Za5yQabpiRcTRg8L7MeV5SO2Sn/s1600/SNAG-0974.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="382" data-original-width="431" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimq3OLW0C8VhZavkenn6WCISpHZ6ZmcIPxJ06EudmnxtApraqtrG_GwlbyVmyyyXRvEdhJdRzD0YTj5Trj-RqOiqpW-siyq6NKmcni8dKIwgvhznw4f2Za5yQabpiRcTRg8L7MeV5SO2Sn/s1600/SNAG-0974.png" /></a></div>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span></div>
<div>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">Hacemos variar </span><span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω1 entre 0 y 1 en intervalos de 0,1. Como </span><span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω2 es la parte complementaria (ambas omegas suman 1), obtendremos que </span><span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω2 varía en el mismo intervalo, pero justo en orden inverso.</span></div>
<div>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span></div>
<div>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">Hacemos variar el umbral u entre 0,1 y 0,9 con intervalos de 0,1.</span></div>
<div>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span></div>
<h4>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; font-size: 14px;"><span style="color: purple;">Paso 1</span></span></h4>
<div>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">Disponemos en la Hoja1 de los datos de los exámenes. Tenemos una tabla con las calificaciones obtenidas por los alumnos en el examen 1 y en el examen 2 (columnas C y D). En color naranja tenemos los pesos que ha asignado el profesor a cada examen y la nota de corte o umbral utilizado para aprobar.</span><br />
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYKW9gN0cNgPvExMhpoFTwT3OU-7WWM26wYipZz7sBv4bT4hsqJfEoFPA51sUs69-CdImtChfBLETrWzKUkBUgPSk4idBdbkL0KHdFW6QMLb8ZZT6WqPgfDSNzT4Exs4431CwhCh7kCuhP/s1600/SNAG-0975.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="828" data-original-width="579" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYKW9gN0cNgPvExMhpoFTwT3OU-7WWM26wYipZz7sBv4bT4hsqJfEoFPA51sUs69-CdImtChfBLETrWzKUkBUgPSk4idBdbkL0KHdFW6QMLb8ZZT6WqPgfDSNzT4Exs4431CwhCh7kCuhP/s1600/SNAG-0975.png" /></a></div>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span></div>
<div>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">Nuestro sistema será alimentado con los valores de color rosa correspondientes a 30 alumnos. Las columnas G y H contienen las notas de los dos exámenes divididas entre 10, ya que al perceptrón se le alimenta con datos estandarizados que van entre 0 y 1. La columna I indica si se ha aprobado el examen (1) o se ha supendido (0). La columan I es la misma que la columan F.</span></div>
<div>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span></div>
<div>
<br /></div>
<div>
<h4>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; font-size: 14px;"><span style="color: purple;">Paso 2</span></span></h4>
</div>
<div>
<span face=""segoe ui" , "arial" , sans-serif" style="background-color: white; color: #333333; font-size: 15px;">A la Hoja2 llevamos las notas de 30 alumnos, para ello copiamos y pegamos con pegado especial valores las tres columnas de color rosa.</span><br />
<span face=""segoe ui" , "arial" , sans-serif" style="background-color: white; color: #333333; font-size: 15px;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_M64wQW3vcBMvfoMjhgFWlZJd1WLUTI5kUWX-YWboWNrtKgxIpyyP-AoGcvtFmOClyZgQ7tVzaKfD0TBRwV7kQjSEQCs-klpwAbyPit_z6mjHe3cvPQyyttTreZ1Ny3jGFOVmAiESQ66I/s1600/SNAG-0976.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="832" data-original-width="318" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_M64wQW3vcBMvfoMjhgFWlZJd1WLUTI5kUWX-YWboWNrtKgxIpyyP-AoGcvtFmOClyZgQ7tVzaKfD0TBRwV7kQjSEQCs-klpwAbyPit_z6mjHe3cvPQyyttTreZ1Ny3jGFOVmAiESQ66I/s1600/SNAG-0976.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<span face=""segoe ui" , "arial" , sans-serif" style="background-color: white; color: #333333; font-size: 15px;"><br /></span></div>
<div>
Para cada uno de los 30 alumnos vamos a calcular la nota final ponderando con los valores de <span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω1y </span><span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω2 que van entre 0 y 1 con variación de 0,1. De esta forma se crea una tabla en las columnas de la E hasta la O. Así, la fórmula de la celda E7 es la siguiente fórmula matricial.</span><br />
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">=SUMAPRODUCTO(TRANSPONER(E$4:E$5);$B7:$C7)</span><br />
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">Esta fórmula multiplica la nota del examen 1 por el peso </span><span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω1 más el producto de la nota 2 por el peso </span><span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω2. También podríamos haber conseguido el mismo resultado con la fórmula siguiente para la celda E7.</span><br />
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span>
<span style="background-color: white; font-size: 14px;"><span face=""arial" , "helvetica" , sans-serif" style="color: #555555;">=$B7*E$4+$C7*E$5</span></span><br />
<span style="background-color: white; font-size: 14px;"><span face=""arial" , "helvetica" , sans-serif" style="color: #555555;"><br /></span></span>
<span style="background-color: white; font-size: 14px;"><span face=""arial" , "helvetica" , sans-serif" style="color: #555555;"><br /></span></span>
<br />
<h4>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: purple; font-size: 14px;">Paso 3</span></h4>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">En las columnas desde la P hasta la Z, vamos a calcular la calificación de aprobado (1) o suspenso (0) teniendo en cuenta la nota media calculada en la tabla anterior y el umbral (u) que se encuentra en la celda P2. Si el umbral es 0,4 quiere decir que se aprueba con un 4 en la nota media.</span><br />
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_M64wQW3vcBMvfoMjhgFWlZJd1WLUTI5kUWX-YWboWNrtKgxIpyyP-AoGcvtFmOClyZgQ7tVzaKfD0TBRwV7kQjSEQCs-klpwAbyPit_z6mjHe3cvPQyyttTreZ1Ny3jGFOVmAiESQ66I/s1600/SNAG-0976.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="832" data-original-width="318" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_M64wQW3vcBMvfoMjhgFWlZJd1WLUTI5kUWX-YWboWNrtKgxIpyyP-AoGcvtFmOClyZgQ7tVzaKfD0TBRwV7kQjSEQCs-klpwAbyPit_z6mjHe3cvPQyyttTreZ1Ny3jGFOVmAiESQ66I/s1600/SNAG-0976.png" /></a></div>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">La fórmula de la celda P7 es un condicional que nos dice si se aprubeba o no según se supere o no el umbral.</span><br />
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">=SI(E7>=$P$2;1;0)</span><br />
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span>
<br />
<h4>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: purple; font-size: 14px;">Paso 4</span></h4>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">Ahora vamos a calcular los errores cometidos comparando el vector de ceros y unos de cada una de las columnas P:Z con los valores de la columna D que contienen los aprobados y suspensos publicados por el profesor.</span><br />
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_ojyLXTY5xM-L3pTrYkSE6Oqmv-mNiU7A6pctjD1Wn_hR2JsNifFFeYsZScnfSEqmeXzQfuv6pxCgqsWkkqPmbM9fmxmdOlvTaWuJKshVnHUprAAeV6qY_M2qBuNdXe-Hnvd6XWxIwrtR/s1600/SNAG-0977.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="831" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_ojyLXTY5xM-L3pTrYkSE6Oqmv-mNiU7A6pctjD1Wn_hR2JsNifFFeYsZScnfSEqmeXzQfuv6pxCgqsWkkqPmbM9fmxmdOlvTaWuJKshVnHUprAAeV6qY_M2qBuNdXe-Hnvd6XWxIwrtR/s1600/SNAG-0977.png" /></a></div>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">La celda AA7 contiene la siguiente fórmula que nos permite realizar la comparación .</span><br />
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">=--(P7<>$D7)</span><br />
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">Si obtenemos un vector completamente de ceros lo vamos a colorear en amarillo usando Formato condicional.</span><br />
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">En la fila 1, en el rango AA1:AK1 calculamos la suma de los errores cometidos en cada una de la columnas. Lo que nos interesa es detectar que el error sea cero. En AN1 calculamos el mínimo de ese rango y si llegamos a obtener un cero quiere decir que estamos ante un caso donde los valores de </span><span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω1, </span><span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">ω2 y u explican bien las calificaciones publicadas por el profesor.</span><br />
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">Pero tenemos que calcular esta tabla para cada uno de los posibles valores de u desde 0,1 hasta 0,9. Para realizar este cálculo sin tener que ir variando el valor de forma manual o sin tener que hacer más tablas hemos recurrido a una estupenda herramienta de Excel denominada Tabla de datos y su resultado se muestra en el rango AM6:AN17.</span><br />
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span>
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;">Con ayuda de Formato condicional para los colores y con un par de botones que lanzan macros, podemos obtener la solución que buscamos. Si en el rango AP6:AP9 obtenemos las cuatro celdas con valores VERDADERO quiere decir que hemos encontrado la solución a un caso.</span><br />
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span>
<span face=""arial" , "helvetica" , sans-serif" style="color: #555555;"><span style="background-color: white; font-size: 14px;">Si deseamos hacer un nuevo caso pulsaremos el botón denominado "cambia pesos" que lo que hace es cambiar los valores de los omegas y el umbral en la Hoja1, y lanzando la macro que intenta resolver el caso. El caso queda resuelto cando obtenemos los cuatro verdaderos.</span></span><br />
<span face=""arial" , "helvetica" , sans-serif" style="color: #555555;"><span style="background-color: white; font-size: 14px;"><br /></span></span>
<span face=""arial" , "helvetica" , sans-serif" style="color: #555555;"><span style="background-color: white; font-size: 14px;">Pero existe la posibilidad de que las 30 notas de los alumnos no sean suficientes para resolver el caso y entonces necesitemos otra muestra de valores. Esto se consigue pulsando el botón "Toma datos", que habrá que pulsar reiteradamente en algunas ocasiones para llegar a conseguir los cuatro verdaderos y por tanto la solución final del problema planteado.</span></span><br />
<span face=""arial" , "helvetica" , sans-serif" style="background-color: white; color: #555555; font-size: 14px;"><br /></span></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com0tag:blogger.com,1999:blog-8263944010888306433.post-30889295077130615902018-04-22T23:31:00.003+02:002022-06-14T16:29:36.404+02:00Gráfico con datos matricialesPuede descargar el archivo <a href="https://www.dropbox.com/s/z1he0px0thmuetp/manchasSolares.xlsm?dl=1">manchasSolares.xlsm</a><br />
<div>
<ul>
</ul>
</div>
<div>
Disponemos de dos casos, en ambos creamos un gráfico de dispersión XY con puntos constituidos por parejas de datos aleatorios. En el primer caso los datos se encuentran en la propia hoja de cálculo y en segundo caso los datos se generan de forma aleatoria en la propia macro, usando simplemente código VBA.</div>
<div>
<br /></div>
<div>
<h3>
<span style="color: orange;">Hoja1</span></h3>
</div>
<div>
La capacidad de representar datos en un gráfico está limitada en Excel según la versión. Seguidamente se muestran las limitaciones de la versión 2016.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFK8seDo6DcX8rDoplHJbmt0gC1XhzQ6jFPyvu84jNjt4YCPaxmqyjYnYR2um83-2-sasxa82erKyFpTUhfv0H5EL-lVkGJ8Junzlg8ksQ4XpR5ohZYsJk3u8R9xD9Hs1QorTi_Cs0wwSx/s1600/SNAG-0088.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="499" data-original-width="776" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFK8seDo6DcX8rDoplHJbmt0gC1XhzQ6jFPyvu84jNjt4YCPaxmqyjYnYR2um83-2-sasxa82erKyFpTUhfv0H5EL-lVkGJ8Junzlg8ksQ4XpR5ohZYsJk3u8R9xD9Hs1QorTi_Cs0wwSx/s800/SNAG-0088.png" width="600" /></a></div>
<div>
<br /></div>
<div>
La información anterior está obtenida de la página de Microsoft. En la Hoja1 hemos creado 30.000 parejas de valores.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuDHb1eSeIexkx836U6Qc7BgODDMrzlyCCW97KW8w_fvQyptqbGSPrmArMEVOEa_2OSAVaRJDiMnD1kL4YNFRO_q0Od3McQV_M6c18yc9IGMQ0deBRFhZMSDG2b14QoaEJZFUfGFP1cvOi/s1600/SNAG-0089.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="246" data-original-width="364" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuDHb1eSeIexkx836U6Qc7BgODDMrzlyCCW97KW8w_fvQyptqbGSPrmArMEVOEa_2OSAVaRJDiMnD1kL4YNFRO_q0Od3McQV_M6c18yc9IGMQ0deBRFhZMSDG2b14QoaEJZFUfGFP1cvOi/s1600/SNAG-0089.png" /></a></div>
<br />
En las columnas A y B creamos aleatoriamente el radio y el ángulo que son las dos <a href="https://es.wikipedia.org/wiki/Coordenadas_polares">coordenadas polares</a> que vamos a manejar. Luego en las columnas C y D convertimos las coordenadas polares en coordenadas cartesianas con la fórmula siguiente.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJTtbGJ5OW3nzsVze5eC-aQG88dhK7btJRDatolvtC64UHNL4CkYm7WAcY2ToSSTLmEFNnO-Xy4I9TOs-wf93SDp8G013pUzbBBHLyVPBEuuDFmkrv8EdS4t0LgJXQFgyWXUdAwACLT5ub/s1600/SNAG-0091.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="45" data-original-width="89" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJTtbGJ5OW3nzsVze5eC-aQG88dhK7btJRDatolvtC64UHNL4CkYm7WAcY2ToSSTLmEFNnO-Xy4I9TOs-wf93SDp8G013pUzbBBHLyVPBEuuDFmkrv8EdS4t0LgJXQFgyWXUdAwACLT5ub/s1600/SNAG-0091.png" /></a></div>
<br />
Si el radio se obtiene con la función aleatorio() esto nos permite crear un gráfico como el siguiente.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXW4rAV6kH0p9TnK6-ZNZ0tbE3Ke45P0ZrmQLXfC3rQjxxZzEcaDSJ5leC3EfOSTsdcxGh3u4WrAbX5TUqrKOMc1t8kVsX6JimRCZ3A2fGVT2s9Z68moVU3QFmUKkvpvebnK7YwjJ0_V8t/s1600/SNAG-0092.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="559" data-original-width="537" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXW4rAV6kH0p9TnK6-ZNZ0tbE3Ke45P0ZrmQLXfC3rQjxxZzEcaDSJ5leC3EfOSTsdcxGh3u4WrAbX5TUqrKOMc1t8kVsX6JimRCZ3A2fGVT2s9Z68moVU3QFmUKkvpvebnK7YwjJ0_V8t/s320/SNAG-0092.png" width="307" /></a></div>
<br />
Observamos una mayor concentración de puntos en el centro. Si queremos que la distribución de puntos aleatorios sea uniforme en toda la circunferencia hemos de elegir el radio como la raiz cuadrada de una uniforme cero uno.<br />
<br />
<pre><code>=raiz(aleatorio())</code></pre>
<br />
Con este cambio obtendremos el siguiente gráfico que podemos ver en forma de gif animado obtenido al recalcular los valores aleatorios pulsando la tecla de función F9 de forma reiterada.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifj7TPEkBRz4QeEcXhG84cmpDfhz2vn0JDoKCI7fRBztgIAqivqZQ7akfaPO1q9qLuqe_X3SPQVZkd1HWHhHhjDvQ6T4quv-vQzFMlZsAvX16NF0Q86xdNbbalLsYwzbnmzAGj6PnZm87Z/s1600/manchasSolares.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="549" data-original-width="536" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifj7TPEkBRz4QeEcXhG84cmpDfhz2vn0JDoKCI7fRBztgIAqivqZQ7akfaPO1q9qLuqe_X3SPQVZkd1HWHhHhjDvQ6T4quv-vQzFMlZsAvX16NF0Q86xdNbbalLsYwzbnmzAGj6PnZm87Z/s1600/manchasSolares.gif" width="390" /></a></div>
<br />
<h3>
<span style="color: orange;">Hoja2</span></h3>
Con el segundo caso veremos cómo generar los puntos aleatorios con una macro. Mediante código VBA crearemos una matriz para el eje X y otra matriz para el eje Y. Luego introduciremos ambas matrices como las series de valores para poder generar el gráfico de tipo dispersión XY.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitIw0lBnh3jOQjonLIWi0rS0PRRDaCmFliVdLNor9CkvZ_wKzAhbAd4dvpfUMgfbu3MM_wwsjKysembBYvwFhFmzrw9AwPVHU-5H94o76m5morfXYXyKVestBuXR6lu6AvZf_-SJ_WjGo9/s1600/SNAG-0093.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="577" data-original-width="740" height="311" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitIw0lBnh3jOQjonLIWi0rS0PRRDaCmFliVdLNor9CkvZ_wKzAhbAd4dvpfUMgfbu3MM_wwsjKysembBYvwFhFmzrw9AwPVHU-5H94o76m5morfXYXyKVestBuXR6lu6AvZf_-SJ_WjGo9/s400/SNAG-0093.png" width="400" /></a></div>
<br /></div>
<h3>
Primera macro</h3>
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"> Sub generaChartConArray1()
Dim A(16000) As Variant
Dim B(16000) As Variant
Dim i As Long
Dim grafico As ChartObject
Dim c As Byte
Dim ChtObj As ChartObject
Worksheets("Hoja2").Activate
c = 0
Randomize
For i = 1 To 16000
A(i) = Rnd
B(i) = Rnd
Next i
For Each grafico In Worksheets("Hoja2").ChartObjects
If grafico.Name = "migas" Then
c = c + 1
End If
Next
If c = 0 Then
Set ChtObj = Worksheets("Hoja2").ChartObjects.Add(Left:=10, Top:=10, _
Width:=400, Height:=400)
With ChtObj
.Chart.ChartType = xlXYScatter
.Chart.SetSourceData Source:=Range("Hoja2!$A$1:$B$2")
.Name = "migas"
End With
End If
ActiveSheet.ChartObjects("migas").Activate
ActiveChart.SeriesCollection(1).XValues = A
ActiveChart.SeriesCollection(1).Values = B
ActiveChart.Axes(xlCategory).MaximumScale = 1
ActiveChart.Axes(xlCategory).MinimumScale = 0
ActiveChart.Axes(xlValue).MaximumScale = 1
ActiveChart.Axes(xlValue).MinimumScale = 0
ActiveChart.SetElement (msoElementLegendNone)
ActiveChart.SetElement (msoElementPrimaryValueGridLinesNone)
ActiveChart.SetElement (msoElementPrimaryCategoryAxisNone)
ActiveChart.SetElement (msoElementPrimaryValueAxisNone)
ActiveChart.SetElement (msoElementChartTitleNone)
ActiveChart.FullSeriesCollection(1).MarkerStyle = -4118
ActiveChart.FullSeriesCollection(1).MarkerSize = 2
Range("A1").Select
End Sub
</code></pre>
<h3>
Segunda macro</h3>
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"> Sub generaChartConArray2()
Dim A() As Variant
Dim B() As Variant
Dim i As Long
Dim radio As Double
Dim angulo As Double
Dim grafico As ChartObject
Dim c As Byte
Dim n As Long
Dim ChtObj As ChartObject
Worksheets("Hoja2").Activate
c = 0
n = 16384
ReDim A(n)
ReDim B(n)
Randomize
For i = 1 To n
radio = Rnd
angulo = Rnd * 2 * (WorksheetFunction.Pi)
A(i) = radio * Cos(angulo)
B(i) = radio * Sin(angulo)
Next i
For Each grafico In Worksheets("Hoja2").ChartObjects
If grafico.Name = "migas" Then
c = c + 1
End If
Next
If c = 0 Then
Set ChtObj = Worksheets("Hoja2").ChartObjects.Add(Left:=10, Top:=10, _
Width:=400, Height:=400)
With ChtObj
.Chart.ChartType = xlXYScatter
.Chart.SetSourceData Source:=Range("Hoja2!$A$1:$B$2")
.Name = "migas"
End With
End If
ActiveSheet.ChartObjects("migas").Activate
ActiveChart.SeriesCollection(1).XValues = A
ActiveChart.SeriesCollection(1).Values = B
ActiveChart.Axes(xlCategory).MaximumScale = 1
ActiveChart.Axes(xlCategory).MinimumScale = -1
ActiveChart.Axes(xlValue).MaximumScale = 1
ActiveChart.Axes(xlValue).MinimumScale = -1
ActiveChart.SetElement (msoElementLegendNone)
ActiveChart.SetElement (msoElementPrimaryValueGridLinesNone)
ActiveChart.SetElement (msoElementPrimaryCategoryAxisNone)
ActiveChart.SetElement (msoElementPrimaryValueAxisNone)
ActiveChart.SetElement (msoElementChartTitleNone)
ActiveChart.FullSeriesCollection(1).MarkerStyle = -4118
ActiveChart.FullSeriesCollection(1).MarkerSize = 2
Range("A1").Select
End Sub
</code></pre>
<h3>
Tercera macro</h3>
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"> Sub generaChartConArray3()
Dim A() As Variant
Dim B() As Variant
Dim i As Long
Dim radio As Double
Dim angulo As Double
Dim grafico As ChartObject
Dim c As Byte
Dim n As Long
Dim ChtObj As ChartObject
Worksheets("Hoja2").Activate
c = 0
n = 16384
ReDim A(n)
ReDim B(n)
Randomize
For i = 1 To n
radio = Sqr(Rnd)
angulo = Rnd * 2 * (WorksheetFunction.Pi)
A(i) = radio * Cos(angulo)
B(i) = radio * Sin(angulo)
Next i
For Each grafico In Worksheets("Hoja2").ChartObjects
If grafico.Name = "migas" Then
c = c + 1
End If
Next
If c = 0 Then
Set ChtObj = Worksheets("Hoja2").ChartObjects.Add(Left:=10, Top:=10, _
Width:=400, Height:=400)
With ChtObj
.Chart.ChartType = xlXYScatter
.Chart.SetSourceData Source:=Range("Hoja2!$A$1:$B$2")
.Name = "migas"
End With
End If
ActiveSheet.ChartObjects("migas").Activate
ActiveChart.SeriesCollection(1).XValues = A
ActiveChart.SeriesCollection(1).Values = B
ActiveChart.Axes(xlCategory).MaximumScale = 1
ActiveChart.Axes(xlCategory).MinimumScale = -1
ActiveChart.Axes(xlValue).MaximumScale = 1
ActiveChart.Axes(xlValue).MinimumScale = -1
ActiveChart.SetElement (msoElementLegendNone)
ActiveChart.SetElement (msoElementPrimaryValueGridLinesNone)
ActiveChart.SetElement (msoElementPrimaryCategoryAxisNone)
ActiveChart.SetElement (msoElementPrimaryValueAxisNone)
ActiveChart.SetElement (msoElementChartTitleNone)
ActiveChart.FullSeriesCollection(1).MarkerStyle = -4118
ActiveChart.FullSeriesCollection(1).MarkerSize = 2
Range("A1").Select
End Sub
</code></pre>
<br />
La segunda y tercera macro son prácticamente iguales, únicamente cambia la forma en la que elegimos el radio. En la segunda macro se hace según una distribución de probabilidad uniforme entre cero y uno. En la tercera macro lo que pretendemos es que los puntos del gráfico se distribuyan de forma uniforme por el área de la circunferencia por lo que hemos tenido que modificar la distribución de probabilidad introduciendo la raiz cuadrada de una uniforme entre cero y uno.
<br />
<br />
Puede ver un desarrollo parecido en otro lenguaje de programación en el siguiente enlace.<br />
<br />
<a href="https://altocodigo.blogspot.com.es/2018/04/canvas-en-html5cssjs-creando-puntitos.html">Canvas en HTML5+CSS+JS creando puntitos aleatorios</a><br />
<br />
En él se emplea HTML5+CSS+JavaScript.Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com0tag:blogger.com,1999:blog-8263944010888306433.post-73460731991563369682018-03-30T14:46:00.002+02:002018-03-30T14:46:41.232+02:00Regresión MúltiplePuede descargar el archivo <a href="https://www.dropbox.com/s/vgfwsw485j0ki06/regresionMultiple.xlsx?dl=1">regresionMultiple.xlsx</a><span class="letrag"></span><br />
<div>
<br /></div>
<div>
En una ciudad establecen un impuesto sobre la propiedad de las casas en función del año de construcción de la vivienda, la superficie, el número de ventanas que tiene y la anchura de la calzada de su calle. Determinar la ecuación lineal que relaciona las cuatro variables independientes <i>x<sub>1</sub></i>, <i>x<sub>2</sub></i>, <i>x<sub>3</sub></i> y <i>x<sub>4</sub></i> con al variable dependiente <i>y</i>.</div>
<div>
<br /></div>
<div>
El año de construcción influye de forma negativa, esto supone que pagan más impuesto las viviendas más recientes. El resto de variables tienen una influencia positiva. Esto supone que el coeficiente del año<i> m<sub>1</sub></i> será negativo y los coeficientes <i>m<sub>2</sub></i>, <i>m<sub>3</sub></i> y <i>m<sub>4</sub></i> serán positivos.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAgL7te0yBuvuQi8LjagUEaQ0Ojxeea1HkdmHTh9UhYqKvr3TGgUk1_PyHbE7NPgSE2EduxcS-WSfna7WqNmuXEm8JKkOtxIEv8uNnlcOfqSmXvsbpy-oxTPHWygyEcZcUbuti4bCmG4Jf/s1600/SNAG-0076.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="66" data-original-width="528" height="40" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAgL7te0yBuvuQi8LjagUEaQ0Ojxeea1HkdmHTh9UhYqKvr3TGgUk1_PyHbE7NPgSE2EduxcS-WSfna7WqNmuXEm8JKkOtxIEv8uNnlcOfqSmXvsbpy-oxTPHWygyEcZcUbuti4bCmG4Jf/s320/SNAG-0076.png" width="320" /></a></div>
<div>
<br />
Siendo <i>b</i> el término independiente.<br />
<br />
La columna B contiene el valor conocido de la variable dependiente <i>y</i>. Las columnas C, D, E y F contienen los valores conocidos de las cuatro variables independientes <i>x</i>. En la columna G calculamos el valor teórico de la variable <i>y</i> usando la siguiente expresión.<br />
<br />
<pre>=SUMAPRODUCTO(C6:F6;$J$14:$M$14)+$N$14</pre>
<br />
Los coeficientes <i>m<sub>1</sub></i>, <i>m<sub>2</sub></i>, <i>m<sub>3</sub></i>, <i>m<sub>4</sub></i> y <i>b</i> se obtienen usando la función matricial ESTIMACION.LINEAL.<br />
<br />
<pre>=ESTIMACION.LINEAL(B6:B105;C6:F105;1;1)</pre>
<br />
Para saber más sobre esta función puede consultar un post de este blog titulado:<br />
<br />
<a href="http://www.excelavanzado.com/2018/03/regresion-polinomica.html">Regresión polinómica</a><br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR9nhlF8qc55PS7LxMWx9v_cWfRwlyvf0e_CCgvsUehFexQBuZb1ff07nTcA1cqWSOhI5Uxk99eE53E2D0yYlCxqmOt3xowjWKxzNG3yJRNt6bw2Jpf444HI_dbqzbbWdbdWvi770GN0m4/s1600/SNAG-0077.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="296" data-original-width="545" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR9nhlF8qc55PS7LxMWx9v_cWfRwlyvf0e_CCgvsUehFexQBuZb1ff07nTcA1cqWSOhI5Uxk99eE53E2D0yYlCxqmOt3xowjWKxzNG3yJRNt6bw2Jpf444HI_dbqzbbWdbdWvi770GN0m4/s1600/SNAG-0077.png" /></a></div>
<br />
<br />
La función ESTIMACION.LINEAL nos da los valores ajustados de los coeficientes en orden inverso al necesario. Nos da <i>m<sub>4</sub></i>, <i>m<sub>3</sub></i>, <i>m<sub>2</sub></i>, <i>m<sub>1</sub></i> cuando nosotros necesitamos el orden <i>m<sub>1</sub></i>, <i>m<sub>2</sub></i>, <i>m<sub>3</sub></i>, <i>m<sub>4</sub></i>. Esto supone que hemos tenido que invertir el orden en el rango J14:M14 usando la fórmula matricial siguiente.<br />
<br />
<pre>=INDICE(J7:M7;COLUMNA(M7)-COLUMNA(J7:M7)+1)</pre>
<br />
El motivo por el que hemos cambiado el orden es para poder usar la función SUMAPRODUCTO en la celda G6.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNFXZMmE6BYRF862wTgESOCxMT-boi1kyZONGTHh_xS4GMqKUmJbD2qj1KCQ-4Jhazgbm8YWgKMIjtGCd6x0WgsAduN96SvrQ8qWXhFrgBvPhTOdWM3RxoeJhDw37Bm34stql895ZV08O7/s1600/SNAG-0078.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="274" data-original-width="529" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNFXZMmE6BYRF862wTgESOCxMT-boi1kyZONGTHh_xS4GMqKUmJbD2qj1KCQ-4Jhazgbm8YWgKMIjtGCd6x0WgsAduN96SvrQ8qWXhFrgBvPhTOdWM3RxoeJhDw37Bm34stql895ZV08O7/s1600/SNAG-0078.png" /></a></div>
<br />
En la celda J9, de color rosa, tenemos el coeficiente de determinación r<sup>2</sup>.</div>
Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com2tag:blogger.com,1999:blog-8263944010888306433.post-66587050408927421682018-03-29T22:05:00.000+02:002018-03-29T22:16:23.605+02:00Regresión polinómicaPuede descargar el archivo <a href="https://www.dropbox.com/s/v4rstq7u8100sns/regresionPolinomica.xlsx?dl=1">regresionPolinomica.xlsx</a><br />
<br />
Podemos ajustar una nube de puntos mediante una recta, ésta sería la típica regresión lineal y=a+bx. También podemos ajustar esa misma nube de puntos mediante un polinomio de grado dos, una parábola y=ax<sup>2</sup>+bx+c. Podemos ir subiendo el grado del polinomio a grado tres, o cuatro, o aún mayor para ver si el ajuste mejora.<span class="letrag"></span><br />
<div>
<br /></div>
<div>
En Excel disponemos de la función <b>ESTIMACION.LINEAL</b> que nos permite obtener los coeficientes de estos polinomios y el coeficiente de determinación R<sup>2</sup>, así como otras magnitudes estadísticas de errores y desviaciones propias del ajuste realizado. El coeficiente de correlación R es la raíz cuadrada de R<sup>2</sup>. El signo del coeficiente de correlación R nos indica si la recta es creciente (signo positivo) o es decreciente (signo negativo).<br />
<br />
Disponemos de una nube de puntos formada por dos variables X e Y. La variable X es la variable independiente y la variable Y es la variable dependiente, que depende de X.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOtgBfwpsdkC0ui3jQHqPcwGCSRtSOec59rDE-4gDlaGRGvT-EwFumVV54AJz3TQTM3TwjZnQnjMv703BYIUO4qolYKmu1Mq0S4kR6QHLBk67ue3nnLDKkNxiW_Ie6iQLf9yGaeEzba5tq/s1600/SNAG-0054.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="221" data-original-width="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOtgBfwpsdkC0ui3jQHqPcwGCSRtSOec59rDE-4gDlaGRGvT-EwFumVV54AJz3TQTM3TwjZnQnjMv703BYIUO4qolYKmu1Mq0S4kR6QHLBk67ue3nnLDKkNxiW_Ie6iQLf9yGaeEzba5tq/s1600/SNAG-0054.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Para hacer más didáctica la explicación de la regresión polinómica hemos elegido unos valores que se ajustan perfectamente a un polinomio de grado 3. Concretamente se trata del polinomio siguiente.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<code>
y=2x<sup>3</sup>-7x<sup>2</sup>+9x+2</code></div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Pero esto no lo sabemos aún, y lo que pretendemos es ir probando grados 1, 2, 3, 4 hasta comprobar que el polinomio de grado 3 es el mejor.</div>
<br />
<h3>
<span style="color: orange;">Polinomio de grado 1. Línea recta</span></h3>
Excel nos permite construir un gráfico de tipo dispersión (XY) donde se representan las cinco parejas de puntos correspondientes a la nube de puntos. Sobre este gráfico podemos pedir, pulsando con el botón derecho del ratón, la opción 'Agregar línea de tendencia'.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikdhqzvKSTpp3fhcB7UNbF9ZFIayaNg5woi7TFgzzYH7oOL2hobPgffeZPAfye6W0sYzu4OTU96MiV8lu8AZGLf8-OVZOG22qxcXeYt5pGAHwCtv8VqTf1VoNLvLYIFiJuEh1Hpy1wRHpg/s1600/SNAG-0055.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="406" data-original-width="595" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikdhqzvKSTpp3fhcB7UNbF9ZFIayaNg5woi7TFgzzYH7oOL2hobPgffeZPAfye6W0sYzu4OTU96MiV8lu8AZGLf8-OVZOG22qxcXeYt5pGAHwCtv8VqTf1VoNLvLYIFiJuEh1Hpy1wRHpg/s400/SNAG-0055.png" width="400" /></a></div>
<br />
Obtenemos a la derecha un menú denominado 'Formato de línea de tendencia', en el que podemos elegir que la línea de tendencia sea 'Lineal', con lo que obtendremos una línea recta.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv5lWwcvmruVL3CrU0Ik3vFPYjpVHbSVCitkKLQDGsSBsNeXnfDKmfNgUSPodW-sugfJGnb4aOkGo-_9zxlr_LogVXhTEQAZ0fsidZA6lWMRttgv8L1IvKP1thbVWYJAfcI83oXA6BvuQt/s1600/SNAG-0057.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="616" data-original-width="382" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv5lWwcvmruVL3CrU0Ik3vFPYjpVHbSVCitkKLQDGsSBsNeXnfDKmfNgUSPodW-sugfJGnb4aOkGo-_9zxlr_LogVXhTEQAZ0fsidZA6lWMRttgv8L1IvKP1thbVWYJAfcI83oXA6BvuQt/s1600/SNAG-0057.png" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
En nuestro gráfico hemos marcado las opciones.<br />
<ul>
<li>Presentar ecuación en el gráfico</li>
<li>Representar el valor R cuadrado en el gráfico</li>
</ul>
<br />
El gráfico obtenido es el siguiente.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaXizIL1S9aDBB9Ikvbs0Tpt-L4dSBFD1UNv1-s9CumBZ9MCcJrvkiJyerFydaTZC_ShpErdbkzGH5JeaqXqGbfTo5RxuJPNidehsOSPDU1Fj83-5I3YhQK2iQV7oVlb_B85JFubp95y5p/s1600/SNAG-0072.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="322" data-original-width="529" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaXizIL1S9aDBB9Ikvbs0Tpt-L4dSBFD1UNv1-s9CumBZ9MCcJrvkiJyerFydaTZC_ShpErdbkzGH5JeaqXqGbfTo5RxuJPNidehsOSPDU1Fj83-5I3YhQK2iQV7oVlb_B85JFubp95y5p/s1600/SNAG-0072.png" /></a></div>
<br />
La ecuación de la recta tiene la siguiente expresión funcional.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh98f-P8eQOCb28pZOwcYah8V3XpxXqKWDhixriNvBxijUSMPpMtC6fQSO1ZhAtc7DIci_CN-yjAyiUZLcQYXWPvKiJVTVKUX33lF376-YdzU2ecqADVDKdC3vYfRATmnQfOYUx8QShLPrA/s1600/SNAG-0058.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="56" data-original-width="167" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh98f-P8eQOCb28pZOwcYah8V3XpxXqKWDhixriNvBxijUSMPpMtC6fQSO1ZhAtc7DIci_CN-yjAyiUZLcQYXWPvKiJVTVKUX33lF376-YdzU2ecqADVDKdC3vYfRATmnQfOYUx8QShLPrA/s1600/SNAG-0058.png" /></a></div>
<code>
y=11,8x-5,6</code><br />
<br />
Donde<br />
<ul>
<li><i>a</i> es el término independiente, es el punto de corte con el eje vertical (eje de ordenadas)</li>
<li><i>b</i> es la pendiente de la recta, es la tangente del ángulo que forma la recta con el eje horizontal (eje de ordenadas). Si es positiva la recta es creciente, si es negativa la recta es decreciente y si es cero la recta es horizontal.</li>
</ul>
<br />
En Excel podemos calcular <i>a</i> y <i>b</i> mediante las siguientes funciones, así como <i>r</i> que es coeficiente de correlación y su cuadrado que es el coeficiente de determinación.<br />
<ul>
<li>INTERSECCION.EJE(Conocido_y; Conocido_x) → permite calcular <i>a</i></li>
<li>PENDIENTE(Conocido_y; Conocido_x) → permite calcular <i>b</i></li>
<li>COEF.DE.CORREL(matriz1; matriz2) → permite calcular <i>r</i></li>
<li>COEFICIENTE.R2(Conocido_y; Conocido_x) → permite calcular <i>r<sup>2</sup></i></li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCxNeE56FdznEVxbeHlh0mlDPdO5cVaohVrgy9TZjw4r-Gx43lVKFyZcBJscs6KJKYNwg9KboGTVMBWOwpxNvtZxumDB44XYC9fAwwuYX_AV-ZEFQtMClJ1JnozpVRtXilgJnhB1MyOwTr/s1600/SNAG-0059.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="168" data-original-width="207" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCxNeE56FdznEVxbeHlh0mlDPdO5cVaohVrgy9TZjw4r-Gx43lVKFyZcBJscs6KJKYNwg9KboGTVMBWOwpxNvtZxumDB44XYC9fAwwuYX_AV-ZEFQtMClJ1JnozpVRtXilgJnhB1MyOwTr/s1600/SNAG-0059.png" /></a></div>
<br />
<br />
<h4>
<span style="color: purple;">Cálculo de los coeficientes del polinomio</span></h4>
La función <a href="https://support.office.com/es-es/article/estimacion-lineal-funci%C3%B3n-estimacion-lineal-84d7d0d9-6e50-4101-977a-fa7abf772b6d">ESTIMACION.LINEAL</a> es una función matricial. Recordemos los tres pasos necesarios para utilizar una función matricial.<br />
<br />
<ol>
<li>Seleccionamos las celdas donde la función matricial dejará sus resultados</li>
<li>Escribimos la función matricial con sus argumentos</li>
<li>Validamos pulsando simultáneamente tres teclas: CONTROL+SHIFT+ENTER</li>
</ol>
<div>
La sintaxis de función es la siguiente.</div>
<div>
<br /></div>
<div>
<pre>=ESTIMACION.LINEAL(conocido_y, [conocido_x], [constante], [estadística])</pre>
</div>
<div>
<br /></div>
<div>
En nuestro caso hemos escrito la siguiente función en la Hoja1.<br />
<br />
<pre>=ESTIMACION.LINEAL(C5:C9;B5:B9;;1)</pre>
<br />
<br />
Hemos indicado el rango de la variable <i>y</i>, el rango de la variable <i>x.</i> Luego hemos dejado vacío el lugar correspondiente a la 'constante' lo que indica que no deseamos que se fuerce la intersección entre los ejes. Esto supone que no deseamos forzar para que la función pase por el punto (0,0). Finalmente hemos puesto un 1 o VERDADERO en 'estadística' porque deseamos que se muestren ciertos valores estadísticos de los que nos interesa especialmente el coeficiente de determinación, que aparece en color rosa, en la 3ª fila, 1ª columna de la tabla de resultados.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjjbqN5XTJCnsNbHcyPW95rhsWPVerSrAKsQurFY_wx9mGXauBt31jGFEOrUSD6Mk0a-y8vXvE2zAXQCFYucW3i9kuG3NbWlul5hGyUMvBF3cmfEQ86QCXF5S5jsdZnPmnYPGwSGSFYkUE/s1600/SNAG-0061.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="280" data-original-width="504" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjjbqN5XTJCnsNbHcyPW95rhsWPVerSrAKsQurFY_wx9mGXauBt31jGFEOrUSD6Mk0a-y8vXvE2zAXQCFYucW3i9kuG3NbWlul5hGyUMvBF3cmfEQ86QCXF5S5jsdZnPmnYPGwSGSFYkUE/s1600/SNAG-0061.png" /></a></div>
<br /></div>
Con la función INDICE podemos extraer un valor individual de la tabla matricial. Esto se ha realizado en la celda F17 de la Hoja1.<br />
<br />
<pre>=INDICE(ESTIMACION.LINEAL(C5:C9;B5:B9;;1);3;1)</pre>
<br />
La expresión anterior extrae el valor del coeficiente de determinación <i>r<sup>2</sup></i>, celda de color rosa.<br />
<br />
<h3>
<span style="color: orange;">Polinomio de grado 2. Parábola</span></h3>
Ahora vamos a realizar una regresión polinómica de grado 2. Obtendremos una parábola de la forma:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQtN-mutlqNa7fVVwgMGeaeSGAtKhrxf6XxPKPvnaSuGTr_rIAcfMlcbYn9JrUTO_x9_UZhgBC_QtaE2XAIEExy-y-6W-HOK90QBvGP3t_HH_9HQLBxv3XsGhsk0MT8QkSQgeq3eTDJcDT/s1600/SNAG-0062.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="75" data-original-width="285" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQtN-mutlqNa7fVVwgMGeaeSGAtKhrxf6XxPKPvnaSuGTr_rIAcfMlcbYn9JrUTO_x9_UZhgBC_QtaE2XAIEExy-y-6W-HOK90QBvGP3t_HH_9HQLBxv3XsGhsk0MT8QkSQgeq3eTDJcDT/s1600/SNAG-0062.png" /></a></div>
<br />
La ecuación resulta ser la siguiente.<br />
<br />
<code>
y=5x<sup>2</sup>-8,2x+4,4</code>
<br />
<br />
Podemos ver el gráfico obtenido pidiendo una línea de tendencia polinómica de grado 2.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRQIYID_VHAJTfgkSx32-IDPa8wa8ABVhEQtF-nE-8WU6J3UBKzn_TRnIi8KWslQftBWoQoObSGyfotRu04ZNRH8ydi9z9HXYSKbOEV2m4ZCpBow89WXD4tAiXj5MXa-I3n9T8CwenpW-t/s1600/SNAG-0064.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="333" data-original-width="553" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRQIYID_VHAJTfgkSx32-IDPa8wa8ABVhEQtF-nE-8WU6J3UBKzn_TRnIi8KWslQftBWoQoObSGyfotRu04ZNRH8ydi9z9HXYSKbOEV2m4ZCpBow89WXD4tAiXj5MXa-I3n9T8CwenpW-t/s1600/SNAG-0064.png" /></a></div>
<br />
Para obtener los coeficientes del polinomio y demás magnitudes estadística utilizamos la función matricial siguiente.<br />
<br />
<code>=ESTIMACION.LINEAL(C5:C9;B5:B9^{1\2};;1)</code>
<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
El primer argumento es el rango C5:C9 correspondiente a los valores conocidos de la variable y.</div>
<div class="separator" style="clear: both; text-align: left;">
El segundo argumento es el ranto B5:B9 correspondiente a los valores conocidos de la variable x. Este rango se debe elevar a un vector, que va entre llaves {} donde aparecen dos elementos 1 y 2 separados por una barra inclinada \. Esto indica que en el polinomio existe un coeficiente (b) que acompaña a la variable x elevada a la 1, y otro coeficiente (a) que acompaña a la variable x elevada a 2.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHLP31g8OIgXj1gH8sOdeuGS8SQ2aMMgS83q9GDAqu1ULACqN6YPbOHYiubmVhQ96PfFeiRRaz8sMLm7AL_53iPMu-jpYyH1ck27JHCzqPxceqzAtligAOso-0z04RmSHK5dPP73uYBPD5/s1600/SNAG-0065.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="261" data-original-width="536" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHLP31g8OIgXj1gH8sOdeuGS8SQ2aMMgS83q9GDAqu1ULACqN6YPbOHYiubmVhQ96PfFeiRRaz8sMLm7AL_53iPMu-jpYyH1ck27JHCzqPxceqzAtligAOso-0z04RmSHK5dPP73uYBPD5/s1600/SNAG-0065.png" /></a></div>
<br />
<h4 style="clear: both;">
<span style="color: purple;">Nota</span></h4>
<div class="separator" style="clear: both;">
En algunas versiones de Excel o según el idioma configurado, el separador de los elementos del vector no será la barra inclinada para ese lado (\), sino la contraria (/), o incluso el puno y coma (;) o la coma (,).</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
También funciona, en nuestro caso, poner la fórmula con la siguiente expresión.</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
<code>=ESTIMACION.LINEAL(C5:C9;B5:B9^TRANSPONER({1;2});;1)</code></div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
Recuerde que cuando se trabaja con vectores es importante manejar los vectores correctamente según sean de fila o columna. Este es el motivo por el que hemos usado <code>TRANSPONER</code> y hemos separado los elementos 1 y 2 con punto y coma.</div>
<div class="separator" style="clear: both;">
<br /></div>
<h3>
<span style="color: orange;">Polinomio de grado 3</span></h3>
Efectuamos una regresión polinómica de grado 3 con la siguiente estructura.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvIs-_OiTjote-RQjFPMm1UaqJ73RsW8yfP7L3YVU1kcR9FKUyuUoP-27cn2UUdv70veSrRIjQ8-ijVu1-XXkUB5eP6jOLBSZm8sCjyvmUhtZtfAXrRuZKq6JzgoKddSdhg0chSZAxAoAJ/s1600/SNAG-0070.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="72" data-original-width="413" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvIs-_OiTjote-RQjFPMm1UaqJ73RsW8yfP7L3YVU1kcR9FKUyuUoP-27cn2UUdv70veSrRIjQ8-ijVu1-XXkUB5eP6jOLBSZm8sCjyvmUhtZtfAXrRuZKq6JzgoKddSdhg0chSZAxAoAJ/s1600/SNAG-0070.png" /></a></div>
<br />
La ecuación resulta ser la siguiente.<br />
<br />
<code>y=2x<sup>3</sup>-7x<sup>2</sup>+9x+2</code><br />
<br />
Podemos ver el gráfico obtenido pidiendo una línea de tendencia polinómica de grado 3.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2ORoULy0IamUz2v7-JOG7001qhmz1qjCNdwgLL6MayKdOyUU1XNU4s71Rn-vOUsB0KBwG4fxiVQpjN0eUmzbfYQGxLx_1jz6SS9dFTcuzweLrQAaMPPey_FJBmQxVuwR0GNMPy1hGdc1q/s1600/SNAG-0066.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="319" data-original-width="529" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2ORoULy0IamUz2v7-JOG7001qhmz1qjCNdwgLL6MayKdOyUU1XNU4s71Rn-vOUsB0KBwG4fxiVQpjN0eUmzbfYQGxLx_1jz6SS9dFTcuzweLrQAaMPPey_FJBmQxVuwR0GNMPy1hGdc1q/s1600/SNAG-0066.png" /></a></div>
<br />
Hemos utilizado la función matricial siguiente.<br />
<br />
<code>=ESTIMACION.LINEAL(C5:C9;B5:B9^{1\2\3};;1)</code>
<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
Poniendo <code>{1\2\3}</code> estamos pidiendo que calcule los coeficientes de grado 1, 2 y 3.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQsrCTTulUeMekVrrtxJ-MaTi6LhXQnMG6p1sIEwS95xfrUJTrkx2g6Cz_MK6XLcwpZgGFfpvkVqe6vaR2SoZh6SAea5JTfMny2yMc5fcR2iMfoPhg8iVMYahrezY0dlH_V6zrDMsQj5nJ/s1600/SNAG-0068.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="257" data-original-width="545" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQsrCTTulUeMekVrrtxJ-MaTi6LhXQnMG6p1sIEwS95xfrUJTrkx2g6Cz_MK6XLcwpZgGFfpvkVqe6vaR2SoZh6SAea5JTfMny2yMc5fcR2iMfoPhg8iVMYahrezY0dlH_V6zrDMsQj5nJ/s1600/SNAG-0068.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Podríamos no haber puesto alguno de los elementos del vector <code>{1\2\3}</code>, y en ese caso se ajustaría un polinomio donde el coeficiente que no aparece se fuerza a que sea cero. Por ejemplo, podemos probar con la siguiente expresión donde falta el elemento que lleva la variable <i>x</i> elevada a 2.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<code>=ESTIMACION.LINEAL(C5:C9;B5:B9^{1\3};;1)</code></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
En este caso obtendríamos el siguiente polinomio que no tiene término en <i>x<sup>2</sup></i>.<br />
<br />
<code>y=0,865740741x<sup>3</sup>-1,532407407x+3,75</code><br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h3>
<span style="color: orange;">Polinomio de grado 4</span></h3>
Efectuamos una regresión polinómica de grado 4 con la siguiente estructura.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDSYENlyBJQAllbgbk_YCGjoglRGH2t5UWrLy0NaYBM7_f7r666ngKBP7v0WLHpi9EAU094c_yB1ZP0bY2cec7tfXUgAE-Un_6pMNKkHnhrpbE-AAgFX5_nxft06Yr6u1DPRAlHHxg6Ti4/s1600/SNAG-0071.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="70" data-original-width="519" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDSYENlyBJQAllbgbk_YCGjoglRGH2t5UWrLy0NaYBM7_f7r666ngKBP7v0WLHpi9EAU094c_yB1ZP0bY2cec7tfXUgAE-Un_6pMNKkHnhrpbE-AAgFX5_nxft06Yr6u1DPRAlHHxg6Ti4/s1600/SNAG-0071.png" /></a></div>
<br />
La ecuación resulta ser la siguiente.<br />
<br />
<code>y=2,87531·10<sup>-15</sup>x<sup>4</sup>+2x<sup>3</sup>-7x<sup>2</sup>+9x+2</code><br />
<br />
Podemos ver el gráfico obtenido pidiendo una línea de tendencia polinómica de grado 4.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE3KEzLibG1bLm0-th47xxyg0TPwsK6h6uDnii2KZQzqNcV0IJVyjNq2fgKVeIz-5G_5EjCk8D7u15jkpr5krWV1zmJgNKRUGWY_XWvSVmXQV8Q0S7dlbwdK1yuLKq_f-IOJvAXVopQLIr/s1600/SNAG-0067.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="319" data-original-width="529" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE3KEzLibG1bLm0-th47xxyg0TPwsK6h6uDnii2KZQzqNcV0IJVyjNq2fgKVeIz-5G_5EjCk8D7u15jkpr5krWV1zmJgNKRUGWY_XWvSVmXQV8Q0S7dlbwdK1yuLKq_f-IOJvAXVopQLIr/s1600/SNAG-0067.png" /></a></div>
<br />
<h3>
</h3>
Hemos utilizado la función matricial siguiente.<br />
<br />
<code>=ESTIMACION.LINEAL(C5:C9;B5:B9^{1\2\3\4};;1)</code><br />
<br />
<div class="separator" style="clear: both;">
Poniendo <code>{1\2\3\4}</code> estamos pidiendo que calcule los coeficientes de grado 1, 2, 3 y 4.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcI566ymcIByH7Rexi1evCpGtnbiSDpxmw540lAAnUyih9yE0QIEFxdIElKitMdicRDjUzLHVKY6bXloL5SEaA-BG4GRbggqYlJ6HEn-rp-fdm5UOeaOaUU0XgsddJ6xjLJA6CKK9ppd5d/s1600/SNAG-0069.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="235" data-original-width="558" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcI566ymcIByH7Rexi1evCpGtnbiSDpxmw540lAAnUyih9yE0QIEFxdIElKitMdicRDjUzLHVKY6bXloL5SEaA-BG4GRbggqYlJ6HEn-rp-fdm5UOeaOaUU0XgsddJ6xjLJA6CKK9ppd5d/s1600/SNAG-0069.png" /></a></div>
<br />
<br />
<h3>
<span style="color: orange;">Nuestro caso es especial</span></h3>
Observe que el coeficiente de <i>x<sup>4</sup></i> es prácticamente cero. Con la función ESTIMACION.LINEAL obtenemos <code>2,87531·10<sup>-15</sup></code> y en el ajuste gráfico obtenemos <code>-7·10<sup>-13</sup></code>. Ambos valores son muy cercanos a cero. Esto indica que no hemos ganado nada pasando de un polinomio de grado 3 a un polinomio de grado 4.<br />
<br />
Con el polinomio de grado 3 ya obtuvimos un coeficiente de determinación <i>r<sup>2</sup></i> igual a 1, que supone correlación perfecta. Este es el motivo de que al aumentar el grado del polinomio no ganemos nada, puesto que ya con el polinomio de grado 3 teníamos perfectamente explicada la nube de puntos. Todos los puntos conocidos, los pares (x,y) caen perfectamente en el polinomio de grado 3, por lo que no es necesario aumentar el grado del polinomio.<br />
<br />
El caso que hemos planteado es muy especial ya que justamente hemos obtenido los pares (x,y) de la nube de puntos usando previamente el polinomio de grado 3.<br />
<br />
<span style="font-family: monospace;">y=2x</span><sup style="font-family: monospace;">3</sup><span style="font-family: monospace;">-7x</span><sup style="font-family: monospace;">2</sup><span style="font-family: monospace;">+9x+2</span><br />
<br />
En un caso donde los datos sean más realistas será complicado llegar justo a un coeficiente de correlación igual a 1. Lo que observaremos, en general, es que aumentando el grado del polinomio se mejora el ajuste, pero aquí debemos llegar a un grado de compromiso, ya que en ocasiones pasar de grado 7 a grado 8, por ejemplo, no mejorará de forma apreciable la bondad del ajuste, no mejorando gran cosa el coeficiente de correlación. Por tanto, hemos de decidir con qué grado nos queremos quedar. Normalmente esto se dilucida aplicando un poco de sentido común, simplemente respondiendo a la siguiente cuestión ¿realmente al aumentar un grado más mejora significativamente el ajuste?Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com24tag:blogger.com,1999:blog-8263944010888306433.post-5628247439117401512018-02-21T20:28:00.001+01:002022-06-14T16:30:57.227+02:00Sucesión de Fibonacci en ExcelPuede descargar el archivo <a href="https://www.dropbox.com/s/tgv50kx1db572l6/fibonacci.xlsm?dl=1">fibonacci.xlsm</a><br />
<br />
Las <a href="https://es.wikipedia.org/wiki/Sucesi%C3%B3n_de_Fibonacci">sucesión de Fibonacci</a> es bastante famosa. Los dos primeros valores son cero y uno, y los restantes se forman sumando los dos anteriores.<span class="letrag"></span><br />
<div>
<br /></div>
<div>
Estos son los números de Fibonacci.</div>
<div>
<br /></div>
<div>
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ... ... ... </div>
<div>
<br /></div>
<div>
Vamos a crear una hoja de cálculo en la que vamos a calcular la serie de tres formas diferentes.</div>
<div>
<ol>
<li>Mediante fórmulas de Excel</li>
<li>Mediante VBA, con la Macro 1</li>
<li>Mediante VBA, con la Macro 2</li>
</ol>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz9vHsZRwWdg6OT4jkvydWn147Dnkxp6d7gHi-YX5T-jJKopmYknOr2w9pCAGegw6o9tlBpNCAR8-TLxQuWURgD_VC93tuL82E3qE9xZCsy3syPxwbW0lJJouA0ZBEpfRbvzoEemVor1g8/s1600/SNAG-0914.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="807" data-original-width="598" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz9vHsZRwWdg6OT4jkvydWn147Dnkxp6d7gHi-YX5T-jJKopmYknOr2w9pCAGegw6o9tlBpNCAR8-TLxQuWURgD_VC93tuL82E3qE9xZCsy3syPxwbW0lJJouA0ZBEpfRbvzoEemVor1g8/s400/SNAG-0914.png" width="296" /></a></div>
<div>
<br /></div>
</div>
<div>
Veamos las macros.</div>
<div>
<br /></div>
<div>
<br /></div>
<pre style="background: rgb(240, 240, 240) none repeat scroll 0% 0%; border: 1px dashed rgb(204, 204, 204); color: black; font-family: "arial"; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"> Sub Borra()
Range("D5:E34").ClearContents
End Sub
Sub fibonacci1()
[D5] = 0
[D6] = 1
For i = 3 To 30
Cells(i + 4, 4) = Cells(i + 3, 4) + Cells(i + 2, 4)
Next i
End Sub
Sub fibonacci2()
Dim A(30) As Long
A(1) = 0: [E5] = 0
A(2) = 1: [E6] = 1
For i = 3 To 30
A(i) = A(i - 1) + A(i - 2)
Range("E" & i + 4) = A(i)
Next i
End Sub
</code></pre>
<br />
<br />
<ol>
<li>En la Macro 1 denominada fibonacci1 trabajamos con cells.</li>
<li>En la Macro 2 denominanda fibonacci2 trabajamos con una array, con la matriz A.</li>
</ol>
Adolfo Apariciohttp://www.blogger.com/profile/18373309889444674587noreply@blogger.com0