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: andrew@pitonyak.org • work: andrew.pitonyak@qwest.com
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

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

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

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

10.49 Instrucción DefVar	128

10.50 Instrucción Dim	128

10.51 Función DimArray	129

10.52 Función Dir	130

10.53 Instrucción Do...Loop	132

10.54 Instrucción End	132

10.55 Función Environ	133

10.56 Función EOF	134

10.57 Función EqualUnoObjects	134

10.58 Operador EQV	135

10.59 Función Erl	136

10.60 Función Err	136

10.61 Función Error	137

10.62 Función Error	138

10.63 Instrucción Exit	138

10.64 Función Exp	139

10.65 Función FileAttr	140

10.66 Instrucción FileCopy	141

10.67 Función FileDateTime	141

10.68 Función FileExists	142

10.69 Función FileLen	142

10.70 Función FindObject	143

10.71 Función FindPropertyObject	143

10.72 Función Fix	144

10.73 For...Next Statement	144

10.74 Función Format	144

10.75 Función FreeFile	147

10.76 FreeLibrary Function	147

10.77 Instrucción Function	148

10.78 Instrucción Get	149

10.79 Función GetAttr	150

10.80 Función GetProcessServiceManager	151

10.81 Función GetSolarVersion	151

10.82 Función GetSystemTicks	152

10.83 Instrucción GlobalScope	152

10.84 Function	153

10.85 Function	153

10.86 Function	153

10.87 Function	154

10.88 Función Green	154

10.89 Palabra clave Private	155

10.90 Palabra clave Public	155

10.91 Función Red	156

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

Introducció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	' Obtiene el documento activo

oText = oDoc.Text	' Obtiene el servicio TextDocument

?? Gracias a Kelvin demo@onlineconnections.com.au por su aporte en cosas como quitar la palabra clave “ByVal”

Recursos disponibles

Material 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) o desde un documento, seleccione “Herramientas=>Macro”, seleccione la librería “Tools” y presione “F5” o haga click en “Run”.

Recursos 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 API . 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” . 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_basic_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:

http://www.darwinwars.com/lunatic/bugs/oo_macros.html

http://disemia.com/software/openoffice/

http://kienlein.com/pages/oo.html

Ejemplos

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

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

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 <= 1 Then

'Removing from the start

If num >= Len(s) Then

RemoveFromString = ""

Else

RemoveFromString = Right(s, Len(s) - num)

End If

Else

'Removing from the middle

If index + num > 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

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 <= 1 entonces el texto es insertado al inicio de la cadena.

Rem	Si index > 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 <= 1 Then

'Pone esto al inicio de la cadena

If num < 1 Then

ReplaceInString = replaces + s

ElseIf num > Len(s) Then

ReplaceInString = replaces

Else

ReplaceInString = replaces + Right(s, Len(s) - num)

End If

ElseIf index + num > 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

Imprimiendo los valores ASCII de una cadena

Esto se ve como una macro rara, pero yo la uso para decidir como será guardado el texto en el documento. Esto imprime una cadena completa como una serie de número s ASCII.

Sub PrintAll

PrintAscii(ThisComponent.text.getString())

End Sub

Sub PrintAscii(TheText As String)

If Len(TheText) < 1 Then Exit Sub

Dim msg$, i%

msg = ""

For i = 1 To Len(TheText)

msg = msg + Asc(Mid(TheText,i,1)) + " "

Next i

Print msg

End Sub

Depurando e inspeccionando Macros

Frecuentemente es dificil determinar qué métodos y propiedades están disponibles en un objeto. Los métodos en esta sección pueden ser de ayuda.

Determinar el tipo de documento

Esta macro viene con OpenOffice y está incluida aquí como una demostración sobre cómo determinar el tipo de documento.

'******************************************************************

'Autor: Incluida con OpenOffice

'

Function GetDocumentType(oDoc)

On Local Error GoTo NODOCUMENTTYPE

If oDocument.SupportsService("com.sun.star.sheet.SpreadsheetDocument") Then

GetDocumentType() = "scalc"

ElseIf oDocument.SupportsService("com.sun.star.text.TextDocument") Then

GetDocumentType() = "swriter"

ElseIf oDocument.SupportsService("com.sun.star.drawing.DrawingDocument") Then

GetDocumentType() = "sdraw"

ElseIf oDocument.SupportsService("com.sun.star.formula.FormulaProperties") Then

GetDocumentType() = "smath"

End If

NODOCUMENTTYPE:

If Err <> 0 Then

GetDocumentType = ""

Resume GOON

GOON:

End If

End Function

Desplegando los métodos y propiedades de un objeto

Esta es una excelente subrutina. El primer parametro es el objeto en cuestión. El segundo parametro puede ser “” para desplegar los métodos y cualquier otra cadena para desplegar las propiedades del objeto. La lista de propiedades o métodos es frecuentemente tan larga que excede el tamaño de la pantalla. Esta subrutina evita esto al partir la lista en piezas pequeñas.

'******************************************************************

'A subroutine to display all the methods or properties of an input

'Author: Tony Bloomfield

'email:	tonyb.lx@btinternet.com

Sub DisplayMethods(oObj As Object, SWhat As String)

DIM sMethodList As String, sMsgBox As String

DIM fs, ep As Integer

DIM i As Integer

DIM EOL As Boolean

if sWhat = "" then

sMethodList = oObj.DBG_methods

else

sMethodList = oObj.DBG_Properties

endif

fs = 1

EOL = FALSE

While fs <= Len(sMethodList)

sMsgBox = ""

For i = 0 to 15

ep = InStr(fs, sMethodList, ";")

if ep = 0 then

ep = Len(sMethodList)

endif

sMsgBox = sMsgBox & Mid$(sMethodList, fs, ep - fs) & Chr$(13)

fs = ep + 1

Next i

MsgBox sMsgBox

Wend

End Sub

Desplegando las propiedades de un objeto en una hoja de cálculo.

Esta macro debe ser ejecutada para creer. Herr Hermann Kienlein hizo un impresionante trabajo con esto. Esta macro crea una nueva hoja de cálculo y la rellena con información sobre los objetos. Yo modifiqué extensivamente esta macro porque usaba variables globales. Las variables globales interferían con mis propias variables locales. Esto me ayudaba a usarla en mi propio código existente.

'******************************************************************

'Author: Hermann Kienlein

'email:	info@kienlein.com

'online:	http://www.kienlein.com/pages/oo.html

Option Explicit	' Fuerza a declarar las variables

Sub Main

MainObjectDisplay(ThisComponent)

End Sub

' ------------------------------------------------------

'Crea un nuevo documento y luego crea nuevas hojas en el documento.

' Da nombres a las hojas e inserta información en las mismas.

Sub MainObjectDisplay(oObject As Object)

Dim oInfo As Object, oDeskNeu As Object, oNewDoc As Object

Dim sNewUrl As String, nSheetsUsed As Long

Dim sInterfaces As String

nSheetsUsed = 0

oDeskNeu = createUnoService("com.sun.star.frame.Desktop")

'sNewUrl = "staroffice.factory:scalc"	' This did not work

sNewUrl = "private:factory/scalc"

oNewDoc = oDeskNeu.loadComponentFromURL( sNewUrl,"_blank",0,NoArgs())

ObjInfo(oNewDoc, nSheetsUsed, "ThisComponent", oObject)

On Local Error GoTo AllDone

sInterfaces = oObject.dbg_supportedinterfaces

On Local Error GoTo NoController

If InStr(sInterfaces, "com.sun.star.frame.XModel") <> 0 Then

oInfo = oObject.getCurrentController()

ObjInfo(oNewDoc, nSheetsUsed, "getCurrentController", oInfo)

End If

NoController:

On Local Error GoTo NoDocInfo

'??

'	If InStr(sInterfaces, "com.sun.star.document.XDocumentInfoSupplier") <> 0 Then

oInfo = oObject.getDocumentInfo()

ObjInfo(oNewDoc, nSheetsUsed, "getDocumentInfo", oInfo)

'	End If

NoDocInfo:

On Local Error GoTo NoSelection

'??

'	If InStr(sInterfaces, "com.sun.star.frame.XSelectionSupplier") <> 0 Then

oInfo = oObject.getCurrentSelection()

ObjInfo(oNewDoc, nSheetsUsed, "getCurrentSelection", oInfo)

'	End If

NoSelection:

On Local Error GoTo NoLibraryContainer

If InStr(sInterfaces, "com.sun.star.script.XStarBasicAccess") <> 0 Then

oInfo = oObject.getLibraryContainer()

ObjInfo(oNewDoc, nSheetsUsed, "getLibraryContainer", oInfo)

End If

NoLibraryContainer:

On Local Error GoTo NoViewData

If InStr(sInterfaces, "com.sun.star.document.XViewDataSupplier") <> 0 Then

oInfo = oObject.getViewData()

ObjInfo(oNewDoc, nSheetsUsed, "getViewData", oInfo)

End If

NoViewData:

On Local Error GoTo NoEvents

If InStr(sInterfaces, "com.sun.star.document.XEventsSupplier") <> 0 Then

oInfo = oObject.getEvents()

ObjInfo(oNewDoc, nSheetsUsed, "getEvents", oInfo)

End If

NoEvents:

AllDone:

On Local Error GoTo 0

End Sub

' ------------------------------------------------------

Sub ObjInfo(oDoc As Object, nSheetsUsed&, sSheetName$, obj As Object)

