OpenOffice Basic
Fermí Vilà
Introducción a la programación en OpenOffice.org Basic
Fermí Vilà
BA-1
OpenOffice Basic
Fermí Vilà
BA-2
1.- Nuestro primer programa El “OpenOffice Basic” es un lenguaje de programación completo (es una versión de BASIC), que nos permite crear aplicaciones visuales interactivas y completas por medio de nuestro “OpenOffice”. - Ejecuta el OpenOffice Calc - Asegúrate que el nivel de seguridad está bajo. Es decir: Menú Herramientas Opciones... OpenOffice.org: Seguridad [Seguridad de Macros...] Bajo (no recomendado) …. [Aceptar] [Aceptar] - Graba el libro de cálculo (que de momento está vacío) como Macro01 en TuCarpeta - Menú Herramientas Macros Organizar macros OpenOffice.org Basic ...
• •
Haz clic en [Editar] Acabamos de acceder al Module1 de nuestro fichero Macro01, observa la pestaña del ángulo inferior izquierdo:
Es el lugar donde escribiremos nuestros programas en OpenOffice Basic. Observa que de hecho nos encontramos en una ventana separada del Macro01.ods:
–
Borra todo lo que aparece en el Editor del Basic, exceptuando:
OpenOffice Basic
Fermí Vilà
BA-3
Todas las líneas, precedidas por “REM” representan “comentarios” para el programador. Es decir a efectos de “programa” tanto da dejar la línea como ponerla. - Escribe en el Editor del Basic, el siguiente programa:
- Clic en el icono “Guardar” y cierra la ventana correspondiente al editor de OooBasic (Mis macros y diálogos.Standard – OpenOffice.org Basic) - Vamos a ejecutar nuestro programa: • Menú Herramientas Macros Ejecutar macro ... • Clic en [+] de “Mis macros” • Clic en [+] de “Standard” de Mis macros • Clic en “Module 1” • [Ejecutar] Si todo funciona correctamente, en la celda D9 de nuestra hoja de cálculo, aparece la frase Hola Mundo Sitúate en el Editor del Basic para visualizar el programa, es decir: Menú Herramientas Macros Organizar macros OpenOffice.org Basic ... [Editar] 1º) Básicamente existen dos tipos de “programas”: procedimientos o funciones. Nuestro programa es un procedimiento porque empieza por Sub y acaba por End Sub 2º) Observa la estructura de un procedimiento (llamado también subprocedimiento): Sub NombreDelPrograma Sentencia 1 Sentencia 2 Sentencia 3 ... ... End Sub 3º) Las primeras líneas de un programa se usan normalmente para declarar los elementos que utilizaremos en el programa. Para ello, en el BASIC, se utiliza la cláusula Dim: Dim Hoj As Object Dim Cel As Object Declaramos dos objetos (nuestro BASIC, permite la POO: programación orientada a objetos), que serán, el primero una hoja de cálculo y el segundo una celda.
OpenOffice Basic
Fermí Vilà
BA-4
4º) Hoj = ThisComponent.Sheets(0) Definimos el objeto “Hoj” como nuestro documento (ThisComponent = este componente), concretamente la Hoja 1 (Sheets(0) = Hoja 1). Se empieza a contar por 0, igual que en las coordenadas que vemos a continuación. 5º) Cel = Hoj.getCellByPosition(3,8) Definimos el objeto “Cel” como la celda de la Hoja de cálculo (Hoj) de coordenadas (3,8). Coordenadas de una celda = (X , Y) 1ª coordenada: X , número de columna = x + 1 2ª coordenada: Y , número de fila = y + 1 Es decir: Número de columna = 3 + 1 = 4, por lo tanto: A, B, C, D Número de fila: 8 + 1 = 9, por lo tanto fila 9 En definitiva, se trata de la ceda : D9 6º) Cel.SetFormula(“Hola Mundo”) En el objeto Cel, construido anteriormente, escribe el texto (SetFormula), que tenemos entre comillas y paréntesis.
2.- Botones La forma de ejecutar el programa: Menú Herramientas Macros Ejecutar macro... Seleccionar el programa y [Ejecutar] es bastante laborioso; veamos otra forma de hacerlo, pero antes ... - Sitúate en el “Editor del Basic” del Macro01 y escribe (a continuación del Prog01):
- Sitúate en la Hoja 1 del Macro01.ods • Graba el libro de cálculo: clic en “Guardar” • Ejecuta el programa Prog02. Es decir: • Menú Herramientas Macros Ejecutar macro ... Selecciona el Prog02 (en Mis macros – Standard – Module 1) y [Ejecutar] Si todo funciona correctamente, en la Hoja2, celda B2 tenemos la frase Hola Mundo Si comparas nuestro programa Prog02 con el anterior, aparte de la hoja, ahora estamos en la Sheets(1). La sintaxis corresponde a la POO: el operador punto para separar los diferentes objetos hasta llegar a un último objeto, que no es más que una propiedad o un método (acción). Es decir, en nuestro caso: Objeto1.SubObjetoA.SubObjetoB.Método Objeto1 = ThisComponent (este componente, en nuestro caso un libro de cálculo) SubObjetoA = Sheets(1) (la hoja 2 del libro anterior) SubObjetoB = getCellByPosition(1,1) (la celda B2 del objeto anterior) Método = SetFormula(“Hola Mundo”) (acción = escribe en el objeto anterior, “Hola Mundo”) - Borra el “Hola Mundo” de la Hoja2 y sitúate en la Hoja1 Vamos a ejecutar nuestro Prog02, utilizando un botón ... –
Necesitamos la barra de iconos Campos de control de formulario, en caso de no estar presente Haz lo siguiente:
OpenOffice Basic
• •
Fermí Vilà
BA-5
Menú Ver Barras de Herramientas ... Clic en “Campos de control de formulario”
- Clic en el botón:
de la nueva barra.
Según la versión de OpenOffice, la imagen del botón puede ser diferente. - Marca un recuadro que abarque la celda B2 (estamos en la Hoja1) aproximadamente:
- Con el botón que acabamos de crear seleccionado, accede a su menú contextual. • Selecciona la opción: Campo de Control... • Solapa: General Propiedad Título: borra “Botón” y escribe en su lugar Prog02 • Solapa: Acontecimientos Sitúa el cursor de escritura en el campo “Botón del ratón pulsado” y clic en su [...] • • • •
[Asignar] Mis macros – Standard – Module 1 - Prog02 [Aceptar] [Aceptar]
•
Cierra la ventana Propiedades: Botón (clic en la X de su extremo superior derecho)
Haz clic en el icono “Modo Diseño”: para salir del modo diseño y volver al modo “ejecución”. Según la versión de OpenOffice, la imagen del botón puede ser diferente. Vamos a probar el botón: - Clic en [Prog02] - Si todo funciona correctamente en B2 de Hoja2, tendremos “Hola Mundo” Borra el texto anterior y vuelvelo a probar. Por último graba la hoja Macro01.ods con el mismo nombre y ciérrala
3.- Cuadros de diálogo estándard En los programas anteriores, hemos utilizado celdas de una hoja de cálculo, para escribir resultados. Aparte de los cuadros de diálogo personalizados, que veremos más adelante, podemos utilizar los llamados “Cuadros de diálogo estándar”. - Crea una hoja de cálculo nueva (Menú Archivo – Nuevo – Hoja de Cálculo) y grábala como Macro02.ods en TuCarpeta - Accede al Editor del Basic del Macro02.ods • Menú Herramientas Macros Organizar macros OpenOffice.org Basic ...
OpenOffice Basic
Fermí Vilà
BA-6
Si seleccionas: Mis macros – Standard – Module 1 verás que aparecen los programas Prog01 y Prog02. Por defecto, al crear un programa, nos colocamos automáticamente en “Mis macros” y al escribir el o los programas en el “Standard” de Mis macros, éstos serán accesibles desde cualquier documento OOo. A partir de ahora “grabaremos” nuestros programas en el documento correspondiente, es decir:
• •
•
Selecciona Standard de Macro02.ods [Nuevo] Acepta el nombre Module1
- Escribe los programas:
- Vuelve a la pantalla del Macro02.ods (Hoja1), vamos a crear un botón para ejecutar el Prog03, es decir: • Con la barra Campos de control de formulario a la vista.
•
Clic en el icono “Botón”:
• • •
Marca un recuadro que abarque a la celda B2 (un poco más grande) Accede al menú contextual del botón acabado de insertar Haz clic en la opción “Campo de Control...” Establece como propiedad Título: Prog03 (Solapa: General) Pestaña: Acontecimientos En el campo “Botón del ratón pulsado”, asigna el programa Prog03 de Macro02.ods (Standard – Module1) Sal del modo diseño: clic en el icono Modo Diseño:
• •
•
- Prueba el funcionamiento del botón; si todo va bien, tendremos:
- Crea otro botón, pero ahora asociado al Prog04:
En este caso tendremos:
OpenOffice Basic
Fermí Vilà
BA-7
Está claro que el cuadro de diálogo MsgBox tiene muchas posibilidades, ya las estudiaremos más adelante en detalle. Ahora nos interesa un cuadro de diálogo que nos permita “entrar” datos ... Sitúate en el Editor del Basic del Macro02.ods y escribe el siguiente programa:
- Sitúate en la Hoja1 del Macro02.ods y crea un botón que has de asociar al Prog05:
- Ejecuta el Prog05, es decir, clic en [Prog05]. Si todo funciona correctamente, debería pasar algo así:
- Vamos a estudiar el Prog05 (sitúate en el editor del Basic, para visualizarlo): • Dim nom As String, ciudad As String Declaramos dos variables (nom y ciudad) de texto (String) • nom = InputBox(“Escribe tu nombre”) “InputBox” es un cuadro de diálogo estándar, que contiene un mensaje (que es lo que escribimos entre comillas y paréntesis) y un campo en blanco; donde el usuario del programa puede escribir lo que quiera. En el momento de hacer clic en el [Aceptar] del InputBox, lo que hemos escrito en el campo que estaba vacío, se entiende como un texto (ya veremos cuando necesitemos un número) y se guarda en la variable de nombre “nom”. • MsgBox “mensaje1” & “variable1 & “mensaje2” & Chr$(13) & variable2 ... Observa en primer lugar, el operador de concanetación (unir), se trata del “ampersand” y lo que hace es unir los diferentes elementos que “opera”; estos elementos pueden ser: . El texto que sea encerrado entre comillas . Variables . Chr$(13): que representa la pulsación de un [Return], o si tú quieres: fuerza a una nueva línea lo que viene a continuación.
OpenOffice Basic
Fermí Vilà
BA-8
Para acabar este apartado, vamos a hacer un programa que mezcle los cuadros de diálogo estándar y los elementos de nuestros documentos “Calc” (celdas en nuestro caso)... - Sitúate en el “Editor del Basic” y escribe:
- Sitúate en Macro02.ods • Crea un botón asociado a Prog06 • Prueba el funcionamiento del programa • Espero que te funcione correctamente • Graba el libro de cálculo con el mismo nombre Macro02.ods
4.- Tipos de Variable OpenOffice Basic soporta los tipos numéricos, cadenas, booleanos y objetos variables. Los objetos son usados principalmente para referirse a los elementos internos del OpenOffice como documentos, tablas, etc. Con un objeto podremos usar sus correspondientes propiedades y métodos. Si usamos “Dim”:los tipos numéricos son inicializados en cero y las cadenas como la cadena vacía “” Los tipos más utilizados (no los únicos): - Tipo Boolean: puede tomar los valores True (verdadero = -1) y o False (falso = 0) - Tipo String: cadena de texto Si escribimos el carácter $ al final del nombre, automáticamente definimos un “String” Es decir: Dim nom$ es equivalente a Dim nom As String - Tipo Integer: número entero Número de –32.768 a +32.767 Dim x%
Es equivalente a
- Tipo Long: número largo Número entero entre: -2.147.483.648
y
Dim x As Integer +2.147.483.647
- Tipo Double: número decimal - Crea un nuevo libro de cálculo, que deberás grabar como Macro03.ods en TuCarpeta - Accede al Editor del Basic (deberás crear un Module1) del Macro03 y escribe el siguiente procedimiento:
- Sitúate en el Macro03.ods y crea un botón de título: Prog07, asociado al procedimiento Prog07. - Ejecuta el procedimiento “Prog07” de la siguiente forma:
OpenOffice Basic • • • •
•
Fermí Vilà
BA-9
Clic en [Prog07] Ante la primera ventana, haz lo que te dice el programa: Escribe lo que quieras y [Aceptar] o pulsa[Return] Número de Columna ?, escribe 5 y [Return] Número de Fila ?, escribe 7 y [Return] Si todo funciona correctamente, en la celda E7 (quinta columna, septima fila), aparece lo que has escrito primeramente.
Veamos: - Sitúate en el Editor del Basic y observa: • Declaramos x e y como “Integer” ya que representarán las coordenadas de una celda • InputBox (“ “) devuelve un texto. • Val(InputBox(“ “)) devuelve un número. Dicho de otra forma: Val es una función que convierte una cadena que representa números, en dichos números (integer). - Sitúate en el Editor del Basic de Macro03.ods y escribe el siguiente procedimiento:
- Sitúate en el Macro03.ods y crea un botón de “Título = Prog08”, asociado al procedimiento “Prog08” - Ejecuta el procedimiento de la siguiente forma: • Clic en [Prog08] • Escribe como base del rectángulo 3,07 • Escribe como altura del rectángulo 2,15 • Si todo funciona correctamente en la celda B21, tendremos el número 6,6005 (siempre y cuando aumentemos el número de decimales) Veamos: - Sitúate en el Editor del Basic y observa: • Coordenadas = (1,20) = 2ª columna – 21 fila = B21 • La base y la altura (bas, alt) se declaran Double, ya que pueden ser decimales. • La función CDbl( ), convierte una cadena de caracteres en número “double” • Cel.SetValue(bas*alt) bas*alt es un número. La función que escribe un número en una celda es SetValue. De la misma forma que lo hace SetFormula si es un texto. –
Sitúate en el Editor del Basic de Macro03.ods y escribe el siguiente procedimiento:
- Sitúate en Macro03.ods y crea un botón de Titulo = Prog09, asociado al procedimiento Prog09 - Ejecuta el procedimiento de la siguiente manera: • Clic en [Prog09] • Escribe como radio de la circunferencia: 3,5812 • Observa que pi = 3,14159265358979
OpenOffice Basic •
Fermí Vilà
BA-10
Si todo va bien en G7 aparece 22,50134322 (deberás aumentar el número de decimales de la celda)
Veamos: - Sitúate en el Editor del Basic y observa: • Coordenadas = (6,6) = 7ª columna – 7ª fila = G7 • longi =2*pi*radi Asignamos (el operador de asignación es el “=”) a la variable “longi” el resultado del producto 2*pi*radi. • pi, es una constante incorporada al lenguaje cuyo valor es 3,14159265358979 • Observa que &, concatena sin problema texto y números: “pi = “ & pi - Sitúate en el Editor del Basic de Macro03.ods y escribe el siguiente procedimiento:
- Sitúate en Macro03.ods y crea un botón de Título = Prog10, asociado al procedimiento Prog10 - Ejecuta el procedimiento de la siguiente manera: • Clic en el botón [Prog10] • Base del triángulo = 3,75 • Altura del triángulo = 2,17 • Si todo funciona correctamente tendremos:
- Observa el Prog10, el único elemento nuevo es cStr(), función que convierte un número a una cadena de caracteres. En efecto: • SetFormula(cadena): coloca en la celda correspondiente el texto “cadena” • “bas” es Double, por lo tanto SetFormula(“Base = “ & cStr(bas)), es decir, en la celda correspondiente se escribirá el texto “Base = “ y a continuación (operador “&”) el texto “bas” ya que la función cStr, lo convierte en texto. - Para acabar este apartado: sitúate en el “Module1” y escribe el siguiente procedimiento:
OpenOffice Basic
Fermí Vilà
BA-11
- Escribe en la Hoja1:
Siendo en botón [Calcular], el botón de Título= Calcular, asignado al procedimiento Prog11 - Prueba el funcionamiento del procedimiento anterior de la siguiente forma: • Escribe en la celda E3 = 3,4 • Clic en [Calcular] • Si todo funciona correctamente, en la celda E5, aparece 36,316811 (=3,4*3,4*pi) Veamos, es importante porque estamos interactuando con el interface del “Calc” (no estamos utilizando ni el InputBox, ni el MsgBox)... - Sitúate en el Editor del Basic del Macro.03. para investigar el procedimiento: Prog11 • Cel1, representa la celda E3 ya que Cel1 = Hoj.getCellByPosition(4,2): 5ªcolumna, 3ª fila. • Cel2, representa la celda E5 ya que Cel2=Hoj.getCellByPositiuon(4,4): 5ª columna, 5ª fila • En Cel1 nostros escribimos un dato (numèrico): para que el programa lo recoja hacemos Cel1.getValue,concretamente lo asignamos a la variable radi: radi=Cel1.getValue Si fuera texto, haríamos: Cel1.getFormula • En Cel2 el programa ha de escribir un número, es decir: Cel2.SetValue(). Si fuera texto, escribiríamos: Cel3.SetF0rmula()
OpenOffice Basic
Fermí Vilà
BA-12
Ejercicios 1) Crea un nuevo libro de cálculo de nombre EjerM01.ods que contenga un procedimiento de nombre EjerM01, que se ejecute con un botón y funcione de la siguiente forma: - El programa nos pregunta nuestro nombre - El programa nos pregunta nuestra edad (en años, claro) - El programa escribe en la hoja de cálculo, nuestro nombre y a continuacion los días que tenemos de vida hasta el momento, de la siguiente forma:
2) Crea un nuevo libro de cálculo de nombre EjerM02.ods que contenga un procedimiento de nombre EjerM02, que se ejecute con un botón y haga lo siguiente: - El programa nos pide un número entero - El programa nos muestra el doble, el triple y el cuadruple del número que habíamos introducido de la siguiente forma:
3) Crea un nuevo libro de cálculo de nombre EjerM03.ods, que contenga dos procedimientos de nombre EjerM03 y EjerM03bis que funcionen de la siguiente forma:
El botón [Calcular] está asociado al EjerM03 que calcula el determinante y el botón [Otro], que corresponde al EjerM03bis, lo único que hace es asignar la cadena vacía (“”) a las cuatro celdas. Observa que en nuestro programa no hay ningún InputBox ni MsgBox.
OpenOffice Basic
Fermí Vilà
BA-13
5.- La estructura “If – then – End If” Crea un nuevo libro de cálculo y grábalo con el nombre Macro04.ods en TuCarpeta Accede al Editor del Basic (deberás crear el Module1 en Macro04.ods) y escribe el siguiente programa:
- Sitúate en la hoja de cálculo. Crea un botón asociado al procedimiento Prog12 y pruébalo. - Espero que te funcione correctamente en las dos versiones: • Contestando a la pregunta con la palabra “Pepe” • Contestando cualquier cosa que no sea “Pepe” - Estudio del Prog12 • En la función InputBox, hemos escrito dos parámetros: el primero “Estructura IF – THEN – ESLSE”, es el que aparece en el interior del cuadro “inputbox” y el segundo no es más que el título de la ventana “InputBox”:
Si escribimos un solo argumento, éste es el mensaje que aparece en el interior del cuadro, y no aparece ningún título en la ventana. • Observa la estructura de programación “IF – THEN – ELSE”. Constituye la estructura de programación más simple: Si se cumple la condición, entonces haz lo siguiente, si no se cumple, haz esto otro. Es decir: Si (If) escribo “Pepe” entonces (then) aparecen dos cuadros, el primer cuadro con el mensaje “Hola Pepe”, el segundo cuadro con el mensaje “No te conozco”. En caso contrario (Else), es decir, si no escribo “Pepe”: aparece el mensaje “Lo siento me he equivocado”. Básicamente, con la estructura IF – THEN – ELSE, conseguimos una bifurcación del programa: el si entonces o el caso contrario. Veamos, que no únicamente representa una bifurcación, en el siguiente procedimiento (debido a que utilizamos todas las posibilidades de la estructura). - Sitúate en el Editor del Basic de Macro04 y escribe el siguiente procedimiento:
OpenOffice Basic
Fermí Vilà
BA-14
- Sitúate en la hoja de cálculo (no te olvides de ir grabando los cambios). Crea un botón asociado al procedimiento Prog13 y pruébalo como mínimo tres veces: para un número mayor de 100, para un número menor de 100 y escribiendo precisamente el 100. Espero que te funcione correctamente: Observa en definitiva, la sintaxis completa de la estructura: If condición1 Then Sentencia 1 Sentencia 2 ... ElseIf condición2 Then Sentencia 3 Sentencia 4 ... ElseIf condición3 Then Sentencia 5 Sentencia 6 ... ... ... Else Sentencia 7 Sentencia 8 ... End If Debes tener en cuenta que las líneas de programa: sentencia 7, sentencia 8, ... sólo se ejecutarán si no se cumple ninguna de las condiciones que hemos considerado en la estructura.
6.- Contadores. Operadores Lógicos Crea un nuevo libro de cálculo y grábalo con el nombre Macro05.ods en TuCarpeta Accede al Editor del Basic (deberás crear el Module1 en Macro05) y escribe el siguiente procedimiento:
OpenOffice Basic
Fermí Vilà
BA-15
- Sitúate en la hoja de cálculo (Hoja1). Crea un botón asociado al procedimiento Prog14 y pruébalo:
- Ejecuta varias veces el programa, observando detenidamente su resultado y el mismo programa ya que nos encontramos con elementos nuevos, veamos • Si al escribir un programa, nos encontramos con una línea demasiado larga, podemos redistribuirla en varias líneas, sin más que escribir el símbolo de subrayado al final de la línea (o cada línea), precedido de un espacio. Es decir: las líneas de programa: s = s + “Valor de x después de pasar por el contador x=x+3” + Chr(9) + _ cStr(x)) + Chr(10) son en realidad una sóla línea. • Declaramos una cadena: Dim s As String y la inicializamos a nada: s=””. No sería necesario ya que al declararla, automáticamente se inicializa a “nada”. • x=x+3 es un contador, instrumento muy utilizado en “programación”, que nos permite añadir al valor de X tres unidades. Si se lee de la siguiente forma, creo que se entiende mejor: “El nuevo valor de X es igual al anterior valor de x + tres unidades. • La función Chr(9) es equivalente a pulsar la tecla de tabulación: [Tab] • La función Chr(10) es equivalente a pulsar la tecla [Return] o [Intro]. Equivale a Chr$(13) • x=x-2, x=x*3 son dos contadores de “x”, en el primer caso modificará el valor de x disminuténdolo en 2 unidades y en el segundo lugar multiplicándolo por 3. • El operador “suma” entre “Strings” se comporta como el operador de concatenación “&”. Es decir: sumar dos textos es equivalente a unirlos: colocarlos uno al lado del otro. • s es una cadena (string) que pasa por diferentes “contadores”: s = s + ... En la práctica, acumulamos en “s” muchos datos, que al incluir el Chr(9) y el Chr(10) se organizan en diferentes líneas (Chr(10)) y columnas (Chr(91)). • Observa la técnica que utilizamos en este procedimiento: “Acumulamos en s una serie de datos, durante la ejecución de todo programa y que mostramos al final: MsgBox s”
- Escribe en el Editor de Basic del Macro05.ods, el siguiente procedimiento:
OpenOffice Basic
Fermí Vilà
BA-16
- Sitúate en la hoja de cálculo (Hoja1). Crea un botón asociado al procedimiento Prog15 y ejecútalo varias veces: prueba las diferentes posibilidades: H, h, V, v, cualquier cosa. - Observa el Prog15: • String*1 Significa “string”, es decir, texto pero de longitud 1, o sea, un solo carácter. • Or Significa, evidentemento “o” - Escribe el siguiente procedimiento:
- Crea un botón asociado al programa Prog16 y ejecuta el programa unas cuantas veces, buscando detenidamente lo que sucede: observa qué técnica más sencilla tenemos, para interrumpir un programa o volver a empezar. Acabamos de ver un programa con el operador lógico “Or”, vamos a ver ahora uno con el operador lógico “And”: utilizaremos este operador cuando sea preciso que para ejecutar un bloque de instrucciones se cumpla más de una condición. Observa que deberán cumplirse todas las condiciones ... - Escribe en el Macro05.ods el siguiente procedimiento:
- Crea un botón asociado al programa Prog17 y ejecuta el programa unas cuantas veces. Considera el caso: “Patatas” y “Total >50”:
OpenOffice Basic
Fermí Vilà
BA-17
- Estudio del Prog17: • Observa en primer lugar que no declaramos ninguna variable y el programa funciona exactamente igual. Si no declaramos una variable, por dfecto, el OpenOffice considerará a esta variable tipo Variant, esto es un tipo indefinido de variable que toma el valor correcto cuando adquiere o asignamos un valor. Bajo este punto de vista, podríamos pensar que es mejor no declarar las variables. Pero hay un problema: el tipo Variant es el que consume más memoria. La conclusión, pues, es declarar todas las variables, aunque el “BASIC” no nos lo exija. • Observa el uso del operador dos puntos “:”, nos permite escribir varias sentencias distintas de un programa en una sola línea. Viene a ser el operador contrario al “carácter de subrayado, precedido de un espacio en blanco”, que nos permitía separar en varias líneas, una única sentencia.
7.- Otras estructuras de programación Crea un nuevo libro de cálculo y grábalo con el nombre Macro06.ods en TuCarpeta Accede al Editor de Basic (deberás crear el Module1 en Macro06.ods) y escribe el siguiente procedimiento:
- Crea un botón (en Hoja1), asociado al procedimiento Prog18 y ejecuta el programa unas cuantas veces.
OpenOffice Basic
Fermí Vilà
BA-18
- La estructura de programación “Select Case” Select Case variable Case a Sentencia1 Sentencia2 ... Case b Sentencia3 Sentencia4 ... Case Else Sentencia5 Sentencia6 ... End Select Viene a ser una generalización de la estructura If – Then: según el valor de la “variable”, se ejecutarán unas sentencias u otras. Veamos a continuación una generalización en las condiciones del “Select – Case” ... Escribe (en Macro06) el siguiente procedimiento: Sub Prog19 Dim num As Integer, notanum As Integer Dim bien As Integer, notacual As String, s As String Dim hoj As Object, Cel1 As Object, Cel2 As Object Dim Cel3 As Object, Cel4 As Object, Cel5 As Object Hoj=ThisComponent.Sheets(0) Cel1=Hoj.getCellByPosition(4,4):Cel2=Hoj.getCellByPosition(4,5) Cel3=Hoj.getCellByPosition(4,6):Cel4=Hoj.getCellByPosition(4,7) Cel5=Hoj.getCellByPosition(4,8) num=Val(InputBox("Escribe el número total de preguntas") bien=Val(InputBox("Escribe el número de respuestas acertadas") notanum=10*bien/num Select Case notanum Case 0 to 1 notacual="Muy Deficiente" Case 2 to 3 notacual="Deficiente" Case 4 notacual="Insuficiente" Case 5 notacual="Suficiente" Case 6 notacual="Bien" Case 7 to 8 notacual="Notable" Case 9 to 10 notacual="Excelente" End Select s="Nota Cualitativa" & Chr(10) & Chr(10) s=s & "Número de preguntas =" & num & Chr(10) s=s & "Número de correctas = " & bien & Chr(10) s=s & "Nota cualitativa = " & cStr(notanum) & Chr(10) s=s & "Nota cualitativa : " & notacual MsgBox s Cel1.SetFormula("Nota Cualitativa") Cel2.SetFormula("Número de preguntas " & cStr(num)) Cel3.SetFormula("Número de correctas " & cStr(bien)) Cel4.SetFormula("Nota Cuantitativa " & cStr(notanum))
OpenOffice Basic
Fermí Vilà
BA-19
Cel5.SetFormula("Nota Cualitativa " & notacual) End Sub - Crea en Hoja1 un botón asociado al procedimiento anterior y ejecútalo varias veces, para comprobar su funcionamiento.
Veamos a continuación otra estructura de programación, en esta ocasión de tipo repetitivo. - Escribe en el “Editor de Basic” del Macro06.ods el siguiente procedimiento:
- Crea en Hoja1 un botón asociado al procedimiento Prog20 y ejecútalo varias veces, para comprobar su funcionamiento.
- Estudio del Prog20 • La estructura “For – To – Next” For indice = número1 To número2 Sentencia 1 Sentencia 2 Sentencia 3 ... Next
OpenOffice Basic
Fermí Vilà
BA-20
El bloque de sentencias 1, 2, 3, ... se repiten desde el número1 hasta el número2 de unidad en unidad
•
Observa de qué forma “acumulamos” la suma, utilizamos un contador del tipo: Total = Total + Valor. Es decir, el nuevo valor de “Total” es el anterior valor de “Total” más el nuevo número “Valor”.
- Escribe en el “Editor de Basic” de Macro06.ods el procedimiento:
- Crea un botón asociado al procedimiento Prog21y ejecuta el programa. Si todo funciona correctamente, se rellenará el rango H11:H15 de los números pares 2, 4, 6, 8, 10 - Observa: “For i=2 To 10 Step 2” Desde i=2 hasta i=10 de dos en dos (step = paso) Vamos a hacer un programa que nos permita calcular la media de 5 notas ... - Escribe en el “Editor de Basic” de Macro06 el procedimiento: -
Crea un botón asociado al procedimiento Prog22 y ejecuta varias veces el programa. Vamos a por otro ejercicio de “for – to next”: escribe en el “Editor de Basic” del Macro06, el procedimiento:
OpenOffice Basic
Fermí Vilà
BA-21
- Crea un botón asociado al procedimiento Prog23 y ejecuta varias veces el programa. Vamos a estudiar la estructura repetitiva “Do While ... Loop” ... - Escribe en el “Editor de Basic” del Macro06.ods el siguiente procedimiento:
- Crea un botón, en la Hoja2 de Macro06.ods, asociado al procedimiento Prog24 y ejecútalo varias veces. - La estructura de programación Do While - Loop Do While condición Sentencia1 Sentencia2 ... Loop Mientras se cumpla la “condición”, se repetirá la ejecución de las sentencias 1, 2, etc. - Escribe en el “Editor de Basic” del Macro06.ods el siguiente procedimiento:
- Crea un botón, en la Hoja2, asociado al procedimiento Prog25 y ejecútalo. - En el Prog16 vimos una forma de volver a empezar, pero sólo una vez, en cambio en el Prog25 gracias a la estructura “Do While – Loop”, disponemos de una tècnica para repetir la ejecución de un programa (volver a empezar), tantas veces como queramos. Vamos a complicar el programa, se trata de crear un procedimiento que sirva para incluir registros en una base de datos. El programa irá pidiendo datos mientras escribamos algún valor en el “InputBox” correspondiente al campo “nombre”, de forma que si al preguntar el “nombre”, no escribimos nada, se terminará la ejecución del bloque correspondiente al Do While – Loop
OpenOffice Basic
Fermí Vilà
BA-22
- Escribe:
Crea un botón asociado al procedimiento Prog26 y ejecútalo varias veces. Debes tener en cuenta que las celdas de la hoja de cálculo correspondientes a una fecha, deberás formatearlas así: como fechas. Al introducir una fecha utilizando el InputBox, por defecto, deberás utilizar la notación inglesa: primero el mes y después el día.
–
Graba el libro de cálculo Macro06.ods con el mismo nombre.
Crea un nuevo libro de cálculo, que deberás grabar como Macro07.ods en TuCarpeta y crea un “Module1”
Programa que suma todos los números que queramos - Escribe en el Editor de Basic de Macro07 el siguiente procedimiento:
OpenOffice Basic
Fermí Vilà
BA-23
- Crea un botón, en la Hoja1 de Macro07, asociado al procedimiento anterior y ejecútalo unas quantas veces.
OpenOffice Basic
Fermí Vilà
BA-24
Programa que nos resuelve una equación de 2º grado - Escribe en el “Editor del Basic” del Macro07 el siguiente programa: Sub Prog28 Dim a As Double, b As Double, c As Double Dim dis As Double, x1 As Double, x2 As Double Dim x As Double, Hoj As Object a=CDbl(InputBox("Coeficiente de x^2")) Hoj=ThisComponent.Sheets(0) Hoj.GetCellByPosition(4,0).SetFormula("Coeficiente de x^2 = " & cStr(a)) If a=0 then Hoj.GetCellByPosition(4,1).SetFormula("No es una ecuación de 2º grado") Else b=CDbl(InputBox("Coeficiente de x= ")) Hoj.GetCellByPosition(4,1).SetFormula("Coeficiente de x = " & cStr(b)) c=CDbl(InputBox("Término independiente = ")) Hoj.GetCellByPosition(4,2).SetFormula("Término Independiente = " & cStr(c)) dis=b^2-4*a*c If dis=0 then x=(-b)/(2*a) Hoj.GetCellByPosition(4,4).SetFormula("La ecuación tiene una solución = " & cStr(x)) End If If dis<0 then Hoj.GetCellByPosition(4,4).SetFormula("Las soluciones son imaginarias") End If If dis>0 then x1=(-b+Sqr(dis))/(2*a): x2=(-b-Sqr(dis))/(2*a) Hoj.GetCellByPosition(4,4).SetFormula("x1 = " & cStr(x1)) Hoj.GetCellByPosition(4,5).SetFormula("x2 = " & cStr(x2)) End If End If End Sub - Crea un botón, en la Hoja1 de Macro07, asociado al procedimiento anterior y ejecútalo para los casos: • a=0 • a=1 ; b=1 ; c=1 • a=1; b=-4; c=4 • a=1; b=1; c=-6 • Pruébalo también para valores decimales. - Nota que la función Sqr(), es una función incorporada al Basic del OpenOffice, que nos permite calcular la raíz cuadrada de un número..
OpenOffice Basic
Fermí Vilà
BA-25
Suma y Producto de los múltiplos de 2 inferiores a 30 - Escribe en el “Editor del Basic” del Macro07 el siguiente procedimiento:
- Crea un botón, en la Hoja1 de Macro07, asociado al procedimiento anterior y ejecútalo para probarlo
Cálculo del factorial de un número - Escribe en el “Editor del Basic” de Macro07.ods el siguiente procedimiento:
- Crea un botón, en la Hoja2 de Macro07 asociado al Prog30 y pruébalo varias veces. - Recuerda que el factorial de un número “x” es x! = x(x-1)(x-2)(x-3)...3.2.1
OpenOffice Basic
Fermí Vilà
BA-26
Programa que calcula los 10 primeros múltiplos del número que queramos, por último nos da la suma y el producto de todos ellos. - Escribe:
- Crea un botón en la Hoja2 de Macro07 asociado al Prog31 y puébalo varias veces
OpenOffice Basic
Fermí Vilà
Tabla de valores de la función y = x2 – 5x + 10 - Escribe en el “Editor del Basic” del Macro07.ods, el siguiente procedimiento:
- Crea un botón, en la Hoja2 de Macro07, asociado al Prog32 y ejecútalo.
BA-27
OpenOffice Basic
Fermí Vilà
BA-28
Cálculo de la hipotenusa de un triángulo rectángulo. El programa tiene la opción de volver a empezar. - Escribe en el “Editor del Basic” del Macro07.ods, el programa:
- Crea un botón, en la Hoja2 de Macro07 asociado al Prog33 y calcula unas cuantas “hipotenusas”...
- Observa: UCase(cadena): es una función incorporada al “OpenOffice Basic”, que transforma todas las letras de “cadena” a mayúsculas. Es decir, que escribir: UCase(opc) = “S” es equivalente a escribir: opc = “S” Or opc = “s”, pero más corto.
OpenOffice Basic
Fermí Vilà
BA-29
Programa que calcula el número “e” - Escribe en el “Editor del Basic” del Macro07, el siguiente programa:
- Crea un botón, en la Hoja2 de Macro07 asociado a Prog34 y ejecútalo ...
- Observa: Exp(número) es una función incorporada al “OpenOffice Basic”, que nos da como resultado “e” elevado al “número”. Por lo tanto: Exp(1) = e
OpenOffice Basic
Fermí Vilà
BA-30
Ejercicios 4) Crea un nuevo libro de cálculo de nombre EjerM04.ods que contenga un procedimiento de nombre EjerM04, que haga lo siguiente: - El procedimiento nos pide que escribamos dos números positivos menores de 57 - El programa nos da como resultado el producto de los dos números - Si los números no son positivos o son mayores de 57, el programa nos lo dice. - El programa nos pregunta al final si queremos volver a empezar 5) Crea un nuevo libro de cálculo de nombre EjerM05.ods que contenga un procedimiento de nombre EjerM05 que haga lo siguiente: El programa nos va pidiendo números, hasta que escribimos el número 9999, por último el programa nos da como resultado el número de números introducidos, exceptuando el 9999 6) Crea un nuevo libro de cálculo de nombre EjerM06.ods que contenga un procedimiento de nombre EjerM06 que haga lo siguiente: El programa escribe todos los múltiplos de 23 inferiores a 1000 y por último nos da la suma de todos ellos. 7) Crea un nuevo libro de cálculo de nombre EjerM07.ods, que contenga un procedimiento de nombre EjerM07 que haga lo siguiente: - El programa hace una tabla de valores de la función y = sen(7x-5) - El programa nos pide los dos valores de “x” (valores máximo y mínimo de la tabla de valores - El programa nos pide el incremento (variación) de la “x”. 8) Crea un nuevo libro de cálculo de nombre EjerM08.ods que contenga un procedimiento de nombre EjerM08, que sirva para calcular un cateto de un triángulo rectángulo a partir del otro cateto y la hipotenusa, de la siguiente forma: - El programa nos pide el valor de la hipotenusa - El programa nos pide el valor de un cateto - Si el cateto es mayor que la hipotenusa, el programa nos da un mensaje de error y se acaba. - El programa nos da como resultado el valor del otro cateto y nos pregunta si queremos volver a empezar. 9) Crea un nuevo libro de cálculo de nombre EjerM09.ods, que contenga un procedimiento de nombre EjerM09 y que sirva para resolver ecuaciones de 2º grado del tipo: ax2 + bx = 0 10) Crea un nuevo libro de cálculo de nombre EjerM10.ods, que contenga un procedimiento de nombre EjerM10 y que sirva para resolver sistemas de ecuaciones del tipo: ax + by = c dx + ey = f Prueba el funcionamiento del programa para el caso a=1, b=-2, c=-3, d=3, e=1, f=5, si todo funciona correctamente: x=1, y=2. La “salida” debería ser de la forma:
11) Haz un nuevo libro de cálculo de nombre EjerM11.ods, que contenga un procedimiento de nombre EjerM11 que escriba los 15 primeros múltiplos de 7, su suma y su producto. El programa ha de tener la posibilidad de volver a empezar.
OpenOffice Basic
Fermí Vilà
BA-31
12) Crea un nuevo libro de cálculo de nombre EjerM12.ods, que contenga un procedimiento de nombre EjerM12, que sirva para calcular el área de un triángulo o el área de un rectángulo o el área de un círculo. El programa ha de tener la posibilidad de volver a empezar. 13) Crea un nuevo libro de cálculo de nombre EjerM13.ods que contenga un procedimiento de nombre EjerM13 que funcione de la siguiente forma: dados dos vectores del espacio, el programa calcula su producto escalar, producto vectorial y además nos dé el módulo de los dos vectores y también el módulo del producto vectorial. Recordemos: v=(a,b,c) p=(d,e,f) Producto Escalar = ad + be + cf Producto Vectorial = (bf – ec, de-af, ae-bd) Módulo de v =
a 2 + b2 + c 2
La “salida” debería ser de la forma:
14) Crea un nuevo libro de cálculo de nombre EjerM14.ods, que contenga un procedimiento de nombre EjerM14, y que funcione de la siguiente forma: El programa nos pide un número y da como resultado la tabla de multiplicar del número introducido. 15) Crea un nuevo libro de cálculo de nombre EjerM15.ods, que contenga un procedimiento de nombre EjerM15, y que funcione de la siguiente forma: El programa calcula el número “e” mediante el desarrollo en serie: e = 1 + 1/1! + 1/(2!) + 1/(3!) + 1/(4!) + ... + 1/(50!)
OpenOffice Basic
Fermí Vilà
BA-32
8.- Arrays - Crea un nuevo libro de cálculo, que has de grabar con el nombre Macro08.ods en TuCarpeta. Crea un Module1 y sitúate en su interior para escribir:
- Crea un botón en la Hoja1 del Macro08.ods, asociado al procedimiento anterior y ejecútalo, observando detenidamente lo que sucede. - Estudio del “Prog35”: Dim a(1 To 3) As Double Definimos lo que se llama “aaray” o “matriz” o “vector” o “arreglo” de una dimensión. Y no es más que una variable que consta de tres números Double, en realidad tres variables double. Para acceder a los elementos de nuestro “array” hemos de utilizar la notación: a(1) = primer elemento; a(2)=segundo elemento; a(3)= tercer elemento El programa anterior es muy bonito, pero no sirve para nada, vamos a hacer un programa un poco más complicado ... Observa la siguiente tabla: Inicio Fin
Lunes 8 14
Martes 10,5 17
Miercoles 6 13,5
Jueves 9 13
Viernes 7 18
Resulta que cada día de la semana hacemos una jornada laboral distinta, en el ejemplo de la tabla (que representa el horario laboral de una semana determinada), el lunes empezamos a trabajar a las 8h y terminamos a las 2h de la tarde, el martes empezamos a las 10h y media y terminamos a las 17h, etc. Vamos a hacer un programa para introducir y guardar los datos de dicha tabla. - Escribe en el Module1 del Macro08.ods el siguiente procedimiento:
- Crea un botón en la Hoja2 del Macro08.ods, asociado al procedimiento anterior y ejecútalo:
OpenOffice Basic
Fermí Vilà
BA-33
En este programa hemos trabajado con un array bidimensional o matriz de dos dimensiones: a( 1 To 2 , 1 To 5 ) Sus elementos: a(1,1), a(1,2), a(1,3), a(1,4), a(1,5) A(2,1), a(2,2), a(2,3), a(2,4), a(2,5) El procedimiento Prog36, hemos de reconocer que está muy bien para utilizar matrices bidimensionales y ciclos anidados, pero es completamente inútil. Vamos a modificar el procedimiento anterior para que nos calcule el “número total de horas trabajadas a la semana” ... Escribe en el Module1 de Macro08.ods:
- Crea un botón en la Hoja2 del Macro08.ods, asociado al programa Prog37 y ejecútalo Si todo funciona correctamente:
- Escribe en el Macro08, el procedimiento:
OpenOffice Basic
Fermí Vilà
BA-34 -
Crea un botón en la Hoja2 del Macro08.ods, asociado al procedimiento Prog38 y ejecútalo varias veces. - Observa de qué forma definimos un array dinámico: al principio del programa, no sabemos el número de elementos (Dim x() As Double); cuando ya sabemos el número de elementos: ReDim x(número) As Double
Programa que calcula, dada una serie de 5 números, la media aritmética, las desviaciones respecto a la media, la desviación media, la varianza y la desviación típica. –
Escribe en el Module1 del Macro08.ods el siguiente programa: Sub Prog39 Dim s As String, sum As Double, med As Double Dim num(1 To 5) As Double Dim desv(1 To 5) As Double Dim sum1 As Double, sum2 As Double, i As Integer Dim desmed As Double, vari As Double, dt As Double s="":sum=0:sum1=0:sum2=0 s=s & "Valores de la serie estadística: " & Chr(10) For i=1 To 5 num(i)=CDbl(InputBox("¿Número?")) s=s & cStr(num(i)) & Chr(10) sum=sum+num(i) Next med=sum/5 s=s & Chr(10): s=s & "Media Aritmética = " & cStr(med) s=s & Chr(10) & "Desviaciones" & Chr(10) For i=1 To 5 desv(i)=Abs(num(i)-med) sum1=sum1+desv(i) sum2=sum2+desv(i)*desv(i) s=s & cStr(desv(i)) & " - " Next desmed=sum1/5 vari=sum2/5 dt=Sqr(vari) s=s & Chr(10) s=s & "Desviación Media = " & cStr(desmed) s=s & Chr(10) s=s & "Varianza = " & cStr(vari) & Chr(10)
OpenOffice Basic
Fermí Vilà
BA-35
s=s & "Desviación Típica = " & cStr(dt) MsgBox s End Sub - Crea un botón en la Hoja2 del Macro08.ods, asociado al procedimiento anterior y ejecuta el programa para el caso:
9.- Procedimientos y Funciones Se define como procedimiento y/o función a un bloque de código que realiza alguna tarea. Hasta ahora, hemos construido los programas utilizando un único procedimiento, pero a medida que los programas (y los problemas) crecen, se va haciendo necesaria la inclusión de más procedimientos. Una función es lo mismo que un procedimiento con la salvedad, que la función devuelve un valor al procedimiento o función que lo llama. - Crea un nuevo libro de cálculo, que deberás grabar como Macro09.ods en TuCarpeta. Crea un Module1 y escribe:
- Crea un botón en la Hoja1 del Macro09.ods, asociado al procedimiento Prog40 y ejecuta el programa varias veces. Observa la sintaxis de una “función”: declaramos los parámetros (en nuestro caso v1 y v2) y declaramos también el tipo de dato que devuelve la función, Integer en nuestro caso.
OpenOffice Basic
Fermí Vilà
BA-36
Observa de qué forma “llamamos” a una función: NombreFunción (lista de parámetros), en nuestro ejemplo: Suma(n1,n2) - Vamos a trabajar con más funciones ... Sitúate en el Module1 del Macro09 y escribe:
Y
- Crea en Hoja1 de Macro09.ods dos botones de nombre: [Prog41] y [Prog42] asociados a los procedimientos 41 y 42 y ejecútalos:
Vamos a por otra función ... - Escribe en el Module1 del Macro09:
- Crea en Hoja1 de Macro09.ods un botón de nombre [Prog43] asociado al procedimiento “Prog43” y ejecútalo. - Escribe en el Module1 del Macro09.ods:
OpenOffice Basic
Fermí Vilà
BA-37
- Crea en la Hoja1 del Macro09, un botón de nombre [Prog44] asociado al procedimiento “Prog44” y ejecútalo.
10.- Números Aleatorios - Crea un nuevo libro de cálculo, que deberás grabar como Macro10.ods en TuCarpeta. Crea un Module1 y escribe los siguientes procedimientos:
OpenOffice Basic
Fermí Vilà
BA-38
- Crea en la Hoja1 de Macro10.ods dos botones de nombre: [Prog45] y [Prog46], asociados a los procedimientos 45 y 46 y ejecútalos. - La función RND Cada vez que el ordenador procesa una línea que contiene la sentencia Rnd, en la celda correspondiente aparece un número aleatorio, decimal entre 0 y 1. El número puede ser cero, pero nunca 1. El número de decimales es 14 (recuerda que en la hoja de cálculo, por defecto aparecen sólo 2) En realidad la serie de números “Rnd” es pseudoaleatoria, para conseguir que la función Rnd genere verdaderos números aleatorios, en el programa hemos de anteponer la sentencia Randomize, que es lo que consideraremos en el siguiente programa. Observa las siguientes relaciones: X=Rnd
0≤ X<1
X número decimal
Y=6*Rnd
0≤ Y<6
Y número decimal
Z=Int(6*Rnd)
0≤ Z<6
Z número entero entre 0 y 6 (puede ser 0, pero no 6)
W=Int(6*Rnd)+1
0
W número entero entre 0 y 6 (no puede ser 0, pero sí 6) Es decir: W = 1, 2, 3, 4, 5 o 6
En general: Int((y-x)*Rnd+x)
número entero aleatorio entre x e y (incluido x, excluido y)
Int((y+1-x)*Rnd+x)
número entero aleatorio entre x e y (incluidos los dos)
- Escribe en el Module1 del Macro10.ods los procedimientos: Sub Prog47 Dim Hoj As Object, i As Integer Randomize Hoj=ThisComponent.Sheets(0) Hoj.getCellByPosition(7,5).SetFormula("10 tiradas aleatorias de un dado de parchís") For i=1 To 10 Hoj.getCellByPosition(7,5+i).SetValue(Int(6*Rnd)+1) Next
OpenOffice Basic
Fermí Vilà
End Sub Sub Prog48 Dim s As String, i As Integer Dim x As Double, y As Double Randomize s="Números Aleatorios " & Chr(10) s=s & "10 números aleatorios entre 0 y 1" & Chr(10) For i=1 to 10 s=s & cStr(Rnd) & " - " Next s=s & Chr(10) s=s & "10 números aleatorios enteros entre 3 y 7" & Chr(10) s=s & "incluido el 3 y excluido el 7" & Chr(10) For i=1 To 10 s=s & cStr(Int((7-3)*Rnd+3)) & " - " Next s=s & Chr(10) s=s & "10 números aleatorios enteros entre 3 y 7" & Chr(10) s=s & "incluidos el 3 y el 7" & Chr(10) For i=1 To 10 s=s & cStr(Int((7+1-3)*Rnd+3)) & " - " Next s=s & Chr(10) s=s & "10 números aleatorios enteros entre los dos que tú quieras" & Chr(10) s=s & "incluidos los dos extremos" & Chr(10) x=CDbl(InputBox("Escribe el menor")) y=CDbl(InputBox("Escribe el mayor")) s=s & "concretamente entre " & cStr(x) & " y " & cStr(y) & Chr(10) For i=1 to 10 s=s & cStr(Int((y+1-x)*Rnd+x)) & " - " Next MsgBox s End Sub - Crea en la Hoja1 de Macro10.ods dos botones de nombre [Prog47] y [Prog48], asociados a los programas 47 y 48 y ejecútalos.
11.- Funciones con y sin retorno de parámetros - Crea un nuevo libro de cálculo, que deberás grabar como Macro11.ods en TuCarpeta. Crea un Module1 y escribe: Function mediageo() Dim x As Integer, y As Integer x=Val(InputBox("Escribe un número entero")) y=Val(InputBox("Escribe otro número entero")) MsgBox "La media geométrica de " & cStr(x) & _ " y " & cStr(y) & " es " & cStr(Sqr(x*y)) End Function Function mediageo2(a As Integer, b As Integer) As Double mediageo2=Sqr(a*b) End Function Sub Prog49 ' Este programa sólo contiene una llamada ' a una función
BA-39
OpenOffice Basic
Fermí Vilà
BA-40
mediageo End Sub Sub Prog50 Dim x As Integer, y As Integer x=Val(InputBox("Escribe un número entero")) y=Val(InputBox("Escribe otro número entero")) MsgBox "La Media Geométrica de " & cStr(x) & _ " y " & cStr(y) & " es " & cStr(mediageo2(x,y)) End Sub - Crea en la Hoja1 de Macro11.ods dos botones de nombre [Prog49] y [Prog50], asociados a los programas 49 y 50 y ejecútalos. El primer tipo de función (mediageo) se dice que es una función sin retorno de parámetros. El segundo tipo (mediageo2) es una función que retorna parámetros. Programa que determina si un número es primo, utilizando una función - Accede al Module1 del Macro11.ods y escribe: Function Primo (x As Integer) As String Dim resto As Integer, i As Integer, opc As Integer For i=2 To x-1 resto=x Mod i If resto=0 And x<>2 Then opc=1 Exit For End If Next If opc=1 Then Primo="N" Else Primo="S" End If End Function Sub Prog51 Dim num As Integer, Hoj As Object Hoj=ThisComponent.Sheets(0) num=Val(InputBox("Escribe un número entero")) If Primo(num)="S" then Hoj.getCellByPosition(1,0).SetFormula("El número " & cStr(num) & " es primo" Else Hoj.getCellByPosition(1,0).SetFormula("El número " & cStr(num) & " no es primo" End If End Sub - Crea en la Hoja1 de Macro11.ods un botón de nombre [Prog51] asociado al programa anterior y ejecútalo varias veces. - La función “Primo” aunque complicada, es importante porque contiene elementos nuevos: • resto = x Mod i “Mod” es el operador que nos da el resto de la división entera (en nuestro caso entre x e i) • Exit For Forzamos la salida del bucle For – To – Next
OpenOffice Basic
Fermí Vilà
Programa que calcula el M.C.D. de dos números, utilizando una función Antes de todo recordemos el Algoritmo de Euclides para el cálculo del M.C.D. Por ejemplo, para calcular el mcd(38,48), hemos de seguir el siguiente proceso: 1.- necesitamos saber el número mayor 2.- divido el mayor entre el menor, 48/36 = 1 y resto12 3.- divido el divisor de antes entre el resto (de antes): 36/12 = 3 y resto 0 4.- continuamos dividiendo divisor/resto, hasta que la división sea exacta 5.- el m.c.d es el último resto distinto de cero, en nuestro caso 12 En general, para calcular el mcd(a,b): 1.-
2.-
3.-
4.-
if a 0 resto = a mod b a=b b = resto loop mcd = resto
- Escribe en el module del Macro11.ods: Function MCD (a As Integer, b As Integer) As Integer Dim resto As Integer, aux As Integer If a 0 resto=a Mod b a=b b=resto Loop MCD=resto End Function Sub Prog52 Dim x As Integer, y As Integer Dim Hoj As Object Hoj=ThisComponent.Sheets(0) x=Val(InputBox("Escribe un número")) y=Val(InputBox("Escribe otro número")) Hoj.getCellByPosition(1,5).SetFormula("El MCD de " & cStr(x) & _
BA-41
OpenOffice Basic
Fermí Vilà
BA-42
" y " & cStr(y) & " es " & cStr(MCD(x,y)) End Sub - Crea en la Hoja1 de Macro11.ods un botón de nombre [Prog52], asociado al último procedimiento y ejecútalo varias veces: MCD(5,25) = 5 MCD(7,3) = 1 MCD(720,300) = 60
Adivinanzas Vamos a hacer un programa que nos pregunte un número entero del 1 al 10, y el usuario del programa tiene 5 tentativas para adivinarlo. - Escribe en el Module1 del Macro11.ods Sub Prog53 Dim x As Integer, num As Integer Dim i As Integer, control As Integer Dim Hoj As Object Hoj=ThisComponent.Sheets(0) Randomize x=Int((10+1-1)*Rnd+1) Do While i<5 i=i+1 num=Val(InputBox("Escribe un entero del 1 al 10, intento " & cStr(i))) If num=x Then Hoj.getCellByPosition(1,6).SetFormula("Lo has acertado en " &_ cStr(i) & " tentativas") i=5 control=1 End If Loop If control=0 Then Hoj.getCellByPosition(1,7).SetFormula("Lo siento, se han acabado tus "&_ "vidas, el número era " & cStr(x)) End If End Sub - Crea un botón asociado al Prog53 y ejecútalo varias veces, para probar el programa.
Programa que nos pregunta 5 sumas aleatoriamente y al final nos da la “nota” - Escribe en el Module1 del Macro11: Sub Prog54 Dim x As Integer, y As Integer, z As Integer Dim nota As Integer, i As Integer, Hoj As Object Randomize: Hoj=ThisComponent.Sheets(0) For i=1 To 5 x=Int((9+1-1)*Rnd+1) y=Int((9+1-1)*Rnd+1)
OpenOffice Basic
Fermí Vilà
z=Val(InputBox(cStr(x) & " + " & cStr(y) & " = ")) If z=x+y Then Hoj.getCellByPosition(1,10+i).SetFormula(cStr(x) & _ " + " & cStr(y) & " = " & cStr(z)) Hoj.getCellByPosition(2,10+i).SetFormula(" Muy Bien ") nota=nota+1 Else Hoj.getCellByPosition(1,10+i).SetFormula(cStr(x) & _ " + " & cStr(y) & " = " & cStr(z)) Hoj.getCellByPosition(2,10+i).SetFormula(" No, es falso ") Hoj.getCellByPosition(3,10+i).SetFormula(cStr(x) & _ " + " & cStr(y) & " = " & cStr(x+y)) End If Next Hoj.getCellByPosition(1,11+i).SetFormula(" Tu nota es " & cStr(2*nota)) End Sub - Crea un botón asociado al Prog54 y ejecútalo varias veces.
BA-43
OpenOffice Basic
Fermí Vilà
BA-44
Ejercicios 16) Crea un libro de cálculo de nombre EjerM16.ods que contenga un procedimiento de nombre EjerM16, que sirva para calcular el mínimo común múltiplo de dos números utilizando la función MCD del procedimiento Prog52 (deberás copiarla en el EjerM16) y sabiendo que mcm(x,y) = x*y/MCD(x,y) 17) Crea un libro de cálculo de nombre EjerM17.ods, que contenga un procedimiento de nombre EjerM17, que sirva para simplificar una fracción numérica, deberás utilizar la función MCD del ejercicio anterior. Observa:
a a / MCD( a , b) = b b / MCD( a, b) La “salida” debería ser de la forma:
18) Crea un libro de cálculo de nombre EjerM18.ods, que contenga un procedimiento de nombre EjerM18, que sirva para sumar o restar dos fracciones y después simplifique el resultado. Observa:
a c a ( mcm(b, d ) / d ) + c( mcm(b, d ) / d ) + = b d mcm(b, d ) La “salida” debería ser:
19) Crea un libro de cálculo de nombre EjerM19.ods que contenga un procedimiento de nombre EjerM19, que sirva para calcular el módulo de un vector en el espacio, utilizando una función. 20) Crea un libro de cálculo de nombre EjerM20.ods, que contenga un procedimiento de nombre EjerM20, que sirva para calcular el área de un triángulo en el espacio, utilizando la función del ejercicio anterior. Recuerda: A=(a1,a2,a3), B=(b1,b2,b3), C=(c1,c2,c3) AB=(b1-a1,b2-a2,b3-a3), AC=(c1-a1,c2-a2,c3-a3) Área del triángulo ABC = mitad del producto vectorial de AB y AC. Compruébalo para el caso:
OpenOffice Basic
Fermí Vilà
BA-45
21) Crea un libro de cálculo de nombre EjerM21.ods, que contenga un procedimiento de nombre EjerM21, que construya el triángulo de Tartaglia o Pascal de la siguiente forma: 1º.- Crea una función que calcule el factorial de un número. 2º.- Crea otra función que permita calcular un número combinatorio:
m m! = n n! ( m − n )!
3º.- El triangulo de Tartaglia no es más que los resultados de los números combinatorios:
0 0 1 1 0 1 2 2 2 0 1 2
... ...
4º.- El programa nos ha de preguntar de entrada el número de filas del triángulo.
22) Crea un libro de cálculo de nombre EjerM22.ods, que contenga un procedimiento de nombre EjerM22, tal que: - El programa nos pregunta cuántas multiplicaciones queremos hacer. - El programa nos las pregunta aleatoriamente – Al final el programa nos da la nota cualitativa (utiliza una función). 23) Crea un libro de cálculo de nombre EjerM23.ods, que contenga un procedimiento de nombre EjerM23, que calcule un determinante de tercer orden. Recuerda:
a d g
b e h
c f = aei + dch + bfg − gec − hfa − dbi i
Compruébalo para el caso:
24) Crea un libro de cálculo de nombre EjerM24.ods que contenga un procedimiento de nombre EjerM24, que sirva para discutir un sistema de tresecuaciones con tres incógnitas, sólo en los casos compatible determinado e incompatible y lo resuelve en el caso compatible determinado. De la siguiente forma: 1º) Crea una función que sirva para calcular un determinante de tercer orden (ejercicio anterior). 2º) Dado el sistema: ax+by+cz=j dx+ey+fz=k gx+hy+iz=l Calcula los determinantes: a b c j b c a j c a b j det = d e f detx = k e f dety = d k f detz = d e k g h i l h i g l i g h l 3º) Si det no es 0 entonces el sistema es compatible determinado
OpenOffice Basic
Fermí Vilà
BA-46
Si det es 0 y (detx no es cero o dety no es 0 o detz no es 0) entonces el sistema es incompatible. 4º) Si el sistema es compatible determinado, la solución por Cramer es x=detx/det, y=dety/det, z=detz/det Pruébalo para los casos:
25) Crea un libro de cálculo de nombre EjerM25.ods, que contenga un procedimiento de nombre EjerM25, que resuelva un sistema de dos ecuaciones con dos incógnitas por el método de Cramer. Crea una función que calcule un determinante de 2º orden Compruébalo para los casos:
26) Crea un libro de cálculo de nombre EjerM26.ods que contenga un procedimiento de nombre EjerM26, que calcule los 50 primeros términos de la sucesión de término general: (3n+1) / (2n-1)
OpenOffice Basic
Fermí Vilà
12.- Cuadros de Diálogo a) Crea un nuevo libro de cálculo, que deberás grabar como Macro12.ods. Crea, como siempre, un Module1 asociado al Macro12. - Sitúate en el Editor de Basic. Accede al menú contextual de la pestaña “Module1”, es decir: • Sitúa el cursor del ratón encima de la pestaña Module1 • Pulsa el botón derecho del ratón:
•
Selecciona la opción: Insertar Diálogo BASIC
- Nos acabamos de situar en una nueva pantalla (Dialog1), que contiene un formulario o cuadro de diálogo vacío. Si observas el ángulo inferior izquierdo de la pantalla:
podemos situarnos fácilmente en el editor de BASIC (clic en la pestaña Module1) y/o volver al formulario (clic en la pestaña Dialog1). - Desde la pantalla del Dialog1, haz clic en el icono “Insertar elementos de Control”: Si mantienes pulsado el botón izquierdo, aparecerán todas sus opciones:
BA-47
OpenOffice Basic
Fermí Vilà
Y puedes arrastrarlo (clic en el marco de la ventana) a cualquier punto de la pantalla:
- Haz clic en el “Campo de Texto” del cuadro “Campos de Control”:
- Marca un pequeño recuadro en el formulario:
- Clic en el “Botón” del cuadro “Campos de Control”: –
Marca un pequeño recuadro debajo del campo de texto que acabamos de insertar.
- Marca otro “CommandButton”, a la derecha del anterior:
- Selecciona el formulario, para ello deberás hacer: • Clic en “Flecha de Selección” del cuadro Campos de Control: •
Marca una ventana que abarque al formulario entero.
BA-48
OpenOffice Basic
Fermí Vilà
BA-49
- Una vez seleccionado el formulario, hazlo más pequeño y observarás que todos los elementos del interior también se hacen más pequeños. Resitúa los elementos, hasta tener aproximadamente:
- Selecciona el “CommandButton1” y accede a sus propiedades: clic en el campo de control “Propiedades”:
Observa que podemos resituar los elementos en pantalla, de manera que se encuentre visible: • La ventana de propiedades. • El formulario • El Cuadro de Controles
De esta forma si seleccionamos otro elemento del formulario (o el mismo formulario) accedemos automáticamente a sus propiedades (pruébalo). - Con el “CommandButton1” seleccionado y sus “Propiedades” a la vista. Cambia el contenido de la propiedad “Título”, que era CommandButton1 por “Saludo”. - Selecciona el “CommandButton2” y cambia su propiedad “Título” por “Borrar Saludo” - Creo que está claro lo que nos proponemos: Al hacer clic en el botón [Saludo], queremos que salga escrito (en el cuadro de texto), un saludo. Por ejemplo: “Bienvenido al Basic del OpenOffice” y al hacer clic en [Borrar Saludo], nos gustaria que se borrara el mensaje anterior. Veamos:
• •
En primer lugar, investiga el nombre del cuadro de texto: basta que selecciones el cuadro de texto y observes su Propiedad = Nombre. Si todo funciona correctamente verás que es TextField1. Si observas el contenido de su propiedad “Texto”, verás que no tiene nada; es lógico, el cuadro de texto está vacio. Sitúate en el Module1 (clic en la pestaña correspondiente) y escribe:
OpenOffice Basic
• • •
• •
Fermí Vilà
Vuelve al Dialog1 y selecciona el botón [Saludo]. En su ventana de propiedades, haz clic en la pestaña Acontecimientos. Sitúa el cursor de escritura en el campo “Boton del ratón pulsado” y haz clic en el botón [...]. [Asignar] Selecciona ClicSaludo de Macro12.ods Standard Module 1 [Aceptar] [Aceptar] Asocia al botón [Borrar Saludo] el programa ClicBorrarSaludo. Es decir: selecciona el botón [Borrar Saludo] en Dialog1. Accede a la pestaña Acontecimientos, en su ventana de propiedades. Y en el campo Boton del ratón pulsado, asigna el procedimiento ClicBorrarSaludo. Sitúate en la hoja de càlculo e inserta un botón de nombre “HOLA”, asociado al procedimiento AbreFormulario
- Prueba el funcionamiento de lo que hemos “programado”: • Clic en el botón [HOLA]. Si todo va bien, aparece el formulario. • Clic en el botón [Saludo]
• •
BA-50
Clic en el botón [Borrar Saludo] Para acabar, clic en la “X” del extremo superior derecho del formulario.
OpenOffice Basic
Fermí Vilà
BA-51
- Sitúate en el Editor de Basic (Module1) para “estudiar” nuestro programa: el procedimiento AbreFormulario:
Es bastante extraño: el Basic del OpenOffice es una versión de Basic, próxima a Java. De todas formas no te preocupes: las tres líneas de nuestro programa (observa en la segunda línea que aparece el nombre del formulario: Dialog1), sirven para abrir el formulario de nombre Dialog1. Observa también que la declaración: Dim oDialogo As Object se encuentra al principio del módulo, y fuera de todo programa, de esta forma evitamos el tener de declarar el formulario, en cada uno de los demás procedimientos del módulo. El procedimiento ClicSaludo, está más claro: ... TextField1.Text = “mensaje” El campo de texto de nombre “TextField1”, propiedad “Text” (texto) ha de ser igual a “mensaje”. Es decir, el contenido (propiedad Text) del campo de texto (TextField1) es “mensaje”. El “prefijo”, oDialogo.Model deberemos escribirlo en todos los controles que aparezcan en los procedimientos del formulario.
b) Vamos a hacer un formulario más complicado: crea un nuevo libro de cálculo que deberás grabar como Macro13.ods. Crea un Module1, también un Dialog1 asociado al Macro13 - Inserta en el formulario, una etiqueta: Clic en el icono “Etiqueta” del Cuadro de Controles: De propiedad “Título”: Introduce la clave secreta Sitúa el cursor de escritura en el campo Fuente (propiedad de la etiqueta que acabamos de insertar) y clic en su botón [...]. Selecciona Fuente: Arial. Estilo: Negrita Cursiva y Tamaño: 12 [Aceptar] Cambia el color de fondo (la etiqueta ha de estar seleccionada) a “Amarillo Pastel” - Selecciona el formulario (deberás deseleccionar la etiqueta y marcar un recuadro que abarque todo el formulario) De esta forma podemos acceder a sus propiedades: por ejemplo, coloca como “Color de fondo= Gris azulado” –
Inserta un campo de texto a la derecha del texto “Introduce la clave secreta”. En su propiedad “Caracter de contraseña”, escribe un asterisco.
- Inserta dos botones: • El “CommandButton1” de propiedad “Título”: Aceptar • El “CommandButton2” de propiedad “Título”: Salir
OpenOffice Basic
Fermí Vilà
BA-52
- Vamos a programar nuestros botones: • Sitúate en el Module1 y escribe:
- Asocia al botón [Aceptar] el programa “Aceptar”: • En la pantalla correspondiente al “Dialog1” • Selecciona el botón [Aceptar] • Clic en la pestaña Acontecimientos de la ventana Propiedades • En el campo Al Ejecutar o en Botón del ratón pulsado, asignale el procedimiento Aceptar de Module1 - Haz lo mismo para asociar al botón [Salir] el procedimiento Salir del Module1. - Sitúate en la hoja de cálculo e inserta un botón de nombre [CONTRASEÑA] y asignalo al procedimiento AbreForm del Module1. Por último ejecuta y prueba el programa. - Observa:
• •
La función UCase(argumento), convierte el argumento en mayúsculas. Gracias al uso de esta función, podemos introducir la contraseña en mayúsculas o minúsculas. Una de las líneas (sentencias) del programa “Aceptar” es el nombre de otro programa: “Salir”. Es decir llamamos (se ejecuta) al procedimiento Salir.
c) Ya habíamos hecho un programa que calculaba el factorial de un número, vamos a repetirlo pero visualmente, es decir, utilizando un formulario y controles ... –
Crea una nueva hoja de cálculo de nombre Macro14.ods con un Module1 y un Dialog1
OpenOffice Basic
Fermí Vilà
BA-53
- Crea el siguiente formulario:
• •
El título no es más que una etiqueta (Label1), con la propiedad “Borde = en 3D” y “Alineación = Centrado” El control que hay debajo de “Escribe un ...” es otro cuadro de texto (TextField2), con el “Color de Fondo = Verde Pastel”
- Escribe en el Module1 el código: Dim oDialogo As Object Sub AbreForm DialogLibraries.LoadLibrary("Standard") oDialogo=createUnoDialog(DialogLibraries.Standard.Dialog1) oDialogo.execute() End Sub Sub Salir oDialogo.endExecute() End Sub Sub Calcular Dim i As Double, fact As Double fact=1 For i=1 To CDbl(oDialogo.Model.TextField1.Text) fact=fact*i Next oDialogo.Model.TextField2.Text="El factorial de " & _ oDialogo.Model.TextField1.Text & " es " & _ cStr(fact) End Sub Sub Otro oDialogo.Model.TextField1.Text="" oDialogo.Model.TextField2.Text="" End Sub - Asocia al botón [Calcular] el procedimiento Calcular - Asocia al botón [Otro] el procedimiento Otro - Asocia al botón [Salir] el procedimiento Salir. - Crea en la Hoja1 del Macro14 un botón de nombre [FACTORIAL] y asócialo al procedimiento AbreForm Sólo nos queda probar el programa (espero que te funcione correctamente).
OpenOffice Basic
Fermí Vilà
BA-54
d) Crea una nueva hoja de cálculo de nombre Macro15.ods con un Module1 y un Dialog1 - Crea el siguiente formulario:
- Creo que está claro lo que pretendemos: tenemos dos campos de texto (TextField1 y TextField2), escribimos en el primero el número de un DNI (8 dígitos) y al hacer clic en el botón [Calcula], aparece en el “TextField2”, el NIF correspondiente, es decir el DNI anterior más la letra correspondiente al Nif. Veamos: - La letra correspondiente al NIF de un DNI es la siguiente: se divide el DNI entre 23, sin decimales, es decir por ejemplo: 40940754/23 = 1780032 y Resto =18. Según el resto de la división, que será un número de 0 a 22 le corresponde la letra del NIF, según la siguiente tabla: Resto 0 1 2 3 4 5 6 7
Letra del NIF T R W A G M Y F
Resto 8 9 10 11 12 13 14 15
Letra del NIF P D X B N J Z S
Resto 16 17 18 19 20 21 22
Letra del NIF Q V H L C K E
En nuestro ejemplo, a un DNI igual a 40.940.754 le corresponde un resto de la división por 23 de 18, por lo tanto la letra del NIF de nuestro ejemplo será la “H”. - El problema ahora es “traducir” los cálculos anteriores al Basic del OpenOffice... Int() es una función incorporada (igual que MsgBox() y muchas más), que nos da la parte entera del número que escribamos como argumento. Así: Int(40940754/23) =1780032, nos da el resultado de la división sin decimales (es lo que en matemáticas se llama división entera) Pensemos ahora en la “prueba de la división: El dividendo = divisor*cociente + resto”. O lo que es equivalente: “El resto de la división = dividendo – divisor*cociente”. En nuestro ejemplo: 18 = 40.940.754 – 23*Int(40940754/23) - Escribe en el Module1, la “function” siguiente y compara la igualdad anterior con la instrucción de nuestra función Letra: num = x – 23*Int(x/23) Function Letra(x As Double) As String Dim num As Double num=x-23*Int(x/23) Select Case num Case 0 Letra="T" Case 1 Letra="R" Case 2 Letra="W" Case 3 Letra="A" Case 4 Letra="G" Case 5 Letra="M"
OpenOffice Basic
Fermí Vilà
Case 6 Letra="Y" Case 7 Letra="F" Case 8 Letra="P" Case 9 Letra="D" Case 10 Letra="X" Case 11 Letra="B" Case 12 Letra="N" Case 13 Letra="J" Case 14 Letra="Z" Case 15 Letra="S" Case 16 Letra="Q" Case 17 Letra="V" Case 18 Letra="H" Case 19 Letra="L" Case 20 Letra="C" Case 21 Letra="K" Case 22 Letra="E" End Select End Function - Escribe en el Module1, los procedimientos: Dim oDialogo As Object Sub AbreForm DialogLibraries.LoadLibrary("Standard") oDialogo=createUnoDialog(DialogLibraries.Standard.Dialog1) oDialogo.execute() End Sub Sub Calcula Dim cadena As String cadena=oDialogo.Model.TextField1.Text Select Case Len(cadena) Case Is<8 MsgBox "Has de escribir 8 dígitos" Case Else oDialogo.Model.TextField2.Text=oDialogo.Model.TextField1.Text & _ cStr(Letra(CDbl(oDialogo.Model.TextField1.Text)) End Select End Sub - Asocia al botón [Calcula] el procedimiento Calcula
BA-55
OpenOffice Basic
Fermí Vilà
BA-56
- Crea en la Hoja1, un botón de nombre [NIF] y asócialo al procedimiento AbreForm Ejecuta y prueba el funcionamiento de nuestro programa.
e) Crea una nueva hoja de cálculo de nombre Macro16.ods con un Module1 y un Dialog1 - Crea el siguiente formulario:
Ten en cuenta las siguientes propiedades: •
TextField2 Sólo lectura = Sí
•
TextField4 Sólo lectura = Sí Juego de Caracteres. Tamaño = 24
•
Los últimos cuadros de texto (desde el TextField5 hasta el TextField10): Alineación = Centrado Sólo Lectura = Sí Juego de Caracteres. Tamaño = 14
- Lo que pretendemos es simular un juego de lotería, que funcione de la siguiente forma: el programa sortea seis números del 1 al 49 y nosotros hemos de adivinar uno de estos números. En los últimos cuadros de texto (TextField5, ..., TextField10) aparecerán los seis números del sorteo, cada vez que hagamos clic en [Sorteo]. Es simplemente para comprobar el funcionamiento del programa (al final, podemos borrarlos).
- El primer problema de nuestro programa, es tener guardados los seis números del sorteo, para ello utilizaremos un array de 6 elementos )números enteros), que deberíamos declarar a nivel de módulo, para que se encuentren “presentes” en los diferentes procedimientos que haremos. Aprovecha también para escribir en el Module1, el programa que abre un formulario:
OpenOffice Basic
Fermí Vilà
BA-57
Observa pues, que declaramos una variable matricial (Loteria) de una dimensión, con seis valores enteros: Loteria(0), Loteria(1), ..., Loteria(5) - Escribe en el Module1 el procedimiento:
Vamos a ver si entendemos el programa: - Definimos cinco variables: • i: es el índice de un ciclo For – To – Next de i=0 hasta i=5, a partir del cual guardaremos en Loteria(i) los números sorteados. • j: es el índice de otro ciclo For – To – Next de j=0 hasta j=i, que servirá para investigar si algún valor de “Lotería” está repetido • NumeroSorteado: representa el número aleatorio de 1 hasta 49 (NumeroSorteado = Int(Rnd*49)+1) • HaSalido: controlará si el numero sorteado ya ha salido • Trabajar: controlará el ciclo Do While – Loop • Básicamente el funcionamiento es: Si el valor de “NumeroSorteado” (número aleatorio entre 1 y 49) es igual a algún valor de “Loteria()”, entonces “HaSalido=1”, y “NumeroSorteado” vuelve a tomar otro número aleatorio entre 1 y 49. Si el valor de “NumeroSorteado” no ha salido, el valor de Loteria(), es igual a dicho número y salimos del Do While – Loop (Trabajar = 0) - Asocia al botón [Sorteo] del Dialog1, el procedimiento anterior (Al Ejecutar = document:Standard.Module1.Lote) - Sitúate en la Hoja1 e inserta un botón de nombre [Lotería] asociado al procedimientoAbreForm. - Ejecuta el programa que hemos hecho hasta ahora: • Clic en [Lotería] de la Hoja1 • Clic en [Sorteo] del formulario. Ejecuta el programa varias veces, para comprobar que los 6 valores de la lotería son distintos. Continuemos ... - Al escribir un número del 1 al 6 en el cuadro de texto TextField3, nos interesa que aparezca en el TextField4 el número correspondiente de la “Lotería” ...
OpenOffice Basic
Fermí Vilà
BA-58
Escribe en el Module1 el procedimiento:
- Accede a las Propiedades (solapa: Acontecimientos) del TextField3, y asigna al “acontecimiento: Texto Modificado” el procedimiento “Orden”. Nos quedará: Texto Modificado = document:Standard. Module1.Orden Esto quiere decir, que sólo por escribir un número (o cambiarlo) en TextField3, en el TextField4 aparecerá automáticamente el número de la “Loteria()”. Pruébalo. -Observa el procedimiento “Orden”: • La variable “i” es el número que escribimos en el tercer cuadro de texto (i = Val(...TextField3 ...)) • La variable “Elemento” es el valor correspondiente del vector Loteria(): Si i=1 entonces Elemento = Loteria(i-1)=Loteria(0) Si i=2 entonces Elemento = Loteria(i-1)=Loteria(1) Etc. • Dicho valor de “Elemento”, se escribe en el cuadro de texto 4: ...TextField4 ... = cStr(Elemento) Para acabar el programa de la lotería: Nos interesa que al escribir un número (del 1 al 49), en el primer cuadro de texto y pulsar [Tab] para pasar a otro control (Al perder el foco), aparezca en el segundo cuadro de texto, un mensaje indicando si lo hemos adivinado o no ...
- Escribe en el Module1:
OpenOffice Basic
Fermí Vilà
BA-59
- Accede a las propiedades (solapa: acontecimientos) del TextField1, y asigna al acontecimiento = “Al perder el foco” el procedimiento document:Standard.Module1.Adivino Sólo nos queda probar exhaustivamente nuestro programa. Recuerda que por último debes grabar nuestro libro Macro16.ods con el mismo nombre.
f) Vamos a hacer un programa, deberíamos hablar de proyecto, que conste de más de un formulario ... Crea una nueva hoja de cálculo de nombre Macro17.ods con su Module1 y dos formularios: Dialog1 y Dialog2 - Crea aproximadamente el siguiente formulario (Dialog1):
- Y el Dialog2:
- Escribe en el Module1:
OpenOffice Basic
Fermí Vilà
BA-60
Observa que declaramos y definimos los dos formularios: AbreForm1: AbreForm2: Cerrar1: Cerrar2:
abre el Dialog1 abre el Dialog2 cierra el Dialog1 cierra el Dialog2
- Crea en la Hoja1 del Macro17, un botón de nombre [Áreas] y asignalo al procedimiento “AbreForm1” - Escribe en el Module1: Sub Salir1Entrar2 Cerrar1 AbreForm2 End Sub Sub Salir2Entrar1 Cerrar2 AbreForm1 End Sub Sub CalcularTriangulo Dim ba As Double, al As Double, ar As Double ba=CDbl(oDialogo1.Model.TextField1.Text) al=CDbl(oDialogo1.Model.TextField2.Text) ar=ba*al/2 oDialogo1.Model.TextField3.Text=cStr(ar) End Sub Sub OtroTriangulo oDialogo1.Model.TextField1.Text="" oDialogo1.Model.TextField2.Text="" oDialogo1.Model.TextField3.Text="" End Sub Sub CalculaCirculo Dim ra As Double, lo As Double, ar As Double If oDialogo2.Model.TextField1.Text<>"" Then ra=CDbl(oDialogo2.Model.TextField1.Text) ar=3.1416*ra*ra lo=2*3.1416*ra oDialogo2.Model.TextField2.Text=cStr(ar) oDialogo2.Model.TextField3.Text=cStr(lo) End If End Sub Sub OtroCirculo oDialogo2.Model.TextField1.Text="" oDialogo2.Model.TextField2.Text="" oDialogo2.Model.TextField3.Text="" End Sub - Asigna: Dialog1 Botón [CALCULAR] (Al Ejecutar) = procedimiento CalcularTriangulo Botón [BORRAR] (Al Ejecutar) = procedimiento OtroTriangulo Botón [CÍRCULO] (Al Ejecutar) = procedimiento Salir1Entrar2
OpenOffice Basic
Fermí Vilà
BA-61
Dialog2 Botón [OTRO] (Al Ejecutar) = procedimiento OtroCirculo Botón [VOLVER] (Al Ejecutar) = procedimiento Salir2Entrar1 TextField1 (Texto Modificado) = procedimiento CalculaCirculo –
Por último graba, ejecuta y prueba exhaustivamente nuestro programa. Espero que te funcione todo correctamente.
OpenOffice Basic
Fermí Vilà
Ejercicios 27) Crea un libro de cálculo de nombre EjerM27.ods, que contenga un cuadro de diálogo que nos permita calcular las tablas de multiplicar de la siguiente forma:
Parece muy complicado de hacer, pero si procedes de la siguiente forma, es muy fácil: Primero: diseña el siguiente “Dialog”:
Segundo: Utilizando el cursor del ratón, selecciona:
- Pulsa [CTRL][C] = copiaremos lo que se encuentra seleccionado - Clic en cualquier sitio para desmarcar. - Pulsa [CTRL][V] = pegaremos lo anterior -Deberás “pegarlo” ocho veces más.
BA-62
OpenOffice Basic
Fermí Vilà
BA-63
Tercero: Cambiar la propiedad “Nombre” de la siguiente forma:
Primera columna de controles = a0, a1, a2, a3, ... a9 Segunda columna de controles = b0, b1, b2, b3, ... b9
Tercera columna de controles = c0, c1, c2, c3, ... c9
Es decir: oDialogo.Model.TextFieldXX.Text = a0, etc, etc. Cuarto: El código correspondiente es muy sencillo si utilizas tres arrays: a(0 To 0), b(0 To 9) y c(0 To 9) - En la primera matriz asignas 1, 2, 3, 4, ....9, 10 - En la segunda matriz asignas a cada elemento el número correspondiente al cuadro de text (tabla del): TextField1 - En la tercera matriz asignas el producto del elemento correspondiente de la primera y segunda matriz
OpenOffice Basic
Fermí Vilà
BA-64
28) Crea un libro de cálculo de nombre EjerM28.ods, que contenga un cuadro de diálogo, que nos permita hacer un estudio estadístico de 10 valores, de la siguiente forma:
29) Crea un libro de cálculo de nombre EjerM29.ods, que contenga un formulario, que nos permita simplificar fracciones. Es decir, se trata de repetir el EjerM17, pero de forma visual:
Si trabajas con variables “Integer”, no podrás “tratar” números como los que aparecen en la ilustración. Prueba en lugar de “Integer”, “Long”. Un Integer es un entero entre –32.768 y 32.767 Un Long es un entero entre –2.147.483.648 y 2.147.493.647 30) En un libro de cálculo de nombre EjerM30.ods, haz un programa que sirva para repasar las tablas de multiplicar, de la siguiente forma: – Considera una función que nos de la nota cualitativa a partir de la cuantitativa (repasa el Prog19 del Macro06.ods) - Inserta un “Dialog” de contenido:
OpenOffice Basic
Fermí Vilà
BA-65
- Utiliza para los controles, los siguientes “Nombres”:
- El problema que nos planteamos, creo que está claro: • Al ejecutar el “Dialog”, escribimos en txtNum el número de multiplicaciones que queremos hacer. • En los cuadros txtUno y txtDos aparecen dos números aleatorios entre 1 y 9. • En el cuadro txtResul escribimos el resultado de la multiplicación que aparece en txtUno y txtDos. • Si la respuesta es correcta, aparece en el cuadro txtCorrec, la frase “Muy Bien” • Si la respuesta es incorrecta, aparece en el cuadro txtCorrec la contestación correcta. • Los cuadros txtBien y txtMal, cuentan el número de respuestas correctas e incorrectas respectivamente. • El botón OTRA sirve para una nueva multiplicación • Al acabarse todas las multiplicaciones: en el cuadro txtNota aparece la nota cualitativa (Excelente, Notable, Bien, etc.)
OpenOffice Basic
Fermí Vilà
BA-66
13.- Cuadros de Diálogo y Hoja de Cálculo Crea un nuevo libro de cálculo de nombre Macro18.ods, que simule en la Hoja1 una base de datos de clientes de la siguiente forma:
- Crea un Module1 y un Dialog1 asociado. - Inserta en el Dialog1 los siguientes controles:
El control que aparece seleccionado es un cuadro combinado (ComboBox1), que podrás hacer a partir del control:
- Lo que pretendemos conseguir es lo siguiente: • Al hacer clic en [Visualizar Clientes]: en el cuadro combinado, se “cargan” los nombres de los clientes que tenemos en el rango B3:B7 • Al hacer clic en [Datos]: en los cuadros de texto del formulario, aparecen los datos (código, nombre, dirección, ...) del cliente que seleccionemos previamente en el Cuadro Combinado - Sitúate en el Module1 y escribe (lo de siempre):
- Veamos el programa que nos permite “cargar” los valores del rango B3:B7 en el cuadro combinado; escribe en el Module1:
OpenOffice Basic
Fermí Vilà
BA-67
- Vamos a ver si entendemos el programa “Cargar”: • oCombo = oDialogo.getControl(“ComboBox1”) A diferencia de lo que sucedía con el control “Cuadro de Texto” (TextField), hemos de “declarar” el cuadro combinado, para poder después, acceder a él. De la forma: NombreDelCuadroCombinado = NombreDelFormulario.getControl(“ComboBox1”) • oCombo.AddItem(Cel.getFormula, i-1) Añade en el cuadro combinado, los elementos (Cel.getFormula), en el mismo orden (i-1 = 0, 1, 2, 3, 4). - Veamos el programa que nos permite “acceder” a los datos del elemento seleccionado en el cuadro combinado; escribe en el Module1:
- Observa de qué forma tan sencilla accedemos al valor seleccionado en el cuadro combinado = oComboText - Asocia al programa Acceder al botón (Al ejecutar) [Datos] - Asocia el programa Cargar al botón [Visualizar Clientes] - Crea un botón de nombre [Clientes], en la Hoja1 del libro Macro18.ods y asócialo al programa “AbreFormulario” - Prueba lo que hemos hecho hasta ahora: • Desde la Hoja1: haz clic en [Clientes] • Clic en [Visualizar Clientes] • Selecciona el cliente que quieras en el cuadro combinado. • Clic en [Datos] Espero que te funcione todo correctamente. - Vamos a mejorar un poco nuestro programa, en efecto: • Sitúate en el Dialog1, selecciona el ComboBox1, accede a sus propiedades (pestaña Acontecimientos) y a la acción Texto Modificado asigna el programa Acceder • Selecciona el botón [Datos] y bórralo. Vuelve a ejecutar el programa.
OpenOffice Basic
Fermí Vilà
BA-68
14.- Facturación Como último ejercicio, te propongo hacer un sencillo programa de facturación ... Crea un nuevo libro de cálculo de nombre Macro19.ods, con el siguiente contenido (en la Hoja1):
En la Hoja2 (cópialo del libro Macro18):
En la Hoja3:
- Inserta dos nuevas hojas, a nuestro libro de la siguiente forma: • Sitúate en la Hoja3 • Menú Insertar Hoja de cálculo ... Posición: Detrás de la hoja actual Núm. De hojas: 2 [Aceptar] - Sitúate en la Hoja4 y crea:
Creo que está claro lo que simula la Hoja4 de nuestro programa de facturación: la base de datos de las facturas realizadas.
OpenOffice Basic
Fermí Vilà
BA-69
Observa que nuestras facturas tienen una serie de limitaciones (limitaciones que tu puedes cambiar, cuando adaptes lo estudiado, en la realización del programa de facturación de tu empresa): • Facturamos un máximo de tres conceptos: Num1 = número de unidades del artículo 1 C.Art.1 = código del artículo 1 Etc. • Sólo disponemos de un iva por factura (no por artículo). • Sólo disponemos de un descuento por factura. • No contemplamos el vencimiento, para simplificar el problema. - Sitúate en la Hoja5 y crea el impreso de factura:
- Cambia el nombre de cada hoja (basta que sitúes el cursor en la pestaña correspondiente y accedas a su menú contextual):
- Crea un Module1 y sitúate en la Hoja1 = MENÚ • Vamos a hacer un programa que nos permita situarnos en la base de datos de Clientes (Hoja2 = CLIENTES), para ello utilizaremos la llamada Grabadora de Macros ... • Desde la Hoja1: MENÚ, haz lo siguiente: Menú Herramientas Macros Grabar macro. Observa que acaba de aparecer una nueva barra de herramientas, con un botón de nombre: [Finalizar grabación]. Atención, todo lo que hagamos ahora, hasta que hagamos clic en [Finalizar grabación], se guardará en un programa. • Haz clic en la pestaña correspondiente a CLIENTES • Clic en la celda A1 de “Clientes” • Clic en [Finalizar grabación] • Selecciona el Module1 de Standard de Macro19.ods (si no lo está ya). • En el campo “Nombre de la macro”, escribe: AClientes y clic en [Guardar] - Sitúate en la hoja MENÚ: • Selecciona el botón [BASE DE DATOS DE CLIENTES], para ello deberás entrar en modo Diseño: clic en de la barra de iconos Campos de control de formulario
OpenOffice Basic
Fermí Vilà
BA-70
•
Menú Contextual Campo de Control Solapa: Acontecimientos Al Ejecutar: Document: Standard.Module1.Aclientes Es decir, acabamos de asociar el programa AClientes, que hemos hecho a partir de la grabadora de macros al botón [BASE DE DATOS DE CLIENTES] - Pruébalo, es decir: clic en [Base de datos de clientes] De hecho, el programa “AClientes” es bastante tonto, ya que es equivalente a dos pulsaciones de ratón: • Clic en la pestaña [CLIENTES] • Clic en A1 de la nueva hoja Precisamente esto, pulsaciones de ratón y teclas, es lo que nos permite “programar” automáticamente la “Grabadora de Macros” Si accedes al Module1 e investigas el contenido de “AClientes”, no te asustes, verás como está codificado “nuestro programa AClientes”. No te preocupes demasiado de su contenido, lo importante es que funciona y es muy fácil de hacer. - Sitúate en la Hoja: CLIENTES y crea una macro que permita volver al Menú... • Desde la Hoja: CLIENTES: Menú Herramientas Macros Grabar macro • Clic en la pestaña: MENÚ • Clic en la celda A1 • Clic en [Finalizar grabación] • Selecciona Module1/Standard/Macro19.ods y en nombre de la macro escribe: AMenu • [Guardar] - Asocia la macro AMenu al botón [VOLVER], que tienes en la Hoja: CLIENTES y pruébalo. - Asocia la macro AMenu al botón [VOLVER] que tienes en la Hoja: ARTÍCULOS y también el la Hoja: HISTÓRICO y también en la Hoja: FACTURA y pruébalo. - Procede de la misma forma para: • Desde “MENÚ” crea una macro de nombre “AArticulos”, que nos sitúe en “ARTÍCULOS”. Asóciala al botón [BASE DE DATOS DE ARTÍCULOS]. • Desde “MENÚ” crea una macro de nombre “AHistorico", que nos sitúe en “HISTÓRICO”. Asóciala al botón [BASE DE DATOS DE FACTURAS] • Desde “MENÚ” crea una macro de nombre “AFactura", que nos sitúe en “FACTURA”. Asóciala al botón [FACTURAR] - Crea otro módulo (Module2), sin más que: desde el editor de Basic, accede al menú contextual de la pestaña “Module1” y “Insertar – Módulo Basic”. Inserta también un formulario (Dialog1). - Escribe en el Module2:
OpenOffice Basic
Fermí Vilà
BA-71
Inserta en el Dialog1:
- Se trata de hacer un programa que calcule el número de factura y también que “cargue” los cuatro cuadros combinados del Dialog1, para ello necesitamos saber el número de clientes y artículos. Veamos, sitúate en Module2 y escribe: Sub Calcula Dim HojCli As Object, HojArt As Object, HojHis As Object Dim Celda As String, CelCli As Object, CelArt As Object Dim CelHi As Object, num As Integer, numCli As Integer Dim numArt As Integer HojCli=ThisComponent.Sheets(1) HojArt=ThisComponent.Sheets(2) HojHis=ThisComponent.Sheets(3) CelHi=HojHis.getCellbyPosition(0,1) Celda=CelHi.getFormula Do While Celda<>"" num=num+1 Celda=HojHis.getCellbyPosition(0,1+num).getFormula Loop oDialogo.Model.TextField1.Text=cStr(num) oCombo1=oDialogo.getControl("ComboBox1") oCombo2=oDialogo.getControl("ComboBox2") oCombo3=oDialogo.getControl("ComboBox3") oCombo4=oDialogo.getControl("ComboBox4") CelCli=HojCli.getCellbyPosition(0,1) Celda=CelCli.getFormula Do While Celda<>"" numCli=numCli+1 Celda=HojCli.getCellbyPosition(1,1+numCli).getFormula oCombo1.AddItem(Celda,numCli-1) Loop oCombo1.RemoveItems(numCli-1,numCli-1) CelArt=HojArt.getCellbyPosition(0,1) Celda=CelArt.getFormula Do While Celda<>"" numArt=numArt+1 Celda=HojArt.getCellbyPosition(1,1+numArt).getFormula oCombo2.AddItem(Celda,numArt-1) oCombo3.AddItem(Celda,numArt-1) oCombo4.AddItem(Celda,numArt-1) Loop oCombo2.RemoveItems(numArt-1,numArt-1)
OpenOffice Basic
Fermí Vilà
oCombo1.RemoveItems(numArt-1,numArt-1) oCombo1.RemoveItems(numArt-1,numArt-1) End Sub - Prueba el funcionamiento del programa anterior, para ello ... • En la Hoja: FACTURA, crea un nuevo botón de nombre [Facturar] y asócialo a AbreFormulario del Module2. • Asigna al botón [Calcula Nº] del Dialog1, el procedimiento anterior (Calcula) • Ejecuta nuestro programa: [FACTURAR] en Hoja1: MENÚ [Facturar] en Hoja5: FACTURA [Calcula Nº] - Vamos a hacer el procedimiento que nos permita colocar los datos del formulario, en la Hoja de Cálculo: FACTURA. Escribe en el Module2: Sub Cancelar oDialogo.endExecute() End Sub Sub Aceptar HojCli=ThisComponent.Sheets(1) Hoj=ThisComponent.Sheets(4) oCombo1=oDialogo.getControl("ComboBox1") oCombo2=oDialogo.getControl("ComboBox2") oCombo3=oDialogo.getControl("ComboBox3") oCombo4=oDialogo.getControl("ComboBox4") Hoj.getCellByPosition(2,5).SetFormula(oDialogo.Model.TextField1.Text) Hoj.getCellByPosition(2,6).SetFormula(oDialogo.Model.TextField2.Text) Hoj.getCellByPosition(3,1).SetFormula(oCombo1.Text) nom=oCombo1.Text x=HojCli.getCellByPosition(1,1).getFormula Do While x<>"" num=num+1 x=HojCli.getCellByPosition(1,1+num).getFormula If x=nom then Hoj.getCellByPosition(3,2).SetFormula(HojCli.getCellByPosition(2,1+num).getFormula) Hoj.getCellByPosition(3,3).SetFormula(HojCli.getCellByPosition(4,1+num).getFormula) Hoj.getCellByPosition(3,4).SetFormula(HojCli.getCellByPosition(5,1+num).getFormula) End If Loop Hoj.getCellByPosition(0,11).SetValue(Val(oDialogo.Model.TextField3.Text)) Hoj.getCellByPosition(0,12).SetValue(Val(oDialogo.Model.TextField4.Text)) Hoj.getCellByPosition(0,13).SetValue(Val(oDialogo.Model.TextField5.Text)) HojArt=ThisComponent.Sheets(2) nom=oCombo2.Text: num=0 x=HojArt.getCellByPosition(1,1).getFormula Do While x<>"" num=num+1 x=HojArt.getCellByPosition(1,1+num).getFormula If x=nom Then Hoj.getCellByPosition(1,11).SetFormula(oCombo2.Text) Hoj.getCellByPosition(2,11).SetValue(HojArt.getCellByPosition(2,1+num).getValue) End If
BA-72
OpenOffice Basic
Fermí Vilà
BA-73
Loop nom=oCombo3.Text: num=0 x=HojArt.getCellByPosition(1,1).getFormula Do While x<>"" num=num+1 x=HojArt.getCellByPosition(1,1+num).getFormula If x=nom Then Hoj.getCellByPosition(1,12).SetFormula(oCombo3.Text) Hoj.getCellByPosition(2,12).SetValue(HojArt.getCellByPosition(2,1+num).getValue) End If Loop nom=oCombo4.Text: num=0 x=HojArt.getCellByPosition(1,1).getFormula Do While x<>"" num=num+1 x=HojArt.getCellByPosition(1,1+num).getFormula If x=nom Then Hoj.getCellByPosition(1,13).SetFormula(oCombo4.Text) Hoj.getCellByPosition(2,13).SetValue(HojArt.getCellByPosition(2,1+num).getValue) End If Loop Hoj.getCellByPosition(1,16).SetValue(Val(oDialogo.Model.TextField6.Text)) Hoj.getCellByPosition(1,15).SetValue(Val(oDialogo.Model.TextField7.Text)) End Sub - Asocia el procedimiento Cancelar, al botón [Cancelar] del Dialog1 y el procedimiento Aceptar al botón [Aceptar] - Prueba el funcionamiento del programa de la siguiente forma: Considera la factura: • Clic en [Calcula Nº], tendremos Factura nº 3 • Fecha: ‘3/7/2009 (debes escribir un apóstrofe antes de introducir la fecha, para no tener problema con el formato de fecha en la hoja de cálculo. De esta forma estamos considerando la fecha como un texto) • Cliente: Eufrasia Martínez • Unidades Artículos 2 Naranjas de la China 3 Pepinillos Variados 4 Té de Ceylan • % IVA: 3 • % descuento: 5 • Clic en [Aceptar] • “Cierra” el formulario Espero que te haya funcionado todo correctamente, ya que en caso contrario no tienes otro remedio que repasarlo, sin prisa, poco a poco. - Supongo que está claro el problema que tenemos pendiente en la Hoja: FACTURA, vamos a introducir las fórmulas correspondientes: • Celda D12: =A12*C12 • Copia la fórmula anterior en D13 y D14 • Celda D15: =SUMA(D12:D14) • Celda D16: =B16*D15/100 • Celda D17: =B17*(D15-D16)/100 • Celda D18: =D15-D16+D17 - El siguiente paso está claro cual es ...
OpenOffice Basic
Fermí Vilà
Grabar la factura, es decir, colocar los datos que tenemos en la Hoja: FACTURA en la Hoja: HISTÓRICO. Escribe en el Module2: Sub GrabarFactura HojCli=ThisComponent.Sheets(1) HojArt=ThisComponent.Sheets(2) HojHis=ThisComponent.Sheets(3) HojFac=ThisComponent.Sheets(4) CelHi=HojHis.getCellByPosition(0,1) Celda=CelHi.getFormula:num=0 Do While Celda<>"" num=num+1 Celda=HojHis.getCellByPosition(1,1+num).getFormula Loop x= HojFac.getCellByPosition(2,5).getValue HojHis.getCellByPosition(0,1+num).SetValue(x) x=HojFac.getCellByPosition(2,6).getFormula HojHis.getCellByPosition(1,1+num).SetFormula(x) y=HojFac.getCellByPosition(3,1).getFormula x=HojCli.getCellByPosition(1,1).getFormula num1=0 Do While x<>"" num1=num1+1 x=HojCli.getCellByPosition(1,1+num1).getFormula If x=y then Cod=HojCli.getCellByPosition(0,1+num1).getFormula HojHis.getCellbyPosition(2,1+num).SetFormula(Cod) End If Loop x=HojFac.getCellByPosition(0,11).getValue HojHis.getCellByPosition(3,1+num).SetValue(x) x=HojFac.getCellByPosition(0,12).getValue HojHis.getCellByPosition(5,1+num).SetValue(x) x=HojFac.getCellByPosition(0,13).getValue HojHis.getCellByPosition(7,1+num).SetValue(x) y=HojFac.getCellByPosition(1,11).getFormula x=HojArt.getCellByPosition(1,1).getFormula num2=0 Do While x<>"" num2=num2+1 x=HojArt.getCellByPosition(1,1+num2).getFormula If x=y then Cod=HojArt.getCellByPosition(0,1+num2).getFormula HojHis.getCellbyPosition(4,1+num).SetFormula(Cod) End If Loop y=HojFac.getCellByPosition(1,12).getFormula x=HojArt.getCellByPosition(1,1).getFormula num3=0 Do While x<>"" num3=num3+1 x=HojArt.getCellByPosition(1,1+num3).getFormula If x=y then Cod=HojArt.getCellByPosition(0,1+num3).getFormula HojHis.getCellbyPosition(6,1+num).SetFormula(Cod) End If Loop y=HojFac.getCellByPosition(1,13).getFormula x=HojArt.getCellByPosition(1,1).getFormula num4=0
BA-74
OpenOffice Basic
Fermí Vilà
BA-75
Do While x<>"" num4=num4+1 x=HojArt.getCellByPosition(1,1+num4).getFormula If x=y then Cod=HojArt.getCellByPosition(0,1+num4).getFormula HojHis.getCellbyPosition(8,1+num).SetFormula(Cod) End If Loop x=HojFac.getCellByPosition(1,15).getValue HojHis.getCellByPosition(10,1+num).SetValue(x) x=HojFac.getCellByPosition(1,16).getValue HojHis.getCellByPosition(9,1+num).SetValue(x) End Sub - Asocia el programa “GrabarFactura” al botón [GRABAR] de la Hoja: FACTURA y pruébalo. - Vamos a hacer un procedimiento que sirva para dejar en “blanco”, la factura.. Escribe el Module2: Sub BorrarFactura Hoj=ThisComponent.Sheets(4) Hoj.getCellByPosition(3,1).SetFormula("") Hoj.getCellByPosition(3,2).SetFormula("") Hoj.getCellByPosition(3,3).SetFormula("") Hoj.getCellByPosition(3,4).SetFormula("") Hoj.getCellByPosition(2,5).SetFormula("") Hoj.getCellByPosition(2,6).SetFormula("") Hoj.getCellByPosition(0,11).SetFormula("") Hoj.getCellByPosition(0,12).SetFormula("") Hoj.getCellByPosition(0,13).SetFormula("") Hoj.getCellByPosition(1,11).SetFormula("") Hoj.getCellByPosition(1,12).SetFormula("") Hoj.getCellByPosition(1,13).SetFormula("") Hoj.getCellByPosition(1,15).SetFormula("") Hoj.getCellByPosition(1,16).SetFormula("") Hoj.getCellByPosition(2,11).SetFormula("") Hoj.getCellByPosition(2,12).SetFormula("") Hoj.getCellByPosition(2,13).SetFormula("") End Sub - Corrige el procedimiento “AbreFormulario”, de forma que su primera línea sea BorrarFactura:
- Abre el formulario, para probar el “BorrarFactura”. Es decir: sitúate en la Hoja: FACTURA y clic en [Facturar] - Crea una macro de nombre “Imprimir” en un módulo nuevo: Module3, que debes asociar al botón [Imprimir] de la Hoja: Factura, que sirva para imprimir la factura, es decir: la macro ha de contener: Menú Archivo Imprimir Selecciona “Páginas” y escribe la última página. [Aceptar] - Si observas la factura impresa, supongo que estarás de acuerdo conmigo, en que no queda demasiado bien los botones en la factura impresa.
OpenOffice Basic
Fermí Vilà
BA-76
Para evitar el problema: • Edita cada botón • Accede a sus propiedades y en la propiedad “Imprimir”, selecciona la opción No - Nuestro simple programa de facturación ya está terminado, solo nos falta probarlo exhaustivamente.