domingo, 11 de mayo de 2008

Arrays

Arrays
Mediante un array podemos refererirnos a una "serie de elementos" por un "mismo nombre" y referenciara un elemento de la serie por un numero de indice.

ArraySuperClubes(1)="Real Madrid"
ArraySuperClubes(2)="Barcelona"
ArraySuperClubes(3)="Milan"
ArraySuperClubes(4)="Inter de Milan"
ArraySuperClubes(5)="Manchester United"

En este ejemplo lo comprobaremos con mayor claridad

1) Nos referimos a una serie de elementos por un mismo nombre en este caso sera ArraySuperClubes.

Por ejemplo bastaria algo como la sgte instruccion para cargar los elementos de nuestro array en un control listbox1

ArraySuperClubes representa a los 5 elementos de nuestro array

listbox1.list=ArraySuperClubes

2) Referenciamos a un elemento de la serie por un numero de indice.

Por ejemplo

Si quisieramos referenciar al elemento "3" de nuestro ArraySuperClubes()

Msgbox ArraySuperClubes(3)

nota:Al igual que con la declaración de variables debemos tener en cuenta

Arrays de variables (estático)
Significa que nuestro array tendra un numero fijo de elementos

Aqui es importante tener en cuenta el ambito de declaración del array tal y como
se hace con las variables de manera cotidiana.

-Es decir a nivel de procedimiento , modulo o pubico (disponible para todo el proyecto)

Ejemplos:

Dim Array_Spain(20) as string

'se declaro un array de 21 elementos que van desde el indice cero..

Array_Spain(0),
Array_Spain(1),
Array_Spain(21)

Dim ArrayBidimensionalXy(1 to 4,1 to 4)as integer

'se declaro array de 2 dimensiones

ArrayBidimensional, con 4*4 elementos ArrayBidimensional(1,1)...ArrayBidimensional(4,4)

Public New_X(1 To 20) As String *20

Public New_X(1)...Public New_X(20),
cada elemento permite almacenar una cadena de (20 caracteres).

domingo, 20 de abril de 2008

For Each ..Next

La instruccion For Each..Next repite instrucciones para cada uno de los objetos de una colección
determinada.

Modificaremos un poco un ejemplo visto anteriormente sobre los colores del libro para
obtener el mismo resultado.
Pero esta vez haremos referencia a colecciones de objetos.

Sub obtener_los_56_colores()

'aqui es conocido que El Excel maneja una paleta de 56 colores
'entonces sabemos tambien que es necesario repetir cierta seccion del codigo


Dim rango_a_pintar As Range
Dim celda As Range
Dim a As Byte

Set rango_a_pintar = Range("A1:A56") 'asignamos el rango que necesitamos


For Each celda In rango_a_pintar 'repetir en cada uno de los elementos de la coleccion

a = a + 1

celda.Interior.ColorIndex = a 'asignar colores del libro a respectiva celda

Next celda

End Sub

Estructuras de Repeticion (Bucles For ..Next )

Las estructuras For...Next las emplearemos en los casos cuando s conocemos el numero de veces que es necesario repetir la ejecuion de determinadas instrucciones

Sub obtener_los_56_colores()

'aqui es conocido que Excel maneja una paleta de 56 colores
'entonces sabemos tambien que es necesario repetir cierta seccion del codigo

Dim a As Byte

Range("A1:A56").Select

For a = 1 To 56 'repetir 56 veces

Selection.Cells(a).Interior.color = ActiveWorkbook.Colors(a)

'asignar colores del libro a la respectiva celda

Next a

End Sub

Estructuras de Repetición

Las estructuras de repeticion son usadas para ejecutar una o mas instrucciones repetidas veces

Do...Loop
---------
Nos permitira ejecutar un bloque de instrucciones durante un numero indefinido de veces
*Pero mientras una condición sea (TRUE)Verdadera o hasta que llegue hacer verdadera.

El sgte es un ejemplo de una macro que comprueba la condicion sea true al inicio para poder continuar con las repeticiones

'primero ingresa valores en una columna ...por ejemplo de A1 a A5
'ahora colocate sobre la celda A1

Sub EJEMPLO_DO_LOOP() 'verificar condicion al inicio

