OpenOffice Macros

November 15, 2016 | Author: Juan Carlos Guartasaca Ordóñez | Category: N/A
Share Embed Donate


Short Description

Download OpenOffice Macros...

Description

Información importante sobre macros para OpenOffice Andrew Pitonyak (Traducción Arturo Garro)

Gracias Muchas gracias a mi esposa Michelle por permitirme escribir este libro y por darme coraje. También doy un agradecimiento a aquellos de la comunidad “open-source” y las listas de correos que proveen información de mucha ayuda. Finalmente, un agradecimiento a aquellos que han dado ejemplos incluidos en este documento.

Advertencia El material en este documento no tiene garantía de aplicación, accuracy, o seguridad. El uso de la información y los macros en este documento es bajo su propio riesgo. Debe asumir que las macros pueden llenar de basura su base de datos, el disco duro, y hacer perder todos sus datos y no me haré responsable.

Licencia En este momento, debe considerar que todo el material en este documento creado por mi esta sujeto a http://www.openoffice.org/licenses/jca.pdf el cual da a la comunidad OpenOffice community la posibilidad de usarlo en el sitio OpenOffice. Este documento contiene macros que no están escritas por mi. En este momento, he obtenido permiso de incluir estas macros en este documento pero de las que no heobtenido confirmación también tienen esta misma licencia. Tomaré las medidas necesarias para resolver estos problemas en este documento durante las actualizaciones.

Información de contacto Andrew Pitonyak • 4446 Mobile Drive #105 • Columbus, OH 43220 • USA home: [email protected] • work: [email protected] home telephone: 614-442-8615

Credenciales Tengo dos bachilleratos, uno en Informática y otro en Matemáticas. También tengo dos maestrías en Ciencias, uno en Matemática Industrial Aplicada y otro en Informática. He trabajado en Oakland University en Rochester Michigan, The Ohio State University en Columbus Ohio, y en The Technical University Of Dresden en Dresden Germany.

Nota del traductor Todas las palabras claves de StarBasic dentro del texto han sido puestas en azul para diferenciarlas. Sobra decir que deber ser escritas exactamente igual para evitar errores de sintaxis. Es posible que se me haya quedado alguna palabra en inglés en el texto mientras buscaba su significado.

Tabla de contenido 1 Introducción...........................................................................................................................1 2 Recursos disponibles..............................................................................................................3 2.1 Material incluido............................................................................................................3 2.2 Recursos en línea (on line).............................................................................................3 3 Ejemplos...............................................................................................................................5 3.1 Manipulación de cadenas..............................................................................................5 3.1.1 Remover caracteres de una cadena........................................................................5 3.1.2 Reemplazar texto en una cadena...........................................................................6 3.1.3 Imprimiendo los valores ASCII de una cadena.....................................................7 3.2 Depurando e inspeccionando Macros...........................................................................7 3.2.1 Determinar el tipo de documento..........................................................................7 3.2.2 Desplegando los métodos y propiedades de un objeto..........................................8 3.2.3 Desplegando las propiedades de un objeto en una hoja de cálculo.......................9 4 Ejemplos misceláneos.........................................................................................................19 4.1 Desplegar texto en la barra de estado..........................................................................20 4.2 Despliega todos los estilos en el documento actual....................................................21 4.3 Cambiar entre los documentos abiertos......................................................................21 4.4 Listar fuentes (Quebrado, no funciona) .....................................................................22 4.5 Imprimir el documento actual.....................................................................................23 4.6 Cambiando el tamaño de una lista..............................................................................25 4.7 Open And Close Documents (And The Desktop).......................................................26 4.7.1 Cerrar documentos OpenOffice...........................................................................26 4.7.2 Cargar un documento desde una URL.................................................................27 4.8 Creando una tabla........................................................................................................29 4.9 Llamando un programa externo..................................................................................30 4.10 Leer y escribir en un archivo.....................................................................................31 4.11 Creando un estilo de formato numérico....................................................................32 4.12 Retorna una matriz Fibonnaci...................................................................................33 4.13 Insertar texto en un marcador....................................................................................33 4.14 Campos de usuario....................................................................................................33 5 Macros de Calc...................................................................................................................35 5.1 Es este un libro de cálculo?.........................................................................................35 5.2 Imprimiendo el valor de una Celda, Cadena o Fórmula.............................................35 5.3 Estableciendo el valor de una Celda, Formato, Cadena o Fórmula............................35 5.4 Limpiar una celda........................................................................................................36 5.5 Texto seleccionado, Qué es?.......................................................................................36 5.6 Dirección imprimible de una Celda............................................................................38 5.7 Insertar fechas formateadas en una Celda...................................................................39 5.8 Desplegar un rango seleccionado en un cuadro de diálogo........................................39 5.9 Rellenar un rango seleccionado con texto...................................................................40 5.10 Algunos estados del texto seleccionado....................................................................41 5.11 Cambiar el rango seleccionado a un rango de Base de Datos...................................42 5.12 Borrar un rango de Base de Datos.............................................................................42 5.13 Rango bordes de línea...............................................................................................42 i

5.14 Ordenar un rango.......................................................................................................43 5.15 Imprimir todos los datos en una columna.................................................................44 5.16 Usando métodos de bordes (agrupamiento)..............................................................44 5.17 Protegiendo sus datos................................................................................................45 6 Macros de Write .................................................................................................................47 6.1 Texto seleccionado, qué es?........................................................................................47 6.2 Cursores de texto, qué son?.........................................................................................47 6.3 Andrew's Selected Text Framework...........................................................................48 6.3.1 Hay texto seleccionado?......................................................................................48 6.3.2 Cómo obtener una selección................................................................................49 6.3.3 Selected Text, Which End Is Which....................................................................49 6.3.4 Sistema Macro de texto seleccionado..................................................................50 El sistema rechazado................................................................................................51 El sistema aceptable.................................................................................................51 El trabajo principal..................................................................................................52 6.3.5 Desplegando caracteres, un ejemplo simple........................................................53 6.3.6 Remover espacios y líneas vacíos, un gran ejemplo...........................................53 Qué es un espacio en blanco?..................................................................................53 Rangos de caracteres para borrar.............................................................................53 El interativo seleccionador de texto.........................................................................54 La macro principal...................................................................................................55 6.3.7 Removiendo párrafos vacíos, sólo otro ejemplo.................................................55 6.4 Reemplazando espacios seleccionados usando cadenas.............................................56 6.4.1 Comparación de cursores y ejemplos de cadenas................................................58 6.5 Poniéndo atributos de texto.........................................................................................68 6.6 End Sub Insertar texto.................................................................................................69 6.7 Insertar fecha formateada dentro de un documento de texto......................................71 6.8 Insertar una nueva página............................................................................................71 6.8.1 La solución..........................................................................................................71 7 Ejemplo de inversión..........................................................................................................73 7.1 Página resumen...........................................................................................................73 7.2 Hoja de detalles...........................................................................................................73 7.3 Chequear duplicados en una columna.........................................................................74 7.3.1 Dirección imprimible de una celda......................................................................74 7.3.2 Conteo de entradas no vacías en una columna....................................................75 7.3.3 Arreglo ordenado.................................................................................................76 7.3.4 Encontrar el duplicado.........................................................................................77 8 Lenguaje..............................................................................................................................79 8.1 Comentarios................................................................................................................79 8.2 Variables.....................................................................................................................79 8.2.1 Nombres..............................................................................................................79 8.2.2 Declaración..........................................................................................................79 8.2.3 Variables globales malas y estáticas....................................................................80 ii

8.2.4 Tipos....................................................................................................................81 Variables Booleanas................................................................................................82 Variables enteras......................................................................................................83 Variables Entero largo.............................................................................................83 Variables de moneda................................................................................................83 Variables de Sencillos..............................................................................................83 Variables de Dobles.................................................................................................83 Variables de Cadena................................................................................................84 8.2.5 Constantes............................................................................................................84 8.2.6 Areglos o matrices...............................................................................................84 Option Base.............................................................................................................84 LBound(NombreMatriz[,Dimensión]).....................................................................84 UBound(NombreMatriz[,Dimensión])....................................................................84 Está esta matriz definida..........................................................................................85 Listas de matrices y ReDim.....................................................................................85 8.2.7 Probando objetos.................................................................................................86 8.2.8 Condicionales......................................................................................................86 8.3 Funciones y SubProcedimientos.................................................................................87 8.3.1 Parametros opcionales.........................................................................................88 8.3.2 Parámetros por referencia o valor........................................................................89 8.3.3 Recursividad........................................................................................................89 8.4 Control de flujo...........................................................................................................90 8.4.1 If ... Then ... Else.................................................................................................90 8.4.2 IIF........................................................................................................................90 8.4.3 Choose.................................................................................................................91 8.4.4 For....Next............................................................................................................91 8.4.5 Do ... Loop...........................................................................................................92 8.4.6 Select ... Case.......................................................................................................93 8.4.7 Expresiones Case.................................................................................................93 8.4.8 While...Wend.......................................................................................................94 8.4.9 GoSub..................................................................................................................94 8.4.10 GoTo..................................................................................................................95 8.4.11 On GoTo............................................................................................................95 8.4.12 Exit....................................................................................................................96 8.4.13 Manejo de errores...............................................................................................97 8.5 Misceláneos.................................................................................................................97 9 Operadores y precedencia.................................................................................................101 10 Operadores, Instrucciones y Funciones..........................................................................103 10.1 Operador - ..............................................................................................................103 10.2 Operador * ..............................................................................................................103 10.3 Operador + .............................................................................................................103 10.4 Operador ^...............................................................................................................104 10.5 Operador /................................................................................................................104 iii

10.6 Operador AND........................................................................................................105 10.7 Función Abs............................................................................................................106 10.8 Función Array.........................................................................................................106 10.9 Función Asc............................................................................................................107 10.10 Función ATN........................................................................................................108 10.11 Instrucción Beep....................................................................................................108 10.12 Función Blue.........................................................................................................108 10.13 Palabra clave ByVal..............................................................................................109 10.14 Palabra clave Call..................................................................................................109 10.15 Función CBool......................................................................................................110 10.16 Función CByte......................................................................................................111 10.17 Función CDate......................................................................................................111 10.18 Función CDateFromIso.........................................................................................112 10.19 Función CDateToIso.............................................................................................112 10.20 Función CDbl........................................................................................................112 10.21 Instrucción ChDir..................................................................................................113 10.22 Instrucción ChDrive..............................................................................................113 10.23 Función Choose.....................................................................................................114 10.24 Función Chr...........................................................................................................115 10.25 Función CInt..........................................................................................................115 10.26 Función CLng........................................................................................................116 10.27 Instrucción Close...................................................................................................116 10.28 Instrucción Const..................................................................................................117 10.29 Función ConvertFromURL...................................................................................117 10.30 Función ConvertToURL.......................................................................................118 10.31 Función Cos..........................................................................................................118 10.32 Función CreateUnoDialog....................................................................................119 10.33 Función CreateUnoService...................................................................................120 10.34 Función CreateUnoStruct......................................................................................120 10.35 Función CSng........................................................................................................121 10.36 Función CStr.........................................................................................................121 10.37 Función CurDir.....................................................................................................122 10.38 Función Date.........................................................................................................122 10.39 Función DateSerial................................................................................................123 10.40 Función DateValue................................................................................................124 10.41 Función Day..........................................................................................................124 10.42 Instrucción Declare...............................................................................................125 10.43 Instrucción DefBool..............................................................................................125 10.44 Instrucción DefDate..............................................................................................126 10.45 Instrucción DefDbl................................................................................................126 10.46 Instrucción DefInt.................................................................................................127 10.47 DefLng Statement..................................................................................................127 10.48 Instrucción DefObj................................................................................................128 iv

10.49 10.50 10.51 10.52 10.53 10.54 10.55 10.56 10.57 10.58 10.59 10.60 10.61 10.62 10.63 10.64 10.65 10.66 10.67 10.68 10.69 10.70 10.71 10.72 10.73 10.74 10.75 10.76 10.77 10.78 10.79 10.80 10.81 10.82 10.83 10.84 10.85 10.86 10.87 10.88 10.89 10.90 10.91

Instrucción DefVar................................................................................................128 Instrucción Dim.....................................................................................................128 Función DimArray................................................................................................129 Función Dir...........................................................................................................130 Instrucción Do...Loop...........................................................................................132 Instrucción End.....................................................................................................132 Función Environ....................................................................................................133 Función EOF.........................................................................................................134 Función EqualUnoObjects....................................................................................134 Operador EQV......................................................................................................135 Función Erl............................................................................................................136 Función Err............................................................................................................136 Función Error........................................................................................................137 Función Error........................................................................................................138 Instrucción Exit.....................................................................................................138 Función Exp..........................................................................................................139 Función FileAttr....................................................................................................140 Instrucción FileCopy.............................................................................................141 Función FileDateTime..........................................................................................141 Función FileExists.................................................................................................142 Función FileLen....................................................................................................142 Función FindObject...............................................................................................143 Función FindPropertyObject.................................................................................143 Función Fix...........................................................................................................144 For...Next Statement..............................................................................................144 Función Format.....................................................................................................144 Función FreeFile...................................................................................................147 FreeLibrary Function.............................................................................................147 Instrucción Function..............................................................................................148 Instrucción Get......................................................................................................149 Función GetAttr....................................................................................................150 Función GetProcessServiceManager....................................................................151 Función GetSolarVersion......................................................................................151 Función GetSystemTicks......................................................................................152 Instrucción GlobalScope.......................................................................................152 Function.................................................................................................................153 Function.................................................................................................................153 Function.................................................................................................................153 Function.................................................................................................................154 Función Green.......................................................................................................154 Palabra clave Private.............................................................................................155 Palabra clave Public..............................................................................................155 Función Red..........................................................................................................156 v

10.92 Notación y nombres de archivo URL....................................................................156 10.92.1 Notación URL...............................................................................................156 10.92.2 Rutas con espacios y otros caracteres especiales..........................................156 11 Index................................................................................................................................159

vi

1Introducción OpenOffice.org Basic es el nombre del lenguaje de macros incluido con OpenOffice.org. OpenOffice.org Basic tiene mucho en común con Visual Basic de manera que si usted sabe Visual Basic, esto será una gran ventaja. OpenOffice.org Basic está basada en subrutinas y funciones. Están implementadas con las palabras clave “Sub” y “Function”. Me referiré genericamente a estos como procedimientos. Cada procedimiento proveerá alguna funcionalidad y puede llamar a otros procedimientos. (No está permitida la recursividad). La diferencia entre un “Sub” y una “Function” es que “Function” puede retornar un valor y por eso está permitido el uso en la parte derecha de una declaración. Una colección de procedimientos está contenido en un módulo. Un documento puede contener modulos, y pueden existir globalmente aparte de un documento. Colecciones de módulos están guardados en una librería. ???? En OpenOffice.org Basic, puede accesar el documento o la aplicación a través de las dos variables globales “ThisComponent” y “StarDesktop” respectivamente. Después de tener un documento, puede accesar su interface. Veamos un ejemplo Dim oText As Object Dim oDoc As Object oDoc = ThisComponent oText = oDoc.Text

' Obtiene el documento activo ' Obtiene el servicio TextDocument

?? Gracias a Kelvin [email protected] por su aporte en cosas como quitar la palabra clave “ByVal”

1

2Recursos disponibles 2.1Material incluido No olvide el poder de las páginas de ayuda. Hay mucha información sobre la sintaxis de las macros. Después de abrir las páginas de ayuda, puede accesar el combo en la esquina superior izquierda que dice “Help about OpenOffice.org Basic” Es también instructivo investigar y usar las macros que viene en el OpenOffice. Hay, por ejemplo, macros para las propiedades de impresión y los nombres de objetos. Las he usado para determinar que puedo hacer con un objeto cuando encuentro la documentación confusa. Abra un documento y seleccione el menú “Herramientas=>Macro”. En la caja de lista, busque un módulo llamado "Tools". Expanda el módulo “Tools”, encontrará otro llamado “Debug”. Estas macros están implementadas para imprimir y mostrar información de depuración, servicios, atributos, etc. Específicamente vea WritedbgInfo(document) o printdbgInfo(sheet). Son buenos ejemplos. Para usar la librería de macros “Tools”, deberá primero cargarla. Desde el Basic IDE (Ambiente de Desarrollo Integrado)1 o desde un documento, seleccione “Herramientas=>Macro”, seleccione la librería “Tools” y presione “F5” o haga click en “Run”.

2.2Recursos en línea (on line) Hay mucha información disponible en línea, el problema es encontrarla. Mientras usted se siente confortable con este paradigma, las cosas no están lo suficientemente claras. Aquí hay algunos vínculos que he encontrado útiles. • http://www.openoffice.org es el vínculo principal. • http://api.openoffice.org contiene información de referencia sobre API2. Mucha información buena, solamente tiene que decifrarla. Cuando esté más a gusto con este paradigma, esto le ayudará grandemente. • http://api.openoffice.org/basic/man/tutorial/tutorial.pdf Usted deberá tener este documento. • http://udk.openoffice.org/common/man/tutorial/office_automation.html • http://api.openoffice.org/common/ref/com/sun/star/module-ix.html información vieja de API que encontré útil. • http://documentation.openoffice.org el sitio de documentación es muy bueno. Verifique la sección “how to”3. Hay un documento fantástico sobre cómo usar las macros! Está disponible en http://documentation.openoffice.org/HOW_TO/various_topics/How_to_use_bas ic_macros.sxw •

http://docs.sun.com/db/coll/999.2?q=star+office le permite bajar los manuales de StarOffice. Yo encontré el tutorial de starbasic útil por los ejemplos. Otros sitios que contienen ejemplos y código generalmente útil son: 1 N.T. Por las siglas de Integrated Development Environment 2 N.T. API son las siglas en inglés Aplication Program Interface, o Interface de programas de aplicación. 3 N.T. “cómo hacerlo”. La página está en inglés y esa expresión en intraducible.

3

• • •

http://www.darwinwars.com/lunatic/bugs/oo_macros.html http://disemia.com/software/openoffice/ http://kienlein.com/pages/oo.html

4

3 Ejemplos 3.1 Manipulación de cadenas Basic ofrece algunos métodos para la manipulación de cadenas. Función

Descripción

Asc(s$)

Devuelve el valor ASCII (American Standard Code for Information Interchange) del primer caracter de la cadena. Genera un error si la cadena está vacía.

LCase(s$)

Devuelve la cadena en minúsculas. La ayuda en línea tiene errores en 1.0.2.

Len(s$)

Retorna el tamaño de la cadena s.

Left(s$, n%)

Devuelve los primeros n caracteres de s o una cadena vacía si n es cero.

LSet s$ = Text LTrim(s$)

Devuelve una cadena sin los espacios iniciales. Espacios no significan espacios en blanco, solamente espacios. Esto no modifica la cadena.

Mid(s$, i%[, n%])

Regresa una cadena desde la locación i del tamaño de n. Si n es omitido, retornará todos los caracteres desde i hasta el final de la cadena.

Mid(s$, i%, n%, r$) Reemplaza la cadena del medio especificada arriba con la cadena r. Esto no modifica la cadena s. Si el valor de r es mayor que n, entonces solamente los primeros n caracteres en r serán reemplazados en s. Add UCase(), RTrim, Trim En la ayuda en línea, el ejemplo para la conversión de minúsculas/mayúsculas es incorrecto. Aqui está el ejemplo como debería de leerse. Sub ExampleLUCase Dim sVar As String sVar = "Las Vegas" Print LCase(sVar) REM Returns "las vegas" Print UCase(sVar) REM Returns "LAS VEGAS" end Sub

3.1.1 Remover caracteres de una cadena Esto removerá los caracteres de una cadena. Lo disparatado de esta macro es que sería mejor escrita con el método mid(). La diferencia es que el método mid() modifica la cadena actual mientras que esta retorna una nueva cadena. Yo pude hacerla usando el método mid(), pero me di cuenta de esto hasta que fue demasiado tarde. 'Remueve cierto número de caracteres de una cadena

5

Function RemoveFromString(s$, index&, num&) As String If num = 0 Or Len(s) < index Then 'Si no se remueve nada o está fuera del rango, se devuelve la cadena RemoveFromString = s ElseIf index Len(s) Then RemoveFromString = Left(s,index - 1) Else RemoveFromString = Left(s,index - 1) + Right(s, Len(s) - index - num + 1) End If End If End Function

3.1.2 Reemplazar texto en una cadena Esto puede ser usado para borrar areas de una cadena especificando que la cadena de reemplazo es una cadena vacía. Inicialmente pensé que podía usar el método mid() para esto también, pero este método no puede hacer que la cadena sea más grande de lo que actualmente es. Por esto tuve que escribir esta macro. No modifica la cadena actual, pero en su lugar crea una nueva cadena con los reemplazos hechos. Rem s$ es la cadena a ser modificada Rem index es un "long" indicando dónde será hecho el reemplazo. (base 1) Rem Si index es Len(s) entonces el texto será insertado al final. Rem num es un "long" indicando cuántos caracteres reemplazar. Rem Si num es cero entonces nada es removido, pero la nueva cadena es insertada. Rem replaces es la cadena a reemplazar dentro de la cadena original. Function ReplaceInString(s$, index&, num&, replaces$) As String If index oSheets.Count() - 1 Then nSheetsUsed = oSheets.Count() - 1 oSheets.insertNewByName("Sheet"&CStr(oSheets.Count()+1), _ nSheetsUsed) End If oSheet = oSheets.getByIndex(nSheetsUsed) nSheetsUsed = nSheetsUsed + 1 End If oSheet.Name = sSheetName End Sub

18

4 Ejemplos misceláneos

19

4.1 Desplegar texto en la barra de estado '****************************************************************** 'Author: Sasa Kelecevic 'email: [email protected] 'Hay dos métodos que se pueden usar para obtener 'el indcador de estado Function ProgressBar ProgressBar = ThisComponent.CurrentController.StatusIndicator 'o también 'ProgressBar = StarDesktop.getCurrentComponent.StatusIndicator End Function

REM Despliega texto en la barra de estado Sub StatusText(sInformation) Dim sSpaces As String Dim iLen,iRest As Integer 'sSpaces=SPACE(270) iLen=Len(sInformation) iRest=270-iLen ProgressBar.start(sInformation+SPACE(iRest),0) End Sub

20

4.2 Despliega todos los estilos en el documento actual Esto no es tan grato como parece. Los siguientes estilos existen en un documento de texto: CharacterStyles, FrameStyles, NumberingStyles, PageStyles, y ParagraphStyles. '****************************************************************** 'Author: Andrew Pitonyak 'email: [email protected] Sub DisplayAllStyles Dim mFamilyNames As Variant Dim mStyleNames As Variant Dim sMsg As String Dim oFamilies As Object Dim oStyle As Object Dim oStyles As Object oFamilies = ThisComponent.StyleFamilies mFamilyNames = oFamilies.getElementNames() For n = LBound(mFamilyNames) To UBound(mFamilyNames) sMsg = "" oStyles = oFamilies.getByName(mFamilyNames(n)) mStyleNames = oStyles.getElementNames() For i = LBound(mStyleNames) To UBound (mStyleNames) sMsg=sMsg + i + " : " + mStyleNames(i) + Chr(13) If ((i + 1) Mod 20 = 0) Then MsgBox sMsg,0,mFamilyNames(n) sMsg = "" End If Next i MsgBox sMsg,0,mFamilyNames(n) Next n End Sub

4.3 Cambiar entre los documentos abiertos Sub Main Dim oDesktop As Object, oDocs As Object Dim oDoc As Object, oComponents As Object 'The hasMoreElements() will fail with the oDesktop, 'I do not know why! 'oDesktop = createUnoService("com.sun.star.frame.Desktop") oComponents = StarDesktop.getComponents() oDocs = oComponents.createEnumeration() Do While oDocs.hasMoreElements() oDoc = oDocs.nextElement() Loop End Sub

4.4 Listar fuentes (Quebrado, no funciona) Esto no funciona... solo para que lo sepan 21

Sub ListFonts Dim document As Object Dim Cursor Dim oText As Object Dim mySelection As Object Dim displayString As String document=ThisComponent displayString = "" oStyleFamilies = document.StyleFamilies 'CharacterStyles, ParagraphStyles, FrameStyles, PageStyles 'NumberingStyles, CellStyles, ShapeStyles oStyles = oStyleFamilies.getByName("CharacterStyles") For n = 0 to oStyles.Count - 1 oStyle = oStyles(n) displayString = displayString & "name = (" & oStyle.Name & ") Font = (" & oStyle.CharFontName & ") Style = (" & CharStyleName & ")" & chr(13) Next n Msgbox(displayString, 64, "Styles") End Sub