Dim i2 As Integer, bProp As Boolean

Dim nRow&, nCol&, oSheet As Object

nRow = 0

ncol = 0

'on error goto err_ObjInfo

If Not isNull(obj) Then

GoToNextSheet(oDoc, nSheetsUsed, sSheetName)

oSheet = oDoc.Sheets.getByIndex(nSheetsUsed-1)

'oCell.String=CStr(obj.WindowServiceName)

SetCell(nCol, nRow, oSheet, TypeName(obj), 1, 0)

SetCell(nCol, nRow, oSheet, VarType(obj), -1, 2)

i2 = InStr(obj.dbg_methods,"getPropertySetInfo")

If i2 > 0 Then

bProp = true

Else

bProp = false

End If

ListItems (nCol, nRow, obj.dbg_methods, ";", obj, true, oSheet)

MoveRow(nCol, nRow, 2)

If Not isNull (obj.dbg_properties) Then

'NextSheet()

ListItems (nCol, nRow, obj.dbg_properties, ";", obj, false, oSheet)

End If

If bProp Then

GetProps(nCol, nRow, obj, oSheet)

bProp = false

End If

MoveRow(nCol, nRow, 1)

ListItems (nCol, nRow, obj.dbg_supportedinterfaces, chr$(10), obj, false, oSheet)

'CleanDbg 'noch keine Ahnung, für was das gut ist

'NextSheet()

End If

exit_ObjInfo:

Exit Sub

err_ObjInfo:

'print err

If err=423 Then

obName = inputbox("Das Objekt hat keine name-Eigenschaft."_

+" Welchen Namen soll das neue Tabellenblatt haben?")

Resume Next

Else

msgbox error$, 16

Resume exit_ObjInfo

End If

End Sub

' ------------------------------------------------------

' ListItems - übergebenen String nach Trennzeichen durchsuchen

' und Zeilenweise ausgeben

' ------------------------------------------------------

Sub ListItems(nCol&, nRow&, itemstring$, sep$, oBj As Object, gt As Boolean, oSheet As Object)

'dim oCurs As Object

Dim frag As String, sleft As String, sPrf As String

Dim act As Integer, ex As Integer, nextpos As Integer

Dim nextchr As Integer, lstr As Integer, lfrag As Integer

Dim ch As Integer

lstr = Len(itemstring)

act =1

'Everything left of the first colon

SetCell(nCol, nRow, oSheet, Left(itemstring,InStr(1,itemstring, ":")), 0, 0)

'If there is no colon, then we are done here

If InStr(1,itemstring,":") < 1 Then

SetCell(nCol, nRow, oSheet, itemstring, 0, 0)

Exit Sub

End If

act= act+InStr(1,itemstring,":") 'also jetzt auf dem ersten :

'act = act+1 'ein Zeichen weiter positionieren

MoveRow(nCol, nRow, 1)

While act<lstr

nextpos=InStr(act,itemstring,sep) 'Position des ersten ; nach :

frag = Mid(itemstring,act,nextpos-act)

lfrag = Len(frag)

act=act+lfrag+1

frag = LTrim(frag) 'linksbündig ausrichten

If frag > "" Then

Do

nextchr = Asc(Mid(frag,1,1)

If nextchr = "10" Then

Mid(frag,1,1," ")

frag = LTrim(frag) 'linksbündig ausrichten

Else

exit Do

End If

Loop

End If

MoveRow(nCol, nRow, 1)

SetCell(nCol, nRow, oSheet, frag, 0, 0)

If gt Then

GtVal(nCol, nRow, frag,oBj, oSheet)

End If

Wend

itemstring = ""

End Sub

' ------------------------------------------------------

' Sub um Properties auszulesen, Object muß allerdins

' .PropertySetInfo.Methode

' unterstützen

Sub GetProps(nCol&, nRow&, obj, oSheet As Object)

Dim vVariant as Variant

dim nVar As Integer

dim mProperties as variant

dim mProps1 as variant

dim sItemDescription

dim nCount As Integer

dim iP As Integer, iP1 As Integer

dim n$

dim p

dim tmp$

dim j%

dim vItem

dim sString

MoveRow(nCol, nRow, 2)

mProperties = obj.PropertySetInfo.Properties

nCount = UBound(mProperties)-LBound(mProperties) + 2

SetCell(nCol, nRow, oSheet, "Properties With Values", 0, 1)

SetCell(nCol, nRow, oSheet, "Name", 1, 0)

SetCell(nCol, nRow, oSheet, "Value", -1, 1)

For iP = LBound(mProperties) To UBound(mProperties)

p = mProperties(iP)

n$ = p.name

vVariant = obj.getPropertyValue(n$)

SetCell(nCol, nRow, oSheet, n$, 1, 0)

nVar = VarType(vVariant)

Select Case nVar

Case 1 'isNull

SetCell(nCol, nRow, oSheet, "NULL-VALUE", 0, 1)

Case 9 'object

If Not isNull (vVariant.dbg_properties) Then

ListItems (nCol, nRow, vVariant.dbg_properties, ";", vVariant, false, oSheet)

MoveRow(nCol, nRow, 2)

End If

if not isNull (vVariant.dbg_supportedinterfaces) then

ListItems (nCol, nRow, vVariant.dbg_supportedinterfaces, _

chr$(10), vVariant, false, oSheet)

MoveRow(nCol, nRow, 2)

End If

If Not isNull (vVariant.dbg_methods) Then

ListItems (nCol, nRow, vVariant.dbg_methods, ";", _

vVariant, false, oSheet)

MoveRow(nCol, nRow, 2)

End If

Case Else

If IsArray(vVariant) Then

tmp$ = ""

For j% = LBound(vVariant) To UBound(vVariant)

vItem = vVariant(j%)

If IsNull(vItem) Then

sItemDescription = "NULL-Value"

ElseIf IsObject(vItem) Then

If Not isNull(vItem.dbg_properties) Then

sItemDescription = CStr(vItem.dbg_properties)

End If

Else

sItemDescription = cstr(vItem)

End If

tmp$ = tmp$ & sItemDescription

Next j%

ListItems(nCol, nRow, tmp$,";",vVariant,false, oSheet)

Else

SetCell(nCol, nRow, oSheet, cstr(vVariant), 0, 1)

End If

end select

MoveRow(nCol, nRow, 1)

MoveCol(nCol, nRow, -1)

Next iP

End Sub

' ------------------------------------------------------

' GetValue - Inhalte auslesen

' ------------------------------------------------------

Sub GtVal (nCol&, nRow&, sGVal As String, oBje As Object, oSheet As Object)

dim is1 As Integer, iAr As Integer

dim s1 As String, s2 As String, s3 As String

dim aR1(10) as variant

dim o1 As Object

is1 =InStr(sGVal," ") 'erstes Space suchen

s1 = Mid(sGval,1,is1)

s2 = Mid(sGVal,1,is1," ")

sGVal = LTrim(sGVal)

is1 = InStr(sGVal," ")

s2 = Mid(sGVal,1,is1)

s1 = LTrim(s1)

s1= RTrim(s1)

s2 = LTrim(s2)

s2 = RTrim(s2)

Select Case s1

Case "SbxSTRING"

Select Case s2

Case "getURL"

s3 = oBje.getURL()

Case "getLocation"

s3 = oBje.getLocation()

Case "getImplementationName"

s3 = oBje.getImplementationName()

Case "getUserFieldName"

s3 = oBje.getUserFieldName(0)

Case "getUserFieldValue"

s3 = oBje.getUserFieldValue(0)

Case Else

s3 = s2

End Select

's3 = oBje.&s2

'msgbox(CStr(oBje)&s2)

MoveCol(nCol, nRow, 4)

SetCell(nCol, nRow, oSheet, s3, -4, 0)

Case "SbxBOOL"

Select Case s2

Case "hasControllersLocked"

s3= CStr(oBje.hasControllersLocked())

Case "isModified"

s3= CStr(oBje.isModified())

Case "AutoloadEnabled"

s3= CStr(oBje.AutoloadEnabled())

Case "hasElements"

s3= CStr(oBje.hasElements())

Case "IsEncrypted"

s3= CStr(oBje.IsEncrypted())

Case "isReadonly"

s3= CStr(oBje.isReadonly())

Case Else

s3 = " "

End Select

MoveCol(nCol, nRow, 4)

SetCell(nCol, nRow, oSheet, s3, -4, 0)

Case "SbxINTEGER"

Select Case s2

Case "getUserFieldCount"

s3 = CStr(oBje.getUserFieldCount())

Case "EditingCycles"

s3 = CStr(oBje.EditingCycles())

Case Else

s3 = ""

End Select

MoveCol(nCol, nRow, 4)

SetCell(nCol, nRow, oSheet, s3, -4, 0)

Case "SbxLONG"

Select Case s2

Case "getCount"

s3 = CStr(oBje.getCount())

Case Else

s3 = ""

End Select

MoveCol(nCol, nRow, 4)

SetCell(nCol, nRow, oSheet, s3, -4, 0)

Case "SbxOBJECT"

Select Case s2

Case "getElementType"

s3 = CStr(VarType(oBje.getElementType()))

MoveCol(nCol, nRow, 4)

SetCell(nCol, nRow, oSheet, s3, -4, 0)

Case "getText"

o1 = oBje.getText()

MoveCol(nCol, nRow, 4)

SetCell(nCol, nRow, oSheet, o1.dbg_properties, 3, 0)

SetCell(nCol, nRow, oSheet, o1.dbg_methods, -7, 0)

Case Else

End Select

Case "SbxARRAY"

Select Case s2

Case "getImplementationId"

aR1() = oBje.getImplementationId()

MoveCol(nCol, nRow, 4)

For iAr = LBound(oBje.getImplementationID()) To _

UBound(oBje.getImplementationID())

s3 = CStr(aR1(iAr))

SetCell(nCol, nRow, oSheet, s3, 1, 0)

next iAr

MoveCol(nCol, nRow, -(4+1+UBound(oBje.getImplementationID())))

Case "getArgs"

'?? Why is this commented out to print?

aR1() = oBje.getArgs()

MoveCol(nCol, nRow, 4)

For iAr = LBound(oBje.getArgs()) To UBound(oBje.getArgs())

o1 = aR1(iAr)

s3 = o1.dbg_properties

'GetProps(aR1(iAr)

'oCell.String = s3

MoveCol(nCol, nRow, 1)

Next iAr

MoveCol(nCol, nRow, -(4+1+UBound(oBje.getArgs())))

Case "getTypes"

aR1() = oBje.getTypes()

MoveCol(nCol, nRow, 4)

For iAr = LBound(oBje.getTypes()) To UBound(oBje.getTypes())

o1 = aR1(iAr)

s3 = VarType(o1)

SetCell(nCol, nRow, oSheet, s3, 1, 0)

Next iAr

MoveCol(nCol, nRow, -(4+1+UBound(oBje.getTypes())))

Case "getElementNames"

aR1() = oBje.getElementNames()

MoveCol(nCol, nRow, 4)

For iAr = LBound(oBje.getElementNames()) To _

UBound(oBje.getElementNames())

'o1 = aR1(iAr)

's3 = VarType(o1)

SetCell(nCol, nRow, oSheet, aR1(iAr), 1, 0)

Next iAr

MoveCol(nCol, nRow, -(4+1+UBound(oBje.getElementNames())))

Case "getSupportedServiceNames"

aR1() = oBje.getSupportedServiceNames()

MoveCol(nCol, nRow, 4)

For iAr = LBound(oBje.getSupportedServiceNames()) To _

UBound(oBje.getSupportedServiceNames())

'o1 = aR1(iAr)

's3 = VarType(o1)

SetCell(nCol, nRow, oSheet, aR1(iAr), 1, 0)

Next iAr

MoveCol(nCol, nRow, _

-(4+1+UBound(oBje.getSupportedServiceNames())))

Case "getPrinter"

aR1() = oBje.getPrinter()

MoveCol(nCol, nRow, 4)

For iAr = LBound(oBje.getPrinter()) To UBound(oBje.getPrinter())

o1 = aR1(iAr)

s3 = CStr(VarType(aR1(iAr)))

'?? We never print this

MoveCol(nCol, nRow, 1)

Next iAr

MoveCol(nCol, nRow, -(4+1+UBound(oBje.getPrinter())))

Case Else

s3 = " "

MoveCol(nCol, nRow, 4)

SetCell(nCol, nRow, oSheet, s3, -4, 0)

End Select

Case Else

s3 = " "

MoveCol(nCol, nRow, 4)

SetCell(nCol, nRow, oSheet, s3, -4, 0)

End Select

end sub

' -----------------------------------------------------

Sub SetCell(nCol&, nRow&, oSheet As Object, s$, colInc%, rowInc%)

oSheet.getCellByPosition(nCol, nRow).String = s$

If colInc <> 0 Then MoveCol(nCol, nRow, colInc%)

If rowInc <> 0 Then MoveRow(nCol, nRow, rowInc)

End Sub

' ------------------------------------------------------

Sub MoveCol(nCol&, nRow&, i%)

nCol = nCol + i

If nCol < 0 Then

nRow = nRow + 1

nCol = 0

End If

End Sub

' ------------------------------------------------------

Sub MoveRow(nCol&, nRow&, i%)

nRow = nRow + i

If nRow < 0 Then

nRow = 0

End If

End Sub

' ------------------------------------------------------

'Create a new sheet if required with the given name.

Sub GoToNextSheet(oDoc As Object, nSheetsUsed&, sSheetName$, Optional nWhichSheet%)

Dim oSheets As Object, oSheet As Object

oSheets = oDoc.Sheets

If isNumeric(nWhichSheet) Then

oSheets.insertNewByName("Sheet"&CStr(oSheets.Count()+1), nWhichSheet)

oSheet = oSheet.getByIndex(nWhichSheet)

Else

If nSheetsUsed > 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

Ejemplos misceláneos

Desplegar texto en la barra de estado

'******************************************************************

'Author: Sasa Kelecevic

'email:	scat@teol.net

'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

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:	andrew@pitonyak.org

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

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

Listar fuentes (Quebrado, no funciona)

Esto no funciona... solo para que lo sepan

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

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:	andrew@pitonyak.org

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

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())

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

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

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.

