[Risolto] Rimuovere elementi da una collection con OO

Creare una macro - Scrivere uno script - Usare le API
Rispondi
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

[Risolto] Rimuovere elementi da una collection con OO

Messaggio da patel »

Con libre uso questa

Codice: Seleziona tutto

   n = collezione.Count()
   for i = n to 1 step -1
      collezione.remove(i)
   next
ma con OO si blocca, c'è un altro modo ?
Ultima modifica di charlie il martedì 22 settembre 2020, 10:50, modificato 2 volte in totale.
Motivazione: aggiunta ✔ verde.
-------------------
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
geovign
Messaggi: 215
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Rimuovere elementi da una collection con OO

Messaggio da geovign »

Ciao patel,
ho provato ad impostare nuovamente la variabile "collezione" con l'istruzione "set" e sembra che funzioni (OO 4.1.6 su macchina virtuale)

Codice: Seleziona tutto

n = collezione.Count()
if n > 0 then
   set collezione = New Collection
   n = collezione.Count()   'n ha valore 0
end if
Sto seguendo anche il tread "Importare file fatture elettroniche xml" ed ho provato la modifica nel codice originario che dà errore.
A me funziona esclusivamente così (sia in LO che OO)

Codice: Seleziona tutto

n = collezione.Count()
if n > 0 then
    set collezione = New Collection
    n = collezione.Count()
end if
for i = n to 1 step -1
    collezione.remove(i)
next
mantenendo anche il ciclo for, altrimenti mi crea un errore in altra pare del codice.
Saluti
Geo
LibO 7 su LinuxMint 21
geovign
Messaggi: 215
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Rimuovere elementi da una collection con OO

Messaggio da geovign »

Questo codice funziona

Codice: Seleziona tutto

Sub Main
Dim test as New Collection
for i = 1 to 5
  test.Add(i)
next
msgbox test.Count()
n = test.Count()
Do While n > 0
	test.remove(n)
	n = n -1
loop
msgbox test.Count()
End Sub
Se sostituisco il ciclo Do/Loop con un ciclo For/Next, OO si blocca.
Saluti
Geo
LibO 7 su LinuxMint 21
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Rimuovere elementi da una collection con OO

Messaggio da patel »

Grazie delle prove che hai fatto, ma a me il file delle fatture dà errore alla seconda fattura (ciclo do loop con OO), la prima tua soluzione invece funziona bene e mi sembra la più corretta.
Non metto Risolto perché non mi convince completamente
-------------------
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
geovign
Messaggi: 215
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Rimuovere elementi da una collection con OO

Messaggio da geovign »

Togliendo il ciclo for/next incriminato, anche a me dava errore dalla seconda fattura. Il problema, scoperto stamattina, è che la variabile i è utilizzata anche in altra parte del codice

Codice: Seleziona tutto

...
On Error Goto doppione
collezione.Add(intCol,intCol)
oRanges = ThisComponent.NamedRanges
If NOT oRanges.hasByName(intCol) Then
   oCellAddress = Sh.GetCellByPosition(i, rig).getCellAddress
   oRanges.addNewByName(intCol, Sh.GetCellByPosition(i, rig).AbsoluteName, oCellAddress, 0) ' inserisco nome definito colonna
End if
Sh.GetCellByPosition(i, lastrow).String = intCol
Sh.GetCellByPosition(i, lastrow+1).String = DatiCol
i = i + 1 'indice di colonna
...
Close #iNumber
REM Elimino tutti i nomi definiti
oRanges = ThisComponent.NamedRanges
for i = oRanges.Count -1 To 0 Step -1
    oRanges.removebyname(oRanges.ElementNames(i))
next i
Goto continua
con significati e valori diversi.
Se tolgo il ciclo for/next iniziale, quello che blocca OO, la variabile i, con la seconda fattura, assume un valore pari a -1 (valore questo definito con l'ultimo ciclo for/next del codice che elimina tutti i nomi definiti) anzichè 0 (zero) e quindi causa l'errore in oCellAddress.
Risolto questo problema, sistemando le variabili, credo si possano utilizzare entrambe le soluzioni ("set collezione = New Collection" oppure ciclo Do While/Loop) togliendo il ciclo for/next incriminato.
Saluti
Geo
LibO 7 su LinuxMint 21
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Rimuovere elementi da una collection con OO

Messaggio da Gaetanopr »

patel ha scritto:Con libre uso questa

Codice: Seleziona tutto

   n = collezione.Count()
   for i = n to 1 step -1
      collezione.remove(i)
   next
ma con OO si blocca, c'è un altro modo ?
Non ho provato se funzioni con il ciclo for ma a mio avviso un ciclo for o loop avrebbe senso se si volesse rimuovere alcuni degli elementi(tramite l’uso di if) e non tutti gli elementi dove basta fare set collezione = nothing.
geovign ha scritto:Ciao patel,
ho provato ad impostare nuovamente la variabile "collezione" con l'istruzione "set" e sembra che funzioni (OO 4.1.6 su macchina virtuale)
Più che impostare una nuova collection per poi rimuovere gli elementi io la eliminerei come specificato sopra.

Oltretutto è buona norma alla fine della routine settare a nothing tutti gli oggetti creati per non lasciare la memoria sporca nel pc.

Saluti
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Rimuovere elementi da una collection con OO

Messaggio da patel »

Grazie Gaetano, non voglio eliminare la collection perché la devo riutilizzare in un ciclo, vedi
viewtopic.php?f=9&t=10738
-------------------
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
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Rimuovere elementi da una collection con OO

Messaggio da Gaetanopr »

Adesso è più chiaro, il metodo più veloce è creare ad ogni ciclo un nuovo oggetto collection che sostituisce il precedente(il metodo remove andrebbe usato solo per rimuovere alcuni elementi) in questo modo
set collezione = New Collection
quindi tutta questa parte

Codice: Seleziona tutto

Dim collezione As New Collection
Do While (sFileName <> "")
   n = collezione.Count()
   for i = n to 1 step -1
      collezione.remove(i)
   next
diventa così

Codice: Seleziona tutto

Do While (sFileName <> "")
set collezione = New Collection


Si elimina il ciclo for che è inutile e oltretutto causa problemi.

Alla fine della routine si distrugge l'oggetto collezione

Codice: Seleziona tutto

set collezione = Nothing
geovign ha scritto: A me funziona esclusivamente così (sia in LO che OO)

Codice: Seleziona tutto

n = collezione.Count()
if n > 0 then
    set collezione = New Collection
    n = collezione.Count()
end if
for i = n to 1 step -1
    collezione.remove(i)
next
mantenendo anche il ciclo for, altrimenti mi crea un errore in altra pare del codice.
Saluti
Geo
Il ciclo for non viene eseguito in quanto la variabile n ha valore ZERO per questo ti funziona pure su OO, non ha senso rimuovere elementi da una nuova collection che è già vuota
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Rimuovere elementi da una collection con OO

Messaggio da patel »

Grazie Gaetano, questa soluzione è stata la prima che ho provato, poi l'ho erroneamente scartata perché mi dava errore, ma non dipendeva da questa ma dalla variabile i usata a sproposito (come indice di colonna e come indice di iterazione).
Ho corretto la macro nella discussione principale ed ora funziona su ambedue gli ambienti
-------------------
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