22

4.5 Imprimir el documento actual La ejecuto y puedo imprimir. Me detuve cuando traté de ver como imprimir un documento A4 en mi impresora Letter! Deseo hacerlo por defecto, pero decidí que eso no merece mi tiempo por ahora. '****************************************************************** 'Author: Andrew Pitonyak 'email: [email protected] Sub PrintCurrentDocument Dim mPrintopts1(), x as Variant 'Dimensioned at 0, if you set any other properties, be certain to set this to a higher value.... Dim mPrintopts2(0) As New com.sun.star.beans.PropertyValue Dim oDocument As Object, oPrinter As Object oDocument = ThisComponent '*********************************** 'Do you want to choose a certain printer 'Dim mPrinter(0) As New com.sun.star.beans.PropertyValue 'mPrinter(0).Name="Name" 'mPrinter(0).value="Other printer" 'oDocument.Printer = mPrinter() '*********************************** 'To simply print the document do the following: 'oDocument.Print(mPrintopts1()) '*********************************** 'To print pages 1-3, 7, and 9 'mPrintopts2(0).Name="Pages" 'mPrintopts2(0).Value="1-3; 7; 9" 'oDocument.Printer.PaperFormat=com.sun.star.view.PaperFormat.LETTER 'DisplayMethods(oDocument, "propr") 'DisplayMethods(oDocument, "") oPrinter = oDocument.getPrinter() MsgBox "printer is from " + LBound(oPrinter) + " to " + UBound(oPrinter) sMsg = "" For n = LBound(oPrinter) To UBound(oPrinter) sMsg = sMsg + oPrinter(n).Name + Chr(13) Next n MsgBox sMsg,0,"Print Settings" 'DisplayMethods(oPrinter, "propr") 'DisplayMethods(oPrinter, "") 'mPrintopts2(0).Name="PaperFormat" 'mPrintopts2(0).Value=com.sun.star.view.PaperFormat.LETTER 'oDocument.Print(mPrintopts2()) End Sub

23

Algo como esto imprime la página actual! dim aPrintOps(0) as new com.sun.star.beans.PropertyValue oDoc = ThisComponent oViewCursor = oDoc.CurrentController.getViewCursor() aPrintOps(0).Name = "Pages" aPrintOps(0).Value = trim(str(oViewCursor.getPage())) oDoc.print(aPrintOps())

24

4.6 Cambiando el tamaño de una lista Comentario desde el sitio Web. Bueno, use la macro. Mientras este error no sea corregido, necesitará “terminar la tarea” después de aplicar la macro, como un apagado corriente, los valores escritos por la macro serán sobreescritos. Hay algunas otras maneras para lograr lo mismo, pero involucra meterse con archivos locales que son una implementación detallada de la configuración del “backend”, que no voy a mencionar aqui :). Para mi, esta macro no lo es. '****************************************************************** 'Author: Unknown 'email: http://ui.openoffice.org/howto/index.html Option Explicit Sub SetPickListTen ChangePickListSize( 10 ) End Sub Sub ChangePickListSize( nSize As Integer ) ' access the global configuration provider Dim aConfigProvider As Object aConfigProvider = createUnoService( "com.sun.star.configuration.ConfigurationProvider" ) ' create an access object for the history node Dim aHistorySettings As Object Dim aParams(0) As new com.sun.star.beans.PropertyValue aParams(0).Name = "nodepath" aParams(0).Value = "/org.openoffice.Office.Common/History" aHistorySettings = aConfigProvider.createInstanceWithArguments ( "com.sun.star.configuration.ConfigurationUpdateAccess", aParams() ) ' set the pick list size aHistorySettings.replaceByName( "PickListSize", nSize ) ' commit the changes done aHistorySettings.commitChanges End Sub

Si desea hacerlo manualmente, aqui está la forma “dificil” de hacerlo 1. Haga una o dos copias completas de los archivos apropiados antes de empezar ~/staroffice6.0/user/config/registry/instance/org/openoffice/Office/common.xml ~/openoffice/user/config/registry/instance/org/openoffice/Office/common.xml 2. Inicie TextPad (www.textpad.com) o cualquier otro editor de texto que maneje archivos XML bien. No use el Block de Notas (Notepad de windows); este obtiene cientos de cuadritos curiosos y mientras se intenta tecnicamente de estar OK, es rrrrrrealmente dificil de leer archivos XML en él. 3. Abra el siguiente archivo, para StarOffice o OpenOffice, cualquiera que esté usando: 25

~/staroffice6.0/user/config/registry/instance/org/openoffice/Office/common.xml ~/openoffice/user/config/registry/instance/org/openoffice/Office/common.xml 4. Busque la etiqueta ; las entradas son alfabéticas. Verá algo como lo siguiente: StarOffice XML (Writer) 4. file:///C:/docs/newdocs/story.sxw file:///C:/docs/newdocs/story.sxw [y luego, un poco más entradas ...] StarOffice XML (Writer) file:///C:/docs/newdocs/story.sxw file:///C:/docs/newdocs/story.sxw [y luego, con tres entradas más; esta es la lista de archivos recientes desplegada bajo el menú archivo...] 5. Reemplace en contenido entero de la etiqueta , es decir desde a inclusive, con el siguiente texto. El ejemplo cambia StarOffice para desplegar los 9 archivos más recientes; digite el número que desee. Imagino que no es buena idea hacerlo muy grande, pero no conozco si existe un límite de archivos, si hay alguno. 9

4.7 Open And Close Documents (And The Desktop) 4.7.1 Cerrar documentos OpenOffice Todos los documentos OpenOffice y los objetos en marcos (servicios) soportan la interface Xcerrable. Para cerrar estos objetos deberá llamar close(bForce As Boolean). Si bForce es falso, entonces el objeto puede rehusar a cerrarse. Si bForce es verdadero, entonces el objeto no puede rehusarse a cerrarse. El escritorio no soporta la interface Xcerrable por razones de herencia. El método terminate() es usado para esto. Este método causa un evento-terminación que será transmitido a todos los que escuchen. Si no se devuelve TerminationVetoException, una notificación de evento26

terminación es transmitido y se devuelve un valor verdadero. De lo contrario, se transmite un aborte-evento-terminación y se devuelve un valor falso. Para citar a Mathias Bauer, “el método terminate() estuvo ahi por mucho tiempo, mucho antes que descubrimos que no es la manera correcta de manejar el cierre de documentos o ventanas. Si este no hubiera estado ahí, podríamos haber usado Xcerrable para el escritorio también.”[Bauer001] If HasUnoInterfaces(oDoc, "com.sun.star.util.XCloseable") Then oDoc.close(true) Else oDoc.dispose End If

Obtuve los siguientes metodos de Sasa Kelecevic [[email protected]] que no he probado?? '------------- salvar_y_cerrar -------------'Use uno de estos métodos 'oDocClose=StarDesktop.CurrentFrame.Close 'oDocClose=StarDesktop.ActiveFrame.Close '------------- cerrar_no_salvar --------------------'Use uno de estos métodos 'oDocClose=ThisComponent.Dispose 'oDocClose=StarDesktop.ActiveFrame.Dispose

4.7.2 Cargar un documento desde una URL Para cargar un documento desde una URL, use el método LoadComponentFromURL() del escritorio. Esto carga un componente dentro de un marco, nuevo o existente. Sintaxis: loadComponentFromURL( string aURL, string aTargetFrameName, long nSearchFlags, sequence< com::sun::star::beans::PropertyValue > aArgs) Returna: com::sun::star::lang::XComponent Parámetros: aURL: URL para el documento a cargar. Para crear un nuevo documento, use "private:factory/scalc", "private:factory/swriter", etc. aTargetFrameName: Nombre del marco que contendrá el documento. Si el nombre delmarco existe, será usado , de lo contrario será creado. "_blank" crea un nuevo marco, "_self" usa el marco actual, "_parent" usa el marco padre, y "_top" usa el primer marco de la ruta actual en el árbol. nSearchFlags: Usa los valores de FrameSearchFlag para especificar cómo encontrar el nombre del marco destino (aTargetFrameName). Normalmente, simplemente use 0. http://api.openoffice.org/common/ref/com/sun/star/frame/FrameSearchFlag.html

27

#

Nombre

Descripción

0 Auto

SELF+CHILDREN

1 PARENT

Incluye el marco padre

2

Incluye el marco inicial

4 8

SELF

CHILDREN Incluye los marcos hijos del marco inicial CREATE

Será creado un marco, si no existe

16 SIBLINGS

Incluye otros marcos hijos del marco inicial

32

TASKS

Incluye todos los marcos en todas las tareas de la actual jerarquía de marcos.

23

ALL

55

GLOBAL

63

Incluye todos los marcos de las otras tareas. 23 = 1+2+4+16 = PARENT + SELF + CHILDREN + SIBLINGS. Busca en toda la jerarquía de marcos. 55 = 1+2+4+16+32 = PARENT + SELF + CHILDREN + SIBLINGS + TASKS. GLOBAL + CREATE

aArgs: Especifica el comportamiento especifico del componente o filtro. "ReadOnly" con un valor boleano especifica que el documento está abierto en modo sólo lectura. "FilterName" especifica el tipo de componente para crear y el tipo de filtro a usar, por ejemplo: "scalc: Text - csv". Ver http://api.openoffice.org/common/ref/com/sun/star/document/MediaDescriptor.html Ejemplo: Rem Cargar dos documentos en el mismo marco! oDesk = createUnoService("com.sun.star.frame.Desktop") Dim NoArgs() Rem marco "MyName" será creado si no existe porque incluye "CREATE" oDoc1 = oDesk.LoadComponentFromUrl(sUrl_1, "MyName", 63, Noargs()) Rem Usar el marco existente "MyName" oDoc2 = oDesk.LoadComponentFromUrl(sUrl_2, "MyName", 55, Noargs())

Tip

En 1.1 el marco implementa loadComponentFromURL por eso puede usar: oDoc = oDesk.LoadComponentFromUrl(sUrl_1, "_blank", 0, Noargs()) oFrame = oDoc.CurrentController.Frame oDoc = oFrame.LoadComponentFromUrl(sUrl_2, "", 2, Noargs())

Note the search flag arguments and the empty frame name argument.

Advertencia En 1.1 solamente puede volver a usar un marco si conoce su nombre. Ejemplo: Sub insertDocumentAtCursor(sFileUrl As String, oText As Object, oDoc As Object)

28

Dim oCur As Object Dim oProperties As Object oCur=oText.createTextCursorByRange(oDoc.getCurrentController().getViewCursor().getStart()) oCur.insertDocumentFromURL(sFileURL,oProperties) End Sub

Ejemplo: '------------- open_new -------------------'Dim NoArgs() 'oDocNew=StarDesktop.loadComponentFromURL("private:factory/swriter","_blank",0,NoArgs())' ------------- open_old_file --------------'Dim NoArg() 'oDocOldFile=StarDesktop.loadComponentFromURL(sUrl,"_blank",0,NoArg())

4.8 Creando una tabla No tengo nada que hacer con estas macros de Kienlein?? Sub InsertNextItem(what, oCursor, oTable) Dim oCelle As Object 'name of the cell range that is selected by this cursor sName = oCursor.getRangeName() ' The cell name will be something like D3 oCelle = oTable.getCellByName(sName) oCelle.String = what oCursor.goRight(1,FALSE) End Sub Function CreateTable() As Object oDocument = StarDesktop.ActiveComponent oTextTable = oDocument.createInstance("com.sun.star.text.TextTable") CreateTable = oTextTable End Function

29

4.9 Llamando un programa externo Este ejemplo de llamada de un programa externo y salvar la salida fue muy lento por el creador de la macro. Aun no lo he probado. El programa my_filter pone su salida en / tmp/output.txt. Pero el filtro es muy lento y debo esperar a que termine. Pero esta no es la mejor manera de hacerlo. Cómo puedo canalizar una cadena por medio de un programa externo? Algún ejemplo? ?? Pruebe esto! '****************************************************************** 'Author: Pavel Janík 'email: [email protected] Sub CallExternalProgram () Dim Document As Object Document = ThisComponent ' Andrew says that this looks like an extra text para = Document.text.Text.getText() shell ("/home/pavel/my_filter", 2, "'" & para.getString() & "'", True) wait (9000) para.setString(ReturnContentsOfFile("/tmp/output.txt")) End Sub

30

4.10 Leer y escribir en un archivo Este ejemplo lee un número desde un archivo de texto. Este valor es convertido en número e incrementado. El número es escrito de nuevo en el archivo como una cadena. '****************************************************************** 'Author: Andrew Pitonyak 'email: [email protected] Sub Read_Write_Number_In_File DIM CountFileName As String, NumberString As String DIM LongNumber As Long, iNum As Integer Dim oDocument As Object CountFileName = "C:\Andy\My Documents\oo\NUMBER.TXT" NumberString = "00000000" LongNumber = 0 'On Local Error Goto NoFile If FileExists(CountFileName) Then ON ERROR GOTO NoFile iNum = FreeFile OPEN CountFileName for input as #iNum LINE INPUT #iNum ,NumberString CLOSE #iNum MsgBox("Read " & NumberString, 64, "Read") NoFile: If Err 0 Then Msgbox("Can not read " & CountFileName, 64, "Error") NumberString = "00000001" End If On Local Error Goto 0 Else Msgbox(CountFileName & " does NOT exists", 64, "Warning") NumberString = "00000001" End If ON ERROR GOTO BadNumber LongNumber = Int(NumberString) LongNumber = LongNumber + 1 BadNumber: If Err 0 Then Msgbox(NumberString & " is not a number", 64, "Error") LongNumber = 1 End If On Local Error Goto 0 NumberString=Trim(Str(LongNumber)) While LEN(NumberString) < 8 NumberString="0"&NumberString Wend MsgBox("Number is (" & NumberString & ")", 64, "Information") iNum = FreeFile OPEN CountFileName for output as #iNum PRINT #iNum,NumberString

31

CLOSE #iNum End Sub

32

4.11 Creando un estilo de formato numérico Si desea un formato particular de número, entonces puede observar si existe y crearlo si no lo tiene. Para más información sobre fomatos validos, vea los contenidos de la ayuda en los tópicos “number formats; formats”. Estos pueden ser bastante complejos. '****************************************************************** 'Author: Andrew Pitonyak 'email: [email protected] Function FindCreateNumberFormatStyle (_ sFormat As String, Optional doc, Optional locale) Dim oDocument As Object Dim aLocale as new com.sun.star.lang.Locale Dim oFormats As Object oDocument = IIf(IsMissing(doc), ThisComponent, doc) oFormats = oDocument.getNumberFormats() 'If you choose to query on types, you need to use the type 'com.sun.star.util.NumberFormat.DATE 'I could set the locale from values stored at 'http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt 'http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html 'I use a NULL locale and let it use what ever it likes. 'First, see if the number format exists If ( Not IsMissing(locale)) Then aLocale = locale End If formatNum = oFormats.queryKey (sFormat, aLocale, TRUE) MsgBox "Current Format number is" & formatNum 'If the number format does not exist then add it If (formatNum = -1) Then formatNum = oFormats.addNew(sFormat, aLocale) If (formatNum = -1) Then formatNum = 0 MsgBox "new Format number is " & formatNum End If FindCreateNumberFormatStyle = formatNum End Function

33

4.12 Retorna una matriz Fibonnaci Esta función retorna una matriz con números Fibonnaci. '****************************************************************** ' http://disemia.com/software/openoffice/macro_arrays.html ' Return the sequence of fibonnaci numbers ' assume that count >=2 is to make this code simpler Function Fibonnaci( Count As Integer ) Dim result( 1 to Count, 1 ) As Double result( 1, 1 ) = 0 result( 2, 1 ) = 1 For i = 3 to Count result( i, 1 ) = result( i - 2, 1 ) + result( i - 1, 1 ) Next i Fibonnaci = result() End Function

4.13 Insertar texto en un marcador oDoc.getBookmarks().getByName("").getAnchor.setString( "What you want to insert")

4.14 Campos de usuario ?? No he hecho nada con esto! Encontré datos de usuario en el documento -- de estos puede obtener algo como esto: oDoc = ThisComponent oInfo = oDoc.Document.Info oVal = oData.ElementNames iCount = oInfo.GetUserFieldCount() For iCount = 0 to oInfo.GetUserFieldCount() - 1 sKey = oInfo.GetUserFieldName(iCount) sVal = oInfo.GetUserFieldValue(iCount) msgbox "Name: " & sKey & ", Value: " & sVal Next iCount

La respuesta fue: > Conoce alguno como (si es posible) incrementar el número de campos de usuario a más de 4? AFAIK no. Qué encontraste sobre campos de usuario de documento de información. AFAIK Ellos son fijados. > Y si esto no es posible – Creo que encontré un segundo juego de campos de usuario, > pero no estoy seguro exactamente si están en el objeto Odoc. Puede obtenerlos con el getTextFields() y getTextFieldMasters() 34

DocInfo = ThisComponent.DocumentInfo nCount = DocInfo.getUserFieldCount() for i=0 to nCount-1 DocInfo.setUserFieldName(i,name) DocInfo.setUserFieldValue(index,value) next i

donde [name], [value] son cadenas que usted elije. También puede usar getUserFieldName(index) o getUserFieldValue(index) para leer estos campos.

35

5 Macros de Calc 5.1 Es este un libro de cálculo? Un libro de cálculo está compuesto de un conjunto de hojas. Antes de poder usar los métodos específicos del libro de cálculo, debe tener un documento libro de cálculo. Puede verificar esto de la siguiente manera: Function IsSpreadhsheetDoc(oDoc) As Boolean On Local Error GoTo NODOCUMENTTYPE IsSpreadhsheetDoc =oDoc.SupportsService(_ "com.sun.star.sheet.SpreadsheetDocument") NODOCUMENTTYPE: If Err 0 Then IsSpreadhseetDoc = False Resume GOON GOON: End If End Function

5.2 Imprimiendo el valor de una Celda, Cadena o Fórmula. '****************************************************************** 'Author: Sasa Kelecevic 'email: [email protected] Sub ExampleGetValue Dim oDocument As Object, oSheet As Object, oCell As Object oDocument=ThisComponent oSheet=oDocument.Sheets.getByName("Sheet1") oCell=oSheet.getCellByposition(0,0) 'A1 print oCell.getValue 'print oCell.getString 'print oCell.getFormula End sub

5.3 Estableciendo el valor de una Celda, Formato, Cadena o Fórmula. '****************************************************************** 'Author: Sasa Kelecevic 'email: [email protected] Sub ExampleSetValue Dim oDocument As Object, oSheet As Object, oCell As Object oDocument=ThisComponent oSheet=oDocument.Sheets.getByName("Sheet1") oCell=oSheet.getCellByPosition(0,0) 'A1 oCell.setValue(23658) 'oCell..NumberFormat=2 '23658.00 'oCell.SetString("oops") 'oCell.setFormula("=FUNCTION()") 'oCell.IsCellBackgroundTransparent = TRUE 'oCell.CellBackColor = RGB(255,141,56)

37

End Sub

5.4 Limpiar una celda Una lista de cosas que pueden ser limpiadas se encuentra en http://api.openoffice.org/5.2/reference/com/sun/star/sheet/CellFlags.html '****************************************************************** 'Author: Andrew Pitonyak 'email: [email protected] Sub ClearDefinedRange Dim oDocument As Object, oSheet As Object, oSheets As Object Dim oCellRange As Object Dim nSheets As Long oDocument = ThisComponent oSheets = oDocument.Sheets nSheets = oDocument.Sheets.Count oSheet = oSheets.getByIndex(2) Rem the range is from 0 to n-1 oCellRange = oSheet.getCellRangeByName("range_you_set") oCellRange.clearContents(_ com.sun.star.sheet.CellFlags.VALUE | _ com.sun.star.sheet.CellFlags.DATETIME | _ com.sun.star.sheet.CellFlags.STRING | _ com.sun.star.sheet.CellFlags.ANNOTATION | _ com.sun.star.sheet.CellFlags.FORMULA | _ com.sun.star.sheet.CellFlags.HARDATTR | _ com.sun.star.sheet.CellFlags.STYLES | _ com.sun.star.sheet.CellFlags.OBJECTS | _ com.sun.star.sheet.CellFlags.EDITATTR) End Sub

5.5 Texto seleccionado, Qué es? Un texto seleccionado en una hoja de cálculo puede ser diferentes cosas; algunas las entiendo y otras no. 1. Una celda seleccionada. Haga click en una celda y luego presione mayúsculas y haga click de nuevo. 2. Texto parcialmente seleccionado en una celda. Haga doble click en una celda y selecciona una parte del texto. 3. Nada seleccionado. Un click sencillo o tabulador entre celdas. 4. Múltiples celdas seleccionadas. Click sencillo y arrastre el cursor. 5. Selecciones múltiples no continuas. Seleccione algunas celdas. Presione la tecla control y seleccione otras. No sé como distinguir los primeros tres casos. Si me puedo imaginar cómo extraer el texto seleccionado del caso 2, entonces resolveré el problema. Function CalcIsAnythingSelected(oDoc As Object) As Boolean Dim oSelections As Object, oSel As Object, oText As Object, oCursor As Object IsAnythingSelected = False If IsNull(oDoc) Then Exit Function ' The current selection in the current controller.

38

'If there is no current controller, it returns NULL. oSelections = oDoc.getCurrentSelection() If IsNull(oSelections) Then Exit Function If oSelections.supportsService("com.sun.star.sheet.SheetCell") Then Print "One Cell selected = " & oSelections.getImplementationName() MsgBox "getString() = " & oSelections.getString() ElseIf oSelections.supportsService("com.sun.star.sheet.SheetCellRange") Then Print "One Cell Range selected = " & oSelections.getImplementationName() ElseIf oSelections.supportsService("com.sun.star.sheet.SheetCellRanges") Then Print "Multiple Cell Ranges selected = " & oSelections.getImplementationName() Print "Count = " & oSelections.getCount() Else Print "Somethine else selected = " & oSelections.getImplementationName() End If End Function

39

5.6 Dirección imprimible de una Celda. 'Given a cell, extract the normal looking address of a cell 'First, the name of the containing sheet is extracted. 'Second, the column number is obtained and turned into a letter 'Lastly, the row is obtained. Rows start at 0 but are displayed as 1 Function PrintableAddressOfCell(the_cell As Object) As String PrintableAddressOfCell = "Unknown" If Not IsNull(the_cell) Then PrintableAddressOfCell = the_cell.getSpreadSheet().getName + ":" + _ ColumnNumberToString(the_cell.CellAddress.Column) + (the_cell.CellAddress.Row+1) End If End Function ' Columns are numbered starting at 0 where 0 corresponds to A ' They run as A-Z,AA-AZ,BA-BZ,...,IV ' This is esentially a question of how do you convert a Base 10 number to ' a base 26 number. ' Note that the_column is passed by value! Function ColumnNumberToString(ByVal the_column As Long) As String Dim s$ 'Save this so I do NOT modify the parameter. 'This was an icky bug that took me a while to find Do s$ = Chr(65 + the_column MOD 26) + s$ the_column = the_column / 26 Loop Until the_column = 0 ColumnNumberToString = s$ End Function

40