Abra el siguiente archivo, para StarOffice o OpenOffice, cualquiera que esté usando:
~/staroffice6.0/user/config/registry/instance/org/openoffice/Office/common.xml
~/openoffice/user/config/registry/instance/org/openoffice/Office/common.xml

Busque la etiqueta <History>; las entradas son alfabéticas. Verá algo como lo siguiente:
<History>
<List cfg:element-type="HistoryType">
<HistoryType state="replaced" cfg:name="h0">
<Filter cfg:type="string">StarOffice XML (Writer)</Filter>
<Password cfg:type="string"/>
4. <Title cfg:type="string">file:///C:/docs/newdocs/story.sxw</Title>
<URL cfg:type="string">file:///C:/docs/newdocs/story.sxw</URL>
</HistoryType>
[y luego, un poco más entradas <HistoryType>...]
</List>
<PickList cfg:element-type="HistoryType">
<HistoryType state="replaced" cfg:name="h0">
<Filter cfg:type="string">StarOffice XML (Writer)</Filter>
<Password cfg:type="string"/>
<Title cfg:type="string">file:///C:/docs/newdocs/story.sxw</Title>
<URL cfg:type="string">file:///C:/docs/newdocs/story.sxw</URL>
</HistoryType>
[y luego, con tres entradas <HistoryType> más; esta es la lista de archivos recientes desplegada bajo el menú archivo...]
</PickList>
</History>

Reemplace en contenido entero de la etiqueta <History>, es decir desde <History> a </History> 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.
<History>
<PickListSize cfg:type="int">9</PickListSize>
</History>

Open And Close Documents (And The Desktop)

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 evento-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 [scat@teol.net] 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

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

#	Nombre	Descripción
0	Auto	SELF+CHILDREN
1	PARENT	Incluye el marco padre
2	SELF	Incluye el marco inicial
4	CHILDREN	Incluye los marcos hijos del marco inicial
8	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	Incluye todos los marcos de las otras tareas. 23 = 1+2+4+16 = PARENT + SELF + CHILDREN + SIBLINGS.
55	GLOBAL	Busca en toda la jerarquía de marcos. 55 = 1+2+4+16+32 = PARENT + SELF + CHILDREN + SIBLINGS + TASKS.
63		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)

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())

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

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:	Pavel@Janik.cz

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

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:	andrew@pitonyak.org

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

CLOSE #iNum

End Sub

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:	andrew@pitonyak.org

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

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

Insertar texto en un marcador

oDoc.getBookmarks().getByName("<yourBookmarkName>").getAnchor.setString(

"What you want to insert")

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()

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.

Macros de Calc

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

Imprimiendo el valor de una Celda, Cadena o Fórmula.

'******************************************************************

'Author: Sasa Kelecevic

'email:	scat@teol.net

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

Estableciendo el valor de una Celda, Formato, Cadena o Fórmula.

'******************************************************************

'Author: Sasa Kelecevic

'email:	scat@teol.net

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)

End Sub

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:	andrew@pitonyak.org

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

Texto seleccionado, Qué es?

Un texto seleccionado en una hoja de cálculo puede ser diferentes cosas; algunas las entiendo y otras no.

Una celda seleccionada. Haga click en una celda y luego presione mayúsculas y haga click de nuevo.

Texto parcialmente seleccionado en una celda. Haga doble click en una celda y selecciona una parte del texto.

Nada seleccionado. Un click sencillo o tabulador entre celdas.

Múltiples celdas seleccionadas. Click sencillo y arrastre el cursor.

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.

'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

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

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:	andrew@pitonyak.org

'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

Desplegar un rango seleccionado en un cuadro de diálogo

'******************************************************************

'Author: Sasa Kelecevic

'email:	scat@teol.net

'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

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

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:	scat@teol.net

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

Algunos estados del texto seleccionado

'******************************************************************

'Author: Sasa Kelecevic

'email:	scat@teol.net

'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)

oRange=ThisComponent.DatabaseRanges

oRange.removeByName (sRangeName)

End Sub

Cambiar el rango seleccionado a un rango de Base de Datos

'******************************************************************

'Author: Sasa Kelecevic

'email:	scat@teol.net

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

Borrar un rango de Base de Datos

'******************************************************************

'Author: Sasa Kelecevic

'email:	scat@teol.net

Sub DeleteDbRange(sRangeName As String)

oRange=ThisComponent.DatabaseRanges

oRange.removeByName (sRangeName)

End Sub

Rango bordes de línea

?? Está modificando la estructura temporal aqui. Use algo como esto.

'******************************************************************

