[Risolto] Esecuzione interruzione Se ERROR si verifica cella

Creare una macro - Scrivere uno script - Usare le API
Rispondi
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

[Risolto] Esecuzione interruzione Se ERROR si verifica cella

Messaggio da chimico »

Saluti ,

Ho una macro filtro avanzata che filtra più colonne in un foglio di lavoro .

in questo foglio di lavoro, ha una formula nella cella "M1" che mi dà un risultato previsto quando la macro è in esecuzione, ma un ERRORE può verificarsi nella cella "M1" durante l'esecuzione della macro, cioè un errore di tipo #N/DISP .

quindi ho bisogno di Includere una Condizione nella macro, cioè se un ERRORE di tipo #N/DISP si verifica nella cella "M1" durante l'esecuzione della macro, allora la macro deve smettere di funzionare, cioè non dovrebbe continuare a funzionare, deve interrompere immediatamente la sua esecuzione .

di seguito è riportato il codice di filtro avanzato che sto utilizzando :

Codice: Seleziona tutto

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
di seguito anche due argomenti che ho trovato su Internet, che possono aiutare a risolvere questo problema ?

sub Test_with_removeByName_warning

sub RetrieveTheActiveCell


abbracci amici
Ultima modifica di chimico il sabato 16 febbraio 2019, 2:54, modificato 1 volta in totale.
LibreOffice 5.4.4.2 no Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Esecuzione interruzione Se ERRORE si verifica nella cell

Messaggio da patel »

allega un file di ESEMPIO da testare
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

Re: Esecuzione interruzione Se ERRORE si verifica nella cell

Messaggio da chimico »

il mio file ufficiale ha 30 MB, sarebbe molto difficile da allegare .

il mio obiettivo principale è fare in modo che l'attuale Macro guardi la cella "M1" mentre è in esecuzione, se si verifica un ERRORE di tipo #N/DISP , allora la macro deve smettere di eseguire immediatamente della esecuzione (EXIT sub o STOP sub) .

anche ho trovato la macro sub AddListener che utilizza "Modify_" .

ma questo metodo rileva qualsiasi modifica sensibile nelle celle "A1:A10", anche se i valori non cambiano la loro grandezza, questo metodo rileva la modifica anche se non si verifica alcuna differenza di magnitudo .

Ho bisogno che la macro rilevi una differenza di valore di magnitudine, quindi rileverà anche un errore #N/DISP .
LibreOffice 5.4.4.2 no Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Esecuzione interruzione Se ERRORE si verifica nella cell

Messaggio da patel »

chimico ha scritto:il mio file ufficiale ha 30 MB, sarebbe molto difficile da allegare .
Lo so, infatti ho scritto ESEMPIO, quindi un estratto del file originale con soltanto i dati utili per testare la macro
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

Re: Esecuzione interruzione Se ERRORE si verifica nella cell

Messaggio da chimico »

Ho creato un file EXAMPLE allegato .

l'obiettivo è di Annullare l'esecuzione della macro Se Error si verifica nella cella M1 durante l'esecuzione della macro .

sarà necessario creare una simulazione, perché questo esempio è solo un campione molto piccolo .
Allegati
ferma la macro se ERROR cell.ods
(65.8 KiB) Scaricato 103 volte
LibreOffice 5.4.4.2 no Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Esecuzione interruzione Se ERRORE si verifica nella cell

Messaggio da patel »

le celle M2 e M3 sono vuote, quindi in M1 ci sarà sempre ERROR
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

Re: Esecuzione interruzione Se ERRORE si verifica nella cell

Messaggio da chimico »

sr. patel ,

scusa, è stata colpa mia quando ho fatto la copia del foglio di lavoro originale .

i valori in "M2" e "M3" sono fissi, le variabili sono impostate da "M7" a "M536" .

Se si verifica un errore da "M7" a "M536", si verificherà anche un errore in "M5" e di conseguenza si verificherà un errore in "M1" .

come ho detto, sarà necessario simulare, perché il file originale è troppo grande per essere collegato

segue l'ESEMPIO con modifiche nelle celle citate sopra .