5.7 Insertar fechas formateadas en una Celda Inserte la fecha en la celda actual. Da un mensaje de error si el documento actual no es una hoja de cálculo. El código provee la manera de formatear la fecha con el estilo que elija. Lolo necesita pero quitele el comentario. '****************************************************************** 'Author: Andrew Pitonyak 'email: [email protected] 'uses: FindCreateNumberFormatStyle Sub InsertDateIntoCell Dim oDesktop As Object, oController As Object, oSelection As Object Dim doc As Object oDesktop = createUnoService("com.sun.star.frame.Desktop") oController = oDesktop.CurrentFrame.Controller doc = oController.Model If doc.SupportsService("com.sun.star.sheet.SpreadsheetDocument") Then oSelection = oController.Selection ' set the date value oFunction = CreateUnoService("com.sun.star.sheet.FunctionAccess") oFunction.NullDate = doc.NullDate Dim aEmpty() oSelection.Value = oFunction.callFunction("NOW", aEmpty()) ' Set the date number format to default oFormats = doc.NumberFormats dim aLocale as new com.sun.star.lang.Locale oSelection.NumberFormat = oFormats.getStandardFormat(_ com.sun.star.util.NumberFormat.DATETIME, aLocale) ' Set the format to something completely different 'oSelection.NumberFormat = FindCreateNumberFormatStyle(_ ' "YYYYMMDD.hhmmss", doc) Else MsgBox "This macro must be run in a spreadsheet document" End If End Sub

5.8 Desplegar un rango seleccionado en un cuadro de diálogo '****************************************************************** 'Author: Sasa Kelecevic 'email: [email protected] 'This macro will take the current selection and print a message 'box indicating the selected range and the number of selected 'cells Sub SelectedCells oSelect=ThisComponent.CurrentSelection.getRangeAddress

41

oSelectColumn=ThisComponent.CurrentSelection.Columns oSelectRow=ThisComponent.CurrentSelection.Rows CountColumn=oSelectColumn.getCount CountRow=oSelectRow.getCount oSelectSC=oSelectColumn.getByIndex(0).getName oSelectEC=oSelectColumn.getByIndex(CountColumn-1).getName oSelectSR=oSelect.StartRow+1 oSelectER=oSelect.EndRow+1 NoCell=(CountColumn*CountRow) If CountColumn=1 AND CountRow=1 Then MsgBox("Cell " + oSelectSC + oSelectSR + chr(13) + "Cell No = " + NoCell,, "SelectedCells") Else MsgBox("Range(" + oSelectSC + oSelectSR + ":" + oSelectEC + oSelectER + ")" + chr(13) + "Cell No = " + NoCell,, "SelectedCells") End If End Sub

5.9 Rellenar un rango seleccionado con texto Esta simple macro cambia a través del texto seleccionado poniéndo el texto en “OOPS”. '****************************************************************** 'Author: Sasa Kelecevic 'email: [email protected] Sub FillCells oSelect=ThisComponent.CurrentSelection oColumn=oselect.Columns oRow=oSelect.Rows For nc= 0 To oColumn.getCount-1 For nr = 0 To oRow.getCount-1 oCell=oselect.getCellByPosition (nc,nr).setString ("OOOPS") Next nr Next nc End Sub

42

5.10 Algunos estados del texto seleccionado '****************************************************************** 'Author: Sasa Kelecevic 'email: [email protected] 'Esta macro toma la selección actual e imprime un mensaje 'indicando el rango seleccionado y el número de celdas 'seleccionadas Sub Analize sSum="=SUM("+GetAddress+")" sAverage="=AVERAGE("+GetAddress+")" sMin="=MIN("+GetAddress+")" sMax="=MAX("+GetAddress+")" CellPos(7,6).setString(GetAddress) CellPos(7,8).setFormula(sSum) CellPos(7,8).NumberFormat=2 CellPos(7,10).setFormula(sAverage) CellPos(7,10).NumberFormat=2 CellPos(7,12).setFormula(sMin) CellPos(7,12).NumberFormat=2 CellPos(7,14).setFormula(sMax) CellPos(7,14).NumberFormat=2 End sub Function GetAddress 'selected cell(s) oSelect=ThisComponent.CurrentSelection.getRangeAddress oSelectColumn=ThisComponent.CurrentSelection.Columns oSelectRow=ThisComponent.CurrentSelection.Rows CountColumn=oSelectColumn.getCount CountRow=oSelectRow.getCount oSelectSC=oSelectColumn.getByIndex(0).getName oSelectEC=oSelectColumn.getByIndex(CountColumn-1).getName oSelectSR=oSelect.StartRow+1 oSelectER=oSelect.EndRow+1 NoCell=(CountColumn*CountRow) If CountColumn=1 AND CountRow=1 then GetAddress=oSelectSC+oSelectSR Else GetAddress=oSelectSC+oSelectSR+":"+oSelectEC+oSelectER End If End Function Function CellPos(lColumn As Long,lRow As Long) CellPos= ActiveSheet.getCellByPosition (lColumn,lRow) End Function Function ActiveSheet ActiveSheet=StarDesktop.CurrentComponent.CurrentController.ActiveSheet End Function Sub DeleteDbRange(sRangeName As String)

43

oRange=ThisComponent.DatabaseRanges oRange.removeByName (sRangeName) End Sub

5.11 Cambiar el rango seleccionado a un rango de Base de Datos '****************************************************************** 'Author: Sasa Kelecevic 'email: [email protected] Sub DefineDbRange(sRangeName As String) 'selected range On Error GoTo DUPLICATENAME oSelect=ThisComponent.CurrentSelection.RangeAddress oRange=ThisComponent.DatabaseRanges.addNewByName (sRangeName,oSelect ) DUPLICATENAME: If Err 0 Then MsgBox("Duplicate name",,"INFORMATION") End If End Sub

5.12 Borrar un rango de Base de Datos '****************************************************************** 'Author: Sasa Kelecevic 'email: [email protected] Sub DeleteDbRange(sRangeName As String) oRange=ThisComponent.DatabaseRanges oRange.removeByName (sRangeName) End Sub

5.13 Rango bordes de línea ?? Está modificando la estructura temporal aqui. Use algo como esto. '****************************************************************** 'Author: Niklas Nebel 'email: [email protected] ' setting_borders_in_calc oRange = ThisComponent.Sheets(0).getCellRangeByPosition(0,1,0,63) aBorder = oRange.TableBorder aBorder.BottomLine = lHor oRange.TableBorder = aBorder

He goes on to say that the following will not work because it modifies a temporary struct. lHor.Color = 0: lHor.InnerLineWidth = 0: lHor.OuterLineWidth = 150: dim lHor as New com.sun.star.table.BorderLinelHor.LineDistance = 0 ThisComponent.Sheets(0).getCellRangeByPosition(0,1,0,63).TableBorder.BottomLine = lHor

44

5.14 Ordenar un rango '****************************************************************** 'Author: Sasa Kelecevic 'email: [email protected] Sub SortRange Dim oSheetDSC,oDSCRange As Object Dim aSortFields(0) as new com.sun.star.util.SortField Dim aSortDesc(0) as new com.sun.star.beans.PropertyValue 'set your sheet name oSheetDSC = ThisComponent.Sheets.getByName("Sheet1") 'set your range address oDSCRange = oSheetDSC.getCellRangeByName("A1:L16") ThisComponent.getCurrentController.select(oDSCRange) aSortFields(0).Field = 0 aSortFields(0).SortAscending = FALSE aSortDesc(0).Name = "SortFields" aSortDesc(0).Value = aSortFields() oDSCRange.Sort(aSortDesc()) End sub

45

5.15 Imprimir todos los datos en una columna Mientras cambiaba la celda y los valores a imprimir, quería imprimir información sobre las celdas. He aqui cómo lo hice. Sub PrintDataInColumn (a_column As Integer) Dim oCells As Object, aCell As Object, oDocument As Object Dim oColumn As Object, oRanges As Object oDocument = ThisComponent oColumn = oDocument.Sheets(0).Columns(a_column) Print "Using column " + oColumn.getName oRanges = oDocument.createInstance("com.sun.star.sheet.SheetCellRanges") oRanges.insertByName("", oColumn) oCells = oRanges.Cells.createEnumeration If Not oCells.hasMoreElements Then Print "Sorry, no text to display" While oCells.hasMoreElements aCell = oCells.nextElement 'This next Function is defined elsewhere in this document! MsgBox PrintableAddressOfCell(aCell) + " = " + aCell.String Wend End Sub

5.16 Usando métodos de bordes (agrupamiento) Ryan Nelson [[email protected]] me dijo sobre la capacidad de bordes y luego me contó cómo hacer esta macro. Hay dos cosas que debe tener en mente. La primera es que es la hoja que agrega y remueve el arupamiento, y la segunda es que los parámetros deben ser los correctos. http://api.openoffice.org/common/ref/com/sun/star/sheet/XSheetOutline.html http://api.openoffice.org/common/ref/com/sun/star/table/TableOrientation.html Option Explicit Sub CalcGroupingExample Dim oDoc As Object, oRange As Object, oSheet As Object oDoc = ThisComponent If Not oDoc.SupportsService("com.sun.star.sheet.SpreadsheetDocument") Then MsgBox "This macro must be run from a spreadsheet document", 64, "Error" End If oSheet=oDoc.Sheets.getByName("Sheet1") ' Parms are (left, top, right, bottom) oRange = oSheet.getCellRangeByPosition(2,1,3,2) 'Could also use COLUMNS oSheet.group(oRange.getRangeAddress(), com.sun.star.table.TableOrientation.ROWS) Print "I just grouped the range" oSheet.unGroup(oRange.getRangeAddress(), com.sun.star.table.TableOrientation.ROWS) Print "I just ungrouped the range" End Sub

46

5.17 Protegiendo sus datos Es fácil proteger sus hojas de cálculo, solamente tiene que llamar su hoja y protegerla. Mi experimento indica que sin embargo no genera un error cuando elige proteger un documento entero, pero no protegerá el documento entero. Sub ProtectSpreadsheet dim oDoc As Object, oSheet As Object oDoc = ThisComponent oSheet=oDoc.Sheets.getByName("Sheet1") oSheet.protect("password") Print "Protect value = " & oSheet.isProtected() oSheet.unprotect("password") Print "Protect value = " & oSheet.isProtected() End Sub

47

6 Macros de Write 6.1 Texto seleccionado, qué es? Texto seleccionado es esencialmente un rango de texto, nada más. Después de que la selección es obtenida. Es posible obtener el texto [getString()] y cambiar el texto [setString ()]. Mientras las cadenas están limitadas a 64K de tamaño, las selecciones no. Hay algunas instancias, sin embargo, con los resultados de los métodos getString() y setString() que no entiendo. Sin embargo, es probablemente mejor usar un cursor para cambiar el texto seleccionado y después usar los métodos insertString() y insertControlCharacter() del objeto de texto. La documentación específicamente indica que los siguientes caracteres “blancos” son soportados por el método insertString(): blank, tab, cr (que inserta un cambio de parráfo), y lf (que inserta una nueva línea). El texto puede ser manualmente seleccionado mientras el cursor esta a la derecha o a la izquierda de la selección. Una selección tiene un punto de inicio y punto final y no se puede saber cual esta a la izquierda y cual está a la derecha del texto seleccionado. Un método mostrado abajo corrige este problema. Ver también: http://api.openoffice.org/common/ref/com/sun/star/text/TextRange.html http://api.openoffice.org/common/ref/com/sun/star/text/XTextRange.html

6.2 Cursores de texto, qué son? Un cursor de texto es un rango de texto que puede ser movido dentro de un objeto de texto. Los movimientos standars incluyen goLeft, goRight, goUp, y goDown. El primer parametro es un entero indicando cuántos caracteres o lineas se moverán. El segundo parámetro es un valor boleano para indicar si el texto seleccionado se puede expandir (true) o no. El valor de True (verdadero) es retornado mientras ocurre el movimiento. Si un cursor ha seleccionado texto por el movimiento izquierdo y desea moverlo a la derecha, probablemente quiera usar oCursor.goRight(0, False) para indicar al cursor que empiece a moverse a la derecha y no seleccione texto. Esto dejará el texto sin seleccionarse. Un cursor de texto tiene un inicio y un final. Si la posición inicial es la misma que la posición final entonces no hay texto seleccionado y la propiedad IsCollapsed será verdadera. Un cursor de texto implementa interfaces que permite movimientos y reconocimiento de posiciones específicas a palabras, oraciones, y párafos. Esto puede ahorrar bastante tiempo.

Advertencia Cursor.gotoStart() y Cursor.gotoEnd() va al inicio o al final del documento aun si el cursor está creado sobre un rango.

Ver también: http://api.openoffice.org/common/ref/com/sun/star/view/XViewCursor.html http://api.openoffice.org/common/ref/com/sun/star/text/TextCursor.html http://api.openoffice.org/common/ref/com/sun/star/text/XWordCursor.html http://api.openoffice.org/common/ref/com/sun/star/text/XSentenceCursor.html http://api.openoffice.org/common/ref/com/sun/star/text/XParagraphCursor.html 49

http://api.openoffice.org/common/ref/com/sun/star/text/TextRange.html http://api.openoffice.org/common/ref/com/sun/star/text/XTextRange.html

6.3 Andrew's Selected Text Framework Muchos problemas al usar texto seleccionado se ven en un nivel abstracto. If nothing is selected then do work on entire document else for each selected area do work on selected area

The difficult part that will change each time is writing a worker macro that will iterate over a selection or between two cursors.

6.3.1 Hay texto seleccionado? Los estados del documentación son si no hay controlador actual, entonces getCurrentSelection() regresará un valor nulo que cuando hay selecciones. Tengo un conocimiento limitado de esto pero trataré de explicarlo y verificarlo. Si la selección es cero, nada está seleccionado. Nunca he vista un conteo de selección de cero, pero chequeelo de cualquier manera. Si no hay texto seleccionado, Tengo una selección de tamaño cero. He visto ejemplos donde la selección es cero y se determina de la siguiente manera: If Len(oSel.getString()) = 0 Then nothing is selected

El problema con esto es que es posible que el texto seleccionado pueda contener más de 64K en caracteres y una cadena no puede contener más de 64 caracteres. Yo considero que esto no es seguro. La mejor solución es crear un cursor de texto del rango seleccionado y luego chequearlo para ver si las posiciones de inicio y final son iguales. oCursor = oDoc.Text.CreateTextCursorByRange(oSel) If oCursor.IsCollapsed() Then nothing is selected

Aqui hay una función que hará la verificación completa: Function IsAnythingSelected(oDoc As Object) As Boolean Dim oSelections As Object, oSel As Object, oText As Object, oCursor As Object IsAnythingSelected = False If IsNull(oDoc) Then Exit Function ' The current selection in the current controller. 'If there is no current controller, it returns NULL. oSelections = oDoc.getCurrentSelection() If IsNull(oSelections) Then Exit Function If oSelections.getCount() = 0 Then Exit Function If oSelections.getCount() > 1 Then IsAnythingSelected = True Else oSel = oSelections.getByIndex(0) oCursor = oDoc.Text.CreateTextCursorByRange(oSel) If Not oCursor.IsCollapsed() Then IsAnythingSelected = True

50

End If End Function

6.3.2 Cómo obtener una selección Obtener una selección es complicado porque es posible que tenga multiples selecciones no contiguas o adyacentes. Algunas selecciones son vacías y algunas no. El código está escrito para manejar todos estos casos. El siguiente ejemplo cambia dentro de todas las secciones seleccionadas y las imprime. '****************************************************************** 'Author: Andrew Pitonyak 'email: [email protected] Sub MultipleTextSelectionExample Dim oSelections As Object, oSel As Object, oText As Object Dim lSelCount As Long, lWhichSelection As Long ' The current selection in the current controller. 'If there is no current controller, it returns NULL. oSelections = ThisComponent.getCurrentSelection() If Not IsNull(oSelections) Then oText = ThisComponent.Text lSelCount = oSelections.getCount() For lWhichSelection = 0 To lSelCount - 1 oSel = oSelections.getByIndex(lWhichSelection) MsgBox oSel.getString() Next End If End Sub

See Also: http://api.openoffice.org/common/ref/com/sun/star/text/XTextRange.html

6.3.3 Selected Text, Which End Is Which Selecciones son esencialmente rangos de texto con un inicio y un final. Como las selecciones tienen ambas un inicio y un final, que lado de la selección es cuál se determina por el método de selección. El objeto de texto provee métodos para comparar las posiciones de inicio y final de los rangos de texto. El método “short compareRegionStarts (XTextRange R1, XTextRange R2)” regresar 1 si R1 inicia antes de R2 , 0 si R1 inicia en la misma posición que R2 y -1 si R1 inicia después de R2. El método “short compareRegionEnds (XTextRange R1, XTextRange R2)” retorna 1, si R1 finaliza antes de R2 , 0, si R1 finaliza en la misma posición que R2 y -1, si R1 finaliza detrás de R2. Yo uso los siguientes dos métodos para encontrar la posición más a la izquierda o más a la derecha del cursor del texto seleccionado. '****************************************************************** 'Author: Andrew Pitonyak 'email: [email protected] 'oSelection is a text selection or cursor range

51

'oText is the text object Function GetLeftMostCursor(oSel As Object, oText As Object) As Object Dim oRange As Object, oCursor As Object If oText.compareRegionStarts(oSel.getEnd(), oSel) >= 0 Then oRange = oSel.getEnd() Else oRange = oSel.getStart() End If oCursor = oText.CreateTextCursorByRange(oRange) oCursor.goRight(0, False) GetLeftMostCursor = oCursor End Function '****************************************************************** 'Author: Andrew Pitonyak 'email: [email protected] 'oSelection is a text selection or cursor range 'oText is the text object Function GetRightMostCursor(oSel As Object, oText As Object) As Object Dim oRange As Object, oCursor As Object If oText.compareRegionStarts(oSel.getEnd(), oSel) >= 0 Then oRange = oSel.getStart() Else oRange = oSel.getEnd() End If oCursor = oText.CreateTextCursorByRange(oRange) oCursor.goLeft(0, False) GetRightMostCursor = oCursor End Function

See Also: http://api.openoffice.org/common/ref/com/sun/star/text/XTextCursor.html http://api.openoffice.org/common/ref/com/sun/star/text/XSimpleText.html http://api.openoffice.org/common/ref/com/sun/star/text/XTextRangeCompare.html

6.3.4 Sistema Macro de texto seleccionado Me tomó mucho tiempo entender como interactuar sobre el texto seleccionado usando los cursores, por eso tuve que escribir muchas macros que hacen cosas que considero equivocadas. Ahora uso sistemas de alto nivel para hacerlas. La idea es que si no hay texto seleccionado, entonces pregunta a la macro si se debe ejecutar contra todo el documento. Si la pregunta es si, entonces el cursor es creado al inicio y al final del documento, y luego la macro es ejecutada. Si hay texto seleccionado, entonces cada selección es traida, un cursor es obtenido al inicio y final de la selección, y la macro es ejecutada para cada una de estas selecciones.

52

El sistema rechazado

Ultimamente rechacé el siguiente sistema porque es muy largo y dificil de manejar y repetir cada vez que deseo interactuar contra el texto. Sin embargo es aceptable. Puede ser que prefiera este sistema y escoja usarlo. Sub IterateOverSelectedTextFramework Dim oSelections As Object, oSel As Object, oText As Object Dim lSelCount As Long, lWhichSelection As Long Dim oLCursor As Object, oRCursor As Object oText = ThisComponent.Text If Not IsAnythingSelected(ThisComponent) Then Dim i% i% = MsgBox("No text selected!" + Chr(13) + _ "Call worker for the ENTIRE document?", _ 1 OR 32 OR 256, "Warning") If i% 1 Then Exit Sub oLCursor = oText.createTextCursor() oLCursor.gotoStart(False) oRCursor = oText.createTextCursor() oRCursor.gotoEnd(False) CallYourWorkerMacroHere(oLCursor, oRCursor, oText) Else oSelections = ThisComponent.getCurrentSelection() lSelCount = oSelections.getCount() For lWhichSelection = 0 To lSelCount - 1 oSel = oSelections.getByIndex(lWhichSelection) 'If I want to know if NO text is selected, I could 'do the following: 'oLCursor = oText.CreateTextCursorByRange(oSel) 'If oLCursor.isCollapsed() Then ... oLCursor = GetLeftMostCursor(oSel, oText) oRCursor = GetRightMostCursor(oSel, oText) CallYourWorkerMacroHere(oLCursor, oRCursor, oText) Next End If End Sub

El sistema aceptable

Opté por crear el siguiente sistema. Devuelve un arreglo bidimensional de los cursores de inicio y final sobre las cuales interactuar. Esto permite usar un mínimo código base para interactuar sobre el texto seleccionado o sobre el documento entero. '****************************************************************** 'Author: Andrew Pitonyak 'email: [email protected] 'sPrompt : how to ask if should iterate over the entire text 'oCursors() : Has the return cursors 'Returns true if should iterate and false if should not Function CreateSelectedTextIterator(oDoc As Object, sPrompt As String, oCursors()) As Boolean

53

Dim oSelections As Object, oSel As Object, oText As Object Dim lSelCount As Long, lWhichSelection As Long Dim oLCursor As Object, oRCursor As Object CreateSelectedTextIterator = True oText = oDoc.Text If Not IsAnythingSelected(ThisComponent) Then Dim i% i% = MsgBox("No text selected!" + Chr(13) + sPrompt, _ 1 OR 32 OR 256, "Warning") If i% = 1 Then oLCursor = oText.createTextCursor() oLCursor.gotoStart(False) oRCursor = oText.createTextCursor() oRCursor.gotoEnd(False) oCursors = DimArray(0, 1) oCursors(0, 0) = oLCursor oCursors(0, 1) = oRCursor Else oCursors = DimArray() CreateSelectedTextIterator = False End If Else oSelections = ThisComponent.getCurrentSelection() lSelCount = oSelections.getCount() oCursors = DimArray(lSelCount - 1, 1) For lWhichSelection = 0 To lSelCount - 1 oSel = oSelections.getByIndex(lWhichSelection) 'If I want to know if NO text is selected, I could 'do the following: 'oLCursor = oText.CreateTextCursorByRange(oSel) 'If oLCursor.isCollapsed() Then ... oLCursor = GetLeftMostCursor(oSel, oText) oRCursor = GetRightMostCursor(oSel, oText) oCursors(lWhichSelection, 0) = oLCursor oCursors(lWhichSelection, 1) = oRCursor Next End If End Function

El trabajo principal

Este es un ejemplo que llama a la rutina del trabajo principal. Sub PrintExample Dim oCursors(), i% If Not CreateSelectedTextIterator(ThisComponent, _ "Print characters for the entire document?", oCursors()) Then Exit Sub For i% = LBOUND(oCursors()) To UBOUND(oCursors()) PrintEachCharacterWorker(oCursors(i%, 0), oCursors(i%, 1), ThisComponent.Text) Next i% End Sub

54

6.3.5 Desplegando caracteres, un ejemplo simple. Este simple ejemplo puede ser usado con el sistema anterior. '****************************************************************** 'Author: Andrew Pitonyak 'email: [email protected] Sub PrintEachCharacterWorker(oLCursor As Object, oRCursor As Object, oText As Object) If IsNull(oLCursor) Or IsNull(oRCursor) Or IsNull(oText) Then Exit Sub If oText.compareRegionEnds(oLCursor, oRCursor) = 0 Print "Character = '" & oLCursor.getString() & "'" Rem This will cause the currently selected text to become Rem no longer selected oLCursor.goRight(0, False) Loop End Sub

6.3.6 Remover espacios y líneas vacíos, un gran ejemplo. Este grupo de macros remueve todos los espacios en blanco con un espacio sencillo. Es fácil de modificar para borrar diferentes tipos de espacios en blanco. Los diferentes tipos de espacios en blanco están ordenados por importancia de manera que puede tener un espacio regular seguido de un párrafo nuevo, el nuevo párrafo se mantiene y el espacio es removido. Esto causará que los espacios iniciales y finales de las líneas son removidos. Qué es un espacio en blanco?

Para resolver este problema, mi primera tarea es determinar cuales caracteres son espacios en blanco. Puede trivialmente cambiar la definición de espacio en blanco para ignorar ciertos caracteres. 'Usually, this is done with an array lookup which would probably be 'faster, but I do not know how to use static initializers in basic. Function IsWhiteSpace(iChar As Integer) As Boolean Select Case iChar Case 9, 10, 13, 32, 160 IsWhiteSpace = True Case Else IsWhiteSpace = False End Select End Function

Rangos de caracteres para borrar

Luego, necesito definir que remover y que debo dejar. Opté por hacer esto con la siguiente rutina. '-1 means delete the previous character ' 0 means ignore this character

55

' 1 means delete this character ' Rank from highest to lowest is: 0, 13, 10, 9, 160, 32 Function RankChar(iPrevChar, iCurChar) As Integer If Not IsWhiteSpace(iCurChar) Then 'The current char is not white space, ignore it RankChar = 0 ElseIf iPrevChar = 0 Then 'Start of a line and current char is white space RankChar = 1 ' so delete the current character. ElseIf Not IsWhiteSpace(iPrevChar) Then 'Current char is white space but previous is not RankChar = 0 ' so ignore the current charcter. ElseIf iPrevChar = 13 Then 'Previous char is highest ranked white space RankChar = 1 ' so delete the current character. ElseIf iCurChar = 13 Then 'Current character is highest ranked white space RankChar = -1 ' so delete the previous character. ElseIf iPrevChar = 10 Then 'No new Pars so see if the previous char is new line RankChar = 1 ' so delete the current character. ElseIf iCurChar = 10 Then 'No new Pars so see if the current char is new line RankChar = -1 ' so delete the previous character. ElseIf iPrevChar = 9 Then 'No new Lines so see if the previous char is tab RankChar = 1 ' so delete the current character. ElseIf iCurChar = 9 Then 'No new Lines so see if the current char is a tab RankChar = -1 ' so delete the previous character. ElseIf iPrevChar = 160 Then 'No Tabs so check previous char for a hard space RankChar = 1 ' so delete the current character. ElseIf iCurChar = 160 Then 'No Tabs so check current char for a hard space RankChar = -1 ' so delete the previous character. ElseIf iPrevChar = 32 Then 'No hard spaces so check previous for a space RankChar = 1 ' so delete the current character. ElseIf iCurChar = 32 Then 'No hard spaces so check current for a space RankChar = -1 ' so delete the previous character. Else 'Should probably not get here RankChar = 0 ' so simply ignore it! End If End Function

El interativo seleccionador de texto

Esto es el formato estandar para decidir si debe hacerlo sobre todo el documento o sobre una porción. 'Remove all runs of empty space! 'If text is selected, then it will only be removed from the selected region. Sub RemoveEmptySpace Dim oCursors(), i% If Not CreateSelectedTextIterator(ThisComponent, _ "ALL empty space will be removed from the ENTIRE document?", oCursors()) Then Exit Sub For i% = LBOUND(oCursors()) To UBOUND(oCursors()) RemoveEmptySpaceWorker (oCursors(i%, 0), oCursors(i%, 1), ThisComponent.Text) Next i% End Sub

56

La macro principal

Esto es donde el trabajo real sucede. Sub RemoveEmptySpaceWorker(oLCursor As Object, oRCursor As Object, oText As Object) Dim sParText As String, i As Integer If IsNull(oLCursor) Or IsNull(oRCursor) Or IsNull(oText) Then Exit Sub If oText.compareRegionEnds(oLCursor, oRCursor) 1 Then IsAnythingSelected = True Else oSel = oSelections.getByIndex(0) oCursor = oDoc.Text.CreateTextCursorByRange(oSel) If Not oCursor.IsCollapsed() Then IsAnythingSelected = True End If End Function '****************************************************************** 'Author: Andrew Pitonyak 'email: [email protected] 'oSelection is a text selection or cursor range 'oText is the text object Function GetLeftMostCursor(oSel As Object, oText As Object) As Object Dim oRange As Object, oCursor As Object If oText.compareRegionStarts(oSel.getEnd(), oSel) >= 0 Then oRange = oSel.getEnd() Else oRange = oSel.getStart() End If oCursor = oText.CreateTextCursorByRange(oRange) oCursor.goRight(0, False) GetLeftMostCursor = oCursor End Function '****************************************************************** 'Author: Andrew Pitonyak 'email: [email protected]

64

'oSelection is a text selection or cursor range 'oText is the text object Function GetRightMostCursor(oSel As Object, oText As Object) As Object Dim oRange As Object, oCursor As Object If oText.compareRegionStarts(oSel.getEnd(), oSel) >= 0 Then oRange = oSel.getStart() Else oRange = oSel.getEnd() End If oCursor = oText.CreateTextCursorByRange(oRange) oCursor.goLeft(0, False) GetRightMostCursor = oCursor End Function '****************************************************************** 'Author: Andrew Pitonyak 'email: [email protected] 'oSelection is a text selection or cursor range 'oText is the text object Function IsWhiteSpace(iChar As Integer) As Boolean Select Case iChar Case 9, 10, 13, 32, 160 IsWhiteSpace = True Case Else IsWhiteSpace = False End Select End Function

'****************************************************************** 'Here starts the OLD macros! 'Author: Andrew Pitonyak Sub ConvertSelectedNewParagraphToNewLine Dim lSelCount&, oSelections As Object, oSelection As Object Dim iWhichSelection As Integer, lIndex As Long Dim oText As Object, oCursor As Object Dim s$, lLastCR As Long, lLastNL As Long 'There may be multiple selections present! oSelections = ThisComponent.getCurrentSelection() lSelCount = oSelections.getCount() oText=ThisComponent.Text For iWhichSelection = 0 To lSelCount - 1 oSelection = oSelections.getByIndex(iWhichSelection) oCursor=oText.createTextCursorByRange(oSelection) s = oSelection.getString() oCursor.setString("") lLastCR = -1 lLastNL = -1 lIndex = 1 Do While lIndex Len(s) Then ReplaceInString = Left(s,index - 1) + replaces Else ReplaceInString = Left(s,index - 1) + replaces + Right(s, Len(s) index - num + 1) End If End Function

6.5 Poniéndo atributos de texto Cuando esta macro es ejecutada, afecta los párrafos que contiene el cursor. La fuente y tamaño son puestos. El atributo de posición de caracteres controla itálicas, peso del caracter controla negritas, el control de subrayado, controla el tipo de subrayado. Encuentre los valores válidos en: http://api.openoffice.org/common/ref/com/sun/star/style/CharacterProperties.html http://api.openoffice.org/common/ref/com/sun/star/awt/FontWeight.html http://api.openoffice.org/common/ref/com/sun/star/awt/FontSlant.html http://api.openoffice.org/common/ref/com/sun/star/awt/FontUnderline.html '****************************************************************** 'Author: Andrew Pitonyak 'email: [email protected] Sub SetTextAttributes Dim document As Object Dim Cursor Dim oText As Object Dim mySelection As Object Dim Font As String document=ThisComponent oText = document.Text Cursor = document.currentcontroller.getViewCursor()

69

mySelection = oText.createTextCursorByRange(Cursor.getStart()) mySelection.gotoStartOfParagraph(false) mySelection.gotoEndOfParagraph(true) mySelection.CharFontName="Courier New" mySelection.Charheight="10" 'Time to set Italic or NOT italic as the case with 'NONE, OBLIQUE, ITALIC, DONTKNOW, REVERSE_OBLIQUE, REVERSE_ITALIC mySelection.CharPosture = com.sun.star.awt.FontSlant.ITALIC 'So you want BOLD text? 'DONTKNOW, THIN, ULTRALIGHT, LIGHT, SEMILIGHT, 'NORMAL, SEMIBOLD, BOLD, ULTRABOLD, BLACK 'These are really only constants where THIN is 50, NORMAL is 100 ' BOLD is 150, and BLACK is 200. mySelection.CharWeight = com.sun.star.awt.FontWeight.BOLD 'If underlining is your thing 'NONE, SINGLE, DOUBLE, DOTTED, DONTKNOW, DASH, LONGDASH, 'DASHDOT, DASHDOTDOT, SMALLWAVE, WAVE, DOUBLEWAVE, BOLD, 'BOLDDOTTED, BOLDDASH, BOLDLONGDASH, BOLDDASHDOT, 'BOLDDASHDOTDOT, BOLDWAVE mySelection.CharUnderline = com.sun.star.awt.FontUnderline.SINGLE 'I have not experimented with this enough to know what the true 'implications of this really is, but I do know that it seems to set 'the character locale to German. Dim aLanguage As New com.sun.star.lang.Locale aLanguage.Country = "de" aLanguage.Language = "de" mySelection.CharLocale = aLanguage

6.6 End Sub Insertar texto '****************************************************************** 'Author: Andrew Pitonyak 'email: [email protected] Sub InsertSimpleText Dim oDocument As Object Dim oText As Object Dim oViewCursor As Object Dim oTextCursor As Object oDocument = ThisComponent oText = oDocument.Text oViewCursor = oDocument.CurrentController.getViewCursor() oTextCursor = oText.createTextCursorByRange(oViewCursor.getStart()) ' Place the text to insert here oText.insertString(oTextCursor, "—", FALSE) End Sub

70

6.7 Insertar fecha formateada dentro de un documento de texto Esto insertará el texto “Today is ” donde la fecha es formateada como “DD. MMM AAAA”. Esto creará el formato de fecha si no existe. Para más información sobre formatos válidos, vea el contenido de la ayuda en el tópico “formato de número; formatos”. '****************************************************************** 'Author: Andrew Pitonyak 'email: [email protected] 'uses: FindCreateNumberFormatStyle Sub InsertDateField Dim oDocument As Object Dim oText As Object Dim oViewCursor As Object Dim oTextCursor As Object Dim oDateTime As Object oDocument = ThisComponent If oDocument.SupportsService("com.sun.star.text.TextDocument") Then oText = oDocument.Text oViewCursor = oDocument.CurrentController.getViewCursor() oTextCursor = oText.createTextCursorByRange(oViewCursor.getStart()) oText.insertString(oTextCursor, "Today is ", FALSE) ' Create the DateTime type. ODateTime = oDocument.createInstance("com.sun.star.text.TextField.DateTime") oDateTime.IsFixed = TRUE oDateTime.NumberFormat = FindCreateNumberFormatStyle(_ "DD. MMMM YYYY", oDocument) oText.insertTextContent(oTextCursor,oDateTime,FALSE) oText.insertString(oTextCursor," ",FALSE) Else MsgBox "Sorry, this macro requires a TextDocument" End If End Sub

6.8 Insertar una nueva página 6.8.1 La solución En mi investigación sobre cómo insertar una página nueva en un documento, tropecé con el siguiente vínculo: http://api.openoffice.org/common/ref/com/sun/star/style/ParagraphProperties.html el cual menciona dos propiedades. El estado PageNumberOffset: “Si una propiedad de salto de página es puesta en un párrafo, esta propiedad contiene el nuevo valor para el número de página.” El estado de la propiedad PageDescName: “Si esta propiedad es activada, creará un salto de página después del párrafo al que pertenece y asigna el valor del nombre del estilo que la nueva página usa.” Razoné que si activo PageDescName, entonces puedo crear una nueva página y ponerle un número de página. Lo que no se dijo es que PageDescName es el 71

nombre del nuevo estilo de página que se usa después del salto de página. Si no usa un estilo de página existente, entonces fallará! Sub ExampleNewPage Dim oSelections As Object, oSel As Object, oText As Object Dim lSelCount As Long, lWhichSelection As Long Dim oLCursor As Object, oRCursor As Object oText = ThisComponent.Text oSelections = ThisComponent.getCurrentSelection() lSelCount = oSelections.getCount() For lWhichSelection = 0 To lSelCount - 1 oSel = oSelections.getByIndex(lWhichSelection) oLCursor = oText.CreateTextCursorByRange(oSel) oLCursor.gotoStartOfParagraph(false) oLCursor.gotoEndOfParagraph(true) Rem Preserve the existing page style! oLCursor.PageDescName = oLCursor.PageStyleName oLCursor.PageNumberOffset = 7 Next End Sub

72

7 Ejemplo de inversión Estuve llevando mis inversiones, bien modestas, en una hoja de cálculo por algún tiempo. Pero decidí que es tiempo de cambiar.

7.1 Página resumen Tengo un resumen con un renglón para cada inversión. Mi pensamiento inicial fue que deseaba la siguiente información: Columna

Descripción

Dueño

A quien pertenece esta cuenta? A mi, a mi esposa, etc.

NASDAQ

Deseo automatizar la determinación del valor actual. Para hacer esto, requiero del símbolo NASDAQ symbol. Escribiré una macro para hacer esto.

Fecha

Cuándo fue la última vez que actualicé automáticamente el valor.

Valor

Valor actual en el NASDAQ.

Acciones

Número de acciones que tengo. Esto es tomado de la hoja de detalles.

Valía

El valor actual de la inversión. Este es el “precio*acciones”

Tipo

Mis valores actuales que uso incluyen “Capital Comercial”, “Fondos”, y “Banco”.

Sub Tipo

Actualmente tengo valores como “Capital medio” para dar un poco más de información acerca de la inversión.

Que

Cuando hice esta columna, estaba pensando en cosas como “Roth”, “IRA”, “inversión”, “401K”, “cheques”, etc.

Apertura

Fecha en que abrí la cuenta.

Nombre

El nombre que identifica la cuenta. Normalmente le pongo el nombre usado por la institución a que pertenece, algo como “Largo plazo, excenta de impuesto”.

Compañía

Ese es el nombre de la compañía a que pertenece, algo como “Vanguard”, “Thrivent”, o “T. Rowe Price”.

Cuenta

Mi número de cuenta

Nombre de la hoja El nombre de la hoja que contiene los detalles de la cuenta. Beneficiario

Que podrá ser el dueño de la cuenta en caso de que el dueño muera.

7.2 Hoja de detalles Asumo que si cada hoja de detalle se ve igual, esto hará que sea fácil realizar operaciones automáticas en la hoja. No sé mucho de inversiones o finanzas por eso no prometo cuan útiles son mis elecciones. Yo decidí las siguientes columnas:

73

Columna

Descripción

Valía

Valor actual de la inversión. Esto es “Precio * Acciones”

Acciones

Número de acciones que tengo.

$ agregé

Cuánto gasté en esta transacción.

# agregué

Acciones compradas por mi contribución.

# Igualaciones

Acciones compradas por un programa de igualaciones como un 401K match.

# Divididas

Acciones agregadas como dividendos.

# Honorarios

Acciones removidas por honorarios de algún orden.

Precio/Acción

Monto pagado por cada acción.

Fecha

Fecha de la transacción.

$ Gastado

Monto acumulado que gasté en esta inversión.

Rédito o producto Cuando abro una cuenta bancaria, normalmente está asociada un una tasa de interés. Busco como determinar cómo se ha comportado mi cuenta para poder calcular el promedio de réditos o productos. Comentario

Agrego comentarios como “$2.50 por honorarios de mantenimiento”

7.3 Chequear duplicados en una columna Para prevenir dos inversiones usando el mismo nombre de hoja, necesito una macro para buscar en la columna “nombre de la hoja” para prevenir entradas duplicadas. Unos pocos utilitarios de macros se requerien para hacer esto. 'Given a cell, extract the normal looking address of a cell 'First, the name of the containing sheet is extracted. 'Second, the column number is obtained and turned into a letter 'Lastly, the row is obtained. Rows start at 0 but are displayed as 1 Function PrintableAddressOfCell(the_cell As Object) As String PrintableAddressOfCell = "Unknown" If Not IsNull(the_cell) Then PrintableAddressOfCell = the_cell.getSpreadSheet().getName + _ ":" + ColumnNumberToString(the_cell.CellAddress.Column) + _ (the_cell.CellAddress.Row + 1) End If End Function

7.3.1 Dirección imprimible de una celda Problemas de seguimiento son mejor reportados en un formato diario sencillo. Internamente, las columnas son numeradas de 0 a 255. Las columnas son reportadas desde 'A' a 'IV'. Por efectos matemáticos, el problema es convertir de la base 10 a la base 26, donde 0 significa A 74

y 25 significa Z. ' Columns are numbered 0 to 255, and shows from 'A' to 'IV' ' How do you convert Base 10 numbers to Base 26? Function ColumnNumberToString(the_column As Long) As String Dim s$ Do s$ = Chr(65 + the_column MOD 26) + s$ 'If I don't use Int, then it seems to round 'the result rather than truncating. the_column = Int(the_column / 26) Loop Until the_column = 0 ColumnNumberToString = s$ End Function

Para imprimir la dirección completa de una celda, un poquito más de trabajo se requiere. El nombre de la hoja se obtiene fácil. El nombre de la columna es descrito abajo. Las filas son representadas internamente iniciando en 0 y externamente iniciando en 1. 'Return a normal looking cell address as 'Sheetname'.ColumnRow. 'Rows start at 0 but are displayed as 1 Function PrintableCellAddress(the_cell As Object) As String PrintableAddressOfCell = "Unknown" If Not IsNull(the_cell) Then PrintableAddressOfCell = "'" + the_cell.getSpreadSheet().getName + _ "'." + ColumnNumberToString(the_cell.CellAddress.Column) + _ (the_cell.CellAddress.Row + 1) End If End Function

7.3.2 Conteo de entradas no vacías en una columna 'oSheet Spreadsheet containing the column 'lCol Column to check 'l_min Ignore rows before this 'l_max Ignore columns after this 'Return the number of non-blank cells in the column 'I used the variant type in the parameter to avoid a bug in version 1.0.2 'That fails to properly detect Optional parameters with non-variant types. Function NonBlankCellsInColumn (oSheet As Object, lCol&, _ Optional l_min As Variant, Optional l_max As Variant) As Long Dim oCells As Object, oCell As Object, oColumn As Object Dim oAddr As Object, oRanges As Object Dim n&, lMin&, lMax& n=0 lMin = 0 lMax = 2147483647 If Not IsMissing(l_min) Then lMin = l_min If Not IsMissing(l_max) Then lMax = l_max oColumn = oSheet.Columns(lCol)

75

oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges") oRanges.insertByName("", oColumn) oCells = oRanges.Cells.createEnumeration Do While oCells.hasMoreElements oCell = oCells.nextElement oAddr = oCell.CellAddress If oAddr.Row > lMax Then Exit Do If oAddr.Row >= lMin And Len(oCell.String) > 0 Then n=n+1 Loop NonBlankCellsInColumn = n End Function

7.3.3 Arreglo ordenado No estoy muy convencido de su eficiencia, porque el número de elementos en mis arreglos es pequeño. Por eso, usé el ordenamiento de burbuja modificado. 'sArray holds the sorted array 'oSheet Spreadsheet containing the column 'lCol Column to check 'l_min Ignore rows before this 'l_max Ignore columns after this Sub BuildSortedArray (sArray() As String, oSheet As Object, lCol&, _ Optional l_min As Variant, Optional l_max As Variant) Dim oCells As Object, oCell As Object, oColumn As Object Dim oAddr As Object, oRanges As Object Dim n&, i&, j&, lMin&, lMax& n = NonBlankCellsInColumn (oSheet, lCol&,l_min,l_max) If n = 0 Then ReDim sArray() As String Else ReDim sArray(n-1) As String lMin = 0 lMax = 2147483647 If Not IsMissing(l_min) Then lMin = l_min If Not IsMissing(l_max) Then lMax = l_max oColumn = oSheet.Columns(lCol) oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges") oRanges.insertByName("", oColumn) oCells = oRanges.Cells.createEnumeration i=0 Do While oCells.hasMoreElements oCell = oCells.nextElement oAddr = oCell.CellAddress If oAddr.Row > lMax Then Exit Do If oAddr.Row >= lMin And Len(oCell.String) > 0 Then sArray(i) = oCell.String

76

i=i+1 End If Loop Dim bSomethingChanged As Boolean Dim sTemp$ For i = LBound(sArray()) To UBound(sArray()) - 2 bSomethingChanged = False For j = n-1 To i+1 Step -1 If sArray(j) < sArray(j-1) Then sTemp$ = sArray(j) sArray(j) = sArray(j-1) sArray(j-1) = sTemp$ bSomethingChanged = True End If Next If Not bSomethingChanged Then Exit For Next End If End Sub

7.3.4 Encontrar el duplicado Con un arreglo ordenado, es fácil encontrar una entrada duplicada! Busco la primera y regreso el valor. Function FirstDuplicate(sArray() As String) As String Dim i& FirstDuplicate = "" For i = LBound(sArray()) To UBound(sArray()) - 1 If sArray(i) = sArray(i+1) Then FirstDuplicate = sArray(i) Exit For End If Next End Function

77

8 Lenguaje 8.1 Comentarios Es siempre una buena práctica comentar libremente su código. Lo que es claro hoy, puede no serlo mañana. La comilla sencilla y REM, ambos indican que un comentario va a iniciar. Todo el texto posteriosr será ignorado. REM This is a comment REM And this is another comment ' And yet another comment ' I could do this all day long Dim i As IntegerRem i is used as in index variable in loops Print i REM This will print the value of i

8.2 Variables 8.2.1 Nombres Los nombres de variables están limitados a 255 caracteres, pueden iniciar con cualquier caracter del alfabeto estándar y pueden contener números. El “underscore” (subrayado) y los espacios también son carácteres válidos. No hay distinción entre mayúsculas y minúsculas. Los nombres de variables con espacios deben estar encerrados entre paréntesis cuadrados “[]”.

8.2.2 Declaración Es considerado una buena práctica declarar las variables antes de usarlas. La instrucción “Option Explicit” fuerza a hacer esto. Esta línea debe existir en su código antes de cualquier otra. Si no usa “Option Explicit”, entonces es posible que un nombre de variable mal escrito regrese para asustarlo con errores. Para declarar variables use “Dim”. La sintaxis de “Dim” es la siguiente: [ReDim]Dim Nombre1 [(inicio To final)] [As Tipo][, Nombre2 [(inicio To final)] [As Tipo] [,...]] Esto permite declarar un número de variables al mismo tiempo. Nombre es cualquier variable o arreglo variable. Las valores inicio and final pueden estar dentro del rango -32768 a 32767. Esto define un número de elementos (inclusive) mientras Nombre1(inicio) y Nombre1(final) sean valores válidos. Si se usa ReDim, entonces los valores inicio y final pueden ser expresiones numéricas. Los valores válidos para tipo incluyen Bool, Currency, Date, Double, Integer, Long, Object, Single, String, y Variant. Las varibles Object4 pueden ser seguidas por un set subsecuente. Uso esto cuando necesito un objeto que retorne valores. El tipo por defecto es Single si tipo no es especificado. A menos que se usen los comandos DefBool, DefDate, DefDbL, DefInt, DefLng, DefObj, o DefVar. Estos comandos le permiten especificar el tipo de datos basados en la primera letra del nombre de una variable. 4 Estas variables se usan para definir objetos, como hojas de cálculo, cursores, etc. Como en VBA.

79

Los objetos de cadena están limitados a 64000 carateres. Los objetos Variant pueden contener todos los tipos y se determinan por definición.

Advertencia El tipo de variable debe ser declarado individualmente para cada

variable, o por defecto será de tipo variant. “Dim a, b As Integer” declara “a” como tipo Variant y “b” como tipo Integer (entero). Sub MultipleDeclaration Dim a, b As Integer Dim c As Long, d As String Dim e As Variant, f As Float Print TypeName(a) Rem Empty, Variant by default Print TypeName(b) Rem Integer, Declared Integer Print TypeName(c) Rem Long, Declared Long Print TypeName(d) Rem String, Declared String Print TypeName(e) Rem Empty, Variant as declared Print TypeName(f) Rem Object, Float is unknown type Print TypeName(g) Rem Object, because NOT declared End Sub

8.2.3 Variables globales malas y estáticas Las variables globales usualmente no se usan porque pueden ser modificadas por cualquier rutina y en cualquier momento donde sea, y es dificil saber cuales métodos modifican cuales variables que está usando. Por eso inicie poniéndo el modificador “malas” después de “Variables Globales” mientras enseñaba en Ohio State University. Lo usé como una herramienta para recordar a mis estudiantes que hay un tiempo y un lugar para las variables globales, y que debe pensar antes de usarlas. Una global puede ser declarada fuera de un procedimiento. Puede usar las palabras claves Public5 y Private para especificar si esta variable es global para todos los módulos o solamente para este. Si no se especifica Public o Private explicitamente, se asume Private. La sintaxis es la misma que las instrucciones Dim y ReDim. Aunque las variables son pasadas por referencia, a menos que se indique lo contrario, las variables globales aparentemente son pasadas por valor. Esto ha causado más de un error en mi código. Cada vez que un procedimiento es llamado, las variables locales en el procedimiento son vueltas a crear. Si usted declara una variable Static6, esta retendrá su valor. En el ejemplo de abajo, la subrutina Worker cuenta el número de veces que ha sido llamada. Recuerde que las variables numéricas son iniciadas en cero y las cadenas son iniciadas con una cadena vacía. Option Explicit Public Author As String

REM Global to ALL Modules

5 N.T: Esta palabra clave define una variable pública. Esta sería la palabra clave que el autor recomienda no usar. 6 N.T: Esta palabra clave declara una variable estática. Este tipo de variable se mantiene durante todo el tiempo de ejecución. No se destruye después de salir de la función o subrutina, sin embargo no es global.

80

Private PrivateOne$ Dim PrivateTwo$

REM Global to THIS Module only REM Global to THIS Module only

Sub PublicPrivateTest Author = "Andrew Pitonyak" PrivateOne = "Hello" Worker() Worker() End Sub Sub Worker() Static Counter As Long REM retains its value between calls Counter = Counter + 1 REM count each time Worker is called Print "Counter = " + Counter Print "Author = " + Author End Sub

8.2.4 Tipos Abstractamente hablando, OpenOffice.org Basic soporta los tipos numéricos, cadenas, booleanos, y objectos variables. Los objetos son usados principalmente usados para referirse a los internos como documentos, tablas, etc. Con un objeto, puede usar sus correspondientes métodos y propiedades. Los tipos numéricos son inicializados en cero y las cadenas con una cadena vacía “”. Si necesita saber el tipo de una variable en tiempo de ejecución, la función TypeName regresa una representación de cadena del tipo de variable. Si necesita saber un tipo de variable en tiempo de ejecución, la función VarType regresa un entero que corresponde al tipo de variable. Palabra Clave

Tipo de variable

No. tipo variable

Auto Tipo

Defxxx

Boolean

Booleano

11

Currency

Moneda con cuatro decimales

6

Date

Fecha

7

Double

Doble con punto flotante

5

#

DefDbl

Integer

Entero

2

%

DefInt

Long

Largo

3

&

DefLng

Object

Objeto

9

Single

Sencillo con punto flotante

4

!

String

Cadena

8

$

Variant

Puede contener todos los tipos especificados en la definición 81

DefBool @ DefDate

DefObj

DefVar 12

Palabra Clave

Tipo de variable

No. tipo variable

Empty

Variable no inicializada

0

Null

No tiene valores válidos

1

Auto Tipo

Defxxx

Sub ExampleTypes Dim b As Boolean Dim c As Currency Dim t As Date Dim d As Double Dim i As Integer Dim l As Long Dim o As Object Dim f As Single Dim s As String Dim v As Variant Dim n As Variant Dim x As Variant n = null x=f Print TypeName(b) + " " + VarType(b) Rem Boolean 11 Print TypeName(c) + " " + VarType(c) Rem Currency 6 Print TypeName(t) + " " + VarType(t) Rem Date 7 Print TypeName(d) + " " + VarType(d) Rem Double 5 Print TypeName(i) + " " + VarType(i) Rem Integer 2 Print TypeName(l) + " " + VarType(l) Rem Long 3 Print TypeName(o) + " " + VarType(o) Rem Object 9 Print TypeName(f) + " " + VarType(f) Rem Single 4 Print TypeName(s) + " " + VarType(s) Rem String 8 Print TypeName(v) + " " + VarType(v) Rem Empty 0 Print TypeName(n) + " " + VarType(n) Rem Null 1 Print TypeName(x) + " " + VarType(x) Rem Single 4 End Sub

Variables Booleanas

Las variables booleanas usan los valores “Verdadero” o “Falso”, y son internamente representadas por los valores enteros “-1” y “0” respectivamente. Si asigna cualquier cosa a una variable booleana, y no puede ser precisamente evaluada como “-1”, entonces el valor “Falso” es guardado en la variable. Normalmente se usa de la siguiente manera: Dim b as Boolean b = True b = False b = (5 = 3) 'Set to False Print b 'Prints 0 b = (5 < 7) 'Set to True Print b 'Prints -1 b=7 'Sets to False

82

Variables enteras

Las variables enteras son números de 16-bits dentro de un rango de -32768 a 32767. Asignar un valor desde un número de punto flotante causa que se trunquen los decimales. Poniendo después del nombre de la variable un caracter “%” causa que se defina como entero. Dim Age% Dim Dogs As Integer

Variables Entero largo

Las variables de entero largo son números de 32-bits en un rango de -2,147,483,648 a 2,147,483,647. Asignar un valor desde un número de punto flotante causa que se trunquen los decimales. Poniendo después del nombre de la variable un caracter “&” causa que se defina como entero largo. Dim Age& Dim Dogs As Long

Variables de moneda

Las variables de moneda son números de 64-bits con cuatro decimales y cincuenta números no decimales. Su rango va desde -922,337,203,658,477.5808 a +922,337,203, 658,477.5807. Poniéndo después del nombre de la variable un caracter “@” causa que se defina como moneda. Dim Income@ Dim Cost As Currency

Variables de Sencillos

Las variables de Sencillos son números de 32-bits. El número más grande es 3.402823 x 10E38. El número más pequeño es 1.401298 x 10E-45. Poniendo después del nombre de la variable un caracter “!” causa que se defina como de Sencillo. Dim Weight! Dim Height As Single

Variables de Dobles

Las variables de Dobles Double son números de 64-bits. El valor más grande para una variable de dobles es 1.79769313486232 x 10E308. El número más pequeño para una variable de Dobles es 4.94065645841247 x 10E-324. Poniendo después del nombre de la variable un caracter “#” causa que se defina como de Doble. Dim Weight# Dim Height As Double

Variables de Cadena

Variables de Cadena usan un byte ASCII para cada caracter y están limitados a un tamaño de 64Kbytes. Poniendo después del nombre de la variable el caracter “$” causa que se defina 83

como de Cadena. Dim FirstName$ Dim LastName As String

8.2.5 Constantes OpenOffice.org Basic también conoce los valores “Verdadero”, “Falso”, y “PI”. Puede también definir sus propias constantes. Cada constante debe ser definida una vez, y sólo una vez. Las constantes no se les define un tipo, simplemente se insertan como son digitadas. Const Gravity = 9.81

8.2.6 Areglos o matrices. Una matriz permite guardar diferentes valores en una sola variable. Por defecto, el primer item de la matriz está en la dirección 0. Usted puede, sin embargo, especificar los valores iniciales y finales. Aqui hay algunos ejemplos. Dim a(5) As Integer REM 6 elements from 0 to 5 inclusive Dim b$(5 to 10) As String REM 6 elements from 5 to 10 inclusive Dim c(-5 to 5) As String REM 11 elements from -5 to 5 inclusive Dim d(5 To 10, 20 To 25) As Long

Option Base

Usted puede cambiar el valor inicial de una matriz entre 1 y cero. Esto debe ser hecho antes de cualquier instrucción en el programa. Sintaxis: Option Base { 0 | 1 } LBound(NombreMatriz[,Dimensión])

Regresa el item más bajo de un arreglo. El segundo parámetro es opcional, y es la dimensión de la matriz de la cual desea el item más bajo basado en 1 (no en cero). LBound(a()) LBound(b()) LBound(c()) LBound(d()) LBound(d(), 1) LBound(d(), 2)

REM 0 REM 5 REM -5 REM 5 REM 5 REM 20

UBound(NombreMatriz[,Dimensión])

Regresa el item más alto de un arreglo. El segundo parámetro es opcional, y es la dimensión de la matriz de la cual desea el item más alto basado en 1 (no en cero). LBound(a()) LBound(b()) LBound(c()) LBound(d()) LBound(d(), 1)

REM 5 REM 10 REM 5 REM 10 REM 10

84

LBound(d(), 2) REM 25

Está esta matriz definida

Si una matriz es una lista vacía, entonces el item más bajo será más grande que el item más alto. Listas de matrices y ReDim

Una matriz de items variables es regresada con el uso del constructor Array. Este es el método más fácil de regresar una lista de valores. Dim a() a = Array(0, 1, 2)

Para crear una matriz de dimensiones vacías, use el constructor DimArray. DimArray( 2, 2, 4 ) es lo mismo que DIM a( 2, 2, 4 ). Puede cambiar el tamaño de una matriz en tiempo de ejecución si lo desea. Dim e() As Integer REM I did not specify the size ReDim e(5) As Integer REM 0 to 5 is valid ReDim e(10) As Integer REM 0 to 10 is valid

La palabra clave Preserve puede ser usada con la instrucción ReDim para preservar el contenido de la matriz cuando es redimensionada. Sub ReDimExample Dim a(5) As Integer Dim b() Dim c() As Integer a(0) = 0 a(1) = 1 a(2) = 2 a(3) = 3 a(4) = 4 a(5) = 5 Rem a is dimensioned from 0 to 5 where a(i) = i PrintArray("a at start", a()) Rem a is dimensioned from 1 to 3 where a(i) = i ReDim Preserve a(1 To 3) As Integer PrintArray("a after ReDim", a()) Rem Array() returns a variant type Rem b is dimensioned from 0 to 9 where b(i) = i-1 b = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) PrintArray("b at initial assignment", b()) Rem b is dimensioned from 1 to 3 where b(i) = i-1 ReDim Preserve b(1 To 3) PrintArray("b after ReDim", b()) Rem The following is NOT valid because the array is already dimensioned Rem to a different size Rem a = Array(0, 1, 2, 3, 4, 5) Rem c is dimensioned from 0 to 5 where a(i) = i