'Author: Niklas Nebel

'email:	niklas.nebel@sun.com

' 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

Ordenar un rango

'******************************************************************

'Author: Sasa Kelecevic

'email:	scat@teol.net

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

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

Usando métodos de bordes (agrupamiento)

Ryan Nelson [ryan@aurelius-mfg.com] 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

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

Macros de Write

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

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

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

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

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.

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

End If

End Function

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:	andrew@pitonyak.org

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

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:	andrew@pitonyak.org

'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:	andrew@pitonyak.org

'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

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.

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:	andrew@pitonyak.org

'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

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

Desplegando caracteres, un ejemplo simple.

Este simple ejemplo puede ser usado con el sistema anterior.

'******************************************************************

'Author: Andrew Pitonyak

'email:	andrew@pitonyak.org

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 Then Exit Sub

oLCursor.goRight(0, False)

Do While oLCursor.goRight(1, True) AND 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

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

' 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

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) <= 0 Then Exit Sub

Dim iLastChar As Integer, iThisChar As Integer, iRank As Integer

iLastChar = 0

iThisChar = 0

oLCursor.goRight(0, False)

Do While oLCursor.goRight(1, True)

iThisChar = Asc(oLCursor.getString())

i = oText.compareRegionEnds(oLCursor, oRCursor)

'If at the last character!

'Then always remove white space

If i = 0 Then

If IsWhiteSpace(iThisChar) Then oLCursor.setString("")

Exit Do

End If

'If went past the end then get out

If i < 0 Then Exit Do

iRank = RankChar(iLastChar, iThisChar)

If iRank = 1 Then

'I am about to delete this character.

'I do not change iLastChar because it did not change!

'Print "Deleting Current with " + iLastChar + " and " + iThisChar

oLCursor.setString("")

ElseIf iRank = -1 Then

'This will deselect the selected character and then select one

'more to the left.

oLCursor.goLeft(2, True)

'Print "Deleting to the left with " + iLastChar + " and " + iThisChar

oLCursor.setString("")

oLCursor.goRight(1, False)

iLastChar = iThisChar

Else

oLCursor.goRight(0, False)

iLastChar = iThisChar

End If

Loop

End Sub

Removiendo párrafos vacíos, sólo otro ejemplo.

Es mejor poner un “AutoFormato” para remover párrafos en blanco, y luego aplicarlo al documento en cuestión. Haga click en “Herramientass=>AutoCorrección/AutoFormato...” y luego seleccionar la cejilla “Opciones”. Una de las opciones es “Remover párrafos en blanco.” Asegúrese que está marcado. Ahora, puede auto formatear el documento y todos los párrafos en blanco serán removidos.

Si desea remover párrafos vacíos de una selección, entonces necesitará ejecutar esta macro. Si el texto está seleccionado, entonces los párrafos vacíos son removidos dentro del texto seleccionado. Si no hay texto seleccionado, se removerá del documento entero. Esta primera macro iteracciona sobre el texto seleccionado. Si no hay texto seleccionado, crea un cursor al inicio y al final del documento. La primera cosa que ve esta macro es como atravesar por los párrafos basados en texto. La macro para remover espacios es más segura porque esta no necesita extraer una cadena para trabajar.

Sub RemoveEmptyParsWorker(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) <= 0 Then Exit Sub

oLCursor.goRight(0, False)

Do While oLCursor.gotoNextParagraph(TRUE) AND oText.compareRegionEnds(oLCursor, oRCursor) > 0

'Yes, I know, limited to 64K here

'If we have one paragraph that is over 64K

'Then I am in trouble!

sParText = oLCursor.getString()

i = Len(sParText)

'We do not have short circuit logical. Drat!

Do While i > 0

If (Mid(sParText,i,1) = Chr(10)) OR (Mid(sParText,i,1) = Chr(13)) Then

i = i - 1

Else

i = -1

End If

Loop

If i = 0 Then

oLCursor.setString("")

Else

oLCursor.goLeft(0,FALSE)

End If

loop

End Sub

Reemplazando espacios seleccionados usando cadenas.

En general, no se debería remover espacios extra al leer el texto seleccionado y volviéndo a escribir los nuevos valores de nuevo. Una razón es porque las cadenas están limitadas a 64K de tamaño, y la otra es que es posible perder información de formateo. Dejé estos ejemplos porque trabajan con problemas que fueron escritos antes de que aprendiera cómo hacer lo mismo con cursores., y porque demuestran tecnicas de insertado de caracteres especiales. La primera macro reemplaza todos los nuevos párrafos y nuevas líneas con caracteres de espacios. Este ejemplo también demuestra cómo insertar caracteres de control (nuevos párrafos, cambios de línea, etc.) dentro del texto.

Sub SelectedNewLinesToSpaces

Dim lSelCount&, oSelections As Object

Dim iWhichSelection As Integer, lIndex As Long

Dim s$, bSomethingChanged As Boolean

oSelections = ThisComponent.getCurrentSelection()

lSelCount = oSelections.getCount()

For iWhichSelection = 0 To lSelCount - 1

bSomethingChanged = False

Rem What if the string is bigger than 64K? Oops

s = oSelections.getByIndex(iWhichSelection).getString()

lIndex = 1

Do While lIndex < Len(s)

Select Case Asc(Mid(s, lIndex, 1))

Case 13

'We found a new paragraph marker.

'The next character will be a 10!

If lIndex < Len(s) And Asc(Mid(s, lIndex+1, 1)) = 10 Then

Mid(s, lIndex, 2, " ")

Else

Mid(s, lIndex, 1, " ")

End If

lIndex = lIndex + 1

bSomethingChanged = True

Case 10

'New line unless the previous charcter is a 13

'Remove this entire case statement to ignore only new lines!

If lIndex > 1 And Asc(Mid(s, lIndex-1, 1)) <> 13 Then

'This really is a new line and NOT a new paragraph.

Mid(s, lIndex, 1, " ")

lIndex = lIndex + 1

bSomethingChanged = True

Else

'Nope, this one really was a new paragraph!

lIndex = lIndex + 1

End If

Case Else

'Do nothing if we do not match something else

lIndex = lIndex + 1

End Select

Loop

If bSomethingChanged Then

oSelections.getByIndex(iWhichSelection).setString(s)

End If

Next

End Sub

También se debe preguntar cómo convertir nuevos párrafos en nuevas líneas. Usar cursores es claramente una mejor idea, pero no sé como hacerlo. Pienso que este ejemplo es aún instructivo, por eso lo dejé. Primero borré el texto seleccionado y después empezar a agregar el texto de nuevo.

Sub SelectedNewParagraphsToNewLines

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

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()

'Delete the selected text!

oCursor.setString("")

lIndex = 1

Do While lIndex <= Len(s)