'esta macro suma el valor de la variable "I"
'al valor de cada celda
'la palabra clave While verifica la condicion sea verdadera'
y continua entonces la ejecucion del bucle

Dim I As Integer

Do While Not IsEmpty(Selection) 'las repeticiones continuran siempre y cuando la seleccion "no 'sea vacio

I = I + 100

If IsNumeric(Selection) Then Selection.Value = Selection.Value + I

Selection.Offset(1, 0).Select

Loop

End Sub


Sub EJEMPLO_DO_LOOP1() 'verificar al final

'esta macro suma el valor de la variable "I" al valor de cada celda
'la palabra clave While verifica la condicion sea verdadera pero al final es decir
'despues de haber ejecutado la menos una vez el bucle

Dim I As Integer

Do

I = I + 100

If IsNumeric(Selection) Then Selection.Value = Selection.Value + I

Selection.Offset(1, 0).Select

Loop While Not IsEmpty(Selection) 'las repeticiones continuran siempre y cuando la seleccion
'no sea vacio

End Sub

jueves, 20 de marzo de 2008

Select Case

Tenemos la posibilidad de emplear alternativamente la instrucciones SELECT CASE por los bloques "IF...THEN..ENDIF" .


Sub cases()

Dim ventas As Integer
Dim totales As Integer

ventas = 50

Select Case ventas 'casos para ventas

Case Is = 30 'si es 30

totales = 30 * 12 'calcular

Case Is = 40 'si es 40

totales = 40 * 13 'calcular

Case Is = 50 'si es 50

totales = 50 * 14 'calcular

Case Else 'caso contrario

totales = 60 * 25 'calcular

End Select


MsgBox totales 'mostrar totales


End Sub

Estructuras de Control ( [ IF..End if] - [ Select case..End Select]

Vba nos permite emplear varias estructuras de control y asi podemos escribir codigo que tome decisiones y repita algunas acciones

IF..Then:
La emplearemos para ejecutar instrucciones dependiendo del valor de una condición.

Sintaxis de una sola linea(ejecuta una instruccion si la condicion es true
---------------------------------------------------------------------------------
'si la celda activa es 500 ..entonces la celda activa sera ahora ..500+100

if activecell.value=500 then activecell.value=500+100

Sintaxis de varias lineas(ejecutara varias instrucciones si la condicion es
-----------------------------------------------------------------------------------
true)
------

Sub test()

If ActiveCell.Value = 600 Then

MsgBox "la celda tiene el valor de 600" 'instruccion1

ActiveCell.Interior.ColorIndex = 3 'instruccion 2

End If

End Sub


IF ..Then..Else
-----------------
Esta estructura Ejecutara determinadas instrucciones si la condicion es TRUE
y otras si la condicion es FALSE

*Ejemplo para 2 posibilidades

IF activecell.value=600 then 'si es 600 then

activecell.value=700 'cambiar por 700

Else 'caso contrario

activecell.value=0 'cambiar por cero

End if

*Ejemplo para varias posibilidades

Sub variosIF()

If ActiveCell.Value = 800 Then 'condicion1

MsgBox "la celda tiene 800 como valor"
ActiveCell.Interior.ColorIndex = 4

ElseIf ActiveCell.Value = 900 Then 'condicion2
MsgBox "la celda tiene 900 como valor"
ActiveCell.Interior.ColorIndex = 5

ElseIf ActiveCell.Value = 910 Then 'condicion3

MsgBox "la celda tiene 910 como valor"
ActiveCell.Interior.ColorIndex = 6

Else 'en el caso no cumpla con las codiciones anteriores

MsgBox "la celda es diferente de 800,900,910 o tal vez esta vacia"

End If

End Sub

lunes, 3 de marzo de 2008

Bug en Excel 2007

En Excel 2007 algunas operaciones, en las que el resultado debería ser
normalmente 65535 se muestra con el número 100000 como resulatdo . Esto es un problema serio y podría afectar a todos los cálculos posteriores que se hagan con ese valor.

Excel 2007

Excel 2003


Pero ya tendria solucion
------------------------------
Solo visiten este enlace y decarguen el parche correspondiente:

http://blogs.msdn.com/excel/archive/2007/10/09/calculation-issue-update-fix-available.aspx