85

Rem If a "ReDim" had been done on c, then this would NOT work c = Array(0, 1, 2, 3, 4, 5) PrintArray("c, of type Integer after assignment", c()) Rem Ironically, this allowed but c will contain no data! ReDim Preserve c(1 To 3) As Integer PrintArray("c after ReDim", c()) End Sub Sub PrintArray (lead$, a() As Variant) Dim i%, s$ s$ = lead$ + Chr(13) + LBound(a()) + " to " + UBound(a()) + ":" + Chr(13) For i% = LBound(a()) To UBound(a()) s$ = s$ + a(i%) + " " Next MsgBox s$ End Sub

8.2.7 Probando objetos. Para determinar el tipo de variable, puede usar las funciones booleanas IsArray, IsDate, IsEmpty, IsMissing, IsNull, IsNumeric, IsObject, y IsUnoStruct. La función IsArray retorna un valor verdadero si el parámetro es una matriz. La función IsDate retorna un verdadero si es posible convertir el objeto en una fecha. Una cadena con un formato apropiado podrá retornar un valor verdadero desde la función IsDate. El método IsEmpty se usa para probar si un objeto del tipo variante ha sido inicializado. La función IsMissing indica si un parámetro opcional está perdido. El método IsNull prueba cuando una variable del tipo variante contiene el valor especial Null, indicándo que la variable no contiene datos. IsNumeric es usado para probar si una cadena contiene números. La función IsUnoStruct toma una cadena del nombre de una estructura uno y retorna verdadero o falso si está es un nombre válido.