Select Case Asc(Mid(s, lIndex, 1)

Case 13

oText.insertControlCharacter(oCursor, _

com.sun.star.text.ControlCharacter.LINE_BREAK, False)

'I wish I had short circuit booleans!

'Skip the next LF if there is one. I think there

'always will be but I can not verify this

If (lIndex < Len(s)) Then

If Asc(Mid(s, lIndex+1, 1)) = 10 Then lIndex = lIndex + 1

End If

Case 10

oText.insertControlCharacter(oCursor, _

com.sun.star.text.ControlCharacter.LINE_BREAK, False)

Case Else

oCursor.setString(Mid(s, lIndex, 1))

oCursor.GoRight(1, False)

End Select

lIndex = lIndex + 1

Loop

Next

End Sub

Comparación de cursores y ejemplos de cadenas

Aqui hay algunas macros que escribí usando métodos de cursores y siguiéndolos, de la misma manera que antes hice mis sistemas.!

'******************************************************************

'Author: Andrew Pitonyak

'email:	andrew@pitonyak.org

'The purpose of this macro is to make it easier to use the Text<-->Table

'method which wants trailing and leading white space removed.

'It also wants new paragraphs and NOT new lines!

Sub CRToNLMain

Dim oCursors(), i%, sPrompt$

sPrompt$ = "Convert New Paragraphs to New Lines for the ENTIRE document?"

If Not CreateSelectedTextIterator(ThisComponent, sPrompt$, oCursors()) Then Exit Sub

For i% = LBOUND(oCursors()) To UBOUND(oCursors())

CRToNLWorker(oCursors(i%, 0), oCursors(i%, 1), ThisComponent.Text)

Next i%

End Sub

Sub CRToNLWorker(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 Then Exit Sub

oLCursor.goRight(0, False)

Do While oLCursor.gotoNextParagraph(False) AND oText.compareRegionEnds(oLCursor, oRCursor) >= 0

oLCursor.goLeft(1, True)

oLCursor.setString("")

oLCursor.goRight(0, False)

oText.insertControlCharacter(oLCursor,_

com.sun.star.text.ControlCharacter.LINE_BREAK, True)

Loop

End Sub

'******************************************************************

'Author: Andrew Pitonyak

'email:	andrew@pitonyak.org

'The real purpose of this macro is to make it easier to use the Text<-->Table

'method which wants trailing and leading white space removed.

'It also wants new paragraphs and NOT new lines!

Sub SpaceToTabsInWordsMain

Dim oCursors(), i%, sPrompt$

sPrompt$ = "Convert Spaces to TABS for the ENTIRE document?"

If Not CreateSelectedTextIterator(ThisComponent, sPrompt$, oCursors()) Then Exit Sub

For i% = LBOUND(oCursors()) To UBOUND(oCursors())

SpaceToTabsInWordsWorker(oCursors(i%, 0), oCursors(i%, 1), ThisComponent.Text)

Next i%

End Sub

Sub SpaceToTabsInWordsWorker(oLCursor As Object, oRCursor As Object, oText As Object)

Dim iCurrentState As Integer, iChar As Integer, bChanged As Boolean

Const StartLineState = 0

Const InWordState = 1

Const BetweenWordState = 2

If IsNull(oLCursor) Or IsNull(oRCursor) Or IsNull(oText) Then Exit Sub

If oText.compareRegionEnds(oLCursor, oRCursor) <= 0 Then Exit Sub

oLCursor.goRight(0, False)

iCurrentState = StartLineState

bChanged = False

Do While oLCursor.goRight(1, True) AND oText.compareRegionEnds(oLCursor, oRCursor) >= 0

iChar = Asc(oLCursor.getString())

If iCurrentState = StartLineState Then

If IsWhiteSpace(iChar) Then

oLCursor.setString("")

Else

iCurrentState = InWordState

End If

ElseIf iCurrentState = InWordState Then

bChanged = True

Select Case iChar

Case 9

Rem It is already a tab, ignore it

iCurrentState = BetweenWordState

Case 32, 160

Rem Convert the space to a tab

oLCursor.setString(Chr(9))

oLCursor.goRight(1, False)

iCurrentState = BetweenWordState

Case 10

Rem Remove the new line and insert a new paragraph

oText.insertControlCharacter(oLCursor,_

com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, True)

oLCursor.goRight(1, False)

iCurrentState = StartLineState

Case 13

iCurrentState = StartLineState

Case Else

oLCursor.gotoEndOfWord(True)

End Select

ElseIf iCurrentState = BetweenWordState Then

Select Case iChar

Case 9, 32, 160

Rem We already added a tab, this is extra stuff!

oLCursor.setString("")

Case 10

Rem Remove the new line and insert a new paragraph

Rem and be sure to delete the leading TAB that we already

Rem added in and that should come out!

oText.insertControlCharacter(oLCursor,_

com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, True)

oLCursor.goLeft(0, False)

Rem and over the TAB for deletion

oLCursor.goLeft(1, True)

oLCursor.setString("")

oLCursor.goRight(1, False)

iCurrentState = StartLineState

Case 13

Rem first, backup over the CR, then select the TAB and delete it

oLCursor.goLeft(0, False)

oLCursor.goLeft(1, False)

oLCursor.goLeft(1, True)

oLCursor.setString("")

Rem finally, move back over the CR that we will ignore

oLCursor.goRight(1, True)

iCurrentState = StartLineState

Case Else

iCurrentState = InWordState

oLCursor.gotoEndOfWord(False)

End Select

End If

oLCursor.goRight(0, False)

Loop

If bChanged Then

Rem To get here, we went one character too far right

oLCursor.goLeft(1, False)

oLCursor.goLeft(1, True)

If Asc(oLCursor.getString()) = 9 Then oLCursor.setString("")

End If

End Sub

'******************************************************************

'Author: Andrew Pitonyak

'email:	andrew@pitonyak.org

Sub TabsToSpacesMain

Dim oCursors(), i%, sPrompt$

sPrompt$ = "Convert TABS to Spaces for the ENTIRE document?"

If Not CreateSelectedTextIterator(ThisComponent, sPrompt$, oCursors()) Then Exit Sub

For i% = LBOUND(oCursors()) To UBOUND(oCursors())

TabsToSpacesWorker(oCursors(i%, 0), oCursors(i%, 1), ThisComponent.Text)

Next i%

End Sub

Sub TabsToSpacesWorker(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 Then Exit Sub

oLCursor.goRight(0, False)

Do While oLCursor.goRight(1, True) AND oText.compareRegionEnds(oLCursor, oRCursor) >= 0

If Asc(oLCursor.getString()) = 9 Then

oLCursor.setString(" ")	'Change a tab into 4 spaces

End If

oLCursor.goRight(0, False)

Loop

End Sub

'******************************************************************

'Author: Andrew Pitonyak

'email:	andrew@pitonyak.org

'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

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

'******************************************************************

'Author: Andrew Pitonyak

'email:	andrew@pitonyak.org

'oDoc is a writer object

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

End If

End Function

'******************************************************************

'Author: Andrew Pitonyak

'email:	andrew@pitonyak.org

'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:	andrew@pitonyak.org

'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:	andrew@pitonyak.org

'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)

Select Case Asc(Mid(s, lIndex, 1)

Case 13

oText.insertControlCharacter(oCursor,_

com.sun.star.text.ControlCharacter.LINE_BREAK, False)

'Boy I wish I had short circuit booleans!

'Skip the next LF if there is one. I think that there

'always will be but I can not verify this

If (lIndex < Len(s)) Then

If Asc(Mid(s, lIndex+1, 1)) = 10 Then lIndex = lIndex + 1

End If

Case 10

oText.insertControlCharacter(oCursor,_

com.sun.star.text.ControlCharacter.LINE_BREAK, False)

Case Else

oCursor.setString(Mid(s, lIndex, 1))

oCursor.GoRight(1, False)

End Select

lIndex = lIndex + 1

Loop

Next

End Sub

'I decided to write this as a finite state machine

'Finite state machines are a wonderful thing :-)

Sub ConvertSelectedSpaceToTabsBetweenWords

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

Rem What states are supported

Dim iCurrentState As Integer

Const StartLineState = 0

Const InWordState = 1

Const BetweenWordState = 2

Rem Transition Points

Dim iWhatFound As Integer

Const FoundWhiteSpace = 0

Const FoundNewLine = 1

Const FoundOther = 2

Const ActionIgnoreChr = 0

Const ActionDeleteChr = 1

Const ActionInsertTab = 2

Rem Define the state transitions

Dim iNextState(0 To 2, 0 To 2, 0 To 1) As Integer

iNextState(StartLineState, FoundWhiteSpace, 0)	= StartLineState

iNextState(StartLineState, FoundNewLine, 0)	= StartLineState

iNextState(StartLineState, FoundOther, 0)	= InWordState

iNextState(InWordState, FoundWhiteSpace, 0)	= BetweenWordState

iNextState(InWordState, FoundNewLine, 0)	= StartLineState

iNextState(InWordState, FoundOther, 0)	= InWordState

iNextState(BetweenWordState, FoundWhiteSpace, 0)= BetweenWordState

iNextState(BetweenWordState, FoundNewLine, 0)	= StartLineState

iNextState(BetweenWordState, FoundOther, 0)	= InWordState

Rem Define the state actions

iNextState(StartLineState, FoundWhiteSpace, 1)	= ActionDeleteChr

iNextState(StartLineState, FoundNewLine, 1)	= ActionIgnoreChr

iNextState(StartLineState, FoundOther, 1)	= ActionIgnoreChr

iNextState(InWordState, FoundWhiteSpace, 1)	= ActionDeleteChr

iNextState(InWordState, FoundNewLine, 1)	= ActionIgnoreChr

iNextState(InWordState, FoundOther, 1)	= ActionIgnoreChr

iNextState(BetweenWordState, FoundWhiteSpace, 1)= ActionDeleteChr

iNextState(BetweenWordState, FoundNewLine, 1)	= ActionIgnoreChr

iNextState(BetweenWordState, FoundOther, 1)	= ActionInsertTab

'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

iCurrentState = StartLineState

Do While lIndex <= Len(s)

Select Case Asc(Mid(s, lIndex, 1))

Case 9, 32, 160

iWhatFound = FoundWhiteSpace

Case 10

iWhatFound = FoundNewLine

lLastNL = lIndex

Case 13

iWhatFound = FoundNewLine

lLastCR = lIndex

Case Else

iWhatFound = FoundOther

End Select

Select Case iNextState(iCurrentState, iWhatFound, 1)

Case ActionDeleteChr

'By choosing to not insert, it is deleted!

Case ActionIgnoreChr

'This really means that I must add the character Back!

If lLastCR = lIndex Then

'Inserting a control character seems to move the

'cursor around

oText.insertControlCharacter(oCursor,_

com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)

'	oText.insertControlCharacter(oCursor,_

'	com.sun.star.text.ControlCharacter.APPEND_PARAGRAPH, False)

'oCursor.goRight(1, False)

'Print "Inserted a CR"

ElseIf lLastNL = lIndex Then

If lLastCR + 1 <> lIndex Then

oText.insertControlCharacter(oCursor,_

com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)

'com.sun.star.text.ControlCharacter.LINE_BREAK, False)

'oCursor.goRight(1, False)

'Print "Inserted a NL"

End If

'Ignore this one

Else

oCursor.setString(Mid(s, lIndex, 1))

oCursor.GoRight(1, False)

'Print "Inserted Something"

End If

Case ActionInsertTab

oCursor.setString(Chr$(9) + Mid(s, lIndex, 1))

oCursor.GoRight(2, False)

'Print "Inserted a tab"

End Select

lIndex = lIndex + 1

'MsgBox "index = " + lIndex + Chr(13) + s

iCurrentState = iNextState(iCurrentState, iWhatFound, 0)

Loop

Next

End Sub

Sub ConvertAllTabsToSpace

DIM oCursor As Object, oText As Object

Dim nSpace%, nTab%, nPar%, nRet%, nTot%

Dim justStarting As Boolean

oText=ThisComponent.Text	'Get the Text component

oCursor=oText.createTextCursor()	'Create a cursor in the text

oCursor.gotoStart(FALSE)	'Goto the start but do NOT select the text as you go

Do While oCursor.GoRight(1, True)	'Move right one chracter and select it

If Asc(oCursor.getString()) = 9 Then

oCursor.setString(" ")	'Change a tab into 4 spaces

End If

oCursor.goRight(0,FALSE)	'Deselect text!

Loop

End Sub

Sub ConvertSelectedTabsToSpaces

Dim lSelCount&, oSelections As Object

Dim iWhichSelection As Integer, lIndex As Long

Dim s$, bSomethingChanged As Boolean

'There may be multiple selections present!

'There will probably be one more than expected because

'it will count the current cursor location as one piece

'of selected text, just so you know!

oSelections = ThisComponent.getCurrentSelection()

lSelCount = oSelections.getCount()

'Print "total selected = " + lSelCount

For iWhichSelection = 0 To lSelCount - 1

bSomethingChanged = False

s = oSelections.getByIndex(iWhichSelection).getString()

'Print "Text group " + iWhichSelection + " is of length " + Len(s)

lIndex = 1

Do While lIndex < Len(s)

'Print "ascii at " + lIndex + " = " + Asc(Mid(s, lIndex, 1))

If Asc(Mid(s, lIndex, 1)) = 9 Then

s = ReplaceInString(s, lIndex, 1, " ")

bSomethingChanged = True

lIndex = lIndex + 3

End If

lIndex = lIndex + 1

'Print ":" + lIndex + "(" + s + ")"

Loop

If bSomethingChanged Then

oSelections.getByIndex(iWhichSelection).setString(s)

End If

Next

End Sub

Function ReplaceInString(s$, index&, num&, replaces$) As String

If index <= 1 Then

'Place this in front of the string

If num < 1 Then

ReplaceInString = replaces + s

ElseIf num > Len(s) Then

ReplaceInString = replaces

Else

ReplaceInString = replaces + Right(s, Len(s) - num)

End If

ElseIf index + num > 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

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:	andrew@pitonyak.org

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()

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

End Sub Insertar texto

'******************************************************************

'Author: Andrew Pitonyak

'email:	andrew@pitonyak.org

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

Insertar fecha formateada dentro de un documento de texto

Esto insertará el texto “Today is <fecha> ” 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:	andrew@pitonyak.org

'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

Insertar una nueva página

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 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

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.

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.

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:

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”

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

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 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

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)

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

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

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

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

Lenguaje

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 Integer	Rem i is used as in index variable in loops

Print i	REM This will print the value of i

Variables

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 “[]”.

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 Object 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.

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

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 Public 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 Static , 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

Private PrivateOne$	REM Global to THIS Module only

Dim PrivateTwo$	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

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		DefBool
Currency	Moneda con cuatro decimales	6	@	
Date	Fecha	7		DefDate
Double	Doble con punto flotante	5	#	DefDbl
Integer	Entero	2	%	DefInt
Long	Largo	3	&	DefLng
Object	Objeto	9		DefObj
Single	Sencillo con punto flotante	4	!	
String	Cadena	8	$	
Variant	Puede contener todos los tipos especificados en la definición	12		DefVar
Empty	Variable no inicializada	0		
Null	No tiene valores válidos	1		

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

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 como de Cadena.

Dim FirstName$

Dim LastName As String

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

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())	REM 0

LBound(b())	REM 5

LBound(c())	REM -5

LBound(d())	REM 5

LBound(d(), 1)	REM 5

LBound(d(), 2)	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())	REM 5

LBound(b())	REM 10

LBound(c())	REM 5

LBound(d())	REM 10

LBound(d(), 1)	REM 10

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

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

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.

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
<=	Menor o igual que
>=	Mayor o igual que
<>	No igual a
Is	Son el mismo Objeto

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” . 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

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:	Function NombreFunción [(Var1 [As Tipo][, Var2 [As Tipo][,...]]]) [As Tipo]
Sintaxis:	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.

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

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 [ca@ofs.no]. Esto es un issue 11678 en las issuezillas.

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 (ab@openoffice.org) 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

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

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

Control de flujo

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

IIF

El constructor IIF es usada para devolver una expresión basados en una condición. Es similar a la sintaxis de “?” en C .

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)

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!

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)

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

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”.

