[RESUELTO] Traducir aplicación VBA a Basic, Objeto Range
-
- Mensajes: 4
- Registrado: Lun Feb 05, 2018 5:02 pm
[RESUELTO] Traducir aplicación VBA a Basic, Objeto Range
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
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
Razón: Marcar icono de resuelto
OpenOffice 3.1 en Windows Vista
- 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
Hola.
¿Te valdría así?
Y la llamada, ver archivo adjunto, sería algo así como:
Saludos cordiales.
¿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
Código: Seleccionar todo
=DISTANCIA(B1;B2;B3;B4)
'B1 es x1; B2 es y1; B3 es x2; B4 es y2
- 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.
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.
-
- Mensajes: 4
- Registrado: Lun Feb 05, 2018 5:02 pm
Re: Traducir aplicación VBA a Basic, Objeto Range
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
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
Re: Traducir aplicación VBA a Basic, Objeto Range
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
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Re: Traducir aplicación VBA a Basic, Objeto Range
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:
Con una formula:
Con una macro Python:
En el código Basic, se asume que los datos están como en la imagen siguiente:
Para Python, no es necesario repetir la primer fila:
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.
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
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
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)
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
-
- Mensajes: 4
- Registrado: Lun Feb 05, 2018 5:02 pm
Re: Traducir aplicación VBA a Basic, Objeto Range
Me gusta, lo probaré.
Gracias.
Gracias.
OpenOffice 3.1 en Windows Vista
Re: [RESUELTO] Traducir aplicación VBA a Basic, Objeto Range
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
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
+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
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
-
- Mensajes: 4
- Registrado: Lun Feb 05, 2018 5:02 pm
Re: [RESUELTO] Traducir aplicación VBA a Basic, Objeto Range
Gracias, está interesante.
OpenOffice 3.1 en Windows Vista