8.2.8 Condicionales Los condicionales generalmente trabajan como se esperan pero no hacen evaluaciones de cortos circuitos. Estos son los condicionales más comúnmente usados Símbolo

Significado

=

Igual

<

Menor que

>

Mayor que

=

Mayor o igual que



No igual a

Is

Son el mismo Objeto 86

El operador And realiza operaciones lógicas en tipos boleanos y operaciones sobre bits en tipos numéricos. El operador OR realiza operaciones lógicas en tipos boleanos y operaciones sobre bits en tipos numéricos. El operador XOR realiza operaciones lógicas en tipos boleanos y operaciones sobre bits en tipos numéricos. Recuerde que es un “Exclusive OR”7. El operador NOT realiza operaciones lógicas en tipos boleanos y operaciones sobre bits en tipos numéricos. Una simple prueba muestra la precedencia standar que existe entre los roles, es decir que AND tiene más precedencia que los operadores OR. Option Explicit Sub ConditionTest Dim msg As String msg = "AND has " msg = msg & IIf(False OR True AND False, "equal", "greater") msg = msg & " precedence than OR" & Chr(13) & "OR does " msg = msg + IIF(True XOR True OR True, "", "not ") msg = msg + "have greater precedence than XOR" + Chr(13) msg = msg & "XOR does " msg = msg + IIF(True OR True XOR True, "", "not ") msg = msg + "have greater precedence than OR" MsgBox msg End Sub

8.3 Funciones y SubProcedimientos Una función es un procedimiento Sub que puede retornar un valor. Esto permite que sea usado como parte de una expresión. Sub y Function inician como sigue: Sintaxis: Sintaxis:

Function NombreFunción [(Var1 [As Tipo][, Var2 [As Tipo][,...]]]) [As Tipo] Sub NombreSub[(Var1 [As Tipo][, Var2 [As Tipo][,...]]])

Las funciones declaran un valor de retorno porque ellas devuelven un valor. Para asignar el valor de retorno, use una instrucción de la siguiente forma “NombreFunción = valor_de_retorno”. Aunque puede realizar la asignación de esta instrucción muchas veces, solamente el último valor asignado será devuelto. Para dejar inmediatamente el procedimiento use una instrucción Exit.

8.3.1 Parametros opcionales. Un parámetro puede ser declarado opcional usando la palabra clave Optional. El método IsMissing es usado para determinar si un parámetro ha sido pasado. Sub testOptionalParameters() Print TestOpt() Rem MMM Print TestOpt(,) Rem MMM Print TestOpt(,,) Rem MMM Print TestOpt(1) Rem 1MM Print TestOpt(1,) Rem 1MM

7 N.T. O exclusivo.

87

Print TestOpt(1,,) Rem 1MM Print TestOpt(1,2) Rem 12M Print TestOpt(1,2,) Rem 12M Print TestOpt(1,2,3) Rem 123 Print TestOpt(1,,3) Rem 1M3 Print TestOpt(,2,3) Rem M23 Print TestOpt(,,3) Rem MM3 Print TestOptI() Rem MMM Print TestOptI(,) Rem 488MM (Error) Print TestOptI(,,) Rem 488488M (Error) Print TestOptI(1) Rem 1MM Print TestOptI(1,) Rem 1MM Print TestOptI(1,,) Rem 1488M (Error) Print TestOptI(1,2) Rem 12M Print TestOptI(1,2,) Rem 12M Print TestOptI(1,2,3)Rem 123 Print TestOptI(1,,3) Rem 14883 (Error) Print TestOptI(,2,3) Rem 48823 (Error) Print TestOptI(,,3) Rem 4884883 (Error) End Sub Function TestOpt(Optional v1 As Variant, Optional v2 As Variant, Optional v3 As Variant) As String Dim s As String s = "" & IIF(IsMissing(v1), "M", Str(v1)) s = s & IIF(IsMissing(v2), "M", Str(v2)) s = s & IIF(IsMissing(v3), "M", Str(v3)) TestOpt = s End Function Function TestOptI(Optional i1 As Integer, Optional i2 As Integer, Optional i3 As Integer) As String Dim s As String s = "" & IIF(IsMissing(i1), "M", Str(i1)) s = s & IIF(IsMissing(i2), "M", Str(i2)) s = s & IIF(IsMissing(i3), "M", Str(i3)) TestOptI = s End Function

Advertencia En la versión 1.0.3.1, IsMissing fallará con Optional si el tipo no es

Variant y el parámetro opcional perdido está representado por dos comas consecutivas. Primero investigué este comportamiento después de hablar con Christian Anderson [[email protected]]. Esto es un issue 11678 en las issuezillas.

8.3.2 Parámetros por referencia o valor. Si una variable es pasada por valor, puedo cambiar el parámetro en el procedimiento llamado y el valor original no cambiará. En cambio si es pasado por referencia, si cambio el parámetro también cambio el valor original. El comportamiento por defecto es pasar por referencia. Para pasar por valor, use la palabra clave ByVal antes de la declaración de los parámetros. Si el parámetro es una constante como “4” y lo modifica en el procedimiento este podrá o no realmente cambiarse. De acuerdo con Andreas Bregas ([email protected]) 88