Select ... Case

La instrucción Select Case es similar al “case” y “switch” de otros lenguajes. Esto imita 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á.

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<10)” La forma correcta de hacer esto es algo como “IIf(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"

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

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.

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.

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ógica . 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

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:

s = s & "At Label 2"

TheEnd:

MsgBox s, 0, "On GoTo Example"

End Sub

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

Manejo 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”.

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.

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

******

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( <pathToYourGraphic> )

.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

*******

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	Description
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
1	<>	Lógico
2	-	Resta numérica
2	+	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	Residuo numérico después de la división
4	^	Exponenciación numérica
5	Is (operator)	??No verificado, ver “Select Case”

Sub TestPrecedence

Dim i%

Print 1 + 2 OR 1	REM Prints 3

Print 1 + (2 OR 1)	REM Prints 4

Print 1 + 2 AND 1	REM Prints 1

Print 1 + 2 * 3	REM Prints 7

Print 1 + 2 * 3 ^2	REM Prints 19

Print 1 = 2 OR 4	REM Prints 4

Print 4 AND 1 = 1	REM Prints 4

End Sub

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.

Operadores, Instrucciones y Funciones.

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	'1

Print 1.23e2 – 23	'100

End Sub

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	'12

Print 1.23e2 * 23	'2829

End Sub

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

Parámetros:

Resultado: Resultado de la suma

Expresión1, Expresión2 : Cualquier expresión numérica.

Ejemplo:

Sub SubtractionExample

Print 4 – 3	'1

Print 1.23e2 – 23	'100

End Sub

Operador ^

Sumario:

Eleva un numéro a una potencia. En la equaciónrepresenta 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

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

Print 4 /2	'2

Print 11/2	'5.5

End Sub

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
VERDADERO	VERDADERO	VERDADERO
VERDADERO	FALSO	FALSO
FALSO	VERDADERO	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

Función Abs

Sumario:

Retorna el valor absoluto de una expresión numérica. Si el parámetro es una cadena, primero 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)	'4

Print Abs("-123")	'123

End Sub

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)

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

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")	'65

End Sub

Función ATN

Sumario:

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

Instrucción Beep

Sumario:

Genera un beep del sistema (sonido)

Sintaxis:

Beep

Ejemplo:

Sub ExampleBeep

Beep

Beep

End Sub

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:

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

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

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:

[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

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)	'True

Print CBool("TRUE")	'True

Print CBool(-10 + 2*5)	'False

Print CBool("John" <> "Fred")	'True

End Sub

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:

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

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

Función CDateFromIso

Sumario:

Retorna el número de fecha interno de una cadena conteniendo una fecha en formato ISO.

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)	Rem 08 June 2002 16:48:00

Print CDateFromIso("20020608")	Rem 08 June 2002

Print CDateFromIso("020608")	Rem 08 June 1902

Print Int(CDateFromIso("20020608"))	Rem 37415

end sub

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

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

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

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 <sigh>! ?? 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

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"

Exit Sub

NoDrive:

Print "Sorry, the drive does not exist"

Resume Next

End Sub

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

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 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

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

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:

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

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)

Loop

Close #iNum2

Msgbox sMsg

End Sub

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

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

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

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)+_

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

"Cos = " + Format(Cos(dAngle), "##0.0000")

End Sub

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 <= uBound( oNames() ) )

MsgBox "How about " + oNames(i)

i = i + 1

wend

oDlgDesc = DialogLibraries.Standard.Dialog1

' generate "live" dialog

oDlgControl = CreateUnoDialog( oDlgDesc )

' display "live" dialog

oDlgControl.execute

End Sub

Función CreateUnoService

Sumario:

Instancia un servicio Uno con el ProcessServiceManager (Administrador de servicios de procesos).

Sintaxis:

oService = CreateUnoService( Nombre del servicio Uno )

Valor de retorno:

??

Parámetros:

??

Ejemplo:

oIntrospection = CreateUnoService( "com.sun.star.beans.Introspection" )

Función CreateUnoStruct

Sumario:

Crea una instancia de un tipo de estructura Uno.

Es mejor usar el siguiente constructor.!

Dim oStruct as new com.sun.star.beans.Property

Sintaxis:

oStruct = CreateUnoStruct( Nombre del tipo Uno )

Valor de retorno:

Parámetros:

Ejemplo:

oStruct = CreateUnoStruct("com.sun.star.beans.Property")

'***********************************

'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()

'You could have done it this way after it was defined!

'mPrinter(0) = CreateUnoStruct("com.sun.star.beans.PropertyValue")

Función CSng

Sumario:

Convierte una expresión numérica o de cadena en un tipo sencillo (Single). Las cadenas deben ser formateadas en base al tipo local. En EEUU, trabajará “12.34”.

Sintaxis:

CSng(Expresión)

Valor de retorno:

Entero Sencillo (Single)

Parámetros:

Expresión : Cualquier cadena o expresión numérica a ser convertida.

Ejemplo:

Sub ExampleCLng

Msgbox CSng(1234.5678)

Msgbox CSng("1234.5678")

End Sub

Función CStr

Sumario:

Converte cualquier expresión en una cadena. Esto se usa para convertir un número en una cadena.

