Sie sind auf Seite 1von 76

OpenOffice Basic

Ferm Vil

BA-1

Introduccin a la programacin en OpenOffice.org Basic

Ferm Vil

OpenOffice Basic

Ferm Vil

BA-2

1.- Nuestro primer programa


El OpenOffice Basic es un lenguaje de programacin completo (es una versin de BASIC), que nos permite crear aplicaciones visuales interactivas y completas por medio de nuestro OpenOffice. - Ejecuta el OpenOffice Calc - Asegrate 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 clculo (que de momento est vaco) 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 pestaa 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 lneas, precedidas por REM representan comentarios para el programador. Es decir a efectos de programa tanto da dejar la lnea 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 dilogos.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 clculo, aparece la frase Hola Mundo Sitate en el Editor del Basic para visualizar el programa, es decir: Men Herramientas Macros Organizar macros OpenOffice.org Basic ... [Editar] 1) Bsicamente 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 tambin subprocedimiento): Sub NombreDelPrograma Sentencia 1 Sentencia 2 Sentencia 3 ... ... End Sub 3) Las primeras lneas de un programa se usan normalmente para declarar los elementos que utilizaremos en el programa. Para ello, en el BASIC, se utiliza la clusula Dim: Dim Hoj As Object Dim Cel As Object Declaramos dos objetos (nuestro BASIC, permite la POO: programacin orientada a objetos), que sern, el primero una hoja de clculo 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 continuacin. 5) Cel = Hoj.getCellByPosition(3,8) Definimos el objeto Cel como la celda de la Hoja de clculo (Hoj) de coordenadas (3,8). Coordenadas de una celda = (X , Y) 1 coordenada: X , nmero de columna = x + 1 2 coordenada: Y , nmero de fila = y + 1 Es decir: Nmero de columna = 3 + 1 = 4, por lo tanto: A, B, C, D Nmero 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 parntesis.

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 ... - Sitate en el Editor del Basic del Macro01 y escribe (a continuacin del Prog01):

- Sitate en la Hoja 1 del Macro01.ods Graba el libro de clculo: 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 ms que una propiedad o un mtodo (accin). Es decir, en nuestro caso: Objeto1.SubObjetoA.SubObjetoB.Mtodo Objeto1 = ThisComponent (este componente, en nuestro caso un libro de clculo) SubObjetoA = Sheets(1) (la hoja 2 del libro anterior) SubObjetoB = getCellByPosition(1,1) (la celda B2 del objeto anterior) Mtodo = SetFormula(Hola Mundo) (accin = escribe en el objeto anterior, Hola Mundo) - Borra el Hola Mundo de la Hoja2 y sitate en la Hoja1 Vamos a ejecutar nuestro Prog02, utilizando un botn ...

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 de la nueva barra.

- Clic en el botn:

Segn la versin de OpenOffice, la imagen del botn puede ser diferente. - Marca un recuadro que abarque la celda B2 (estamos en la Hoja1) aproximadamente:

- Con el botn que acabamos de crear seleccionado, accede a su men contextual. Selecciona la opcin: Campo de Control... Solapa: General Propiedad Ttulo: borra Botn y escribe en su lugar Prog02 Solapa: Acontecimientos Sita el cursor de escritura en el campo Botn del ratn pulsado y clic en su [...] [Asignar] Mis macros Standard Module 1 - Prog02 [Aceptar] [Aceptar] Cierra la ventana Propiedades: Botn (clic en la X de su extremo superior derecho)

Haz clic en el icono Modo Diseo: para salir del modo diseo y volver al modo ejecucin. Segn la versin de OpenOffice, la imagen del botn puede ser diferente. Vamos a probar el botn: - 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 cirrala

3.- Cuadros de dilogo estndard


En los programas anteriores, hemos utilizado celdas de una hoja de clculo, para escribir resultados. Aparte de los cuadros de dilogo personalizados, que veremos ms adelante, podemos utilizar los llamados Cuadros de dilogo estndar. - Crea una hoja de clculo nueva (Men Archivo Nuevo Hoja de Clculo) y grbala 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 vers que aparecen los programas Prog01 y Prog02. Por defecto, al crear un programa, nos colocamos automticamente en Mis macros y al escribir el o los programas en el Standard de Mis macros, stos sern 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 botn para ejecutar el Prog03, es decir: Con la barra Campos de control de formulario a la vista.

Clic en el icono Botn: Marca un recuadro que abarque a la celda B2 (un poco ms grande) Accede al men contextual del botn acabado de insertar Haz clic en la opcin Campo de Control... Establece como propiedad Ttulo: Prog03 (Solapa: General) Pestaa: Acontecimientos En el campo Botn del ratn pulsado, asigna el programa Prog03 de Macro02.ods (Standard Module1) Sal del modo diseo: clic en el icono Modo Diseo:

- Prueba el funcionamiento del botn; si todo va bien, tendremos:

- Crea otro botn, pero ahora asociado al Prog04:

En este caso tendremos:

OpenOffice Basic

Ferm Vil

BA-7

Est claro que el cuadro de dilogo MsgBox tiene muchas posibilidades, ya las estudiaremos ms adelante en detalle. Ahora nos interesa un cuadro de dilogo que nos permita entrar datos ... Sitate en el Editor del Basic del Macro02.ods y escribe el siguiente programa:

- Sitate en la Hoja1 del Macro02.ods y crea un botn que has de asociar al Prog05:

- Ejecuta el Prog05, es decir, clic en [Prog05]. Si todo funciona correctamente, debera pasar algo as:

- Vamos a estudiar el Prog05 (sitate 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 dilogo estndar, que contiene un mensaje (que es lo que escribimos entre comillas y parntesis) 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 vaco, se entiende como un texto (ya veremos cuando necesitemos un nmero) y se guarda en la variable de nombre nom. MsgBox mensaje1 & variable1 & mensaje2 & Chr$(13) & variable2 ... Observa en primer lugar, el operador de concanetacin (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 pulsacin de un [Return], o si t quieres: fuerza a una nueva lnea lo que viene a continuacin.

OpenOffice Basic

Ferm Vil

BA-8

Para acabar este apartado, vamos a hacer un programa que mezcle los cuadros de dilogo estndar y los elementos de nuestros documentos Calc (celdas en nuestro caso)... - Sitate en el Editor del Basic y escribe:

- Sitate en Macro02.ods Crea un botn asociado a Prog06 Prueba el funcionamiento del programa Espero que te funcione correctamente Graba el libro de clculo con el mismo nombre Macro02.ods

4.- Tipos de Variable


OpenOffice Basic soporta los tipos numricos, 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 mtodos. Si usamos Dim:los tipos numricos son inicializados en cero y las cadenas como la cadena vaca Los tipos ms 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 carcter $ al final del nombre, automticamente definimos un String Es decir: Dim nom$ es equivalente a Dim nom As String - Tipo Integer: nmero entero Nmero de 32.768 a +32.767 Dim x%

Es equivalente a y

Dim x As Integer +2.147.483.647

- Tipo Long: nmero largo Nmero entero entre: -2.147.483.648 - Tipo Double: nmero decimal

- Crea un nuevo libro de clculo, que debers grabar como Macro03.ods en TuCarpeta - Accede al Editor del Basic (debers crear un Module1) del Macro03 y escribe el siguiente procedimiento:

- Sitate en el Macro03.ods y crea un botn de ttulo: Prog07, asociado al procedimiento Prog07. - Ejecuta el procedimiento Prog07 de la siguiente forma:

OpenOffice Basic

Ferm Vil

BA-9

Veamos:

Clic en [Prog07] Ante la primera ventana, haz lo que te dice el programa: Escribe lo que quieras y [Aceptar] o pulsa[Return] Nmero de Columna ?, escribe 5 y [Return] Nmero de Fila ?, escribe 7 y [Return] Si todo funciona correctamente, en la celda E7 (quinta columna, septima fila), aparece lo que has escrito primeramente.

- Sitate en el Editor del Basic y observa: Declaramos x e y como Integer ya que representarn las coordenadas de una celda InputBox ( ) devuelve un texto. Val(InputBox( )) devuelve un nmero. Dicho de otra forma: Val es una funcin que convierte una cadena que representa nmeros, en dichos nmeros (integer). - Sitate en el Editor del Basic de Macro03.ods y escribe el siguiente procedimiento:

- Sitate en el Macro03.ods y crea un botn de Ttulo = Prog08, asociado al procedimiento Prog08 - Ejecuta el procedimiento de la siguiente forma: Clic en [Prog08] Escribe como base del rectngulo 3,07 Escribe como altura del rectngulo 2,15 Si todo funciona correctamente en la celda B21, tendremos el nmero 6,6005 (siempre y cuando aumentemos el nmero de decimales) Veamos: - Sitate 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 funcin CDbl( ), convierte una cadena de caracteres en nmero double Cel.SetValue(bas*alt) bas*alt es un nmero. La funcin que escribe un nmero en una celda es SetValue. De la misma forma que lo hace SetFormula si es un texto.

Sitate en el Editor del Basic de Macro03.ods y escribe el siguiente procedimiento:

- Sitate en Macro03.ods y crea un botn 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 (debers aumentar el nmero de decimales de la celda)

Veamos: - Sitate en el Editor del Basic y observa: Coordenadas = (6,6) = 7 columna 7 fila = G7 longi =2*pi*radi Asignamos (el operador de asignacin 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 nmeros: pi = & pi - Sitate en el Editor del Basic de Macro03.ods y escribe el siguiente procedimiento:

- Sitate en Macro03.ods y crea un botn de Ttulo = Prog10, asociado al procedimiento Prog10 - Ejecuta el procedimiento de la siguiente manera: Clic en el botn [Prog10] Base del tringulo = 3,75 Altura del tringulo = 2,17 Si todo funciona correctamente tendremos:

- Observa el Prog10, el nico elemento nuevo es cStr(), funcin que convierte un nmero 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 continuacin (operador &) el texto bas ya que la funcin cStr, lo convierte en texto. - Para acabar este apartado: sitate en el Module1 y escribe el siguiente procedimiento:

OpenOffice Basic - Escribe en la Hoja1:

Ferm Vil

BA-11

Siendo en botn [Calcular], el botn de Ttulo= 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)... - Sitate 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): 5columna, 3 fila. Cel2, representa la celda E5 ya que Cel2=Hoj.getCellByPositiuon(4,4): 5 columna, 5 fila En Cel1 nostros escribimos un dato (numrico): para que el programa lo recoja hacemos Cel1.getValue,concretamente lo asignamos a la variable radi: radi=Cel1.getValue Si fuera texto, haramos: Cel1.getFormula En Cel2 el programa ha de escribir un nmero, es decir: Cel2.SetValue(). Si fuera texto, escribiramos: Cel3.SetF0rmula()

OpenOffice Basic

Ferm Vil

BA-12

Ejercicios
1) Crea un nuevo libro de clculo de nombre EjerM01.ods que contenga un procedimiento de nombre EjerM01, que se ejecute con un botn y funcione de la siguiente forma: - El programa nos pregunta nuestro nombre - El programa nos pregunta nuestra edad (en aos, claro) - El programa escribe en la hoja de clculo, nuestro nombre y a continuacion los das que tenemos de vida hasta el momento, de la siguiente forma:

2) Crea un nuevo libro de clculo de nombre EjerM02.ods que contenga un procedimiento de nombre EjerM02, que se ejecute con un botn y haga lo siguiente: - El programa nos pide un nmero entero - El programa nos muestra el doble, el triple y el cuadruple del nmero que habamos introducido de la siguiente forma:

3) Crea un nuevo libro de clculo de nombre EjerM03.ods, que contenga dos procedimientos de nombre EjerM03 y EjerM03bis que funcionen de la siguiente forma:

El botn [Calcular] est asociado al EjerM03 que calcula el determinante y el botn [Otro], que corresponde al EjerM03bis, lo nico que hace es asignar la cadena vaca () a las cuatro celdas. Observa que en nuestro programa no hay ningn InputBox ni MsgBox.

OpenOffice Basic

Ferm Vil

BA-13

5.- La estructura If then End If


Crea un nuevo libro de clculo y grbalo con el nombre Macro04.ods en TuCarpeta Accede al Editor del Basic (debers crear el Module1 en Macro04.ods) y escribe el siguiente programa:

- Sitate en la hoja de clculo. Crea un botn asociado al procedimiento Prog12 y prubalo. - 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 funcin InputBox, hemos escrito dos parmetros: el primero Estructura IF THEN ESLSE, es el que aparece en el interior del cuadro inputbox y el segundo no es ms que el ttulo de la ventana InputBox:

Si escribimos un solo argumento, ste es el mensaje que aparece en el interior del cuadro, y no aparece ningn ttulo en la ventana. Observa la estructura de programacin IF THEN ELSE. Constituye la estructura de programacin ms simple: Si se cumple la condicin, 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. Bsicamente, con la estructura IF THEN ELSE, conseguimos una bifurcacin del programa: el si entonces o el caso contrario. Veamos, que no nicamente representa una bifurcacin, en el siguiente procedimiento (debido a que utilizamos todas las posibilidades de la estructura). - Sitate en el Editor del Basic de Macro04 y escribe el siguiente procedimiento:

OpenOffice Basic

Ferm Vil

BA-14

- Sitate en la hoja de clculo (no te olvides de ir grabando los cambios). Crea un botn asociado al procedimiento Prog13 y prubalo como mnimo tres veces: para un nmero mayor de 100, para un nmero menor de 100 y escribiendo precisamente el 100. Espero que te funcione correctamente: Observa en definitiva, la sintaxis completa de la estructura: If condicin1 Then Sentencia 1 Sentencia 2 ... ElseIf condicin2 Then Sentencia 3 Sentencia 4 ... ElseIf condicin3 Then Sentencia 5 Sentencia 6 ... ... ... Else Sentencia 7 Sentencia 8 ... End If Debes tener en cuenta que las lneas de programa: sentencia 7, sentencia 8, ... slo se ejecutarn si no se cumple ninguna de las condiciones que hemos considerado en la estructura.

6.- Contadores. Operadores Lgicos