esto es un error por eso abrí un issue en issuezilla (http://www.openoffice.org/project/www/issues/show_bug.cgi?id=12272). Option Explicit Sub LoopForever Dim l As Long l=4 LoopWorker(l) Print "Passed l by value and it is still " + l LoopForeverWorker(l) ' l is now 1 so this will print 1. Print "Passed l by reference and it now is " + l ' This will loop forever because 4 is a constant ' and you can NOT change it. Print "Passing a constant parameter by reference, this will be fun" Print LoopForeverWorker(4) End Sub Sub LoopWorker(ByVal n As Long) Do While n > 1 Print n n=n-1 Loop End Sub Sub LoopForeverWorker(n As Long) Do While n > 1 ' This is fun when n is a constant. Print n n=n-1 Loop End Sub

8.3.3 Recursividad Sus funciones no pueden ser recursivas. Cuando digo no pueden, realmente quiero decir que no puede porque no obtendrá los resultados que espera. Option Explicit Sub DoFact Print "Recursive = " + RecursiveFactorial(4) Print "Normal Factorial = " + Factorial(4) End Sub Function Factorial(n As Long) As Long Dim answer As Long Dim i As Long i=n answer = 1 Do While i > 1 answer = answer * i

89

i=i-1 Loop Factorial = answer End Function ' This will fail because you can not use recursion Function RecursiveFactorial(n As Long) As Long If n > 2 Then RecursiveFactorial = n * RecursiveFactorial(n-1) Else RecursiveFactorial = 1 End If End Function

8.4 Control de flujo 8.4.1 If ... Then ... Else El constructor If es usado para ejecutar un bloque de código basado en una expresión. Mientras puede usar GoTo o GoSub para saltar fuera de un bloque If, no podrá saltar dentro de un bloque If. Sintaxis: If condición Then Bloque [ElseIf condición Then] Bloque [Else] Bloque End If If x < 0 Then MsgBox "The number is negative" ElseIf x > 0 Then MsgBox "The number is positive" Else MsgBox "The number is zero" End If

8.4.2 IIF El constructor IIF es usada para devolver una expresión basados en una condición. Es similar a la sintaxis de “?” en C8. Sintaxis: IIf (Condición, Expresión_si_verdadero, Expresión_si_falso) Es muy similar al siguiente código. If (Condition) Then object = TrueExpression Else object = FalseExpression End If max_age = IIf(johns_age > bills_age, johns_age, bills_age)

8 N.T. En Visual Fox también existe esta misma función son una sintaxis igual.

90

8.4.3 Choose La instrucción choose permite seleccionar desde una lista de valores basados en un índice. Sintaxis:

Choose (índice, Selección1[, Selección2, ... [,Selección_n]])

Si el índice es 1, entonces el primer item es regresado. Si el índice es 2, entonces el segundo item es retornado. Se podrá imaginar el resto!

8.4.4 For....Next Esto repetirá un bloque de instrucciones un número específico de veces. Sintaxis: For contador=inicio To final [Step paso] bloque de instrucciones [Exit For] bloque de instrucciones Next [contador]

El numérico “contador” es inicialmente asignado al valor “inicio”. El valor de “paso” no es dado, entonces el contador es incrementado en uno hasta que pase el valor “final”. El bloque de instrucciones es ejecutado una vez por cada incremento. El “contador” es opcional en la instrucción “Next”, Y automáticamente se refiere a la más reciente instrucción “For”. Puede dejar prematuramente una instrucción For al usar la instrucción Exit For. Esto hará que salga de la instrucción “For” más reciente. Ejemplo: El siguiente ejemplo usa dos ciclos anidados para ordenar un arreglo de cadena con diez elementos ( sEntry() ), el cual es primero llenado con varios contenidos: Sub ForNextExampleSort Dim iEntry(10) As Integer Dim iCount As Integer, iCount2 As Integer, iTemp As Integer Dim bSomethingChanged As Boolean ' Fill the array with the integers between -10 and 10 For iCount = LBound(iEntry()) To Ubound(iEntry()) iEntry(iCount) = Int((20 * Rnd) -10) Next iCount ' Sort the array For iCount = LBound(iEntry()) To Ubound(iEntry()) 'Assume that the array is sorted bSomethingChanged = False For iCount2 = iCount + 1 To Ubound(iEntry()) If iEntry(iCount) > iEntry(iCount2) Then iTemp = iEntry(iCount)

91

iEntry(iCount) = iEntry(iCount2) iEntry(iCount2) = iTemp bSomethingChanged = True End If Next iCount2 'If the array is already sorted then stop looping! If Not bSomethingChanged Then Exit For Next iCount For iCount = 1 To 10 Print iEntry(iCount) Next iCount End Sub

8.4.5 Do ... Loop El constructor Loop tiene algunas diferentes formas y es usado para continuar ejecutando un bloque de código mientras una condición sea verdadera. La forma más común verifica la condición antes de que inicie el ciclo y hasta que la condición sea verdadera ejecutará repetidamente el bloque de código. Si la condición es falsa, entonces el ciclo nunca será ejecutado. Do While condition Block Loop

Una forma similar, pero menos común verifica la condición antes que el ciclo inicie y mientras la condición sea falsa ejecutará repetidamente el bloque de código. Si la condición se evalue en verdadero inmediatamente, entonces el cilco nunca se ejecutará. Do Until condition Block Loop

Puede también poner la verificación al final del ciclo en cuyo caso el bloque de código se ejecutará al menos una vez. Para siempre ejecutar el ciclo al menos una vez y luego continuar si la condición es verdadera, use la siguiente construcción: Do Block Loop While condition

Para ejecutar el ciclo al menos una vez y luego continuar mientras la condición sea falsa, use la siguiente construcción: Do Block Loop Until condition

En un “Do Loop”, puede forzar a salir inmediatamente del ciclo con la instrucción “Exit Do”.

8.4.6 Select ... Case La instrucción Select Case es similar al “case” y “switch” de otros lenguajes. Esto imita 92

multiples bloques de “Else If” en una instrucción “If”. Una sola expresión de condición es especificada y comparada contra múltiples valores para verificar como sigue: Select Case expresión_de_condición Case caso_expresión1 Bloque_de_instrucciones1 Case caso_expresión2 Bloque_de_instrucciones1 Case Else Bloque_de_instrucciones1 End Select

La expresión_de_condición es la expresión que será comparada en cada instrucción Case. No extoy enterado acerca de algún tipo de limitación de tipos de datos más que los que sea compatible con los tipos de expresión. El primer bloque de instrucciones en cumplir la condición será ejecutado. Si ninguna condición se cumple, entonces el opcional Case Else se ejecutará.

8.4.7 Expresiones Case Una expresión case es usualmente una constante de código como “Case 4” o Case “"Case hello"”. Múltiples valores pueden ser epecificados al separarlos con comas: “Case 3, 5, 7”. Si desea verificar un rango de valores, hay una palabra clave “To” “Case 5 To 10”. Rangos sin valor inicial pueden ser verificados como “Case < 10” o con la palabra clave “Is” “Case Is < 10”. La ayuda en línea incluye un ejemplo que tiene un error. Muestra como verificar un rango de números como “Case i > 2 And i < 10”. Lo que realmente evalúa es “i > 2 AND i < 10”, lo cual es boleano, y entonces lo compara con el parámetro seleccionado (presuntamente “i” en este ejemplo). Es como decir que “i (i>2 AND i 2 And i% < 10, %i, %i+1)”. Select Case i% 'Correct method because it returns %i when it is true 'and %i = %i. It returns %i+1 when it is false and '%i+1 %i Case IIf(i% > 2 And i% < 10, %i, %i+1) 'WRONG because %i (i% > 2 And i% < 10) Case i% > 2 And i% < 10 'Even better yet because these are integers Case 2 To 10

Todavía se puede ver natural escribir algo como “Case Is > 2 AND i < 10”, y lo que realmente quiere decir es “Case Is > (2 AND i < 10)” lo cual definitivamente no es lo que se desea. Sub DemoSelectCase Dim i% i% = Int((15 * Rnd) -2) Select Case i% Case 1 To 5 Print "Number from 1 to 5"

93

Case 6, 7, 8 Print "Number from 6 to 8" Case IIf(i% > 8 And i% < 11, %i, %i+1) Print "Greater than 8" Case Else Print "Out of range 1 to 10" End Select End Sub

8.4.8 While...Wend No hay nada de especial en el constructor While...Wend, tiene la siguiente forma: While Condition Código Wend

Tip

Este constructor tiene limitaciones que no existen en el constructor Do While...Loop y no ofrece beneficios particulares. No puede usar el constructor Exit, o puede salir con un GoTo.

8.4.9 GoSub La instrucción GoSub causa que la ejecución salte a una etiqueta de subrutina definida en la actual subrutina. No puede saltar fuera de la actual subrutina. Cuando se encuentra la instrucción Return, la ejecución continuará desde le punto de donde fue originalmente llamada. Si una instrucción Return es encontrada y no se hizo un previo GoSub, ocurre un error. En otras palabras, Return no es un substituto de un Exit Sub o Exit Function. Es generalmente aceptado que el uso de funciones y subrutinas produce un código más inteligible que el que el uso de GoSub y GoTo. Option Explicit Sub GoSubExample Dim i As Integer GoSub Line2 GoSub Line1 MsgBox "i = " + i, 0, "GoSub Example" Exit Sub Line1: i=i+1 Return Line2: i=1 Return End Sub

Tip

GoSub y Return son remanentes persistentes de dialectos viejos de BASIC, retenidos solamente por razones de compatibilidad. Su uso no es recomendable porque tiende a producir código ilegible. Subs o Functions son preferibles.

94

8.4.10 GoTo La instrucción GoTo causa que la ejecución salte a una etiqueta definida en la actual subrutina. No puede saltar fuera de la actual subrutina. La instrucción GoTo es generalmente considerada que produce código pobremente escrito porque hace más dificil seguir la lógica9. No recomiendo su uso en general. Option Explicit Sub GoToExample Dim i As Integer GoTo Line2 Line1: i=i+1 GoTo TheEnd Line2: i=1 GoTo Line1 TheEnd: MsgBox "i = " + i, 0, "GoTo Example" End Sub

8.4.11 On GoTo Sintaxis: On N GoSub Etiqueta1[, Etiqueta2[, Etiqueta3[,...]]] Sintaxis: On N GoTo Etiqueta1[, Etiqueta2[, Etiqueta3[,...]]] Esto causa que la ejecución se bifurque a una etiqueta basados en una expresión numérica N. If (N=0) then no ocurre bifurcación. La expresión numérica N debe estar dentro del rango de 0 y 255. Esto es similar a las instrucciones “computed goto,” “case,” y “switch,” de otros lenguajes. No trate de saltar fuera de la actual subrutina o función. Option Explicit Sub OnGoToExample Dim i As Integer Dim s As String i=1 On i+1 GoSub Sub1, Sub2 s = s & Chr(13) On i GoTo Line1, Line2 REM The exit causes us to exit if we do not continue execution Exit Sub Sub1: s = s & "In Sub 1" : Return Sub2: s = s & "In Sub 2" : Return Line1: s = s & "At Label 1" : GoTo TheEnd Line2:

9 N.T. Se sobreentiende que la lógica del código.

95

s = s & "At Label 2" TheEnd: MsgBox s, 0, "On GoTo Example" End Sub

8.4.12 Exit La instrucción Exit es usada para salir de un Do Loop, For Next, Function, o un Sub. Tratar de salir (exit) desde alguna parte del código no causará error. Las fomas son las siguientes: • Exit DO Continua la instrucción siguiente al Loop. • Exit For Continua la instrucción siguiente al Next. • Exit Function Inmediatamente saldrá de la función actual. • Exit Sub Inmediatamente saldrá de la subrutina actual. Option Explicit Sub ExitExample Dim a%(100) Dim i% REM Fill the array with 100, 99, 98, ..., 0 For i = LBound(a()) To UBound(a()) a(i) = 100 - i Next i Print SearchIntegerArray(a(), 0 ) Print SearchIntegerArray(a(), 10 ) Print SearchIntegerArray(a(), 100) Print SearchIntegerArray(a(), 200) End Sub Function SearchIntegerArray( list(), num%) As Integer Dim i As Integer SearchIntegerArray = -1 For i = LBound(list) To UBound(list) If list(i) = num Then SearchIntegerArray = i Exit For End If Next i End Function

8.4.13Manejo de errores Para atrapar los errores en las macros, use la instrucción “On Error”. On [Local] {Error GoTo Etiqueta | GoTo 0 | Resume Next} La foma “On Error GoTo Label”, causa que la macro salte a la etiqueta especificada si ocurre un error. Si la forma “On Error Resume Next” está activada y ocurre un error, la ejecución continua en la línea siguiente a la que causó el error. Considero que es una instrucción “ignore el error”. La instrucción “On Error” está deshabilitada por medio de el uso de la forma “On Error GoTo 0”. 96

Una instrucción que inicie con “On Error” es válida para el módulo entero. Si se usa “Local”, entonces esto define que el manejo de errores es local al contenido de la subrutina o función. Si no se usa “Local” el manejo de errores afecta el módulo entero.

8.5 Misceláneos Esta sección contiene pequeñeces y piezas que yo solo sé porque las he visto en ejemplos pero no he encontrado ejemplos para aplicar. ********* Muchas instrucciones pueden existir en la misma línea si están separadas por dos puntos “:” . ********* Para una línea sencilla de instrucciones, la construcción If Then no requiere que se cierre con End If. Sub SimpleIf If 4 = 4 Then Print "4 = 4" : Print " Hello you"Rem This prints If 3 = 2 Then Print "3 = 2" Rem This does not End Sub

********* Librerias, dialogos, IDE, importar y exportar macros. With objeto ... End With ********* Cómo iniciarlo desde la línea de comandos? El parámetro para llamar macros se lee así: soffice.exe macro:/Librería módulo macro Ejemplo: soffice.exe macro:///standard.module1.macro1 Pero note! Si la macro no hace o no abre nada dentro del documento, la macro se implementa y cierra StarOffice de nuevo. ********* Copiar un objeto simplemente copiará la referencia. Copiar una estructura hará una nueva copia. Ver EqualUnoObjects para un ejemplo. ********* Los nombres con espacios pueden ser un problema. Puede manejarse de dos maneras Sub ExampleShell Shell("file:///C|/Andy/My%20Documents/oo/tmp/h.bat",2) Shell("C:\Andy\My%20Documents\oo\tmp\h.bat",2) End Sub

97

****** Poner el fondo de página Sub Main ' First get the Style Families oStyleFamilies= ThisComponent.getStyleFamilies() ' then get the PageStyles oPageStyles= oStyleFamilies.getByName("PageStyles") ' then get YOUR page's style oMyPageStyle= oPageStyles.getByName("Standard") ' then set your background with oMyPageStyle .BackGraphicUrl= _ convertToUrl( ) .BackGraphicLocation= _ com.sun.star.style.GraphicLocation.AREA end with End Sub

******* Todo el código para “Events” está mostrado en la ayuda. ****** La forma usual de cerrar OOo completamente es llamar el método terminate() en el objeto desktop. Esto se ejecutará si no hay abierta una ventana de documentos o una ventana no cerrable y no está registrado el visor de terminación que objeta contra las llamadas a teminaciones (tal y como lo hace el quickstarter). La interface "XCloseable" se refiere a cerrar documentos sencillos o marcos, y sólo trabaja en OOo 1.1, no en Ooo1.0, por eso deberá preguntar esto si desea escribir código que corra en OOo1.0 y OOo1.1 (Como se describe en la guía del desarrollador). Buena suerte, Mathias Bauer *******

98

9 Operadores y precedencia OpenOffice.org Basic soporta los operadores numéricos básicos. -, +, /, *, y ^. Los operadores usan el orden de precedencia standard, pero de todos modos los indicaremos aqui. Los operadores lógicos devuelven 0 para falso (ningún bit activado) y -1 para verdadero (todos los bits activados). Para una descripción completa, vea la sección que lista los operadores y funciones. Precedence

Operator

0

AND

Opera bits en numéricos y boleanos lógicos

0

OR

Opera bits en numéricos y boleanos lógicos

0

XOR

Opera bits en numéricos y boleanos lógicos

0

EQV

Equvalencia lógica o en bits

1

=

Lógico

1

<

Lógico

1

>

Lógico

1

=

Lógico

1



Lógico

2

-

Resta numérica

+

Suma numérica y concatenación de caracteres.

2

&

Concatenación de caracteres

3

*

Multiplicación numérica

3

/

División numérica

3

MOD

4

^

2

5 Sub TestPrecedence Dim i% Print 1 + 2 OR 1 Print 1 + (2 OR 1) Print 1 + 2 AND 1 Print 1 + 2 * 3 Print 1 + 2 * 3 ^2 Print 1 = 2 OR 4 Print 4 AND 1 = 1 End Sub

Description

Residuo numérico después de la división Exponenciación numérica

Is (operator) ??No verificado, ver “Select Case”

REM Prints 3 REM Prints 4 REM Prints 1 REM Prints 7 REM Prints 19 REM Prints 4 REM Prints 4

99

Advertencia Los valores boleanos son guardados internamente como enteros donde

falso = 0 y verdadero = -1. Esto permite usar operaciones numéricas con los valores boleanos pero cuidado esto (1 + Verdadero = Falso). Mejor use operadores boleanos.

100

10 Operadores, Instrucciones y Funciones. 10.1 Operador Resumen: Resta dos valores numéricos. La precedencia matemática se explica en la página 99. Sintaxis: Resultado = Expresión1 - Expresión2 Parámetros: Resultado : Resultado de la resta. Expresión1, Expresión2 : Cualquier expresión numérica. Ejemplo: Sub SubtractionExample Print 4 – 3 Print 1.23e2 – 23 End Sub

'1 '100

10.2 Operador * Sumario: Multiplica dos valores numéricos. La precedencia matemática se explica en la página 99. Sintaxis: Resultado = Expresión1 * Expresión2 Parámetros: Resultado: Resultado de la multiplicación. Expresión1, Expresión2 : Cualquier expresión numérica. Ejemplo: Sub MultiplictionExample Print 4 * 3 Print 1.23e2 * 23 End Sub

'12 '2829

10.3 Operador + Sumario: Suma dos valores numéricos. Sin embargo trabaja con valores boleanos porque son representados como enteros pero no recomiendo su uso. Experimentalmente, imita el resultado del operador OR pero no recomiendo su uso, porque la conversión puede tener algunos problemas. Las operaciones son hechas en el dominio de los enteros y vueltos a convertir a boleanos. Esto puede acarrear problemas. La precedencia matemática se explica en la página 99. Sintaxis: Resultado = Expresión1 + Expresión2 101

Parámetros: Resultado: Resultado de la suma Expresión1, Expresión2 : Cualquier expresión numérica. Ejemplo: Sub SubtractionExample Print 4 – 3 Print 1.23e2 – 23 End Sub

'1 '100

10.4 Operador ^ Sumario: Eleva un numéro a una potencia. En la equación x=y z representa el operador. Si z es un entero, entonces x es el resultado de multiplicar y por el mismo z veces. La precedencia matemática se explica en la página 99. Sintaxis: Resultado = Expresión ^ Exponente Parámetros: Resultado : Resultado de la exponenciación Expresión: Cualquier expresión numérica Exponent: Cualquier expresión numérica Ejemplo: Sub ExponentiationExample Print 2 ^ 3 '8 Print 2.2 ^ 2 '4.84 Print 4 ^ 0.5 '2 End Sub

10.5 Operador / Sumario: Divide dos valores numéricos. Tenga cuidado porque una división puede que no produzca un entero cuando usted esté esperando uno. Es importante el uso de la función Int(). La precedencia matemática se explica en la página 99. Sintaxis: Resultado = Expresión1 / Expresión2 Paramétros: Resultado : Resultado de la división Expresión1, Expresión2 : Cualquier expresión numérica Ejemplo: Sub DivisionExample

102

Print 4 /2 Print 11/2 End Sub

'2 '5.5

10.6 Operador AND Sumario: Realiza AND lógicos en valores boleanos y operación de bits AND en valores numéricos. Una operación de bits AND en un número doble, aparentemente causa una conversión en un tipo entero. Es posible un desbordamiento numérico. La precedencia matemática se explica en la página 99 y la tabla de operaciones es mostrada abajo. x

y

x AND y

VERDAD VERDAD VERDAD ERO ERO ERO VERDAD ERO

FALSO

FALSO

FALSO

VERDAD ERO

FALSO

FALSO

FALSO

FALSO

1

1

1

1

0

0

0

1

0

0

0

0

Sintaxis: Resultado = Expresión1 AND Expresión2 Parámetros: Resultado: Resultado de la operación. Expresión1, Expresión2 : expresiones numéricas o boleanas Ejemplo: Sub AndExample Print (3 And 1) 'Prints 1 Print (True And True) 'Prints -1 Print (True And False) 'Prints 0 End Sub

10.7 Función Abs Sumario: Retorna el valor absoluto de una expresión numérica. Si el parámetro es una cadena, primero 103

es convertida a número, probablemente usando la función Val. Si el número no es negativo, entonces, es retornado, en otro caso, el negativo del número es retornado. Sintaxis: Abs (Número) Valor de retorno: Doble Parámetro: Número: Cualquier expresión numérica. Ejemplo: Sub AbsExample Print Abs(3) '3 Print Abs(-4) Print Abs("-123") End Sub

'4 '123

10.8 Función Array Sumario: Crea una matriz de una lista de parámetros. Es el método más rápido para crear una matriz de constantes.

Advertencia Si asigna el valor de una matriz Variant a una matriz no-Variant, no

podrá preservar los datos si redimensiona el arreglo. Lo considero un error que pueda asignar matrices Variantes a matrices no-Variantes.

Ver también la función DimArray. Sintaxis: Array ( lista de argumentos) Valor de retorno: Arreglo Variant conteniendo la lista de argumentos. Parámetros: Lista de argumentos: Lista de valores separados por comas desde las cuales es creada la lista. Ejemplo: Sub ArrayExample Dim a(5) As Integer Dim b() As Variant Dim c() As Integer Rem Array() returns a variant type Rem b is dimensioned from 0 to 9 where b(i) = i-1 b = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) PrintArray("b at initial assignment", b()) Rem b is dimensioned from 1 to 3 where b(i) = i-1 ReDim Preserve b(1 To 3)

104

PrintArray("b after ReDim", b()) Rem The following is NOT valid because the array is already dimensioned Rem to a different size, but you can ReDim it, go figure! Rem a = Array(0, 1, 2, 3, 4, 5) Rem c is dimensioned from 0 to 5. Rem This concerns me because "Hello" is a String value, but Rem it is allowed as of 1.0.2 c = Array(0, 1, 2, "Hello", 4, 5) PrintArray("c, Variant assigned to an Integer array", c()) Rem Ironically, this allowed but c will contain no data! ReDim Preserve c(1 To 3) As Integer PrintArray("c after ReDim", c()) End Sub Sub PrintArray (lead$, a() As Variant) Dim i%, s$ s$ = lead$ + Chr(13) + LBound(a()) + " to " + UBound(a()) + ":" + Chr(13) For i% = LBound(a()) To UBound(a()) s$ = s$ + a(i%) + " " Next Rem I MsgBox rather than Print because I have an embeded Chr(13) MsgBox s$ End Sub

10.9 Función Asc Sumario: Retorna el valor ASCII (American Standard Code for Information Interchange) del primer caracter de la cadena, el resto es ignorado. Un error en tiempo de ejecución es reportado si la cadena tiene un tamaño de cero. Caracteres 16 bit unicode son permitidos. Esta es esencialmente inversa a la función Chr$. Sintaxis: Asc (Texto como cadena) Valor de retorno: entero Parámetro: Texto: Cualquier expresión caracter válida. Ejemplo: Sub AscExample Print Asc("ABC") End Sub

'65

10.10 Función ATN Sumario: 105

Devuelve el Arcotangente de una expresión numérica dentro del rango -?/2 to ?/2 (radianes). Esta es inversa a la función de la tangente (Tan). Para los que no saben mucho de matemática, esta función es trigonométrica. Sintaxis: ATN(número) Valor de retorno: Doble Parametros: Número: cualquier expresión numérica Ejemplo: Sub ExampleATN Dim dLeg1 As Double, dLeg2 As Double dLeg1 = InputBox("Enter the length of the adjacent leg: ","Adjacent") dLeg2 = InputBox("Enter the length of the opposite leg: ","Opposite") MsgBox "The Angle is " + Format(ATN(dLeg2/dLeg1), "##0.0000") _ + " radians" + Chr(13) + "The Angle is " _ + Format(ATN(dLeg2/dLeg1) * 180 / Pi, "##0.0000") + " degrees" End Sub

10.11 Instrucción Beep Sumario: Genera un beep del sistema (sonido) Sintaxis: Beep Ejemplo: Sub ExampleBeep Beep Beep End Sub

10.12 Función Blue Sumario: Los colores son representados por enteros largos. Devuelve el componente azul de un código de colores específico. Ver también RGB, Red, y Green. Sintaxis: Blue (Color como entero largo) Valor de retorno: Entero en el rango de 0 a 255. Parámetros:

106

Valor del color: es una expresión de entero largo que representa un color. Ejemplo: Sub ExampleColor Dim lColor As Long lColor = RGB(255,10,128) MsgBox "The color " & lColor & " consists of:" & Chr(13) &_ "Red = " & Red(lColor) & Chr(13)&_ "Green= " & Green(lColor) & Chr(13)&_ "Blue= " & Blue(lColor) & Chr(13) , 64,"Colors" End Sub

10.13 Palabra clave ByVal Sumario: Los parámetros de las funciones y subrutinas definidas por el usuario son pasados por referencia. Si la subrutina o la función modifica el parámetro, también es modificado en el programa que lo llamó. Esto puede causar resultados extraños si el parámetro de llamada es una constante o si el que está llamando no lo está esperando. La palabra clave ByVal especifica que el parámetro debe ser pasado por valor y no por referencia. Sintaxis: Sub Nombre(ByVal Parámetro As TipoParámetro) Ejemplo: Sub ExampleByVal Dim j As Integer j = 10 ModifyParam(j) Print j Rem 9 DoNotModifyParam(j) Print j Rem 9 End Sub Sub ModifyParam(i As Integer) i=i-1 End Sub Sub DoNotModifyParam(ByVal i As Integer) i=i-1 End Sub

10.14 Palabra clave Call Sumario: Transfiere el control del programa a una subrutina, una función o un procedimiento de un DLL. La palabra Call es opcional a menos que llame un DLL en cuyo caso este debe ser definido de primero. Los parámetros pueden estar encerrados en paréntesis y deben ser encerrados en paréntesis si una función es ejecutada como una expresión. Sintaxis: 107

[Call] Nombre [Parámetros] Parámetros: Nombre: Nombre de la subrutina, función o DLL a llamar. Parámetros: El tipo y número de parámetros depende de la rutina que se está llamando. Ejemplo: Sub ExampleCall Call CallMe "This text will be displayed" End Sub Sub CallMe(s As String) Print s End Sub

10.15 Función CBool Sumario: Convierte el parámetro a boleano. Si la expresión es un número, 0 será falso y cualquier otro número será verdadero. Si la expresión evalúa una cadena, entonces “true” y “false” (sensible a mayúsculas) se convierten a Verdadero y Falso respectivamente. Cadenas con cualquier otro valor genera un error en tiempo de ejecución. Esto es útil para forzar a que el resultado sea boleano. Si llamo una función y retorna un número, como en InStr, puedo escribir “If CBool(InStr(s1, s2)) Then” en lugar de “If InStr(s1, s2) 0 Then”. Sintaxis: CBool (Expresión) Valor de retorno: Booleano Parámetros: Expresión: Numérico, Booleano, Ejemplo: Sub ExampleCBool Print CBool(1.334e-2) Print CBool("TRUE") Print CBool(-10 + 2*5) Print CBool("John" "Fred") End Sub

'True 'True 'False 'True

10.16 Función CByte Sumario: Convierte una expresión de cadena o numérica en el tipo Byte. Las expresiones de cadena son convertidas a números y los dobles son redondeados. Si la expresión es muy larga o negativa, se genera un error. Sintaxis: 108

Cbyte(expresión) Valor de retorno: Byte Parámetros: Expresión : Una expresión de cadena o numérica. Ejemplo: Sub ExampleCByte Print Int(CByte(133)) '133 Print Int(CByte("AB")) '0 'Print Int(CByte(-11 + 2*5)) 'Error, out of range Print Int(CByte(1.445532e2)) '145 Print CByte(64.9) 'A Print CByte(65) 'A Print Int(CByte("12")) '12 End Sub

10.17 Función CDate Sumario: Convierte a fecha. Las expresiones numéricas conteniendo fechas, empezando desde el 31 de diciembre de 1899 a la izquierda del decimal y la hora a la derecha del decimal. Las expresiones de cadena deben ser formateadas por las funciones convensionales de DateValue y TimeValue. En otras palabras, la el formato de la cadena depende del locale. CDateFromIso no depende de su locale y es más seguro si desea un código más global. Sintaxis: CDate (Expresión) Valor de retorno: Date Parámetros: Expresión: Cualquier expresión numérica o de cadena a ser convertida. Ejemplo: sub ExampleCDate MsgBox cDate(1000.25) REM 09.26.1902 06:00:00 MsgBox cDate(1001.26) REM 09.27.1902 06:14:24 Print DateValue("06/08/2002") MsgBox cDate("06/08/2002 15:12:00") end sub

10.18 Función CDateFromIso Sumario: Retorna el número de fecha interno de una cadena conteniendo una fecha en formato ISO.

109

Sintaxis: CDateFromIso(cadena) Valor de retorno: Número de fecha interno. Parámetros: Cadena: Una cadena conteniendo una fecha ISO. El año puede contener dos o cuatro dígitos. Ejemplo: sub ExampleCDateFromIso MsgBox cDate(37415.70) Print CDateFromIso("20020608") Print CDateFromIso("020608") Print Int(CDateFromIso("20020608")) end sub

Rem 08 June 2002 16:48:00 Rem 08 June 2002 Rem 08 June 1902 Rem 37415

10.19 Función CDateToIso Sumario: Retorna la fecha en formato ISO de una serie de números generados con DateSerial o DateValue. Sintaxis: CDateToIso(Número) Valor de retorno: Cadena Parámetros: Número: Entero que contiene la serie de número de fecha. Ejemplo: Sub ExampleCDateToIso MsgBox "" & CDateToIso(Now) ,64,"ISO Date" End Sub

10.20 Función CDbl Sumario: Convierte cualquier expresión numérica o de cadena en el tipo double. Las cadenas deben ser formateadas en el estilo locale. En USA, “12.34” funcionará, pero podría fallar en otros lugares. Sintaxis: CDbl (Expresión) Valor de retorno: Double

110

Parámetros: Expresión: Cualquier expresión de cadena o numérica a ser convertida. Ejemplo: Sub ExampleCDbl Msgbox CDbl(1234.5678) Msgbox CDbl("1234.5678") End Sub

10.21 Instrucción ChDir Sumario: Cambia el directorio actual o la unidad. Si sólo quiere cambiar la unidad actual, digite la letra de la unidad, seguida de dos puntos. ?? Cómo trabajará esto en mi computadora ! ?? Cómo trabajará en Linux o en Mac. Sintaxis: ChDir Texto As String Parámetro: Texto: Cualquier expresión de cadena que especifica una ruta de directorio o unidad. Ejemplo: Sub ExampleChDir Dim sDir as String sDir = CurDir ChDir( "C:\temp" ) msgbox CurDir ChDir( sDir ) msgbox CurDir End Sub

10.22 Instrucción ChDrive Sumario: Cambia la unidad actual. La letra de la unidad debe ser escrita como una letra mayúscula. Puede usar la instrucción OnError para capturar los errores. Esto se ve muy pequeño en mi computadora ?? Sintaxis: ChDrive Texto As String Parámetros: Texto: Expresión de cadena que contenga una letra de unidad. Se acepta notación URL. Ejemplo: Sub ExampleCHDrive On Local Error Goto NoDrive ChDrive "Z" REM Only possible if a drive 'Z' exists. Print "Completed"

111

Exit Sub NoDrive: Print "Sorry, the drive does not exist" Resume Next End Sub

10.23 Función Choose Sumario: Retorna un valor seleccionado de una lista de argumentos. Este es un método rápido para seleccionar un valor de una lista. Si el indice está fuera de los límites (menor a 1 o mayor que n), entonces es retornado un nulo. Sintaxis: Choose (Index, Selección_1[, Selección_2, ... [,Selección_n]]) Valor de retorno: El tipo dependerá del que contenga Selección_i. Parámetros: Index: Una expresión numérica que especifique el valor de retorno. Selection_i: Un valor a retornar. Ejemplo: En este ejemplo, la variable “o” no tiene un tipo de valor dado de manera que toma el tipo de Selección_i. Selección_1 es del tipo “cadena” y Selección_2 es del tipo Double. Si define que “o” tenga un tipo de datos, entonces el valor de retorno será convertido a ese tipo de datos. Sub ExampleChoose Dim sReturn As String Dim sText As String Dim i As Integer Dim o sText = InputBox ("Enter a number (1-3):","Example") i = Int(sText) o = Choose(i, "One", 2.2, "Three") If IsNull(o) Then Print "Sorry, '" + sText + "' is not valid" Else Print "Obtained '" + o + "' of type " + TypeName(o) End If end Sub

10.24 Función Chr Sumario: Retorna el caracter correspondiente al código de caracter específico (ASCII o Unicode) Esto es usado para crear secuencias especiales de cadenas, como secuencias de control para 112

impresoras, tabuladores, nuevas líneas, retornos de carro, etc. Esto también provee un método para insertar comillas dobles dentro de una cadena. Esto es escrito como “Chr$()”. Ver también la Función Asc Sintaxis: Chr(Expresión As Integer) Valor de retorno: Cadena Parámetros: Expresión: Variables numéricas que representan un valor ASCII de 8 bits válido (0-255) o un valor unicode de 16 bits. Ejemplo: Ejemplo: sub ExampleChr REM Show "Line 1" and "Line 2" on separate lines. MsgBox "Line 1" + Chr$(13) + "Line 2" End Sub

