[RESUELTO] Traducir aplicación VBA a Basic, Objeto Range

Discute sobre la aplicación de hojas de cálculo
Responder
Juan Sanchez
Mensajes: 4
Registrado: Lun Feb 05, 2018 5:02 pm

[RESUELTO] Traducir aplicación VBA a Basic, Objeto Range

Mensaje por Juan Sanchez »

Realmente Utilizo Libre Office 6.0, sobre Windows 10; aunque me tuve que registrar como Open Office 3.2, sobre Win Vista, ya que de otra forma no me permitia el acceso.

Mi pregunta es sobre el Objeto Range, cómo traducir esta sencilla función UDF a Basic

Function Distancia(Datos As Range) As Single
'Esta es una función que nos permite evaluar la distancia entre dos puntos (x1,y1) y (x2,y2)

Dim celda As Range
Dim x(2) As Single
Dim y(2) As Single
Dim i As Integer, j As Integer
Dim d As Single

'RUTINA DE LECTURA DE DATOS EN RANGO
'inicializacion de variables
j = 1 'contador de datos
i = 1 'contador de estaciones

For Each celda In Datos
If j / 2 = Int(j / 2) Then
y(i) = celda.Value
j = j + 1
i = i + 1
Else
x(i) = celda.Value
j = j + 1
End If
Next celda
'----------

d = Sqr((x(2) - x(1)) ^ 2 + (y(2) - y(1)) ^ 2)

Distancia = d

End Function
Última edición por mauricio el Mié Feb 07, 2018 4:10 pm, editado 2 veces en total.
Razón: Marcar icono de resuelto
OpenOffice 3.1 en Windows Vista
Avatar de Usuario
PepeOooSevilla
Mensajes: 1480
Registrado: Sab Abr 04, 2009 6:10 pm
Ubicación: Sevilla (España)

Re: Traducir aplicación VBA a Basic, Objeto Range

Mensaje por PepeOooSevilla »

Hola.
¿Te valdría así?

Código: Seleccionar todo

REM  *****  BASIC  *****
Option Explicit

Public Function Distancia(x1 As Double, y1 As Double, x2 As Double, y2 As Double) As Double

	Distancia = Sqr((x2-x1)^2 + (y2-y1)^2)

End Function
Y la llamada, ver archivo adjunto, sería algo así como:

Código: Seleccionar todo

=DISTANCIA(B1;B2;B3;B4)
'B1 es x1; B2 es y1; B3 es x2; B4 es y2
Saludos cordiales.
Adjuntos
Distancia entre dos puntos.ods
(10.72 KiB) Descargado 103 veces
LibreOffice 6.4.6. Windows 10. Java 8 rev. 261 (64 bits)
Por favor, utiliza el Foro para tus consultas, no los mensajes privados
Si usas OpenOffice/LibreOffice trabaja y guarda en ODT, ODS, ODP, ... Y haz copias de seguridad.
Juan Sanchez
Mensajes: 4
Registrado: Lun Feb 05, 2018 5:02 pm

Re: Traducir aplicación VBA a Basic, Objeto Range

Mensaje por Juan Sanchez »

No, realmente para este caso es factible, pero realmente no podría aplicarla en este:

Function AreaPol(Datos As Range) As Single
'Esta función nos sirve para evaluar el area de
'una poligonal mediante puntos contenidos en un rango
'de celdas.

Dim celda As Range
Dim x(100) As Single
Dim y(100) As Single
Dim i As Integer, j As Integer, n As Integer
Dim s As Single

'RUTINA DE LECTURA DE DATOS EN RANGO
'inicializacion de variables
j = 1 'contador de datos
i = 1 'contador de estaciones

For Each celda In Datos
If j / 2 = Int(j / 2) Then
y(i) = celda.Value
j = j + 1
i = i + 1
Else
x(i) = celda.Value
j = j + 1
End If
Next celda
'----------

n = i - 1

s = 0 'suma de columnas

For i = 1 To n
s = s + x(i) * y(i + 1) - x(i + 1) * y(i)
Next i

AreaPol = Abs(s) / 2

End Function
OpenOffice 3.1 en Windows Vista
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Traducir aplicación VBA a Basic, Objeto Range

Mensaje por mauricio »

Claro, no puedes aplicarla, por que son dos problemas distintos.
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Traducir aplicación VBA a Basic, Objeto Range

Mensaje por mauricio »

Si bien el usuario no lo específica claramente, dado el código mostrado, no es más que el calculo del área de un polígono por medio de las coordenadas de cada punto.

Con una macro:

Código: Seleccionar todo

Sub AreaPoligono()

	suma = 0
	sel = ThisComponent.CurrentController.Selection.DataArray
	For i = LBound(sel) To UBound(sel)
		If i = UBound(sel) Then
			Exit For
		End If
		suma = suma + (sel(i)(0) * sel(i + 1)(1)) - (sel(i+1)(0) * sel(i)(1))
	Next i

	msgbox(abs(suma)/2)

End Sub
Con una formula:

Código: Seleccionar todo

Function AreaPol(sel)
	suma = 0
	For i = LBound(sel) To UBound(sel)
		If i = UBound(sel) Then
			Exit For
		End If
		suma = suma + (sel(i,1) * sel(i+1,2)) - (sel(i+1,1) * sel(i,2))
	Next i
	AreaPol = Abs(suma) / 2

End Function
Con una macro Python:

Código: Seleccionar todo

    data = app.doc.selection.data
    data += data[0:1]
    suma = abs(sum([v[0] * data[i+1][1] - v[1] * data[i+1][0] for i, v in enumerate(data[:-1])]))
    area = round(suma / 2, 2)
    app.msgbox(area)
En el código Basic, se asume que los datos están como en la imagen siguiente:
foro1.png
foro1.png (10.66 KiB) Visto 2277 veces
Para Python, no es necesario repetir la primer fila:
foro2.png
bueno, con un poco de ingenio tampoco sería necesario en Basic, queda al usuario adaptar a sus necesidades, si realmente es lo que quiere.
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Juan Sanchez
Mensajes: 4
Registrado: Lun Feb 05, 2018 5:02 pm

Re: Traducir aplicación VBA a Basic, Objeto Range

Mensaje por Juan Sanchez »

Me gusta, lo probaré.
Gracias.
OpenOffice 3.1 en Windows Vista
Avatar de Usuario
SLV-es
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España
Contactar:

Re: [RESUELTO] Traducir aplicación VBA a Basic, Objeto Range

Mensaje por SLV-es »

Hola a todos

Aunque el tema está resuelto, la pregunta inicial es sobre el objeto RANGE de VBA Excel

Ni OpenOffice ni LibreOffice no disponen de este objeto, y por ende, tampoco de sus propiedades, métodos ni eventos.

Si deseamos acceder a un rango de celdas o a una celda desde macros VB en nuestras suites, este enlace puede ayudarnos a entender cómo hacerlo: http://wiki.open-office.es/Macros_en_Ba ... ffice_Calc

Saludos :D
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
Juan Sanchez
Mensajes: 4
Registrado: Lun Feb 05, 2018 5:02 pm

Re: [RESUELTO] Traducir aplicación VBA a Basic, Objeto Range

Mensaje por Juan Sanchez »

Gracias, está interesante.
OpenOffice 3.1 en Windows Vista
Responder