Crea un nuevo libro de clculo y grbalo con el nombre Macro05.ods en TuCarpeta Accede al Editor del Basic (debers crear el Module1 en Macro05) y escribe el siguiente procedimiento:

OpenOffice Basic

Ferm Vil

BA-15

- Sitate en la hoja de clculo (Hoja1). Crea un botn asociado al procedimiento Prog14 y prubalo:

- 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 lnea demasiado larga, podemos redistribuirla en varias lneas, sin ms que escribir el smbolo de subrayado al final de la lnea (o cada lnea), precedido de un espacio. Es decir: las lneas de programa: s = s + Valor de x despus de pasar por el contador x=x+3 + Chr(9) + _ cStr(x)) + Chr(10) son en realidad una sla lnea. Declaramos una cadena: Dim s As String y la inicializamos a nada: s=. No sera necesario ya que al declararla, automticamente se inicializa a nada. x=x+3 es un contador, instrumento muy utilizado en programacin, que nos permite aadir 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 funcin Chr(9) es equivalente a pulsar la tecla de tabulacin: [Tab] La funcin 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 disminutndolo en 2 unidades y en el segundo lugar multiplicndolo por 3. El operador suma entre Strings se comporta como el operador de concatenacin &. 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 prctica, acumulamos en s muchos datos, que al incluir el Chr(9) y el Chr(10) se organizan en diferentes lneas (Chr(10)) y columnas (Chr(91)). Observa la tcnica que utilizamos en este procedimiento: Acumulamos en s una serie de datos, durante la ejecucin 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

- Sitate en la hoja de clculo (Hoja1). Crea un botn asociado al procedimiento Prog15 y ejectalo 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 carcter. Or Significa, evidentemento o - Escribe el siguiente procedimiento:

- Crea un botn asociado al programa Prog16 y ejecuta el programa unas cuantas veces, buscando detenidamente lo que sucede: observa qu tcnica ms sencilla tenemos, para interrumpir un programa o volver a empezar. Acabamos de ver un programa con el operador lgico Or, vamos a ver ahora uno con el operador lgico And: utilizaremos este operador cuando sea preciso que para ejecutar un bloque de instrucciones se cumpla ms de una condicin. Observa que debern cumplirse todas las condiciones ... - Escribe en el Macro05.ods el siguiente procedimiento:

- Crea un botn 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, podramos pensar que es mejor no declarar las variables. Pero hay un problema: el tipo Variant es el que consume ms memoria. La conclusin, 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 lnea. Viene a ser el operador contrario al carcter de subrayado, precedido de un espacio en blanco, que nos permita separar en varias lneas, una nica sentencia.

7.- Otras estructuras de programacin


Crea un nuevo libro de clculo y grbalo con el nombre Macro06.ods en TuCarpeta Accede al Editor de Basic (debers crear el Module1 en Macro06.ods) y escribe el siguiente procedimiento:

- Crea un botn (en Hoja1), asociado al procedimiento Prog18 y ejecuta el programa unas cuantas veces.

OpenOffice Basic

Ferm Vil

BA-18

- La estructura de programacin Select Case Select Case variable Case a Sentencia1 Sentencia2 ... Case b Sentencia3 Sentencia4 ... Case Else Sentencia5 Sentencia6 ... End Select Viene a ser una generalizacin de la estructura If Then: segn el valor de la variable, se ejecutarn unas sentencias u otras. Veamos a continuacin una generalizacin 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 nmero total de preguntas") bien=Val(InputBox("Escribe el nmero 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 & "Nmero de preguntas =" & num & Chr(10) s=s & "Nmero 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("Nmero de preguntas " & cStr(num)) Cel3.SetFormula("Nmero 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 botn asociado al procedimiento anterior y ejectalo varias veces, para comprobar su funcionamiento.

Veamos a continuacin otra estructura de programacin, en esta ocasin de tipo repetitivo. - Escribe en el Editor de Basic del Macro06.ods el siguiente procedimiento:

- Crea en Hoja1 un botn asociado al procedimiento Prog20 y ejectalo varias veces, para comprobar su funcionamiento.

- Estudio del Prog20 La estructura For To Next For indice = nmero1 To nmero2 Sentencia 1 Sentencia 2 Sentencia 3 ... Next

OpenOffice Basic

Ferm Vil

BA-20

El bloque de sentencias 1, 2, 3, ... se repiten desde el nmero1 hasta el nmero2 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 ms el nuevo nmero Valor.

- Escribe en el Editor de Basic de Macro06.ods el procedimiento:

- Crea un botn asociado al procedimiento Prog21y ejecuta el programa. Si todo funciona correctamente, se rellenar el rango H11:H15 de los nmeros 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 botn 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 botn 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 botn, en la Hoja2 de Macro06.ods, asociado al procedimiento Prog24 y ejectalo varias veces. - La estructura de programacin Do While - Loop Do While condicin Sentencia1 Sentencia2 ... Loop Mientras se cumpla la condicin, se repetir la ejecucin de las sentencias 1, 2, etc. - Escribe en el Editor de Basic del Macro06.ods el siguiente procedimiento:

- Crea un botn, en la Hoja2, asociado al procedimiento Prog25 y ejectalo. - En el Prog16 vimos una forma de volver a empezar, pero slo una vez, en cambio en el Prog25 gracias a la estructura Do While Loop, disponemos de una tcnica para repetir la ejecucin 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 algn valor en el InputBox correspondiente al campo nombre, de forma que si al preguntar el nombre, no escribimos nada, se terminar la ejecucin del bloque correspondiente al Do While Loop

OpenOffice Basic - Escribe:

Ferm Vil

BA-22

Crea un botn asociado al procedimiento Prog26 y ejectalo varias veces. Debes tener en cuenta que las celdas de la hoja de clculo correspondientes a una fecha, debers formatearlas as: como fechas. Al introducir una fecha utilizando el InputBox, por defecto, debers utilizar la notacin inglesa: primero el mes y despus el da.

Graba el libro de clculo Macro06.ods con el mismo nombre.

Crea un nuevo libro de clculo, que debers grabar como Macro07.ods en TuCarpeta y crea un Module1

Programa que suma todos los nmeros que queramos - Escribe en el Editor de Basic de Macro07 el siguiente procedimiento:

OpenOffice Basic

Ferm Vil

BA-23

- Crea un botn, en la Hoja1 de Macro07, asociado al procedimiento anterior y ejectalo unas quantas veces.

OpenOffice Basic

Ferm Vil

BA-24

Programa que nos resuelve una equacin 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 ecuacin de 2 grado") Else b=CDbl(InputBox("Coeficiente de x= ")) Hoj.GetCellByPosition(4,1).SetFormula("Coeficiente de x = " & cStr(b)) c=CDbl(InputBox("Trmino independiente = ")) Hoj.GetCellByPosition(4,2).SetFormula("Trmino Independiente = " & cStr(c)) dis=b^2-4*a*c If dis=0 then x=(-b)/(2*a) Hoj.GetCellByPosition(4,4).SetFormula("La ecuacin tiene una solucin = " & 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 botn, en la Hoja1 de Macro07, asociado al procedimiento anterior y ejectalo para los casos: a=0 a=1 ; b=1 ; c=1 a=1; b=-4; c=4 a=1; b=1; c=-6 Prubalo tambin para valores decimales. - Nota que la funcin Sqr(), es una funcin incorporada al Basic del OpenOffice, que nos permite calcular la raz cuadrada de un nmero..

OpenOffice Basic

Ferm Vil

BA-25

Suma y Producto de los mltiplos de 2 inferiores a 30 - Escribe en el Editor del Basic del Macro07 el siguiente procedimiento:

- Crea un botn, en la Hoja1 de Macro07, asociado al procedimiento anterior y ejectalo para probarlo

Clculo del factorial de un nmero - Escribe en el Editor del Basic de Macro07.ods el siguiente procedimiento:

- Crea un botn, en la Hoja2 de Macro07 asociado al Prog30 y prubalo varias veces. - Recuerda que el factorial de un nmero 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 mltiplos del nmero que queramos, por ltimo nos da la suma y el producto de todos ellos. - Escribe:

- Crea un botn en la Hoja2 de Macro07 asociado al Prog31 y pubalo varias veces

OpenOffice Basic

Ferm Vil

BA-27

Tabla de valores de la funcin y = x2 5x + 10 - Escribe en el Editor del Basic del Macro07.ods, el siguiente procedimiento:

- Crea un botn, en la Hoja2 de Macro07, asociado al Prog32 y ejectalo.

OpenOffice Basic

Ferm Vil

BA-28

Clculo de la hipotenusa de un tringulo rectngulo. El programa tiene la opcin de volver a empezar. - Escribe en el Editor del Basic del Macro07.ods, el programa:

- Crea un botn, en la Hoja2 de Macro07 asociado al Prog33 y calcula unas cuantas hipotenusas...

- Observa: UCase(cadena): es una funcin incorporada al OpenOffice Basic, que transforma todas las letras de cadena a maysculas. Es decir, que escribir: UCase(opc) = S es equivalente a escribir: opc = S Or opc = s, pero ms corto.

OpenOffice Basic Programa que calcula el nmero e

Ferm Vil

BA-29

- Escribe en el Editor del Basic del Macro07, el siguiente programa:

- Crea un botn, en la Hoja2 de Macro07 asociado a Prog34 y ejectalo ...

- Observa: Exp(nmero) es una funcin incorporada al OpenOffice Basic, que nos da como resultado e elevado al nmero. Por lo tanto: Exp(1) = e

OpenOffice Basic

Ferm Vil

BA-30

Ejercicios
4) Crea un nuevo libro de clculo de nombre EjerM04.ods que contenga un procedimiento de nombre EjerM04, que haga lo siguiente: - El procedimiento nos pide que escribamos dos nmeros positivos menores de 57 - El programa nos da como resultado el producto de los dos nmeros - Si los nmeros 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 clculo de nombre EjerM05.ods que contenga un procedimiento de nombre EjerM05 que haga lo siguiente: El programa nos va pidiendo nmeros, hasta que escribimos el nmero 9999, por ltimo el programa nos da como resultado el nmero de nmeros introducidos, exceptuando el 9999 6) Crea un nuevo libro de clculo de nombre EjerM06.ods que contenga un procedimiento de nombre EjerM06 que haga lo siguiente: El programa escribe todos los mltiplos de 23 inferiores a 1000 y por ltimo nos da la suma de todos ellos. 7) Crea un nuevo libro de clculo de nombre EjerM07.ods, que contenga un procedimiento de nombre EjerM07 que haga lo siguiente: - El programa hace una tabla de valores de la funcin y = sen(7x-5) - El programa nos pide los dos valores de x (valores mximo y mnimo de la tabla de valores - El programa nos pide el incremento (variacin) de la x. 8) Crea un nuevo libro de clculo de nombre EjerM08.ods que contenga un procedimiento de nombre EjerM08, que sirva para calcular un cateto de un tringulo rectngulo 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 clculo 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 clculo 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 debera ser de la forma:

11) Haz un nuevo libro de clculo de nombre EjerM11.ods, que contenga un procedimiento de nombre EjerM11 que escriba los 15 primeros mltiplos 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 clculo de nombre EjerM12.ods, que contenga un procedimiento de nombre EjerM12, que sirva para calcular el rea de un tringulo o el rea de un rectngulo o el rea de un crculo. El programa ha de tener la posibilidad de volver a empezar. 13) Crea un nuevo libro de clculo 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 adems nos d el mdulo de los dos vectores y tambin el mdulo 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) Mdulo de v =

a 2 + b2 + c 2

La salida debera ser de la forma:

14) Crea un nuevo libro de clculo de nombre EjerM14.ods, que contenga un procedimiento de nombre EjerM14, y que funcione de la siguiente forma: El programa nos pide un nmero y da como resultado la tabla de multiplicar del nmero introducido. 15) Crea un nuevo libro de clculo de nombre EjerM15.ods, que contenga un procedimiento de nombre EjerM15, y que funcione de la siguiente forma: El programa calcula el nmero 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 clculo, que has de grabar con el nombre Macro08.ods en TuCarpeta. Crea un Module1 y sitate en su interior para escribir:

- Crea un botn en la Hoja1 del Macro08.ods, asociado al procedimiento anterior y ejectalo, 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 dimensin. Y no es ms que una variable que consta de tres nmeros Double, en realidad tres variables double. Para acceder a los elementos de nuestro array hemos de utilizar la notacin: 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 ms 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 da 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 botn en la Hoja2 del Macro08.ods, asociado al procedimiento anterior y ejectalo:

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 intil. Vamos a modificar el procedimiento anterior para que nos calcule el nmero total de horas trabajadas a la semana ... Escribe en el Module1 de Macro08.ods:

- Crea un botn en la Hoja2 del Macro08.ods, asociado al programa Prog37 y ejectalo Si todo funciona correctamente:

- Escribe en el Macro08, el procedimiento:

OpenOffice Basic

Ferm Vil

BA-34 -

Crea un botn en la Hoja2 del Macro08.ods, asociado al procedimiento Prog38 y ejectalo varias veces. - Observa de qu forma definimos un array dinmico: al principio del programa, no sabemos el nmero de elementos (Dim x() As Double); cuando ya sabemos el nmero de elementos: ReDim x(nmero) As Double

Programa que calcula, dada una serie de 5 nmeros, la media aritmtica, las desviaciones respecto a la media, la desviacin media, la varianza y la desviacin tpica.

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 estadstica: " & Chr(10) For i=1 To 5 num(i)=CDbl(InputBox("Nmero?")) s=s & cStr(num(i)) & Chr(10) sum=sum+num(i) Next med=sum/5 s=s & Chr(10): s=s & "Media Aritmtica = " & 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 & "Desviacin Media = " & cStr(desmed) s=s & Chr(10) s=s & "Varianza = " & cStr(vari) & Chr(10)

OpenOffice Basic

Ferm Vil

BA-35

s=s & "Desviacin Tpica = " & cStr(dt) MsgBox s End Sub - Crea un botn 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 funcin a un bloque de cdigo 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 inclusin de ms procedimientos. Una funcin es lo mismo que un procedimiento con la salvedad, que la funcin devuelve un valor al procedimiento o funcin que lo llama. - Crea un nuevo libro de clculo, que debers grabar como Macro09.ods en TuCarpeta. Crea un Module1 y escribe:

- Crea un botn en la Hoja1 del Macro09.ods, asociado al procedimiento Prog40 y ejecuta el programa varias veces. Observa la sintaxis de una funcin: declaramos los parmetros (en nuestro caso v1 y v2) y declaramos tambin el tipo de dato que devuelve la funcin, Integer en nuestro caso.

OpenOffice Basic

Ferm Vil

BA-36

Observa de qu forma llamamos a una funcin: NombreFuncin (lista de parmetros), en nuestro ejemplo: Suma(n1,n2) - Vamos a trabajar con ms funciones ... Sitate en el Module1 del Macro09 y escribe:

- Crea en Hoja1 de Macro09.ods dos botones de nombre: [Prog41] y [Prog42] asociados a los procedimientos 41 y 42 y ejectalos:

Vamos a por otra funcin ... - Escribe en el Module1 del Macro09:

- Crea en Hoja1 de Macro09.ods un botn de nombre [Prog43] asociado al procedimiento Prog43 y ejectalo. - Escribe en el Module1 del Macro09.ods:

OpenOffice Basic

Ferm Vil

BA-37

- Crea en la Hoja1 del Macro09, un botn de nombre [Prog44] asociado al procedimiento Prog44 y ejectalo.

10.- Nmeros Aleatorios


- Crea un nuevo libro de clculo, que debers 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 ejectalos. - La funcin RND Cada vez que el ordenador procesa una lnea que contiene la sentencia Rnd, en la celda correspondiente aparece un nmero aleatorio, decimal entre 0 y 1. El nmero puede ser cero, pero nunca 1. El nmero de decimales es 14 (recuerda que en la hoja de clculo, por defecto aparecen slo 2) En realidad la serie de nmeros Rnd es pseudoaleatoria, para conseguir que la funcin Rnd genere verdaderos nmeros 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 Y=6*Rnd Z=Int(6*Rnd) W=Int(6*Rnd)+1 En general: Int((y-x)*Rnd+x) Int((y+1-x)*Rnd+x) nmero entero aleatorio entre x e y (incluido x, excluido y) nmero entero aleatorio entre x e y (incluidos los dos) 0 X<1 0 Y<6 0 Z<6 0<W 6 X nmero decimal Y nmero decimal Z nmero entero entre 0 y 6 (puede ser 0, pero no 6) W nmero entero entre 0 y 6 (no puede ser 0, pero s 6) Es decir: W = 1, 2, 3, 4, 5 o 6

- 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 parchs") For i=1 To 10 Hoj.getCellByPosition(7,5+i).SetValue(Int(6*Rnd)+1) Next

OpenOffice Basic

Ferm Vil

BA-39

End Sub Sub Prog48 Dim s As String, i As Integer Dim x As Double, y As Double Randomize s="Nmeros Aleatorios " & Chr(10) s=s & "10 nmeros aleatorios entre 0 y 1" & Chr(10) For i=1 to 10 s=s & cStr(Rnd) & " - " Next s=s & Chr(10) s=s & "10 nmeros 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 nmeros 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 nmeros 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 ejectalos.

11.- Funciones con y sin retorno de parmetros


- Crea un nuevo libro de clculo, que debers 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 nmero entero")) y=Val(InputBox("Escribe otro nmero entero")) MsgBox "La media geomtrica 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 slo contiene una llamada ' a una funcin

OpenOffice Basic

Ferm Vil

BA-40

mediageo End Sub Sub Prog50 Dim x As Integer, y As Integer x=Val(InputBox("Escribe un nmero entero")) y=Val(InputBox("Escribe otro nmero entero")) MsgBox "La Media Geomtrica 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 ejectalos. El primer tipo de funcin (mediageo) se dice que es una funcin sin retorno de parmetros. El segundo tipo (mediageo2) es una funcin que retorna parmetros. Programa que determina si un nmero es primo, utilizando una funcin - 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 nmero entero")) If Primo(num)="S" then Hoj.getCellByPosition(1,0).SetFormula("El nmero " & cStr(num) & " es primo" Else Hoj.getCellByPosition(1,0).SetFormula("El nmero " & cStr(num) & " no es primo" End If End Sub - Crea en la Hoja1 de Macro11.ods un botn de nombre [Prog51] asociado al programa anterior y ejectalo varias veces. - La funcin Primo aunque complicada, es importante porque contiene elementos nuevos: resto = x Mod i Mod es el operador que nos da el resto de la divisin entera (en nuestro caso entre x e i) Exit For Forzamos la salida del bucle For To Next

OpenOffice Basic

Ferm Vil

BA-41

Programa que calcula el M.C.D. de dos nmeros, utilizando una funcin Antes de todo recordemos el Algoritmo de Euclides para el clculo del M.C.D. Por ejemplo, para calcular el mcd(38,48), hemos de seguir el siguiente proceso: 1.- necesitamos saber el nmero 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 divisin 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.if a<b then aux = a a=b b = aux end if A partir de este momento a es el mayor y b el menor if a mod b = 0 then resto = b end if do while a mod b <> 0 resto = a mod b a=b b = resto loop mcd = resto

2.-

3.-

4.-

- 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<b Then aux=a a=b b=aux End If If a Mod b=0 Then resto=b End If Do While a Mod b <> 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 nmero")) y=Val(InputBox("Escribe otro nmero")) Hoj.getCellByPosition(1,5).SetFormula("El MCD de " & cStr(x) & _

OpenOffice Basic

Ferm Vil

BA-42

" y " & cStr(y) & " es " & cStr(MCD(x,y)) End Sub - Crea en la Hoja1 de Macro11.ods un botn de nombre [Prog52], asociado al ltimo procedimiento y ejectalo varias veces: MCD(5,25) = 5 MCD(7,3) = 1 MCD(720,300) = 60

Adivinanzas Vamos a hacer un programa que nos pregunte un nmero 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 nmero era " & cStr(x)) End If End Sub - Crea un botn asociado al Prog53 y ejectalo 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

BA-43

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 botn asociado al Prog54 y ejectalo varias veces.

OpenOffice Basic

Ferm Vil

BA-44

Ejercicios
16) Crea un libro de clculo de nombre EjerM16.ods que contenga un procedimiento de nombre EjerM16, que sirva para calcular el mnimo comn mltiplo de dos nmeros utilizando la funcin MCD del procedimiento Prog52 (debers copiarla en el EjerM16) y sabiendo que mcm(x,y) = x*y/MCD(x,y) 17) Crea un libro de clculo de nombre EjerM17.ods, que contenga un procedimiento de nombre EjerM17, que sirva para simplificar una fraccin numrica, debers utilizar la funcin MCD del ejercicio anterior. Observa:

a a / MCD( a , b) = b b / MCD( a, b)
La salida debera ser de la forma:

18) Crea un libro de clculo de nombre EjerM18.ods, que contenga un procedimiento de nombre EjerM18, que sirva para sumar o restar dos fracciones y despus simplifique el resultado. Observa:

a c a ( mcm(b, d ) / d ) + c( mcm(b, d ) / d ) + = b d mcm(b, d )


La salida debera ser:

19) Crea un libro de clculo de nombre EjerM19.ods que contenga un procedimiento de nombre EjerM19, que sirva para calcular el mdulo de un vector en el espacio, utilizando una funcin. 20) Crea un libro de clculo de nombre EjerM20.ods, que contenga un procedimiento de nombre EjerM20, que sirva para calcular el rea de un tringulo en el espacio, utilizando la funcin 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 tringulo ABC = mitad del producto vectorial de AB y AC. Comprubalo para el caso:

OpenOffice Basic

Ferm Vil

BA-45

21) Crea un libro de clculo de nombre EjerM21.ods, que contenga un procedimiento de nombre EjerM21, que construya el tringulo de Tartaglia o Pascal de la siguiente forma: 1.- Crea una funcin que calcule el factorial de un nmero. 2.- Crea otra funcin que permita calcular un nmero combinatorio:

3.- El triangulo de Tartaglia no es ms que los resultados de los nmeros combinatorios:

m m! = n n! ( m n )!

... ...

0 0 1 1 0 1 2 2 2 0 1 2

4.- El programa nos ha de preguntar de entrada el nmero de filas del tringulo.

22) Crea un libro de clculo de nombre EjerM22.ods, que contenga un procedimiento de nombre EjerM22, tal que: - El programa nos pregunta cuntas multiplicaciones queremos hacer. - El programa nos las pregunta aleatoriamente Al final el programa nos da la nota cualitativa (utiliza una funcin). 23) Crea un libro de clculo 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

Comprubalo para el caso:

24) Crea un libro de clculo de nombre EjerM24.ods que contenga un procedimiento de nombre EjerM24, que sirva para discutir un sistema de tresecuaciones con tres incgnitas, slo en los casos compatible determinado e incompatible y lo resuelve en el caso compatible determinado. De la siguiente forma: 1) Crea una funcin 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 solucin por Cramer es x=detx/det, y=dety/det, z=detz/det Prubalo para los casos:

25) Crea un libro de clculo de nombre EjerM25.ods, que contenga un procedimiento de nombre EjerM25, que resuelva un sistema de dos ecuaciones con dos incgnitas por el mtodo de Cramer. Crea una funcin que calcule un determinante de 2 orden Comprubalo para los casos:

26) Crea un libro de clculo de nombre EjerM26.ods que contenga un procedimiento de nombre EjerM26, que calcule los 50 primeros trminos de la sucesin de trmino general: (3n+1) / (2n-1)

OpenOffice Basic

Ferm Vil

BA-47

12.- Cuadros de Dilogo


a) Crea un nuevo libro de clculo, que debers grabar como Macro12.ods. Crea, como siempre, un Module1 asociado al Macro12. - Sitate en el Editor de Basic. Accede al men contextual de la pestaa Module1, es decir: Sita el cursor del ratn encima de la pestaa Module1 Pulsa el botn derecho del ratn:

Selecciona la opcin: Insertar Dilogo BASIC

- Nos acabamos de situar en una nueva pantalla (Dialog1), que contiene un formulario o cuadro de dilogo vaco. Si observas el ngulo inferior izquierdo de la pantalla:

podemos situarnos fcilmente en el editor de BASIC (clic en la pestaa Module1) y/o volver al formulario (clic en la pestaa Dialog1). - Desde la pantalla del Dialog1, haz clic en el icono Insertar elementos de Control: Si mantienes pulsado el botn izquierdo, aparecern todas sus opciones:

OpenOffice Basic

Ferm Vil

BA-48

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 pequeo recuadro en el formulario:

- Clic en el Botn del cuadro Campos de Control:

Marca un pequeo recuadro debajo del campo de texto que acabamos de insertar.

- Marca otro CommandButton, a la derecha del anterior:

- Selecciona el formulario, para ello debers hacer: Clic en Flecha de Seleccin del cuadro Campos de Control: Marca una ventana que abarque al formulario entero.

OpenOffice Basic

Ferm Vil

BA-49

- Una vez seleccionado el formulario, hazlo ms pequeo y observars que todos los elementos del interior tambin se hacen ms pequeos. Resita 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 automticamente a sus propiedades (prubalo). - Con el CommandButton1 seleccionado y sus Propiedades a la vista. Cambia el contenido de la propiedad Ttulo, que era CommandButton1 por Saludo. - Selecciona el CommandButton2 y cambia su propiedad Ttulo por Borrar Saludo - Creo que est claro lo que nos proponemos: Al hacer clic en el botn [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 vers que es TextField1. Si observas el contenido de su propiedad Texto, vers que no tiene nada; es lgico, el cuadro de texto est vacio. Sitate en el Module1 (clic en la pestaa correspondiente) y escribe:

OpenOffice Basic

Ferm Vil

BA-50

Vuelve al Dialog1 y selecciona el botn [Saludo]. En su ventana de propiedades, haz clic en la pestaa Acontecimientos. Sita el cursor de escritura en el campo Boton del ratn pulsado y haz clic en el botn [...]. [Asignar] Selecciona ClicSaludo de Macro12.ods Standard Module 1 [Aceptar] [Aceptar] Asocia al botn [Borrar Saludo] el programa ClicBorrarSaludo. Es decir: selecciona el botn [Borrar Saludo] en Dialog1. Accede a la pestaa Acontecimientos, en su ventana de propiedades. Y en el campo Boton del ratn pulsado, asigna el procedimiento ClicBorrarSaludo. Sitate en la hoja de clculo e inserta un botn de nombre HOLA, asociado al procedimiento AbreFormulario

- Prueba el funcionamiento de lo que hemos programado: Clic en el botn [HOLA]. Si todo va bien, aparece el formulario. Clic en el botn [Saludo]

Clic en el botn [Borrar Saludo] Para acabar, clic en la X del extremo superior derecho del formulario.

OpenOffice Basic

Ferm Vil

BA-51

- Sitate en el Editor de Basic (Module1) para estudiar nuestro programa: el procedimiento AbreFormulario:

Es bastante extrao: el Basic del OpenOffice es una versin de Basic, prxima a Java. De todas formas no te preocupes: las tres lneas de nuestro programa (observa en la segunda lnea que aparece el nombre del formulario: Dialog1), sirven para abrir el formulario de nombre Dialog1. Observa tambin que la declaracin: Dim oDialogo As Object se encuentra al principio del mdulo, y fuera de todo programa, de esta forma evitamos el tener de declarar el formulario, en cada uno de los dems procedimientos del mdulo. El procedimiento ClicSaludo, est ms 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 ms complicado: crea un nuevo libro de clculo que debers grabar como Macro13.ods. Crea un Module1, tambin un Dialog1 asociado al Macro13 - Inserta en el formulario, una etiqueta: Clic en el icono Etiqueta del Cuadro de Controles: De propiedad Ttulo: Introduce la clave secreta Sita el cursor de escritura en el campo Fuente (propiedad de la etiqueta que acabamos de insertar) y clic en su botn [...]. Selecciona Fuente: Arial. Estilo: Negrita Cursiva y Tamao: 12 [Aceptar] Cambia el color de fondo (la etiqueta ha de estar seleccionada) a Amarillo Pastel - Selecciona el formulario (debers 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 contrasea, escribe un asterisco.

- Inserta dos botones: El CommandButton1 de propiedad Ttulo: Aceptar El CommandButton2 de propiedad Ttulo: Salir

OpenOffice Basic - Vamos a programar nuestros botones: Sitate en el Module1 y escribe:

Ferm Vil

BA-52

- Asocia al botn [Aceptar] el programa Aceptar: En la pantalla correspondiente al Dialog1 Selecciona el botn [Aceptar] Clic en la pestaa Acontecimientos de la ventana Propiedades En el campo Al Ejecutar o en Botn del ratn pulsado, asignale el procedimiento Aceptar de Module1 - Haz lo mismo para asociar al botn [Salir] el procedimiento Salir del Module1. - Sitate en la hoja de clculo e inserta un botn de nombre [CONTRASEA] y asignalo al procedimiento AbreForm del Module1. Por ltimo ejecuta y prueba el programa. - Observa:

La funcin UCase(argumento), convierte el argumento en maysculas. Gracias al uso de esta funcin, podemos introducir la contrasea en maysculas o minsculas. Una de las lneas (sentencias) del programa Aceptar es el nombre de otro programa: Salir. Es decir llamamos (se ejecuta) al procedimiento Salir.

c) Ya habamos hecho un programa que calculaba el factorial de un nmero, vamos a repetirlo pero visualmente, es decir, utilizando un formulario y controles ...

Crea una nueva hoja de clculo de nombre Macro14.ods con un Module1 y un Dialog1

OpenOffice Basic - Crea el siguiente formulario:

Ferm Vil

BA-53

El ttulo no es ms que una etiqueta (Label1), con la propiedad Borde = en 3D y Alineacin = 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 cdigo: 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 botn [Calcular] el procedimiento Calcular - Asocia al botn [Otro] el procedimiento Otro - Asocia al botn [Salir] el procedimiento Salir. - Crea en la Hoja1 del Macro14 un botn de nombre [FACTORIAL] y ascialo al procedimiento AbreForm Slo nos queda probar el programa (espero que te funcione correctamente).

OpenOffice Basic

Ferm Vil

BA-54

d) Crea una nueva hoja de clculo 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 nmero de un DNI (8 dgitos) y al hacer clic en el botn [Calcula], aparece en el TextField2, el NIF correspondiente, es decir el DNI anterior ms 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. Segn el resto de la divisin, que ser un nmero de 0 a 22 le corresponde la letra del NIF, segn 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 divisin por 23 de 18, por lo tanto la letra del NIF de nuestro ejemplo ser la H. - El problema ahora es traducir los clculos anteriores al Basic del OpenOffice... Int() es una funcin incorporada (igual que MsgBox() y muchas ms), que nos da la parte entera del nmero que escribamos como argumento. As: Int(40940754/23) =1780032, nos da el resultado de la divisin sin decimales (es lo que en matemticas se llama divisin entera) Pensemos ahora en la prueba de la divisin: El dividendo = divisor*cociente + resto. O lo que es equivalente: El resto de la divisin = 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 instruccin de nuestra funcin 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

BA-55

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 dgitos" Case Else oDialogo.Model.TextField2.Text=oDialogo.Model.TextField1.Text & _ cStr(Letra(CDbl(oDialogo.Model.TextField1.Text)) End Select End Sub - Asocia al botn [Calcula] el procedimiento Calcula

OpenOffice Basic

Ferm Vil

BA-56

- Crea en la Hoja1, un botn de nombre [NIF] y ascialo al procedimiento AbreForm Ejecuta y prueba el funcionamiento de nuestro programa.

e) Crea una nueva hoja de clculo de nombre Macro16.ods con un Module1 y un Dialog1 - Crea el siguiente formulario:

Ten en cuenta las siguientes propiedades: TextField2 Slo lectura = S TextField4 Slo lectura = S Juego de Caracteres. Tamao = 24 Los ltimos cuadros de texto (desde el TextField5 hasta el TextField10): Alineacin = Centrado Slo Lectura = S Juego de Caracteres. Tamao = 14

- Lo que pretendemos es simular un juego de lotera, que funcione de la siguiente forma: el programa sortea seis nmeros del 1 al 49 y nosotros hemos de adivinar uno de estos nmeros. En los ltimos cuadros de texto (TextField5, ..., TextField10) aparecern los seis nmeros 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 nmeros del sorteo, para ello utilizaremos un array de 6 elementos )nmeros enteros), que deberamos declarar a nivel de mdulo, para que se encuentren presentes en los diferentes procedimientos que haremos. Aprovecha tambin 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 dimensin, 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 nmeros sorteados. j: es el ndice de otro ciclo For To Next de j=0 hasta j=i, que servir para investigar si algn valor de Lotera est repetido NumeroSorteado: representa el nmero 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 Bsicamente el funcionamiento es: Si el valor de NumeroSorteado (nmero aleatorio entre 1 y 49) es igual a algn valor de Loteria(), entonces HaSalido=1, y NumeroSorteado vuelve a tomar otro nmero aleatorio entre 1 y 49. Si el valor de NumeroSorteado no ha salido, el valor de Loteria(), es igual a dicho nmero y salimos del Do While Loop (Trabajar = 0) - Asocia al botn [Sorteo] del Dialog1, el procedimiento anterior (Al Ejecutar = document:Standard.Module1.Lote) - Sitate en la Hoja1 e inserta un botn de nombre [Lotera] asociado al procedimientoAbreForm. - Ejecuta el programa que hemos hecho hasta ahora: Clic en [Lotera] de la Hoja1 Clic en [Sorteo] del formulario. Ejecuta el programa varias veces, para comprobar que los 6 valores de la lotera son distintos. Continuemos ... - Al escribir un nmero del 1 al 6 en el cuadro de texto TextField3, nos interesa que aparezca en el TextField4 el nmero correspondiente de la Lotera ...

OpenOffice Basic Escribe en el Module1 el procedimiento:

Ferm Vil

BA-58

- 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 slo por escribir un nmero (o cambiarlo) en TextField3, en el TextField4 aparecer automticamente el nmero de la Loteria(). Prubalo. -Observa el procedimiento Orden: La variable i es el nmero 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 lotera: Nos interesa que al escribir un nmero (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 Slo 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, deberamos hablar de proyecto, que conste de ms de un formulario ... Crea una nueva hoja de clculo 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 botn 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 Botn [CALCULAR] (Al Ejecutar) = procedimiento CalcularTriangulo Botn [BORRAR] (Al Ejecutar) = procedimiento OtroTriangulo Botn [CRCULO] (Al Ejecutar) = procedimiento Salir1Entrar2

OpenOffice Basic Dialog2

Ferm Vil

BA-61

Botn [OTRO] (Al Ejecutar) = procedimiento OtroCirculo Botn [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

BA-62

Ejercicios
27) Crea un libro de clculo de nombre EjerM27.ods, que contenga un cuadro de dilogo 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 fcil: Primero: disea el siguiente Dialog:

Segundo: Utilizando el cursor del ratn, selecciona:

- Pulsa [CTRL][C] = copiaremos lo que se encuentra seleccionado - Clic en cualquier sitio para desmarcar. - Pulsa [CTRL][V] = pegaremos lo anterior -Debers pegarlo ocho veces ms.

OpenOffice Basic Tercero:

Ferm Vil

BA-63

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 cdigo 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 nmero 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 clculo de nombre EjerM28.ods, que contenga un cuadro de dilogo, que nos permita hacer un estudio estadstico de 10 valores, de la siguiente forma:

29) Crea un libro de clculo 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 podrs tratar nmeros como los que aparecen en la ilustracin. 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 clculo de nombre EjerM30.ods, haz un programa que sirva para repasar las tablas de multiplicar, de la siguiente forma: Considera una funcin 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 nmero de multiplicaciones que queremos hacer. En los cuadros txtUno y txtDos aparecen dos nmeros aleatorios entre 1 y 9. En el cuadro txtResul escribimos el resultado de la multiplicacin 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 contestacin correcta. Los cuadros txtBien y txtMal, cuentan el nmero de respuestas correctas e incorrectas respectivamente. El botn OTRA sirve para una nueva multiplicacin 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 Dilogo y Hoja de Clculo


Crea un nuevo libro de clculo 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 podrs 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 (cdigo, nombre, direccin, ...) del cliente que seleccionemos previamente en el Cuadro Combinado - Sitate 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 suceda con el control Cuadro de Texto (TextField), hemos de declarar el cuadro combinado, para poder despus, acceder a l. De la forma: NombreDelCuadroCombinado = NombreDelFormulario.getControl(ComboBox1) oCombo.AddItem(Cel.getFormula, i-1) Aade 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 botn (Al ejecutar) [Datos] - Asocia el programa Cargar al botn [Visualizar Clientes] - Crea un botn de nombre [Clientes], en la Hoja1 del libro Macro18.ods y ascialo 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: Sitate en el Dialog1, selecciona el ComboBox1, accede a sus propiedades (pestaa Acontecimientos) y a la accin Texto Modificado asigna el programa Acceder Selecciona el botn [Datos] y brralo. Vuelve a ejecutar el programa.

OpenOffice Basic

Ferm Vil

BA-68

14.- Facturacin
Como ltimo ejercicio, te propongo hacer un sencillo programa de facturacin ... Crea un nuevo libro de clculo de nombre Macro19.ods, con el siguiente contenido (en la Hoja1):

En la Hoja2 (cpialo del libro Macro18):

En la Hoja3:

- Inserta dos nuevas hojas, a nuestro libro de la siguiente forma: Sitate en la Hoja3 Men Insertar Hoja de clculo ... Posicin: Detrs de la hoja actual Nm. De hojas: 2 [Aceptar] - Sitate en la Hoja4 y crea:

Creo que est claro lo que simula la Hoja4 de nuestro programa de facturacin: 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 realizacin del programa de facturacin de tu empresa): Facturamos un mximo de tres conceptos: Num1 = nmero de unidades del artculo 1 C.Art.1 = cdigo del artculo 1 Etc. Slo disponemos de un iva por factura (no por artculo). Slo disponemos de un descuento por factura. No contemplamos el vencimiento, para simplificar el problema. - Sitate en la Hoja5 y crea el impreso de factura:

- Cambia el nombre de cada hoja (basta que sites el cursor en la pestaa correspondiente y accedas a su men contextual):

- Crea un Module1 y sitate 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 botn de nombre: [Finalizar grabacin]. Atencin, todo lo que hagamos ahora, hasta que hagamos clic en [Finalizar grabacin], se guardar en un programa. Haz clic en la pestaa correspondiente a CLIENTES Clic en la celda A1 de Clientes Clic en [Finalizar grabacin] 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] - Sitate en la hoja MEN: Selecciona el botn [BASE DE DATOS DE CLIENTES], para ello debers entrar en modo Diseo: 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 botn [BASE DE DATOS DE CLIENTES] - Prubalo, 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 ratn: Clic en la pestaa [CLIENTES] Clic en A1 de la nueva hoja Precisamente esto, pulsaciones de ratn y teclas, es lo que nos permite programar automticamente la Grabadora de Macros Si accedes al Module1 e investigas el contenido de AClientes, no te asustes, vers como est codificado nuestro programa AClientes. No te preocupes demasiado de su contenido, lo importante es que funciona y es muy fcil de hacer. - Sitate 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 pestaa: MEN Clic en la celda A1 Clic en [Finalizar grabacin] Selecciona Module1/Standard/Macro19.ods y en nombre de la macro escribe: AMenu [Guardar] - Asocia la macro AMenu al botn [VOLVER], que tienes en la Hoja: CLIENTES y prubalo. - Asocia la macro AMenu al botn [VOLVER] que tienes en la Hoja: ARTCULOS y tambin el la Hoja: HISTRICO y tambin en la Hoja: FACTURA y prubalo. - Procede de la misma forma para: Desde MEN crea una macro de nombre AArticulos, que nos site en ARTCULOS. Asciala al botn [BASE DE DATOS DE ARTCULOS]. Desde MEN crea una macro de nombre AHistorico", que nos site en HISTRICO. Asciala al botn [BASE DE DATOS DE FACTURAS] Desde MEN crea una macro de nombre AFactura", que nos site en FACTURA. Asciala al botn [FACTURAR] - Crea otro mdulo (Module2), sin ms que: desde el editor de Basic, accede al men contextual de la pestaa Module1 y Insertar Mdulo Basic. Inserta tambin 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 nmero de factura y tambin que cargue los cuatro cuadros combinados del Dialog1, para ello necesitamos saber el nmero de clientes y artculos. Veamos, sitate 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

BA-72

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 botn de nombre [Facturar] y ascialo a AbreFormulario del Module2. Asigna al botn [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 Clculo: 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

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 botn [Cancelar] del Dialog1 y el procedimiento Aceptar al botn [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 apstrofe antes de introducir la fecha, para no tener problema con el formato de fecha en la hoja de clculo. De esta forma estamos considerando la fecha como un texto) Cliente: Eufrasia Martnez Unidades Artculos 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 frmulas correspondientes: Celda D12: =A12*C12 Copia la frmula 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

BA-74

Grabar la factura, es decir, colocar los datos que tenemos en la Hoja: FACTURA en la Hoja: HISTRICO. 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

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 botn [GRABAR] de la Hoja: FACTURA y prubalo. - 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 lnea sea BorrarFactura:

- Abre el formulario, para probar el BorrarFactura. Es decir: sitate en la Hoja: FACTURA y clic en [Facturar] - Crea una macro de nombre Imprimir en un mdulo nuevo: Module3, que debes asociar al botn [Imprimir] de la Hoja: Factura, que sirva para imprimir la factura, es decir: la macro ha de contener: Men Archivo Imprimir Selecciona Pginas y escribe la ltima pgina. [Aceptar] - Si observas la factura impresa, supongo que estars 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 botn Accede a sus propiedades y en la propiedad Imprimir, selecciona la opcin No - Nuestro simple programa de facturacin ya est terminado, solo nos falta probarlo exhaustivamente.

Das könnte Ihnen auch gefallen