10.25 Función CInt Sumario: Convierte cualquier expresion numérica o de cadena en un tipo Integer (entero). La cadena debe ser formateada en base al tipo local. En EEUU, trabajará “12.34”. Ver también: Fix Sintaxis: CInt(Expresión) Valor de retorno: Entero (Integer) Parámetros: Expresión : Cualquier cadena o expresión numérica a ser convertida. Ejemplo: Sub ExampleCInt Msgbox CInt(1234.5678) Msgbox CInt("1234.5678") End Sub

10.26 Función CLng Sumario: Convierte cualquier expresión numérica o de cadena en un tipo Largo (Long). Las cadenas deben ser formateadas en base al tipo local. En EEUU, trabajará “12.34”. Sintaxis: 113

CLong(Expresión) Valor de retorno: Entero Largo (Long) Parámetros: Expresión : Cualquier cadena o expresión numérica a ser convertida. Ejemplo: Sub ExampleCLng Msgbox CLng(1234.5678) Msgbox CLng("1234.5678") End Sub

10.27 Instrucción Close Sumario: Cierra archivos abiertos previamente con la instrucción Open. Multiples archivos pueden ser cerrados simultáneamente. Ver también, EOF, Kill, y FreeFile Sintaxis: Close NuméroArchivo As Integer[, NúmeroArchivo2 As Integer[,...]] Parámetros: NúmeroArchivo : Expresión entera que especifica un archivo abierto anteriormente.

Ejemplo: Sub ExampleCloseFile Dim iNum1 As Integer, iNum2 As Integer Dim sLine As String, sMsg As String 'Next available file number! iNum1 = FreeFile Open "c:\data1.txt" For Output As #iNum1 iNum2 = FreeFile Open "c:\data2.txt" For Output As #iNum2 Print #iNum1, "Text in file one for number " + iNum1 Print #iNum2, "Text in file two for number " + iNum2 Close #iNum1, #iNum2 Open "c:\data1.txt" For Input As #iNum1 iNum2 = FreeFile Open "c:\data2.txt" For Input As #iNum2 sMsg = "" Do While not EOF(iNum1) Line Input #iNum1, sLine If sLine "" Then sMsg = sMsg+"File: "+iNum1+":"+sLine+Chr(13) Loop Close #iNum1 Do While not EOF(iNum2) Line Input #iNum2, sLine If sLine "" Then sMsg = sMsg+"File: "+iNum2+":"+sLine+Chr(13)

114

Loop Close #iNum2 Msgbox sMsg End Sub

10.28 Instrucción Const Sumario: Las Constantes mejora la lectura de los programas al asignar nombres a las contantes y también provee un solo punto de definición. Las constantes pueden incluir la definición de un tipo de datos pero no es requerido. Una constante es definida una vez y no puede ser modificada. Sintaxis: Const Texto [As tipo] = Expresión[, Texto2 [As tipo] = Expresión2[, ...]] Parámetros: Texto: Cualquier nombre de constante que siga los estándares de nombres de variables. Ejemplo: Sub ExampleConst Const iVar As String = 1964 Const sVar = "Program", dVar As Double = 1.00 Msgbox iVar & " " & sVar & " " & dVar End Sub

10.29 Función ConvertFromURL Sumario: Convierte un URL de archivo en un nombre de archivo de sistema. Sintaxis: ConvertFromURL(NombreArchivo) Valor de retorno: Cadena (String) Parámetros: NombreArchivo: Nombre del archivo como un URL Ejemplo: Sub ExampleUrl Dim sUrl As String, sName As String sName = "c:\temp\file.txt" sUrl = ConvertToURL(sName) MsgBox "Original File:" + sName + Chr(13) + "URL: " + sURL + Chr(13) + _ "And Back:" + ConvertFromURL(sUrl) End Sub

115

10.30 Función ConvertToURL Sumario: Convierte un archivo de un URL a un nombre de archivo del sistema. Sintaxis: ConvertToURL(NombreArchivo) Valor de retorno: Cadena (String) Parámetros: NombreArchivo: Nombre del archivo como un nombre del sistema. Ejemplo: Sub ExampleUrl Dim sUrl As String, sName As String sName = "c:\temp\file.txt" sUrl = ConvertToURL(sName) MsgBox "Original File:" + sName + Chr(13) + _ "URL: " + sURL + Chr(13) + _ "And Back:" + ConvertFromURL(sUrl) End Sub

10.31 Función Cos Sumario: El coseno de una expresión numérica con un valor de retorno en el rango de 1 y -1. Para las mentes no matemáticas, esta es una función trigonométrica. Sintaxis: Cos(Número) Valor de retorno: Doble (Double) Parámetros: Número: Ejemplo: Sub ExampleCos Dim dLeg1 As Double, dLeg2 As Double, dHyp As Double Dim dAngle As Double dLeg1 = InputBox("Enter the length of the adjacent leg: ","Adjacent") dLeg2 = InputBox("Enter the length of the opposite leg: ","Opposite") dHyp = Sqr(dLeg1 * dLeg1 + dLeg2 * dLeg2) dAngle = Atn(dLeg2 / dLeg1) MsgBox "Adjacent Leg = " + dLeg1 + Chr(13) + _ "Opposite Leg = " + dLeg2 + Chr(13) + _ "Hypotenuse = " + Format(dHyp, "##0.0000") + Chr(13) + _ "Angle = "+Format(dAngle*180/Pi, "##0.0000")+" degrees"+Chr(13)+_

116

"Cos = " + Format(dLeg1 / dHyp, "##0.0000") + Chr(13) + _ "Cos = " + Format(Cos(dAngle), "##0.0000") End Sub

10.32 Función CreateUnoDialog Sumario: Crea un objeto Basic Uno que representa un dialogo de control Uno durante el tiempo de ejecución de Basic. Los diálogos están definidos en las librerías de diálogos. Para desplegar un dialogo, un diálogo “vivo” debe ser creado en la librería. Sintaxis: CreateUnoDialog( oDlgDesc ) Valor de retorno: Objeto: Diálogo a ejecutar! Parámetros: oDlgDesc : Descripción del dialogo previamente definido en la librería. Ejemplo: ?? Warning, I have not made this work at all! Work on this! Sub ExampleCreateDialog Dim oDlgDesc As Object, oDlgControl As Object DialogLibraries.LoadLibrary("Standard") ' Get dialog description from the dialog library oDlgDesc = DialogLibraries.Standard Dim oNames(), i% oNames = DialogLibraries.Standard.getElementNames() i = lBound( oNames() ) while( i 0 Then REM here the directories sDir = sDir & chr(13) & sValue Else REM here the files If iFile Mod 3 = 0 Then sFile = sFile + Chr(13) iFile = iFile + 1 sFile = sFile + sValue &"; " End If End If sValue = Dir$ Loop Until sValue = "" MsgBox sDir,0,sPath MsgBox "" & iFile & " " & sFile,0,sPath End Sub

Tip

El método getPathSeparator() es incluido sin embargo no aparece en la lista de ayuda. No ha encontrado aun donde está definido, pero es usado en las herramientas distribuidas y en la ayuda.

Advertencia Algunos sistemas operativos incluyen los directorios “.” y “..” que se

refieren al directorio actual y al directorio padre respectivamente. Si escribe código que barra un directorio, probablemente no desee seguirlos o caerá en un ciclo infinito.

Advertencia Cuando obtenga una lista de directorios, los archivos no serán retornados, aun cuando la ayuda en línea parezca indicar que si lo hace.

10.53 Instrucción Do...Loop Sumario: Construye una repetición de instrucciones. Ver también: Control Loop Página 92. Sintaxis: Do [{While | Until} Condición = True] Block de instrucciones [Exit Do] Block de instrucciones Loop Sintaxis: Do Block de instrucciones [Exit Do] Block de instrucciones

129

Loop [{While | Until} condición = True]

10.54 Instrucción End Sumario: Marca el final de un procedimiento o bloque. Ver también: Exit Sintaxis: Forma

Función

End

Por sí mismo termina la ejecución del programa. Puede estar en cualquier parte. Es opcional.

End Function

Marca el final de una función.

End If

Marca el final de un bloque If...Then...Else.

End Select

Marca el final de un bloque Select Case.

End Sub

Marca el final de una subrutina.

Ejemplo: Sub ExampleEnd Dim s As String s = InputBox ("Enter an integer :","White Space Checker") If IsWhiteSpace(Val(s)) Then Print "ASCII " + s + " is white space" Else Print "ASCII " + s + " is not white space" End If End Print "I will never get here" End Sub Function IsWhiteSpace(iChar As Integer) As Boolean Select Case iChar Case 9, 10, 13, 32, 160 IsWhiteSpace = True Case Else IsWhiteSpace = False End Select End Function

10.55 Función Environ Sumario: Retorna el valor de una variable de ambiente. Las variables de ambiente dependen del sistema operativo. En una Macintosh esta función retorna una cadena vacía. Sintaxis: 130

Environ (Ambiente As String) Valor de retorno: Cadena Parámetros: Ambiente: Variable de ambiente, de la cual se quiere extraer el valor que contiene. Ejemplo: Sub ExampleEnviron MsgBox "Path = " & Environ("PATH") End Sub

10.56 Función EOF Sumario: Use EOF para evitar tratar de leer más allá del final del archivo. Cuando el final del archivo es encontrado, EOF retorna Verdadero (-1). Ver también Open, Close, Kill, y FreeFile Sintaxis: EOF (ValorEntero As Integer) Valor de retorno: Boleano Parámetros: ValorEntero: Expresión Entera que evalúa el número correspondiente de un archivo abierto. Ejemplo: Rem Este ejemplo está modificado de la ayuda en línea. Rem El ejemplo de la ayuda en línea no funciona. Sub ExampleEof Dim iNumber As Integer Dim aFile As String Dim sMsg as String, sLine As String aFile = "c:\DeleteMe.txt" iNumber = Freefile Open aFile For Output As #iNumber Print #iNumber, "First line of text" Print #iNumber, "Another line of text" Close #iNumber iNumber = Freefile Open aFile For Input As iNumber While Not Eof(iNumber) Line Input #iNumber, sLine If sLine "" Then sMsg = sMsg & sLine & chr(13) End If Wend Close #iNumber

131

Msgbox sMsg End Sub

10.57 Función EqualUnoObjects Sumario: Verifica si dos objetos Uno representan la misma instancia del objeto Uno. Sintaxis: EqualUnoObjects( oObj1, oObj2 ) Valor de retorno: Boleano Ejemplo: Sub ExampleEqualUnoObjects Dim oIntrospection, oIntro2, Struct2 Rem Copy of objects -> same instance oIntrospection = CreateUnoService( "com.sun.star.beans.Introspection" ) oIntro2 = oIntrospection print EqualUnoObjects( oIntrospection, oIntro2 ) Rem Copy of structs as value -> new instance Dim Struct1 as new com.sun.star.beans.Property Struct2 = Struct1 print EqualUnoObjects( Struct1, Struct2 ) End Sub

10.58 Operador EQV Sumario: Calcula la equivalencia lógica de doe expresiones. En una comparación de bit-a-bit, el operador EQV activa el bit correspondiente en el resultado solamente si un bit es activado en ambas expresiones o en ninguna expresión. La precedencia matemática usada está mostrada en la página 99 y la tabla de operaciones es mostrada a continuación: x

y

x EQV y

VERDAD VERDAD VERDAD ERO ERO ERO VERDAD ERO

FALSO

FALSO

FALSO

VERDAD ERO

FALSO

FALSO

FALSO

VERDAD ERO

1

1

1

132

x

y

x EQV y

1

0

0

0

1

0

0

0

1

Sintaxis: Resultado = Expresión1 EQV Expresión2 Parámetros: Resultado: Variable numérica que contiene el resultado de la comparación. Expresión1, expresión2 : Expresiones a comparar. Ejemplo: Sub ExampleEQV Dim vA as Variant, vB as Variant, vC as Variant, vD as Variant Dim vOut as Variant vA = 10: vB = 8: vC = 6: vD = Null vOut = vA > vB EQV vB > vC REM returns -1 Print vOut vOut = vB > vA EQV vB > vC REM returns -1 Print vOut vOut = vA > vB EQV vB > vD REM returns 0 Print vOut vOut = (vB > vD EQV vB > vA) REM returns -1 Print vOut vOut = vB EQV vA REM returns -1 End Sub

10.59 Función Erl Sumario: Retorna el número de línea en la que ha ocurrido un error durante el tiempo de ejecución. Ver también: Err Sintaxis: Erl Valor de retorno: Entero Ejemplo: Sub ExampleErl On Error GoTo ErrorHandler Dim iVar as Integer iVar = 0 iVar = 4 / iVar

133

Exit Sub ErrorHandler: Rem Error 11 : Division by Zero Rem In line: 8 Rem .... MsgBox "Error " & err & ": " & error$ + chr(13) + _ "In line : " + Erl + chr(13) + Now , 16 ,"An error occured" End Sub

10.60 Función Err Sumario: Retorna el número de error del último error. Ver también: Erl Sintaxis: Err Valor de retorno: Entero Ejemplo: Sub ExampleErr On Error GoTo ErrorHandler Dim iVar as Integer iVar = 0 iVar = 4 / iVar Exit Sub ErrorHandler: Rem Error 11 : Division by Zero Rem In line: 8 Rem .... MsgBox "Error " & err & ": " & error$ + chr(13) + _ "In line : " + Erl + chr(13) + Now , 16 ,"An error occured" End Sub

10.61 Función Error Sumario: Simula la ocurrencia de un error durante la ejecución de un programa. Sintaxis: Error NumeroError As Integer Parámetros: NumeroError: Expresión Entera que especifica el número de error a ser simulado. La instrucción Error simula la ocurrencia de un error durante la ejecución de un programa. Un error interceptado por una rutina de manejo de errores no será reportada, a menos que sea tomada una acción correctiva o no. La instrucción Error es usada para reportar un error 134

cuando no hay rutina de manejo de errores, y detener la ejecución del programa. Ejemplo: ?? This does NOT work! Sintaxis: Error NumeroError As Integer Valor de retorno: Entero Parámetros: Ejemplo:

10.62 Función Error Sumario: Retorna el mensaje de error correspondiente a un código de error dado. Sintaxis: Error (Expresión) Valor de retorno: Cadena Parámetros: Expresión: Entero opcional conteniendo el mensaje de error para un número de error. Si este no está presente, el mensaje de error más reciente es regresado. Ejemplo: Sub ExampleError On Error GoTo ErrorHandler Dim iVar as Integer iVar = 0 iVar = 4 / iVar Exit Sub ErrorHandler: Rem Error 11 : Division by Zero Rem In line: 8 Rem .... MsgBox "Error " & err & ": " & error$ + chr(13) + _ "In line : " + Erl + chr(13) + Now , 16 ,"An error occured" End Sub

10.63 Instrucción Exit Sumario: La instrucción Exit es usada para dejar una estructura Do...Loop, For...Next, Función o 135

Subroutina. En otras palabras, puedo inmediatamente salir de cualquiera de estas estructuras. Si estoy dentro de una subrutina y determino que los argumentos están mal, puedo dejar inmediatamente la subrutina. Ver también: End Sintaxis: Forma

Function

Exit Do

Sale del Do...Loop más cercano.

Exit For

Sale del For...Next más cercano.

Exit Function Sale de una función y continua la ejecución siguiente a la llamada a la función. Exit Sub

Sale de la subrutina y continua la ejecución siguiente a la llamada a la subrutina.

Ejemplo: Sub ExampleExit Dim sReturn As String Dim sListArray(10) as String Dim siStep as Single Rem Build array ("B", "C", ..., "L") For siStep = 0 To 10 REM Fill array with test data sListArray(siStep) = chr(siStep + 66) Next siStep sReturn = LinSearch(sListArray(), "M") Print sReturn Exit Sub Rem This really is a useless statement! End Sub REM Returns the index of the entry or (LBound(sList()) - 1) if not found Function LinSearch( sList(), sItem As String ) as integer Dim iCount As Integer REM LinSearch searches a TextArray:sList() for a TextEntry: For iCount=LBound(sList()) To UBound(sList()) If sList(iCount) = sItem Then LinSearch = iCount Exit Function Rem Probably a good use of Exit here! End If Next LinSearch = LBound(sList()) - 1 End Function

10.64 Función Exp Sumario: Retorna la base del logaritmo natural (e = 2.718282) elevado a una potencia. Ver también: Log 136

Sintaxis: Exp (Número) Valor de retorno: Doble Parámetros: Número: Cualquier expresión numérica. Ejemplo: Sub ExampleExp Dim d as Double, e As Double e = Exp(1) Print "e = " & e Print "ln(e) = " & Log(e) Print "2*3 = " & Exp(Log(2.0) + Log(3.0)) Print "2^3 = " & Exp(Log(2.0) * 3.0) end sub

10.65 Función FileAttr Sumario: El primer propósito de la función FileAttr es determinar el modo de acceso de un archivo abierto con la instrucción Open. Poniéndo el segundo parámetro en 1, recupera este valor. Valor

Descrición del modo de acceso

1

INPUT (Archivo abierto para entrada)

2

OUTPUT (Archivo abierto para salida)

4

RANDOM (Archvo abierto para acceso aleatorio)

8

APPEND (Archivo abierto para añadir)

32

BINARY (Archivo abierto en modo binario)

El segundo propósito de la función FileAttr es determinar el atributo de un archivo MS-DOS que ha sido abierto con la instrucción Open. Este valor depende del sistema operativo. Poniéndo el segundo parametro en 2, recupera este valor.

Advertencia El atributo de archivos depende del sistema operativo. Si el sistema

operativo es una versión 32-bit, no es posible usar la función FileAttr para determinar al atributo del archivo MS-Dos file de manera que es regresado un cero.

Ver también: Open Sintaxis: FileAttr (NumeroArchivo As Integer, Atributo As Integer) 137

Valor de retorno: Entero Parámetros: NumeroArchivo: Número usado en la instrucción Open. Atributo: Entero indicando que información retornar. 1 recupera el modo de acceso y 2 recupera el número de acceso del archivo. Ejemplo: Sub ExampleFileAttr Dim iNumber As Integer iNumber = Freefile Open "file:///c|/data.txt" For Output As #iNumber Print #iNumber, "Random Text" MsgBox AccessModes(FileAttr(#iNumber, 1 )),0,"Access mode" MsgBox FileAttr(#iNumber, 2 ),0,"File attribute" Close #iNumber End Sub Function AccessModes(x As Integer) As String Dim s As String s = "" If (x AND 1) 0 Then s = "INPUT" If (x AND 2) 0 Then s = "OUTPUT" If (x AND 4) 0 Then s = s & " RANDOM" If (x AND 8) 0 Then s = s & " APPEND" If (x AND 32) 0 Then s = s & " BINARY" AccessModes = s End Function

10.66 Instrucción FileCopy Sumario: Copia un archivo. No puede copiar un archivo que esté abierto. Sintaxis: FileCopy TextoDesde As String, TextoA As String Parámetros: TextoDesde: Cadena especificando el nombre del archivo origen. TextoA: Cadena especificando el nombre de archivo destino. Ejemplo: Sub ExampleFilecopy Filecopy "c:\Data.txt", "c:\Temp\Data.sav" End Sub

10.67 Función FileDateTime Sumario: 138

Retorna una cadena cona la fecha y hora en que un archivo ha sido creado o modificado por última vez, retornado en un formato que depende del sistema."MM/DD/YYYY HH:MM:SS" en mi computadora. Considere el uso de la función DateValue function con esta cadena. Sintaxis: FileDateTime(Texto As String) Valor de retorno: Cadena Parámetros: Texto: Especificación del archivo (no se permiten comodines). Notación URL es permitida. Ejemplo: Sub ExampleFileDateTime Rem 04/23/2003 19:30:03 MsgBox FileDateTime("file://localhost/C|/macro.txt") End Sub

10.68 Función FileExists Sumario: Determina si un archivo o directorio existe. Sintaxis: FileExists(NombreArchivo As String | NombreDirectorio As String) Valor de retorno: Boleano Parámetros: NombreArchivo | NombreDirectorio: Archivo o directorio especificado (No se permiten comodines). Ejemplo: Sub ExampleFileExists MsgBox FileExists("C:\autoexec.bat") MsgBox FileExists("file://localhost/c|/macro.txt") MsgBox FileExists("file:///d|/private") End Sub

10.69 Función FileLen Sumario: Determina el tamaño de un archivo. Si el archivo está actualmente abierto, el tamaño antes de que fue abierto será retornado. Para determinar el largo del archivo de un archivo abierto, en su lugar use la función Lof. Sintaxis: FileExists(NombreArchivo As String) 139

Valor de retorno: Largo. Parámetros: NombreArchivo: Especificación del archivo (No se permiten comodines). Ejemplo: Sub ExampleFileExists MsgBox FileLen("C:\autoexec.bat") MsgBox FileLen("file://localhost/c|/macro.txt") End Sub

10.70 Función FindObject Sumario: ?? No tengo idea10 Sintaxis: Valor de retorno: Parámetros: Ejemplo:

10.71 Función FindPropertyObject Sumario: ?? No tengo idea11 Sintaxis: 10 El siguiente texto está tomado de la ayuda en línea: Permite que los objetos sean referenciados en tiempo de ejecución como un parámetro de cadena de caracteres por medio del nombre del objeto. Sintaxis: FindObject(NombreObjeto As String) Parámetro: NombreObjeto: Cadena que especifica el nombre del objeto que debe ser referenciado en tiempo de ejecución. Ejemplo: Dim ObjVar as Object Dim ObjProp as Object ObjName As String = "MyObj" ObjVar = FindObject( ObjName As String ) PropName As String = "Prop1" ObjProp = FindPropertyObject( ObjVar, PropName As String ) ObjProp.Command = 5 11 La ayuda en línea de este tópico es igual a la anterior.

140

Valor de retorno: Parámetros: Ejemplo:

10.72 Función Fix Sumario: Retorna la porción entera de una expresión numérica removiendo la fracción. Ver también: CInt Sintaxis: Fix(Expresión) Valor de retorno: Doble Parámetros: Expresión: Número del cual se retornará la parte entera. Ejemplo: sub ExampleFix Print Fix(3.14159) REM returns 3. Print Fix(0) REM eturns 0. Print Fix(-3.14159) REM returns -3. End Sub

10.73For...Next Statement Sumario: Construye una repetición de instrucciones con un contador que se autoincrementa. Ver también: For....Next en la página 91. Sintaxis: For contador=inicio To end [Step paso] block de instrucciones [Exit For] block de instrucciones Next [contador]

141

10.74 Función Format Sumario: Convierte un número en una cadena formateada de acuerdo al formado de cadena opcional. Formatos múltiples pueden ser incluidos en una sola cadena de formato. Cada formato individual está separado por un “;”. El primer formato es usado para los números positivos, el segundo para los negativos y el tercero para el cero. Si sólo un código de formato está presente, se aplica para todos los números. Código

Descripción

0

Si un número tiene un dígito en la posición del cero en el código del formato, el dígito es desplegado; de lo contrario aparecerá un cero. Esto significa que los cero al inicio y al final son despegados, los digitos al inicio no serán truncados y los decimales al final serán redondeados.

#

Esto trabaja como el 0, pero los ceros al inicio y al final no son desplegados.

.

El punto decimal determina el número de posiciones decimales a la derecha y a la izquierda del separador decimal.

%

Multiplica el número por 100 e inserta el signo porcentual (%) en donde aparezca en el código del formato.

EE+ ee+

Si el código de formato contiene al menos una posición para digitos a la derecha del simbolo, el número será formateado en notación científica. La letra E o e es insertada entre el número y el exponente. El número de posiciones para los dígitos a la derecha del símbolo determina el número de dígitos en el exponente. Si el exponente es negativo, un signo de menos es desplegado directamente antes del exponente. Si el exponente es positivo, un signo de más solamente será desplegado antes con E+ o e+.

,