Tipo entrada	Valor de salida
Booleano	“True” o “False”
Fecha (Date)	Cadena con la fecha y la hora.
Null	Error en tiempo de ejecución.
Vacío (Empty)	Cadena vacía “”
Cualquier número	El número como una cadena. Los ceros a la derecha del decimal son cortados.

Sintaxis:

CStr (Expresión)

Valor de retorno:

Cadena (String)

Parámetros:

Expresión: Cualquier cadena válida o expresión numérica a ser convertida.

Ejemplo:

Sub ExampleCSTR

Dim sVar As String

Msgbox CDbl(1234.5678)

Msgbox CInt(1234.5678)

Msgbox CLng(1234.5678)

Msgbox CSng(1234.5678)

sVar = CStr(1234.5678)

MsgBox sVar

end sub

Función CurDir

Sumario:

retorna la cadena representando la ruta actual de la unidad especificada. Si el parámetro no es dado o de tamaño cero, entonces la ruta de la unidad actual es retornado.

Sintaxis:

CurDir [(Texto As String)]

Valor de retorno:

Cadena (String)

Parámetros:

Texto: Cadena no sensible a mayúsculas especificando una unidad para retornar la ruta actual. Debe ser un solo caracter. ?? Chequear esto en linux.

Ejemplo:

Sub ExampleCurDir

MsgBox CurDir("c")

MsgBox CurDir("p")

MsgBox CurDir()

end sub

Función Date

Sumario:

Retorna o cambia el sistema actual. El formato de fecha depende del local.

Sintaxis:

Fecha

Date = Texto As String

Valor de retorno:

Cadena (String)

Parámetros:

Texto: Nueva fecha del sistema como se define en su configuración local.

Ejemplo:

Sub ExampleDate

MsgBox "The date is " & Date

End Sub

Función DateSerial

Sumario:

Convierte un año, mes, y día en un objeto Fecha (Date). La representación interna es un doble (Double) donde 0 es Diciembre 30,1899. Ver este doble como el número de días desde esta fecha base. Los números negativos son antes y los positivos después.

Ver también DateValue, Date, y Day.

Advertencia	Los años de dos dígitos son consderados como 19xx. Esto no es consistente con la función DateValue.

Sintaxis:

DateSerial (año, mes, día)

Valor de retorno:

Fecha

Parámetros:

Año: valor entero de año. Valores entre 0 y 99 son representados como los años 1900 a 1999. todos los demás años deberán contener cuatro dígitos.

Mes: Entero indicando el mes. Los valores válidos van de 1 a 12.

Día: Entero indicando el día. Los valores válidos van de 1 a 28, 29, 30 o 31 (Depende del mes).

Ejemplo:

Sub ExampleDateSerial

Dim lDate as Long, sDate as String, lNumDays As Long

lDate = DateSerial(2002, 6, 8)

sDate = DateSerial(2002, 6, 8)

MsgBox lDate REM returns 37415

MsgBox sDate REM returns 06/08/2002

lDate = DateSerial(02, 6, 8)

sDate = DateSerial(02, 6, 8)

MsgBox lDate REM returns 890

MsgBox sDate REM returns 06/08/1902

end sub

Función DateValue

Sumario:

Convierte una cadena de fecha en un valor númerico que puede ser usado para determinar el número de días entre dos fechas.

Ver también DateSerial, Date, y Day

Advertencia	Los años de dos dígitos son considerados 20xx. Esto no es consistente con la función DateSerial.

Sintaxis:

DateValue [(fecha)]

Valor de retorno:

Largo

Parámetros:

Fecha: Cadena representando la fecha.

Ejemplo:

Sub ExampleDateValue

Dim s(), i%, sMsg$, l1&, l2&

Rem These all map to June 8, 2002.

s = Array("06.08.2002", "6.08.02", "6.08.2002", "June 08, 2002", _

"Jun 08 02", "Jun 08, 2002", "Jun 08, 02", "06/08/2002")

Rem If you use these values, it will generate an error

Rem which contradicts the included help

Rem s = Array("6.08, 2002", "06.08, 2002", "06,08.02", "6,08.2002", "Jun/08/02")

sMsg = ""

For i = LBound(s()) To UBound(s())

sMsg = sMsg + DateValue(s(i)) + "<=" + s(i) + Chr(13)

Next

MsgBox sMsg

Print "I was married " + (DateValue(Date) - DateValue("6/8/2002")) + " days ago"

end sub

Función Day

Sumario:

Retorna el día del mes basado en un número de serie de datos (serial date number) generado con DateSerial o DateValue.

Sintaxis:

Day (Número)

Valor de retorno:

Entero

Parámetros:

Número: Número “Serial date” retornado por DateSerial

Ejemplo:

Sub ExampleDay

Print Day(DateValue("6/8/2002")	Rem 8

Print Day(DateSerial(02,06,08))	Rem 8

end sub

Instrucción Declare

Sumario:

Usado para declarar y definir una subrutina en un DLL DLL (Dynamic Link Library) para ser ejecutada desde OpenOffice.org Basic. La palabra clave ByVal debe ser usada si los parámetros son pasados por valor en lugar de por referencia.

Ver también: FreeLibrary

Sintaxis:

Declare {Sub | Function} Name Lib "Libname" [Alias "Aliasname"] [Parameter] [As Typ]

Parameter/Element:

Name: Un nombre diferente que el definido en el DLL, usado para llamar la subrutina desde Basic.

Aliasname: Nombre de la subrutina tal y como está definida en la DLL.

Libname: Archivo o nombre de sistema de la DLL. Esta librería es automáticamente cargada la primera vez que la función es usada.

Argumentlist: Lista de parámetros representando los argumentos que son pasados al procedimiento cuando este es llamado. El tipo y número de parámetros depende del procedimiento que se está ejecutando.

Type: Define el tipo de datos de el valor retornado por el procedimiento Función. Esto puede ser excluido si un caracter de tipo de declaración es ingresado despues del nombre.

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

Instrucción DefBool

Sumario:

Define el tipo por defecto de las variables, de acuerdo a un rango de letras, si no se define un caracter de tipo de declaración o palabra clave. Puede permitir que todas las variables que inician con “b”, por ejemplo, sean automáticamente del tipo boleanos.

Ver también: DefBool, DefDate, DefDbL, DefInt, DefLng, DefObj, y DefVar.

Sintaxis:

DefBool Rango1[, Rango2[,...]]

Parámetros:

Rango: Letras especificando el rango de variables a las que se les va a definir el tipo de datos por defecto.

Ejemplo:

REM Prefix definition for variable types:

DefBool b

DefDate t

DefDbL d

DefInt i

DefLng l

DefObj o

DefVar v

DefBool b-d,q

Sub ExampleDefBool

cOK = 2.003

zOK = 2.003

Print cOK	Rem True

Print zOK	Rem 2.003

End Sub

Instrucción DefDate

Summary

Define el tipo de variable por defecto, de acuerdo a un rango de letras, si no es declarado el tipo mediante un caracter de definición o una palabra clave. Permite que todas las variables que inician con una “t”, por ejemplo, sean automaticamente del tipo fecha.

Ver también: DefBool, DefDate, DefDbL, DefInt, DefLng, DefObj, y DefVar.

Sintaxis:

DefDate Rango1[, Rango2[,...]]

Parámetros:

Rango: Letras especificando el rango de variables a las que se les va a definir el tipo de datos por defecto.

Ejemplo:

ver ejemplo DefBool

Instrucción DefDbl

Sumario:

Define el tipo por defecto de las variables, de acuerdo a un rango de letras, si no se define un caracter de tipo de declaración o palabra clave. Puede permitir que todas las variables que inician con “d”, por ejemplo, sean automáticamente del tipo Doble.

Ver también: DefBool, DefDate, DefDbL, DefInt, DefLng, DefObj, y DefVar.

Sintaxis:

DefDbl Rango1[, Rango2[,...]]

Parámetros:

Rango: Letras especificando el rango de variables a las que se les va a definir el tipo de datos por defecto.

Ejemplo:

ver ejemplo DefBool

Instrucción DefInt

Sumario:

Define el tipo por defecto de las variables, de acuerdo a un rango de letras, si no se define un caracter de tipo de declaración o palabra clave. Puede permitir que todas las variables que inician con “i”, por ejemplo, sean automáticamente del tipo Entero.

Ver también: DefBool, DefDate, DefDbL, DefInt, DefLng, DefObj, y DefVar.

Sintaxis:

DefInt Rango1[, Rango2[,...]]

Parámetros:

Rango: Letras especificando el rango de variables a las que se les va a definir el tipo de datos por defecto.

Ejemplo:

Ver ejemplo DefBool

DefLng Statement

Sumario:

Define el tipo por defecto de las variables, de acuerdo a un rango de letras, si no se define un caracter de tipo de declaración o palabra clave. Puede permitir que todas las variables que inician con “l”, por ejemplo, sean automáticamente del tipo Largo.

Ver también: DefBool, DefDate, DefDbL, DefInt, DefLng, DefObj, y DefVar.

Sintaxis:

DefLng Rango1[, Rango2[,...]]

Parámetros:

Rango: Letras especificando el rango de variables a las que se les va a definir el tipo de datos por defecto.

Ejemplo:

Ver ejemplo DefBool

Instrucción DefObj

Sumario:

Define el tipo por defecto de las variables, de acuerdo a un rango de letras, si no se define un caracter de tipo de declaración o palabra clave. Puede permitir que todas las variables que inician con “o”, por ejemplo, sean automáticamente del tipo Objeto.

Ver también: DefBool, DefDate, DefDbL, DefInt, DefLng, DefObj, y DefVar.

Sintaxis:

DefObj Rango1[, Rango2[,...]]

Parámetros:

Rango: Letras especificando el rango de variables a las que se les va a definir el tipo de datos por defecto.

Ejemplo:

Ver ejemplo DefBool

Instrucción DefVar

Sumario:

Define el tipo por defecto de las variables, de acuerdo a un rango de letras, si no se define un caracter de tipo de declaración o palabra clave. Puede permitir que todas las variables que inician con “v”, por ejemplo, sean automáticamente del tipo Variante.

Ver también: DefBool, DefDate, DefDbL, DefInt, DefLng, DefObj, y DefVar.

Sintaxis:

DefVar Rango1[, Rango2[,...]]

Parámetros:

Rango: Letras especificando el rango de variables a las que se les va a definir el tipo de datos por defecto.

Ejemplo:

Ver ejemplo DefBool

Instrucción Dim

Sumario:

Declara variables. El tipo de cada variable es declarado separadamente y el tipo por defecto es Variante. La siguiente instrucción define a, b, y c del tipo Variante y d del tipo Fecha.

Dim a, b, c, d As Date

Los tipos de variables también pueden ser definidos mediante el uso de un caracter al final. Esto es mencionado en la sección de tipos de variables.

Dim es usada para declarar variables locales dentro de las subrutinas. Las variables globales fuera de las Subrutinas son declaradas con las instrucciones PUBLIC o PRIVATE.

A menos que la instrucción “Option Explicit” esté presente, las variables que no sean matriz pueden ser usadas sin declaración y su tipo por defecto será variante.

Son soportadas matrices sencillas y multi-dimensionales.

Ver también: Public, Private, ReDim

Sintaxis:

[ReDim]Dim Nombre_1 [(inicio To fin)] [As Tipo][, Nombre_2 [(inicio To fin)] [As Tipo][,...]]

Parámetros/Palabras clave:

Name_i: Nombre de la variable o de la matriz.

Inicio, fin: Constante entero desde -32768 a 32767 del rango de la matriz o arreglo. A nivle de procedimiento, ReDim permite expresiones numéricas de manera que puede ser reiniciado en tiempo de ejecución.

Tipo: Palabra clave usada para declarar el tipo de datos de una variable. Los tipos soportados son Boolean (Boleano), Currency (Moneda), Date (Fecha), Double (Doble), Integer (Entero), Long (Largo), Object (Objeto), Single (Sencillo), String (Cadena), o Variant (Variante).

Ejemplo:

Sub ExampleDim

Dim s1 As String, i1 As Integer, i2%

Dim a1(5) As String Rem 0 to 6

Dim a2(3, -1 To 1) As String Rem (0 to 3, -1 to 1)

Const sDim as String = " Dimension:"

For i1 = LBound(a2(), 1) To UBound(a2(), 1)

For i2 = LBound(a2(), 2) To UBound(a2(), 2)

a2(i1, i2) = Str(i1) & ":" & Str(i2)

Next

Next

For i1 = LBound(a2(), 1) To UBound(a2(), 1)

For i2 = LBound(a2(), 2) To UBound(a2(), 2)

Print a2(i1, i2)

Next

Next

End Sub

Función DimArray

Sumario:

Crea una matriz del tipo Variante. Esto trabaja igual que Dim(Lista de argumentos). Si no hay argumentos, una matriz vacía es creada. Si hay parámetros, una dimensión es creada por cada parámetro.

Ver también: Array

Sintaxis:

DimArray ( Lista de argumentos)

Valor de retorno:

Matriz Variant

Parámetros:

Lista de argumentos: De manera opcional son enteros separados por comas.

Ejemplo:

DimArray( 2, 2, 4 ) es lo mismo que DIM a( 2, 2, 4 )

Función Dir

Sumario:

Retorna el nombre de un archivo, directorio, o todos los archivos y directorios de una unidad o directorio que concuerde con la ruta de busqueda especificada. Un posible uso es verificar que exista un archivo o directorio, o listar los archivos y directorios de un directorio especifico.

Si no concuerda ningún archivo o directorio, se retorna una cadena de tamaño cero. Llamar repetidamente la función Dir hasta que una cadena de tamaño cero sea retornada para iterate a traves de todos los valores retornados.

Los atributos de Volumen y Directorio tienen significado exclusivamente si pide uno de estos y es la única cosa que obtiene. No puedo determinar cual tiene más precedencia, porque la versión 1.0.3, el atributo del volumen no hace nada.

Los atributos son un subconjunto de estos disponibles en GetAttr.

Ver también: GetAttr

Sintaxis:

Dir [(Texto As String[, Atributo As Integer])]

Valor de retorno:

Cadena

Parámetros:

Texto: Cadena que especifica la ruta de búsqueda, directorio o archivo. Notación URL es aceptada.

Atributo: Entero para los atributos de los archivos. La función Dir retornará solo los archivos o directorios que concuerden con los atributos especificos. Sume los atributos para combinarlos.

Atributo	Descripción
0	Archivo normal.
2	Archivo oculto.
4	Archivo de sistema.
8	Retorna el nombre del volumen (Exclusivo).
16	Retorna directorios (Exclusivo).

Ejemplo:

Sub ExampleDir

REM Displays all files and directories

Dim sFile as String, sPath As String

Dim sDir as String, sValue as String

Dim iFIle as Integer

sFile= "Files: "

sDir="Directories:"

iFile = 0

sPath = CurDir

Rem 0 : Normal files.

Rem 2 : Hidden files.

Rem 4 : System files.

Rem 8 : Returns the name of the volume

Rem 16 : Returns the name of the directory only.

Rem This example will ONLY return directories because the 16 is included!

Rem Remove the 16 and you will receive the files

sValue = Dir$(sPath, 0 + 2 + 4 + 16)

Do

If sValue <> "." and sValue <> ".." Then

If (GetAttr( sPath + getPathSeparator() + sValue) AND 16) > 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.

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

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

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

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:

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

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

Msgbox sMsg

End Sub

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

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
VERDADERO	VERDADERO	VERDADERO
VERDADERO	FALSO	FALSO
FALSO	VERDADERO	FALSO
FALSO	FALSO	VERDADERO
1	1	1
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

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

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

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

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 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:

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

Instrucción Exit

Sumario:

La instrucción Exit es usada para dejar una estructura Do...Loop, For...Next, Función o 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

Función Exp

Sumario:

Retorna la base del logaritmo natural (e = 2.718282) elevado a una potencia.

Ver también: Log

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

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)

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

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

Función FileDateTime

Sumario:

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

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

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)

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

Función FindObject

Sumario:

?? No tengo idea

Sintaxis:

Valor de retorno:

Parámetros:

Ejemplo:

Función FindPropertyObject

Sumario:

?? No tengo idea

Sintaxis:

Valor de retorno:

Parámetros:

Ejemplo:

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

For...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]

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.
E- E+ e- e+	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.
\	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

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

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.

FreeLibrary 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

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

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

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 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

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 = ""

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

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")

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

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

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

Function

Sumario:

Sintaxis:

Valor de retorno:

Parámetros:

Ejemplo:

Function

Sumario:

Sintaxis:

Valor de retorno:

Parámetros:

Ejemplo:

Function

Sumario:

Sintaxis:

Valor de retorno:

Parámetros:

Ejemplo:

???????

Function

Sumario:

Sintaxis:

Valor de retorno:

Parámetros:

Ejemplo:

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

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

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

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

Notación y nombres de archivo URL

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/”.

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”.

Index

/	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	35

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

CharWeight	69

FontWeight	69

FontSlant

DONTKNOW	69

ITALIC	69

NONE	69

OBLIQUE	69

REVERSE_ITALIC	69

REVERSE_OBLIQUE	69

FontUnderline

BOLD	69

BOLDDASH	69

BOLDDASHDOT	69

BOLDDASHDOTDOT	69

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

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	25

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

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

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

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

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	1

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()	49

compareRegionStarts()	49p.

createTextCursorByRange	69

createTextCursorByRange()	48pp., 69

CurrentController	69

getCurrentSelection

getCount()	49

getCurrentSelection()	48p.

getByIndex()	49

getCount()	48

getString()	30

getText()	30

insertControlCharacter	58

insertString	69

setString	30

Text	30, 69

TextTable

getCellByName	29

ThisComponent”	1

TimeValue	111

To	93

Trim	31

True	87

UBound	21

Variant	79

wait	30

While...Wend	94

WritedbgInfo	3

XOR	87, 101

N.T. Por las siglas de Integrated Development Environment

N.T. API son las siglas en inglés Aplication Program Interface, o Interface de programas de aplicación.

N.T. “cómo hacerlo”. La página está en inglés y esa expresión en intraducible.

Estas variables se usan para definir objetos, como hojas de cálculo, cursores, etc. Como en VBA.

N.T: Esta palabra clave define una variable pública. Esta sería la palabra clave que el autor recomienda no usar.

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.

N.T. O exclusivo.

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

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

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

La ayuda en línea de este tópico es igual a la anterior.

159

Andrew's Macro Information

Macro Programming

starbasic Macro

Andrew Pitonyak

2003-02-11T16:41:37

Arturo Garro Zumbado