amico abbraccio .
Allegati
ferma la macro se ERROR cell.ods
(88.23 KiB) Scaricato 108 volte
LibreOffice 5.4.4.2 no Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Esecuzione interruzione Se ERRORE si verifica nella cell

Messaggio da patel »

chimico ha scritto: come ho detto, sarà necessario simulare... .
non capisco cosa intendi per simulare
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

Re: Esecuzione interruzione Se ERRORE si verifica nella cell

Messaggio da chimico »

Volevo dire che devi avere una creatività immaginaria, perché non hai il file originale disponibile per fare veri test, perché stai utilizzando un solo campione , così ho detto simulare, cioè lavorare con l'immaginazione del reale .
LibreOffice 5.4.4.2 no Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Esecuzione interruzione Se ERRORE si verifica nella cell

Messaggio da patel »

allora non sono la persona giusta
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

Re: Esecuzione interruzione Se ERRORE si verifica nella cell

Messaggio da chimico »

Penso di non essermi espresso correttamente, volevo solo dire che il file allegato non è l'originale, è un campione preso dall'originale .

quando parlavo di immaginazione, intendevo pensare come originale .

se puoi aiutarmi, ti ringrazierò in anticipo .


amico abbraccio .
LibreOffice 5.4.4.2 no Windows 7
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

Re: Esecuzione interruzione Se ERRORE si verifica nella cell

Messaggio da chimico »

Ho pensato a una soluzione senza utilizzare la procedura AddListener, perché questa procedura non si adatta molto bene al mio problema .

quindi ho pensato alla seguente idea: se crei lo stesso calcolo in M1, cioè M5/M3/M2, e lo memorizzi in memoria, allora quando c'è un Errore di divisione, la macro dovrebbe fermarsi immediatamente .

Ho avuto questa idea, ma non so come trasformare questo codice di base .

forse questo sub SheetChange (oEvent) aiuta a dare una luce a questa idea che ho menzionato .


amico abbraccio .
LibreOffice 5.4.4.2 no Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Esecuzione interruzione Se ERRORE si verifica nella cell

Messaggio da patel »

La tua macro non mi sembra che modifichi i contenuti di M5 e M3, fa soltanto ordinamento, quindi non la puoi fermare, però puoi controllare prima di far partire l'ordinamento il contenuto di di M5 e M3
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

Re: Esecuzione interruzione Se ERRORE si verifica nella cell

Messaggio da chimico »

noterete che l'architettura dell'esempio allegato è nella forma di una tabella pivot dalla colonna "A" alla colonna "C", che viene aggiornata prima della classificazione .

poi ho effettivamente scoperto che l'ERRORE si verifica durante l'aggiornamento della tabella pivot, ma che posso vedere l'errore quando eseguo l'ordinamento, perché è una sequenza di macro, quindi non riesco a vedere l'errore in anticipo, perché le macro funzionano, vedere la codice qui sotto che utilizzo per aggiornare la tabella pivot :

Codice: Seleziona tutto

oSheet = ThisComponent.Sheets.getByName("4.1Tinto MS")
oCell = oSheet.getCellRangeByName("A20")
ThisComponent.CurrentController.select(oCell)
PlanAtiva = ThisComponent.getCurrentController.getActiveSheet()
TabDinam1 = PlanAtiva.DataPilotTables.getByIndex(0)
TabDinam1.refresh()
cosa si può fare di fronte a questa nuova informazione, è quello di aggiungere nella macro di classificazione un comando "IF" che punta alla cella "M1", quindi se c'è ERROR in "M1", la macro dovrebbe classificare solo la colonna "G" e la colonna "H", il cui criterio di classificazione dovrebbe essere #N/D, ovvero classificare gli ERROR trovati nella colonna "G" e "H" con il criterio #N/D, così posso correggere gli errori e rendere la macro lavorare di nuovo, ovvero riavviare la macro dopo aver corretto gli errori .

puoi aiutarmi per favore in questo adattamento macro ?
LibreOffice 5.4.4.2 no Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Esecuzione interruzione Se ERRORE si verifica nella cell

Messaggio da patel »

non riesco a seguire il tuo ragionamento, ripeto, è più semplice controllare il contenuto di di M5 e M3
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Rispondi