La coma es un indicador para el separador de miles. Separa los miles de los cientos en un número de al menos cuatro dígitos. El delimitador de miles es desplegado si el formato contiene el delimitador rodeado de los indicadores de dígitos (0 o #).

- + $ ( ) space

Más (+), menos (-), dólar ($), espacio, o paréntesis entradas directamente en el formato son desplegadas como caracteres literales.

142

Código

Descripción

\

El “backslash” despliega el siguiente caracter en el formato del codigo. En otras palabras, previene que el siguiente caracter se lea como un caracter especial. El “backslash” no es desplegado, a menos que introduzca un doble “backslash” (\\) en el código de formato. Los caracteres que pueden ser precedidos por un “backslash” en el código de formato para que sean desplegados como caracteres literales son los caracteres de formato de fecha-hora (a, c, d, h, m, n, p, q, s, t, w, y, /, :), caracteres de formateo de números (#, 0, %, E, e, coma, punto) y caracteres de formatero de cadenas (@, &, , !). Puede encerrar los caracteres en comillas dobles.

Números en general

Los números se despliegan tal y como se introducen.

Moneda

Un signo de dólar es colocado al frente del número; los números negativos son encerrados en paréntesis. Se despliegan dos decimales. (Actualmente, esto es especifico de la localización)

Fijo

Al menos un digito es desplegado al frente del separador decimal. Se despliegan dos decimales.

Standard

Despliega los números con el separador de miles específico de la localización. Se despliegan dos decimales.

Científico

Despliego los números en notación científica. Se despliegan dos decimales.

Advertencia No se hace ninguna conversión si el parámetro no es un número (como cuando es una cadena) y una cadena vacía es devuelta.

Advertencia La versión 1.0.3.1, Format(123.555, “.##”) produce “.12356” lo que

considero un problema. Cambiando el formato a “#.##” resuelve el problema. Use siempre un “#” o “0” adelante según sea lo apropiado. La notación científica actualmente está mala (quebrada) Moneda es colocando el signo de dólar a la derecha. Actualmente no es posible realizar caracteres especiales de escape.

Sintaxis: Format (Número [, Formato As String]) Valor de retorno: Cadena 143

Parámetros: Número: Expresión numérica a ser convertida a una cadena formateada. Formato: El formato deseado. Si es omitido, la función Format trabajará como la función Str. Ejemplo: Sub ExampleFormat MsgBox Format(6328.2, "##,##0.00") REM = 6,328.20 MsgBox Format(123456789.5555, "##,##0.00") REM = 123,456,789.56 MsgBox Format(0.555, ".##") Rem .56 MsgBox Format(123.555, "#.##") Rem 123.56 MsgBox Format(0.555, "0.##") Rem 0.56 MsgBox Format(0.1255555, "%#.##") Rem %12.56 MsgBox Format(123.45678, "##E-####") Rem 12E1 MsgBox Format(.0012345678, "0.0E-####") Rem 1.2E3 (broken) MsgBox Format(123.45678, "#.e-###") Rem 1e2 MsgBox Format(.0012345678, "#.e-###") Rem 1e3 (broken) MsgBox Format(123.456789, "#.## is ###") Rem 123.45 is 679 (strange) MsgBox Format(8123.456789, "General Number")Rem 8123.456789 MsgBox Format(8123.456789, "Fixed") Rem 8123.46 MsgBox Format(8123.456789, "Currency") Rem 8,123.46$ (broken) MsgBox Format(8123.456789, "Standard") Rem 8,123.46 MsgBox Format(8123.456789, "Scientific") Rem 8.12E03 MsgBox Format(0.00123456789, "Scientific") Rem 1.23E03 (broken) End Sub

10.75 Función FreeFile Sumario: Retorna el siguiente número de archivo disponible para abrir un archivo. Esto asegura que nunca use un número de archivo que esté actualmente en uso. Ver también Open, EOF, Kill, y Close. Sintaxis: FreeFile Valor de retorno: Entero Ejemplo: Ver el ejemplo para Close.

10.76FreeLibrary Function Sumario: Libera una DLL que ha sido cargada por una instrucción Declare. La DLL será automaticamente recargada si una de sus funciones es llamada. Solamente las DLLs cargadas durante el tiempo de ejecución de Basic pueden ser liberadas. Ver también: Declare 144

Sintaxis: FreeLibrary (NombreLib As String) Parámetros: NombreLib: Nombre de la DLL. Ejemplo: Declare Sub MyMessageBeep Lib "user32.dll" Alias "MessageBeep" ( long ) Sub ExampleDeclare Dim lValue As Long lValue = 5000 MyMessageBeep( lValue ) FreeLibrary("user32.dll" ) End Sub

10.77 Instrucción Function Sumario: Define una función definida por el usuario, en oposición a una subrutina. Ver también: Sub Sintaxis: Function Nombre[(Variable1 [As Tipo][, Variable2 [As Tipo][,...]]]) [As Tipo] bloque de instrucciones [Exit Function] bloque de instrucciones End Function Valor de retorno: Cualquier tipo que haya sido declarado. Ejemplo: Function IsWhiteSpace(iChar As Integer) As Boolean Select Case iChar Case 9, 10, 13, 32, 160 IsWhiteSpace = True Case Else IsWhiteSpace = False End Select End Function

10.78 Instrucción Get Sumario: Lee un registro de un archivo relativo, o una secuencia de bytes de un archivo binario, dentro de una variable. Si el parámetro de posición es omitido, los datos son leidos de la posición actual en el archivo. Para los archivos abiertos en modo binario, la posición es la posición del 145

byte en el archivo. Ver también: PUT Sintaxis: Get [#] NúmeroArchivo As Integer, [Posición], Variable Parámetros: NúmeroArchivo: expresión entera que determina el número de archivo. Yo uso FreeFile para obtenerlo. Posición: Para los archivos abiertos en modo aleatorio, este es el número de registro a ser leido. Variable: Variable a leer. El objeto Variable puede no ser usado aqui. Ejemplo: '?? This is broken! Sub ExampleRandomAccess2 Dim iNumber As Integer, aFile As String Dim sText As Variant REM Must be a variant aFile = "c:\data1.txt" iNumber = Freefile Open aFile For Random As #iNumber Len=5 Seek #iNumber,1 REM Position at beginning Put #iNumber,, "1234567890" REM Fill line with text Put #iNumber,, "ABCDEFGHIJ" Put #iNumber,, "abcdefghij" Rem This is how the file looks now! Rem 08 00 0A 00 31 32 33 34 35 36 37 38 39 30 08 00 ....1234567890.. Rem 0A 00 41 42 43 44 45 46 47 48 49 4A 08 00 0A 00 ..ABCDEFGHIJ.... Rem 61 62 63 64 65 66 67 68 69 6A 00 00 00 00 00 00 abcdefghij Rem Seek #iNumber,1 Get #iNumber,,sText Print "on open:" & sText Close #iNumber iNumber = Freefile Open aFile For Random As #iNumber Len=5 Get #iNumber,,sText Print "reopened: " & sText Put #iNumber,,"ZZZZZ" Get #iNumber,1,sText Print "anoter get "& sText Get #iNumber,1,sText Put #iNumber,20,"This is the text in record 20" Print Lof(#iNumber) Close #iNumber End Sub

146

10.79 Función GetAttr Sumario: Retorna un máscara de bits para el tipo de archivo. Los atributos son el tipo usado en la función Dir. Atributo

Descripción

0

Archivo Normal.

1

Archivo de Sólo-Lectura

2

Archivo oculto.

4

Archivo de sistema.

8

Nombre del Volumen.

16

Directorio.

32

Bit de archivado (el archivo cambio desde el último backup)

Ver también: Dir

Advertencia No sirve en 1.0.3.1. Pruebe con la versión que usted usa. Sintaxis: GetAttr (Texto As String) Valor de retorno: Entero Parámetros: Texto: Expresión de cadena que contiene una especificación única de archivo. Es válida la notación URL. Ejemplo: Sub ExampleGetAttr Rem Should say " Read-Only Hidden System Archive" Rem says " Read-Only" Print FileAttributeString(GetAttr("C:\IO.SYS")) Rem Should say " Archive" says "Normal" Print FileAttributeString(GetAttr("C:\AUTOEXEC.BAT")) Rem "Directory" Print FileAttributeString(GetAttr("C:\WINDOWS")) End Sub Function FileAttributeString(x As Integer) As String Dim s As String If (x = 0) Then s = "Normal" Else s = ""

147

If (x AND 16) 0 Then s = "Directory" If (x AND 1) 0 Then s = s & " Read-Only" If (x AND 2) 0 Then s = " Hidden" If (x AND 4) 0 Then s = s & " System" If (x AND 8) 0 Then s = s & " Volume" If (x AND 32) 0 Then s = s & " Archive" End If FileAttributeString = s End Function

10.80 Función GetProcessServiceManager Sumario: Obtiene el administrador Uno central. Esto es requerido cuando debe iniciar un servicio usando CreateInstance con argumentos. ?? Encontrar un mejor ejemplo que este! Mostrar un ejemplo que toma un argumento! Sintaxis: oServiceManager = GetProcessServiceManager() Valor de retorno: Ejemplo: oServiceManager = GetProcessServiceManager() oIntrospection = oServiceManager.createInstance("com.sun.star.beans.Introspection"); this is the same as the following statement: oIntrospection = CreateUnoService("com.sun.star.beans.Introspection")

10.81 Función GetSolarVersion Sumario: Retorna el número interno de la versión actual de OpenOffice.org. Puede escribir sus macros de manera que trabajen alrededor de problemas conocidos en las diferentes versiones. Sintaxis: s = GetSolarVersion() Valor de retorno: Cadena Ejemplo: Sub ExampleGetSolarVersion Rem as of 1.0.3.1, this is "641" Print GetSolarVersion() End Sub

148

10.82 Función GetSystemTicks Sumario: Retorna los tiempos del sistema provistos por el sistema operativo. El número de tiempos de reloj del sistema retornados dentro de ciertos marcos de tiempo, dependen del sistema operativo. Sintaxis: GetSystemTicks() Valor de retorno: Largo Ejemplo: Este ejemplo intentará medir cuantos tiempos de reloj hay por segundo. En Windows XP y la versión 1.0.3.1 de OpenOffice.org, veo 1000 tiempos de reloj por segundo. Sub ExampleGetSystemTicks Dim lTick As Long, lMillisToWait As Long Dim lSecsToWait As Long, lTicksPerSec As Long lSecsToWait = 60 lMillisToWait = lSecsToWait * 1000 lTick = GetSystemTicks() wait(lMillisToWait) lTick = (GetSystemTicks() - lTick) lTicksPerSec = lTick / lSecsToWait MsgBox "Each second has about " & lTicksPerSec & " Ticks Per Second" End Sub

10.83 Instrucción GlobalScope Sumario: Los macros de y diálogos están organizados en librerias. Una librería puede contener módulos y/o diálogos. En Basic, el contenedor de librerías es llamado “BasicLibraries” y el contenedor de dialogos es llamado “DialogLibraries”. De esta forma ambos contenedores de librerías existen en el nivel de aplicación y de documento, en basic estas son cargadas automáticamente pero no en el doumento. Para llamar estos contenedores de librerías globales dentro de un documento, debe usar la palabra clave GlobalScope. Sintaxis: GlobalScope Ejemplo: ' calling Dialog1 in the document library Standard oDlgDesc = DialogLibraries.Standard.Dialog1 ' calling Dialog2 in the application library Library1 oDlgDesc = GlobalScope.DialogLibraries.Library1.Dialog2

149

10.84 Function Sumario: Sintaxis: Valor de retorno: Parámetros: Ejemplo:

10.85 Function Sumario: Sintaxis: Valor de retorno: Parámetros: Ejemplo:

10.86 Function Sumario: Sintaxis: Valor de retorno: Parámetros: Ejemplo:

150

???????

10.87 Function Sumario: Sintaxis: Valor de retorno: Parámetros: Ejemplo:

10.88 Función Green Sumario: Los colores son representados por un entero largo. Retorna el componente verde del código de colores específico. Ver también RGB, Red, y Blue. Sintaxis: Green(Color As Long) Valor de retorno: Entero en el rango de 0 a 255. Parámetros: Color: Expresión de entero largo representando un color. Ejemplo: Sub ExampleColor Dim lColor As Long lColor = RGB(255,10,128) MsgBox "The color " & lColor & " consists of:" & Chr(13) &_ "Red = " & Red(lColor) & Chr(13)&_ "Green= " & Green(lColor) & Chr(13)&_ "Blue= " & Blue(lColor) & Chr(13) , 64,"Colors" End Sub

151

10.89 Palabra clave Private Sumario: La palabra clave Private es usado para declarar una variable fuera de una subrutina como privada. Si una variable es declarada usando la palabra clave Dim, es considerada privada. Ver también la descripción para las descripciones de la sintaxis de Dim. Ver también: Dim, Public Sintaxis: Private Nombre_1 [(inicio To fin)] [As VarType][, Nombre_2 [(inicio To fin)] [As VarType] [,...]] Ejemplo: Private iPriv As Integer Sub ExamplePublic iPriv = 1 Call CalledSub End Sub Sub CalledSub Print iPriv Rem 1 End Sub

10.90 Palabra clave Public Sumario: La palabra clave Public es usada para declarar una variable fuera de una subrutina como pública para todos los módulos. Si una variable es declarada usando la palabra clave Dim, es considerada privada. Vea la descripción en Dim para la sintaxis. Ver también: Dim, Private Sintaxis: Public Nombre_1 [(inicio To fin)] [As VarType][, Nombre_2 [(inicio To fin)] [As VarType] [,...]] Ejemplo: Public iPub As Integer Sub ExamplePublic iPub = 1 Call CalledSub End Sub Sub CalledSub Print iPub Rem 1 End Sub

152

10.91 Función Red Sumario: Los colores son representados por un entero largo. Retorna el componente rojo del código de colores específico. Ver también RGB, Green, y Blue. Sintaxis: Red(Color As Long) Valor de retorno: Entero en el rango de 0 a 255. Parámetros: Color: Expresión de entero largo representando un color. Ejemplo: Sub ExampleColor Dim lColor As Long lColor = RGB(255,10,128) MsgBox "The color " & lColor & " consists of:" & Chr(13) &_ "Red = " & Red(lColor) & Chr(13)&_ "Green= " & Green(lColor) & Chr(13)&_ "Blue= " & Blue(lColor) & Chr(13) , 64,"Colors" End Sub

10.92 Notación y nombres de archivo URL 10.92.1 Notación URL En una computadora con windows, “c:\autoexec.bat” es un típico método para referenciar un archivo. Esto también puede ser referenciado en notación URL como “file:///c|/autoexec.bat”. Una idea general cuando realice conversiones es iniciar el URL con “file:///”, cambiar “:” por “|”, y reemplazar “\” con “/”. Si desea insertar el nombre de una computadora o una dirección IP, insértelo entre el segundo y tercer caracter “/” como en “file://localhost/c|/autoexec.bat/”.

10.92.2 Rutas con espacios y otros caracteres especiales. Los espacios y caracteres especiales pueden ser cambiados en las URLs como notación estandar de archivos usando la secuencia de escape standar de URL. Tome el valor ASCII que intenta cambiar, conviertalo en hex, ponga el caracter “%” antes, y coloquelo donde desea el caracter especial. Considere el cambio por un espacio en la ruta. “c:\My% 20Documents\info.sxw” y “file///c|/My%20Documents/info.sxw”.

153

154

11Index / 86p., 90, 101, 103p. Abs 106 And 87, 101, 105 Array 85p. Asc 107 ATN 108 AVERAGE 41 Beep 108 Blue 109 Bool 79 BottomLine 42 ByVal 89, 109 Call 110 case 93, 95 Case Else 93 CBool 110 Cbyte 111 CDate 111 CDateFromIso 111p. CDateToIso 112 CDbl 113 Cell CellAddress 38, 74p. CellBackColor 35 getFormula 35 getSpreadSheet 38, 74p. getString 35 getValue 35 IsCellBackgroundTransparent NumberFormat 35, 41 setFormula 35, 41 setString 35, 41 setValue 35 String 29 CellAddress Column 38, 74p. Row 38, 74p. CharacterProperties CharFontName 69 Charheight 69 CharLocale 69 CharPosture 69 FontSlant 69 CharUnderline 69

35

CharWeight 69 FontWeight 69 FontSlant DONTKNOW 69 ITALIC 69 NONE 69 OBLIQUE 69 REVERSE_ITALIC 69 REVERSE_OBLIQUE FontUnderline BOLD 69 BOLDDASH 69 BOLDDASHDOT 69 BOLDDASHDOTDOT BOLDDOTTED 69 BOLDLONGDASH 69 BOLDWAVE 69 DASH 69 DASHDOT 69 DASHDOTDOT 69 DONTKNOW 69 DOTTED 69 DOUBLE 69 DOUBLEWAVE 69 LONGDASH 69 NONE 69 SINGLE 69 SMALLWAVE 69 WAVE 69 FontWeight BLACK 69 BOLD 69 DONTKNOW 69 LIGHT 69 NORMAL 69 SEMIBOLD 69 SEMILIGHT 69 THIN 69 ULTRABOLD 69 ULTRALIGHT 69 ChDir 113 ChDrive 114 Choose 114 Chr 107, 115 Christian Anderson 88 CInt 115 155

69

69

CLong 116 Close 31, 116, 134, 147 Component CurrentController 41 CurrentSelection 41 DatabaseRanges 41 getCurrentController 43 removeByName 42 StatusIndicator 20 Text 1 computed goto 95 Config commitChanges 25 ConfigurationUpdateAccess 25 createInstanceWithArguments PickListSize 25 replaceByName 25 ConfigurationProvider 25 Const 117 Controller ActiveSheet 41 getViewCursor() 69 select 43 StatusIndicator 20 ConvertFromURL 117 ConvertToURL 118 Cos 118 CreateUnoDialog 119 CreateUnoService 25, 120 CreateUnoStruct 120 CSng 121 CStr 121 CurDir 122 Currency 79 CurrentController 20 Cursor getRangeName 29 getStart() 69 goRight 29 gotoEndOfParagraph() 69 gotoStartOfParagraph() 69 Date 79, 122 DateSerial 112, 123 DateValue 111p., 124 Day 124 DBG_methods 8

25

DBG_Properties 8 Declare 125 DefBool 79, 126 DefDate 79, 126 DefDbl 79, 127 DefInt 79, 127 DefLng 79, 127 DefObj 79, 128 DefVar 79, 128 Desktop CurrentComponent 41 LoadComponentFromURL() 27 Dim 79pp., 84p., 129 Dim” 79 DimArray 85, 130 DimArray. 85, 106 Dir 130, 150 Do...Loop más cercano 138 Double 79 Else 90 ElseIf 90 El tipo por defecto es Single 79 End 132p. End Function 132p. End If 133 End Select 133 End Sub 133 Environ 133 EOF 116, 134, 147 EqualUnoObjects 134 EQV 101, 135 Erl 136 Err 136 Error 137 Exit 96 Exit DO 96 Exit For 96 Exit Function 96 Exit Sub 96 Exit. 87 Exit Do 93, 138 Exit For 91, 138 Exit Function 139 Exit Sub 139 Exp 139 False 87 156

Fecha 122 Fibonnaci 33 File CLOSE 31 FileExists 31 LINE INPUT 31 OPEN 31 FileAttr 140 FileCopy 141 FileDateTime 141 FileExists 142 Fix 144 For 91 For...Next 138 Format 146 FreeFile 116, 134, 147 Function 87 Get 149 GetAttr 130, 150 getCurrentComponent 20 getNumberFormats() 32 getPathSeparator() 131 GetProcessServiceManager() 151 GetSolarVersion() 151 GetSystemTicks() 152 GlobalScope 152 GoSub 90, 94 GoTo 31, 90, 94p. Green 154 If 90 If. 90 IIf 87, 90p. Int 31 Integer 79 Is 87, 93 IsArray 86 IsDate 86 IsEmpty 86 IsMissing 32, 86, 88 IsNull 74, 86 IsNumeric 86 IsObject 86 IsUnoStruct 86 Kelecevic, Sasa 27 Kill 116, 134, 147 Las variables enteras son números de 16-bits

dentro de un rango de 83 Las varibles Object4 79 LBound 21, 23, 84p. LEN 20, 31 LineDistance 42 Locale Country 69 Language 69 Long 79 Loop 92 Do 92 Do Until 92 Do While 92 Loop Until 93 Loop While 92 Los objetos de cadena están limitados a 80 Los objetos Variant 80 Macro Author Andrew Pitonyak AccessModes 141 BuildSortedArray 76 CalcGroupingExample 44 ClearDefinedRange 36 ColumnNumberToString 38, 75 CreateSelectedTextIterator 52 DisplayAllStyles 21 ExampleNewPage 72 FileAttributeString 151 FindCreateNumberFormatStyle 32 FirstDuplicate 77 ForNextExampleSort 91 GetLeftMostCursor 50 GetRightMostCursor 50 GoToExample 95 InsertDateField 71 InsertDateIntoCell 39 InsertSimpleText 69 IsAnythingSelected 48 IsSpreadhsheetDoc 35 IsWhiteSpace 53, 148 IterateOverSelectedTextFramework 51 MultipleTextSelectionExample 49 NonBlankCellsInColumn 75 OnGoToExample 95 PrintableAddressOfCell 38, 74 PrintableCellAddress 75 157

PrintAscii 7 PrintDataInColumn 44 PrintEachCharacterWorker 53 ProtectSpreadsheet 45 RankChar 54 Read_Write_Number_In_File 31 RemoveEmptyParsWorker 56 RemoveFromString 6 ReplaceInString 6 SelectedNewLinesToSpaces 56 SelectedNewParagraphsToNewLines 57 SetTextAttributes 68 testOptionalParameters 88 edA-qa mort-ora-y Fibonnaci 33 Hermann Kienlein CreateTable 29 InsertNextItem 29 Niklas Nebel setting_borders_in_calc 42 OpenOffice GetDocumentType 7 Pavel Janík CallExternalProgram 30 Sasa Kelecvic _no_salvar 27 ActiveSheet 41 Analize 41 CellPos 41 DefineDbRange 42 DeleteDbRange 41p. ExampleGetValue 35 ExampleSetValue 35 FillCells 40 GetAddress 41 open_new 29 open_old_file 29 ProgressBar 20 salvar_y_cerrar 27 SelectedCells 39 SortRange 43 StatusText 20 Tony Bloomfield DisplayMethods 8 Unknown

ChangePickListSize 25 MAX 41 MIN 41 MOD 21, 101 NOT 87 Null 86 NumberFormat 32 addNew 32 DATE 32 FindCreateNumberFormatStyle 39, 71 queryKey 32 Object 79 On Error 97 Local 97 On Error 97 On Error GoTo 0 97 On Error GoTo Label 97 On Error Resume Next 97 ON ERROR 31 On Local Error Goto 0 31 On N GoSub 95 On N GoTo 95 Open 31, 134, 147 Option Explicit 25 Option 25 Optional 32, 88 Option Base 84 Option Explicit 9, 79 OR 87, 101 PageDescName 71 PageDescName es el nombre del nuevo estilo de página que se usa después del salto de página. Si no usa un estilo de página existente, entonces fallará 71 PageNumberOffset 71 PI 84 PRINT 31 printdbgInfo 3 Private 80p., 155 PropertyValue 25, 43 Name 25, 43 Value 25, 43 Public 80p., 155 Public5 80 Red 156 158

ReDim 79, 129 ReDim Preserve 85p. ReDim 85p. ReDimExample 85 ReDim. 80 Return 94 Select Case 93 Selection Columns 41 getRangeAddress 41 Rows 41 shell 30 Single 79 Sort 43 SortField 43 Field 43 SortAscending 43 SPACE 20 SpreadsheetDocument BottomLine 42 Column Columns 39p. getByIndex 40p. getCount 40p. getName 40, 44 Columns 39, 44 Count 36 CurrentSelection 39p. getByName 35, 43 getCellByPosition 35, 40 getCellRangeByName 43 getCellRangeByPosition 42 getCount 40 getName 38, 74p. getRangeAddress 39 Row EndRow 40p. getCount 40p. Rows 40 StartRow 40p. Rows 40 setString 40 Sheets 35p., 42pp. SpreadsheetDocument 35 SupportsService 35

TableBorder 42 StarDesktop” respectivamente Static 81 Static6 80 StatusIndicator start 20 Str 31 String 79 Styles CharacterStyles 21 FrameStyles 21 getByName 21 getElementNames() 21 NumberingStyles 21 PageStyles 21 ParagraphStyles 21 StyleFamilies 21 Sub 87 switch 93, 95 TableBorder 42 Tan 108 TextCursor goRight() 47 gotoEnd() 47 gotoStart() 47 IsCollapsed 47 IsCollapsed() 48p. TextDocument compareRegionEnds() compareRegionStarts() createTextCursorByRange createTextCursorByRange() CurrentController 69 getCurrentSelection getCount() 49 getCurrentSelection() 48p. getByIndex() 49 getCount() 48 getString() 30 getText() 30 insertControlCharacter insertString 69 setString 30 Text 30, 69 TextTable getCellByName 29 159

1

49 49p. 69 48pp., 69

58

ThisComponent” TimeValue 111 To 93 Trim 31 True 87 UBound 21 Variant 79 wait 30 While...Wend 94 WritedbgInfo 3 XOR 87, 101

1

160

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF