Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introduccion Programacion Open Office Basic
Introduccion Programacion Open Office Basic
Ferm Vil
Introduccin a la
programacin en
OpenOffice.org Basic
Ferm Vil
BA-1
OpenOffice Basic
Ferm Vil
BA-2
Es el lugar donde escribiremos nuestros programas en OpenOffice Basic. Observa que de hecho nos
encontramos en una ventana separada del Macro01.ods:
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):
OpenOffice Basic
Ferm Vil
BA-5
Men Ver
Barras de Herramientas ...
Clic en Campos de control de formulario
- Clic en el botn:
de la nueva barra.
[Asignar]
Mis macros Standard Module 1 - Prog02
[Aceptar]
[Aceptar]
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:
- 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.
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:
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
Es equivalente a
Dim x As Integer
+2.147.483.647
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]
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.
Veamos:
- 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:
OpenOffice Basic
Ferm Vil
BA-10
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:
- 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
Ferm Vil
BA-11
- Escribe en la Hoja1:
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
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.
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
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
- Crea un botn (en Hoja1), asociado al procedimiento Prog18 y ejecuta el programa unas cuantas veces.
OpenOffice Basic
Ferm Vil
BA-18
OpenOffice Basic
Ferm Vil
BA-19
- Crea en Hoja1 un botn asociado al procedimiento Prog20 y ejectalo varias veces, para comprobar su
funcionamiento.
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
OpenOffice Basic
Ferm Vil
BA-21
OpenOffice Basic
Ferm Vil
BA-22
- Escribe:
Crea un nuevo libro de clculo, que debers grabar como Macro07.ods en TuCarpeta y crea un
Module1
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
OpenOffice Basic
Ferm Vil
BA-25
- Crea un botn, en la Hoja1 de Macro07, asociado al procedimiento anterior y ejectalo para probarlo
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:
OpenOffice Basic
Ferm Vil
BA-27
OpenOffice Basic
Ferm Vil
BA-28
- 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
Ferm Vil
BA-29
- 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
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:
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:
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:
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.
OpenOffice Basic
Ferm Vil
BA-35
- 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
- Crea en Hoja1 de Macro09.ods dos botones de nombre: [Prog41] y [Prog42] asociados a los
procedimientos 41 y 42 y ejectalos:
OpenOffice Basic
Ferm Vil
BA-37
- Crea en la Hoja1 del Macro09, un botn de nombre [Prog44] asociado al procedimiento Prog44 y
ejectalo.
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
0 X<1
X nmero decimal
Y=6*Rnd
0 Y<6
Y nmero decimal
Z=Int(6*Rnd)
0 Z<6
W=Int(6*Rnd)+1
0<W 6
En general:
Int((y-x)*Rnd+x)
Int((y+1-x)*Rnd+x)
OpenOffice Basic
Ferm Vil
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.
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 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
2.-
3.-
4.-
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
BA-41
OpenOffice Basic
Ferm Vil
BA-42
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.
OpenOffice Basic
Ferm Vil
BA-43
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:
m
m!
=
n n! ( m n )!
0
0
1 1
0 1
2 2 2
0 1 2
...
...
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
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
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
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:
BA-47
OpenOffice Basic
Ferm Vil
Marca un pequeo recuadro debajo del campo de texto que acabamos de insertar.
BA-48
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:
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
OpenOffice Basic
Ferm Vil
BA-51
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.
OpenOffice Basic
Ferm Vil
BA-52
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
Ferm Vil
BA-53
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
Resto
8
9
10
11
12
13
14
15
Resto
16
17
18
19
20
21
22
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
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
BA-55
OpenOffice Basic
Ferm Vil
BA-56
e) Crea una nueva hoja de clculo de nombre Macro16.ods con un Module1 y un Dialog1
- Crea el siguiente formulario:
TextField2
Slo lectura = S
TextField4
Slo lectura = S
Juego de Caracteres. Tamao = 24
- 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:
OpenOffice Basic
Ferm Vil
BA-58
- Escribe en el Module1:
OpenOffice Basic
Ferm Vil
BA-59
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
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
Ferm Vil
BA-61
Dialog2
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
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:
BA-62
OpenOffice Basic
Ferm Vil
BA-63
Tercero:
Cambiar la propiedad Nombre de la siguiente forma:
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
OpenOffice Basic
Ferm Vil
BA-66
- 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
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 Hoja3:
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):
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
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
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 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
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
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 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