[Resuelto] Detener ejecución Si se produce ERROR en la celda

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
physic
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

[Resuelto] Detener ejecución Si se produce ERROR en la celda

Mensaje por physic »

Saludos ,

tengo una macro de filtro avanzado que filtra varias columnas en una hoja de cálculo .

En esta hoja de cálculo, tiene una fórmula en la celda "M1" que me da un resultado esperado, pero un ERROR puede ocurrir en la celda "M1" durante la ejecución de la macro, es decir, un error de tipo: #N/DISP

es necesario incluir en la macro una Condición que si se produce un ERROR de tipo #N/DISP en la celda "M1" durante la ejecución, entonces la macro debe dejar de ejecutarse, es decir, no debe continuar ejecutándose, debe Detener inmediatamente su ejecución .

abajo sigue el código de filtro avanzado que estoy usando:

Código: Seleccionar todo

Sub Prog_MS
     
Dim searchString As String
Dim sheet As Object
dim oCell as object
   
sheet = ThisComponent.Sheets.getByName("4.1Tinto MS")
oCell =  sheet.getCellRangeByName("M1")
ThisComponent.CurrentController.select(oCell)
   
Dim range As Object
range = sheet.GetCellRangeByName("A6:BA3000")
   
Dim filterDescriptor As Object
filterDescriptor = range.CreateFilterDescriptor(true)
   
Dim filterFields(11) As New com.sun.star.sheet.TableFilterField2  
       
range.filter(filterDescriptor)

with filterDescriptor
   .ContainsHeader = true                                                                   
   .UseRegularExpressions = true         
end with
     
     
With filterFields(0)
      .field = 3 
      .IsNumeric = false
      .stringValue = "A0174" 
      .operator = com.sun.star.sheet.FilterOperator2.NOT_EQUAL
End With
   
      
With filterFields(1)
      .field = 3 
      .IsNumeric = false
      .stringValue = "A0168"
      .operator = com.sun.star.sheet.FilterOperator2.NOT_EQUAL
      .Connection = com.sun.star.sheet.FilterConnection.AND
End With
      
     
With filterFields(2)
        .Connection = com.sun.star.sheet.FilterConnection.AND
      .field = 4 
      .IsNumeric = false
      .StringValue = "000001"
      .operator = com.sun.star.sheet.FilterOperator2.NOT_EQUAL
End With
      
      
With filterFields(3)
      .field = 4 
      .IsNumeric = false
      .StringValue = "000001"
      .operator = com.sun.star.sheet.FilterOperator2.NOT_EQUAL
      .Connection = com.sun.star.sheet.FilterConnection.AND
End With  
    
   
with filterFields(4)
    .Connection = com.sun.star.sheet.FilterConnection.AND
   .field = 5                
   .IsNumeric = false         
   .StringValue = "^A0033.*"  
   .Operator = com.sun.star.sheet.FilterOperator2.NOT_EQUAL
end with


With filterFields(5)
      .Field = 5 
      .IsNumeric = false
      .StringValue = "^A9.*" 
      .operator = com.sun.star.sheet.FilterOperator2.NOT_EQUAL
      .Connection = com.sun.star.sheet.FilterConnection.AND
End With 


with filterFields(6)
   .field = 5                
   .IsNumeric = false         
   .StringValue = "^A2005.*"  
   .Operator = com.sun.star.sheet.FilterOperator2.NOT_EQUAL
   .Connection = com.sun.star.sheet.FilterConnection.AND
end with


With filterFields(7)
        .Connection = com.sun.star.sheet.FilterConnection.AND
      .Field = 6 
      .IsNumeric = false
        .StringValue = ".*" & "ELAS" & ".*"  
      .operator = com.sun.star.sheet.FilterOperator2.NOT_EQUAL
End With 


With filterFields(8)
      .Field = 6 
      .IsNumeric = false
      .StringValue = ".*" & "ROMAN" & ".*"  
      .operator = com.sun.star.sheet.FilterOperator2.NOT_EQUAL
      .Connection = com.sun.star.sheet.FilterConnection.AND
End With


with filterFields(9)
    .Connection = com.sun.star.sheet.FilterConnection.AND
   .field = 10               
   .IsNumeric = false         
     .StringValue = "v"  
   .Operator = com.sun.star.sheet.FilterOperator2.EQUAL
    .Connection = com.sun.star.sheet.FilterConnection.AND
end with


with filterFields(10)
    .Connection = com.sun.star.sheet.FilterConnection.AND
   .field = 8               
   .IsNumeric = false         
    .StringValue = "^m.*"  
   .Operator = com.sun.star.sheet.FilterOperator2.EQUAL
end with


With filterFields(11)
   .Field = 8 
   .IsNumeric = false
   .StringValue = "^z.*"  
   .operator = com.sun.star.sheet.FilterOperator2.EQUAL
   .Connection = com.sun.star.sheet.FilterConnection.OR
End With 

  
With filterDescriptor
      .filterFields2 = filterFields
      .containsHeader = True
      .isCaseSensitive = false
      .useRegularExpressions = True
End With
   
      range.Filter filterDescriptor
   
End Sub
Creo que he encontrado un buen tema en otro foro que puede tal vez ayudar a resolver mi problema .

pero no estoy seguro de que este tema del otro foro puede ayudar a resolver el problema ?


abrazo amigos .
Última edición por physic el Sab Feb 16, 2019 2:47 am, editado 1 vez en total.
LibreOffice 5.4.4.2 >>> Windows 7
RMG
Mensajes: 3878
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Detener ejecución Si se produce ERROR en la celda

Mensaje por RMG »

Hola,

Tienes dos posibles opciones con el controlador de errores.

On error goto control y al final de la macro pones lo que quieres que haga en caso de producirse el eror o On error resume next que en caso de error finaliza sin ejecutar la macro.

En este enlace tienes el tutorial del amigo Mauricio que lo explica muy bien.

https://forum.openoffice.org/es/forum/v ... =50&t=1545

Saludos
OpenOffice 4.1.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
physic
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

Re: Detener ejecución Si se produce ERROR en la celda

Mensaje por physic »

saludos sr. RMG ,

de tratamiento de Errores en la ejecución de código básico ya puedo hacer .

mi problema actual es hacer que la macro deje de funcionar (EXIT sub), o, deje de ejecutar (STOP sub), SI se produce un ERROR del tipo #N/DISP en la celda "M1" .

porque la ocurrencia de un ERROR en una celda no hace necesariamente que la Macro deje de funcionar, si está con el código perfecto .

Es necesario que durante la ejecución, la macro quede mirando a la celda "M1", si se produce un ERROR del tipo #N/DISP en "M1", entonces la macro debe parar inmediatamente (EXIT sub) o (STOP sub) .

encontré otra macro RetrieveTheActiveCell , quién sabe tal vez esta macro ayuda a encontrar una solución para mi necesidad .


abrazo amigos .
LibreOffice 5.4.4.2 >>> Windows 7
Responder