TIPOS DE DATOS EN VISUAL BASIC PARA EXCEL Tipos de datos El tipo de un dato, es el conjunto de valores que son asignados en un programa. Si se intenta dar un valor fuera del conjunto, se producirá un error. La asignación de tipos a los datos tiene dos objetivos principales: - Detectar errores en las operaciones - Determinar cómo ejecutar estas operaciones 1 Los tipos de datos simples, más básicos son: - Integer (entero), - Boolean, - String, Integer El tipo de datos Integer es un tipo simple, y dentro de estos, es ordinal. Al declarar una variable de tipo Integer, se está creando una variable numérica que puede tomar valores positivos o negativos, y sin parte decimal. Boolean (lógico) El tipo de datos Boolean es el que te permite usar variables que disponen sólo de dos posibles valores: cierto o falso. Debido a esto, su utilidad salta a la vista, y no es otra que variables de chequeo. Nos sirven para mantener el estado de un objeto mediante dos valores: - si/no - cierto/falso - funciona/no funciona - on/off , etc. String (carácter y cadena) Las cadenas de caracteres (Strings), se puede contener en una sola variable. Por ejemplo, “Casa”. Conversión de Tipos de datos Son funciones, como su nombre lo indica, que convierten datos de un tipo a otro: - de String a Integer, - de Integer a String, - de Date a String,... Ejemplo 7A El siguiente procedimiento nos pide ingresar dos números. Ingresamos los números 40 y 60. Estos se mantienen por medio de las variables en una parte de la memoria, se suman, y finalmente se guardan en la casilla A1 de la hoja activa, con el valor de 100. Option Explicit Sub Sumar() Dim Numero1 As Integer Dim Numero2 As Integer Numero1 = InputBox("Entrar el primer valor", "Entrada de datos") Numero2 = InputBox("Entrar el primer valor", "Entrada de datos") ActiveSheet.Range("A1").Value = Numero1 + Numero2 End Sub Volvamos a ejecutar el procedimiento, y cuando se pida el primer valor pongamos "Casa". Observamos que nos aparece una ventana indicando el siguiente error: Se ha producido el error 13 en tiempo de ejecución: No coinciden los tipos 2 Esto quiere decir que el procedimiento se detiene, debido a un error en el tipo de datos. La función InputBox siempre devuelve datos tipo String. El tipo de datos String es uno de los tipos más utilizados por los programadores. Como he visto, un String es una secuencia o cadena de caracteres, como por ejemplo "Casa", "Física" Cuando se ingresaron caracteres numéricos, no hubo ningún problema, ya que estos pueden asignarse a variables tipo Integer, porque Visual Basic hace automáticamente la conversión. Pero cuando entramos texto e intentamos asignarlo a una variable Integer, Visual Basic muestra un error, indicando que la variable no es adecuada para los datos que se desean guardar. Ejemplo 7B Ahora repitamos el mismo ejemplo, pero cambiemos el tipo de dato por String. Ejecutamos el procedimiento, he ingresamos los valores 40 y 60, y el resultado nos permitirá comprender mejor este tema de los tipos de datos. Option Explicit Sub Sumar() Dim Numero1 As String Dim Numero2 As String Numero1 = InputBox("Entrar el primer valor", "Entrada de datos") Numero2 = InputBox("Entrar el primer valor", "Entrada de datos") ActiveSheet.Range("A1").Value = Numero1 + Numero2 End Sub Funciones de Conversión de Tipo Las funciones de conversión de tipo, nos permiten solucionar problemas de esta clase. Val(Cadena). Convierte la cadena a un valor numérico La función Val(Dato String), convierte una cadena de caracteres a valor numérico. Si la cadena a convertir contiene algún carácter no numérico devuelve 0. Así, si al pedir un valor se teclea "Casa", la función Val, devolverá un cero. . Str(Número). Convierte el número a una expresión cadena. Las siguientes funciones tienen la forma Función(Expresión). 3 Ejemplo 7C En el siguiente ejemplo, cuando nos pida el primer valor, ingresemos: “Casa”, y luego el número: 40. Como dijimos, en este caso no dará error. La cadena de caracteres String: “Casa”, devolverá cero, que sumado a 40, nos dará como resultado: 40. Option Explicit Sub Sumar() Dim Numero1 As Integer Dim Numero2 As Integer Numero1 = Val(InputBox("Entrar el primer valor", "Entrada de datos")) Numero2 = Val(InputBox("Entrar el primer valor", "Entrada de datos")) ActiveSheet.Range("A1").Value = Numero1 + Numero2 End Sub De igual manera, si cambiamos el tipo de dato de Integer a String, también obtendremos los mismos resultados. Probemos con el procedimiento siguiente, e ingresemos “Casa” y luego 40. Option Explicit Sub Sumar() Dim Numero1 As String Dim Numero2 As String Numero1 = Val(InputBox("Entrar el primer valor", "Entrada de datos")) Numero2 = Val(InputBox("Entrar el primer valor", "Entrada de datos")) ActiveSheet.Range("A1").Value = Numero1 + Numero2 End Sub OBJETOS Y PROPIEDADES QUE SE UTILIZAN HABITUALMENTE Objeto Cells(fila, columna). Se usa como objeto range, para referenciar una casilla o rango de casillas. Es una alternativa a utilizar la referencia de la forma A1, B1, X320. Utiliza la fila y la columna que ocupa la casilla dentro de la hoja (o objeto WorkSheet). Ejemplo 8 Para poner “Casa” en la casilla A1 de la hoja activa seria: 8.1.- ActiveSheet.Cells(1,1).Value=“Casa” Utilizar Cells para referenciar un rango. Es equivalente a cuando usamos Range("Casilla_Inicial:Casilla_Final"). La forma que se obtiene utilizando Cells es un poco más larga, pero a veces resulta más funcional que utilizando únicamente Range. 8.2.- El Rango A1:B8 será equivalente a: Range(Cells(1, 1), Cells(8, 2)).Value = "Casa" Otra forma interesante de Cells es cuando lo usamos de la siguiente forma: 8.3. - Range("A5:B10").Cells(5, 2).Value = "Casa" El resultado del valor "Casa", lo pondrá en la celda B9. Analicemos en este ejemplo: Cells comienza a contar columnas y filas a partir del rango especificado en el objeto Range. 4 VARIABLES DE OBJETOS Una variable objeto sirve para hacer referencia a un objeto, esto significa que podremos acceder a las propiedades de un objeto e invocar a sus métodos a través de la variable, en lugar de hacerlo directamente a través del objeto. Posiblemente no se utilice demasiado esta clase de variables, pero hay casos en los que no hay más remedio que utilizarlas, por ejemplo en estructuras For Each ... Next como veremos, o cuando sea necesario construir funciones que devuelvan rangos, referencias a hojas, etc. Para declarar una variable objeto se utiliza también la palabra Dim de la forma siguiente: Dim Var_Objeto As Objeto Por Ejemplo: Dim R As Range Dim Hoja As WorkSheet Para asignar un objeto a una variable debe utilizar la instrucción Set. Set Variable_Objeto = Objeto Por Ejemplo Dim HName As Object Set HName = Hoja5 ******************************************** Set R= ActiveSheet.Range("A1:B10") Set Hoja = ActiveSheet Set Hoja = WorkSheets(1) Ejemplo 9 Este ejemplo nos va a enseñar a entender, como utilizar este tipo de variables. Se pide llenar el Rango de A1 a C13 con la palabra "Casa", y después poner negrita. Asignamos una variable objeto al objeto, y luego trabajamos con esa variable de la misma forma que se trabajaría directamente sobre el objeto. Option Explicit Sub obj() Dim K As Range Set K = ActiveSheet.Range("A1:C13") K.Value = "Casa" K.Font.Bold = True End Sub 5 BUSCAR OBJETIVO / GOAL SEEK (CON VBA) El Buscar Objetivo tradicional que utilizamos a través del Menú Herramientas, nos permite utilizar este utilitario, de manera individual, para cada cálculo que queramos realizar. Sin embargo, suelen presentarse casos en que debemos realizar este tipo de cálculos que nos ofrece el Buscar Objetivo de modo masivo, para un grupo de datos que podamos tener en una matriz. En estos casos, utilizamos mediante programación VBA la funcionalidad de esta herramienta. Ejemplo 10 Nuestros datos pueden tener una estructura similar a esta, a la cual le adicionamos un comando (Botón), que nos permita ejecutar la macro del Buscar Objetivo. Estructura de Fórmulas Tasa 7% Condiciones 60 días Margen Bruto (fondo verde) Costo GlsxEnv Costo Financ. Precio Margen Bruto (fondo amarillo) Es un valor fijo. No es resultado de una fórmula. Si está relacionada con la estructura de costos. Es un valor fijo. No es resultado de una fórmula. Si está relacionada con la estructura de costos. Es una columna donde tenemos nuestro margen objetivo. No está relacionada con la estructura de costos. Es un valor fijo. No es resultado de una fórmula. Si está relacionada con la estructura de costos. Es un valor fijo. No es resultado de una fórmula. Indica la cantidad de galones por unidad de envase. Si está relacionada con la estructura de costos. Es resultado de una fórmula. Fórmula de la celda E7 =C7*($A$2*$A$3/360) Es un valor fijo. No es resultado de una fórmula. Modificando el Precio, cambia el Margen Bruto. Si está relacionada con la estructura de costos. Es resultado de una fórmula. Indica el Margen Bruto por barril. 1 barril equivale a 42 galones. Fórmula de la celda G7 =((F7-(C7+E7))/D7)*42 6 Para que la Macro funcione, utilizaremos el siguiente algoritmo: Option Explicit Private Sub cmd_ejecuta_Click() Dim i As Integer i=7 While Worksheets("Example1").Range("b" & i).Value <> "" Range("g" & i).Activate ActiveCell.GoalSeek Goal:=Worksheets("Example1").Range("b" & i).Value, _ ChangingCell:=ActiveCell.Offset(0, -1).Range("A1") i=i+1 Wend Range("A7").Select End Sub Es necesario también, tomar en cuenta los siguientes puntos: 1.- La hoja de cálculo (Worksheet) tenga el nombre de: Example1 2.- Poner en la hoja de cálculo un comando (botón) que tenga el nombre de: cmd_ejecuta Interpretación/lectura del algoritmo 1.- Utilizamos Option Explicit, para forzar el uso de variables. 2.- El procedimiento indica que es una consulta privada. 3.- La consulta se inicia cuando se da Click en el comando: cmd_ejecuta 4.- Asignamos a la variable i un tipo Integer. 5.- Asignamos a la variable i el valor de 7. 6.- Se considera 7, porque los datos se encuentran en la fila 7. 7.- Utilizamos el bucle While (cuando inicia) 8.- Indicamos que el bucle operará mientras que las celdas tengan algún contenido. 9.- Cuando ponemos Range("b" & i).Value, i toma el valor de 7. 10.- Entonces el bucle está empezando en la celda B7 11.- La columna B, será nuestra referencia, que establecerá hasta que fila el bucle operará. 12.- Luego la celda G7 se activa. 13.- Indicamos que aquella celda activa será nuestra celda Gol, donde queremos el resultado esperado. 14.- También decimos que el resultado que queremos para aquella celda, se encuentra en la celda B7. 15.- Y para que este cambio se realice, calculará automáticamente el valor de la celda F7. 16.- Para definir que la celda que cambia es la F7, se utiliza ChangingCell:=ActiveCell.Offset(0, -1) 17.- ActiveCell.Offset(0,-1) parte desde el punto que el foco en la celda activa es la G7. 18.- Luego interpreta que de la celda activa no tiene movimiento vertical, por el valor 0. 19.- Y se mueve hacia la izquierda una celda, por el valor -1. 20.- Finalmente la nueva ubicación del foco es la celda F7. 21.- Que es donde cambia el valor, y consecuentemente, modifica el margen bruto esperado (celda G7). 22.- i = i + 1, indica que, mientras no encuentra celda vacía, el bucle se inicia con un valor, de 7 a 8. 23.- Se inicia nuevamente el ciclo. 24.- El ciclo finaliza con el Wend. 25.- El procedimiento pre-finaliza localizando el foco en la celda A7. 26.- Con End Sub finaliza el procedimiento. 7 8