[Risolto] - Macro che funziona sul foglio visualizzato

Creare una macro - Scrivere uno script - Usare le API
Rispondi
amax
Messaggi: 99
Iscritto il: mercoledì 7 novembre 2012, 10:59

[Risolto] - Macro che funziona sul foglio visualizzato

Messaggio da amax »

buonasera, è possibile applicare una macro al solo foglio visualizzato?
Mi spiego, ha un file per ogni cliente nel quale vengono creati fogli per i preventivi, per le fatturem i ddt ecc. Ho creato una macro (grazie al vostro aiuto) che mi permette di creare fogli nuovi ad ogni nuovo docuemnto emesso per il cliente. Adesso sto cecando di realizzare una macro che mi aggiunga il nuovo folio creato (per indenderci la fattura n° xxx del xxx) in un file riassuntivo dove sono presenti tutte le fatture dei diversi clienti.

Es:
- cliente pippo ha il suo file "2020-Pippo". Nel file ci sono il foglio "preventivo n°01 del 01-01-2020", il foglio "preventivo n° 05 del 05-05-2020", il foglio "Fattura n° 02 del 02-02-2020"
- cliente caio ha il suo file "2020-Caio". Nel file ci sono il foglio "preventivo n°02 del 03-02-2020", il foglio "preventivo n° 04 del 04-04-2020", il foglio "Fattura n° 04 del 04-04-2020"

Mi piacerebbe creare una macro che mi salvi nel file "contabilità" nel foglio "preventivi" i diversi preventivi incrementali.
Attualmente sono riuscito a creare (copiare e personalizzare) una macro che salva in modo incementale, ma indicando il nome o il numero del foglio con "Doc.Sheets(.getbyname("NomeFoglio")" o "Doc.Sheets(0)". Avendo diversi fogli creati di volta in volta mi farebbe piacere avere una macro che dica "usa il foglio visualizzato"

Spero di essere stato chiaro
Grazie
Ultima modifica di charlie il lunedì 2 novembre 2020, 8:25, modificato 2 volte in totale.
Motivazione: Aggiunta ✔ verde.
macOS 14 Sonoma: LibreOffice 24.2.1
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Macro che funziona sul foglio visualizzato

Messaggio da patel »

trovi il foglio attivo così

Codice: Seleziona tutto

Doc = thiscomponent  
sh = Doc.currentcontroller.getActiveSheet()
-------------------
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
amax
Messaggi: 99
Iscritto il: mercoledì 7 novembre 2012, 10:59

Re: Macro che funziona sul foglio visualizzato

Messaggio da amax »

Ottimo, grazie
Un solo appunto non ha funzionato con

Codice: Seleziona tutto

sh = Doc.currentcontroller.getActiveSheet()
ma con

Codice: Seleziona tutto

sheet = Doc.currentcontroller.getActiveSheet()
.
Non so il perchè ma può essere utile ad altri.

Grazie ancora Patel
macOS 14 Sonoma: LibreOffice 24.2.1
amax
Messaggi: 99
Iscritto il: mercoledì 7 novembre 2012, 10:59

Re: Macro che funziona sul foglio visualizzato

Messaggio da amax »

Adesso sto usando questo

Codice: Seleziona tutto

Doc = ThisComponent
sheet = Doc.currentcontroller.getActiveSheet() 'Seleziona il foglio visualizzato
Range = Sheet.getCellRangeByName("D1").getDataArray ' range da copiare
e se volessi usare come range non solo D1 ma D1 e F3 ecc, come dovrei compilarlo?
Grazie
macOS 14 Sonoma: LibreOffice 24.2.1
amax
Messaggi: 99
Iscritto il: mercoledì 7 novembre 2012, 10:59

Re: Macro che funziona sul foglio visualizzato

Messaggio da amax »

Per essere più chiaro, sto usando questo

Codice: Seleziona tutto

Sub SalvaDatiPreventivoInContabilta

Dim DocName as object, DocUlr as string, dummy(), range as object
Doc = ThisComponent
sheet = Doc.currentcontroller.getActiveSheet() 'Seleziona il foglio visualizzato
Range = Sheet.getCellRangeByName("I1:J1").getDataArray ' range da copiare
sFileName ="/Users/NomeUtente/Documents/Archivio/Test-Contabilità.ods"  ' file destinazione
DocUrl = ConvertToURL(sFileName)
DocName = StarDesktop.loadComponentFromURL (DocUrl, "_blank",0, Dummy() )
Preventivo = DocName.Sheets.getbyname("Preventivi") ' il nome del foglio di destinazione
Cursore = Preventivo.createCursor
Cursore.gotoEndOfUsedArea(false)
UltimaRiga = Cursore.RangeAddress.EndRow
Riga = UltimaRiga + 2
dRange  = Preventivo.getCellRangeByName("A" & Riga & ":B" & Riga) ' range destinazione (PrimaRigaLibera)
dRange.setDataArray(Range)
DocName.store
DocName.Close(true)

End Sub
Dove le celle I1 e J1 del file vengono riportate nelle colonne A e B del file Test-Contabilità.
Se io volessi utilizzare delle celle non nel range I:J ma D1 e F3 e piportarle nelle colonne A e B del file Test-Contailità, come devo compilare

Codice: Seleziona tutto

Range = Sheet.getCellRangeByName("I1:J1").getDataArray ' range da copiare
, ho provato con la "," ma non funziona

Grazie
macOS 14 Sonoma: LibreOffice 24.2.1
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Macro che funziona sul foglio visualizzato

Messaggio da patel »

domanda cattiva, bisogna unire i 2 range, una cosa del genere

Codice: Seleziona tutto

Sub MakeRangesUnion
   Dim oRange(1) As Object
   oDoc = ThisComponent
   oSheet = oDoc.Sheets(0)
   oRanges = oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")
   oRange(0) = oSheet.getCellRangeByName("D1")
   oRange(1) = oSheet.getCellRangeByName("F1")
   for i = 0 to 1
      oRanges.addRangeAddress(oRange(i).RangeAddress, False)
   next i
   oDoc.CurrentController.Select(oranges)
            
End Sub
Ultima modifica di patel il venerdì 30 ottobre 2020, 18:40, modificato 1 volta in totale.
-------------------
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
amax
Messaggi: 99
Iscritto il: mercoledì 7 novembre 2012, 10:59

Re: Macro che funziona sul foglio visualizzato

Messaggio da amax »

patel ha scritto:domanda cattiva, non so rispondere
Nooooo, un mito come te che mi da una risposta secca mi fa perdere ogni speranza. ;) ;)

Grazie
macOS 14 Sonoma: LibreOffice 24.2.1
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Macro che funziona sul foglio visualizzato

Messaggio da patel »

Ci ho ripensato, guarda sopra
-------------------
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
amax
Messaggi: 99
Iscritto il: mercoledì 7 novembre 2012, 10:59

Re: Macro che funziona sul foglio visualizzato

Messaggio da amax »

patel ha scritto:Ci ho ripensato, guarda sopra
ho letto ma purtroppo non riesco da solo ad integrarlo in quello che sto usando. Posso osare chiderti se puoi integrarlo, perchè va ben oltre le mie competenze, capisco il codice ma non so proprio come fare.

Grazie
macOS 14 Sonoma: LibreOffice 24.2.1
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Macro che funziona sul foglio visualizzato

Messaggio da patel »

allega un file di esempio su cui provare
-------------------
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
amax
Messaggi: 99
Iscritto il: mercoledì 7 novembre 2012, 10:59

Re: Macro che funziona sul foglio visualizzato

Messaggio da amax »

Grazie, ho aggiunto un file ZIP con la cartella ed i due file.

Spero che le indicazioni nel file siano chiare
Allegati
Test.zip
(29.99 KiB) Scaricato 143 volte
macOS 14 Sonoma: LibreOffice 24.2.1
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Macro che funziona sul foglio visualizzato

Messaggio da patel »

Non mi sembra la strada giusta usare .getDataArray e .setDataArray, io copierei un dato alla volta così:

Codice: Seleziona tutto

 Sheet.getCellRangeByName("B7").String = Preventivo.getCellRangeByName("A2").String
-------------------
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
amax
Messaggi: 99
Iscritto il: mercoledì 7 novembre 2012, 10:59

Re: Macro che funziona sul foglio visualizzato

Messaggio da amax »

Grazie, ho provata, ma non funziona, perchè cancella la cella principale e non la copia nel file di destinazioe.
Alleco codice inserito

Codice: Seleziona tutto

Sub SalvaDatiPreventivoInContabilta

Dim DocName as object, DocUlr as string, dummy(), range as object, sVar as Integer
sVar = MsgBox( "Vuoi proseguire per salvare i dati di questo preventivo nel file di contabilità?",   MB_YESNO )
If sVar = IDYES  Then
Doc = ThisComponent
sheet = Doc.currentcontroller.getActiveSheet() 'Seleziona il foglio visualizzato
sFileName ="/Users/nome-utente/Documents/Test/Test_Elenco_Preventivi.ods"  ' file destinazione
DocUrl = ConvertToURL(sFileName)
DocName = StarDesktop.loadComponentFromURL (DocUrl, "_blank",0, Dummy() )
Preventivo = DocName.Sheets.getbyname("Preventivi") ' il nome del foglio di destinazione
Cursore = Preventivo.createCursor
Cursore.gotoEndOfUsedArea(false)
UltimaRiga = Cursore.RangeAddress.EndRow
Riga = UltimaRiga + 2

Sheet.getCellRangeByName("C6").String = Preventivo.getCellRangeByName("A2").String ' range da copiare

DocName.store
DocName.Close(true)
MsgBox ("Preventivo aggiunto al file di contabilità")
Else
MsgBox ("Preventivo NON aggiunto al file di contabilità")
End If

End Sub
macOS 14 Sonoma: LibreOffice 24.2.1
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Macro che funziona sul foglio visualizzato

Messaggio da patel »

Allega i 2 file con dei dati e col risultato desiderato
-------------------
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
Avatar utente
lucky63
Volontario assiduo
Volontario assiduo
Messaggi: 2996
Iscritto il: martedì 18 maggio 2010, 17:01

Re: Macro che funziona sul foglio visualizzato

Messaggio da lucky63 »

Adegua la riga che inizia con sFileName al percorso sul tuo sistema operativo.
Notare le righe rimosse o modificate e soprattutto quelle aggiunte.

Codice: Seleziona tutto

Sub SalvaDatiPreventivoInContabilta

Dim DocName as object, DocUlr as string, dummy(), range as object, sVar as Integer
sVar = MsgBox( "Vuoi proseguire per salvare i dati di questo preventivo nel file di contabilità?",   MB_YESNO )
 
If sVar = IDYES  Then
Doc = ThisComponent
sheet = Doc.currentcontroller.getActiveSheet() 'Seleziona il foglio visualizzato
sFileName ="File:///home/NomeUtente/Scaricati/Test/Test/Test_Elenco_Preventivi.ods"  ' file destinazione Linux
'sFIleName = "File:///C:/Percorso/NomeFile.ods" 'file di destinazione Windows (sempre con barra rovescia)
DocUrl = ConvertToURL(sFileName)
DocName = StarDesktop.loadComponentFromURL (DocUrl, "_blank",0, Dummy() )
Preventivo = DocName.Sheets.getbyname("Preventivi") ' il nome del foglio di destinazione
Cursore = Preventivo.createCursor
Cursore.gotoEndOfUsedArea(false)
UltimaRiga = Cursore.RangeAddress.EndRow
Riga = UltimaRiga + 1
Preventivo.getCellByPosition(0,Riga).String = Sheet.getCellRangeByName("B7").String
Preventivo.getCellByPosition(1,Riga).String = Sheet.getCellRangeByName("D1").String
Preventivo.getCellByPosition(2,Riga).String = Sheet.getCellRangeByName("C6").String
Preventivo.getCellByPosition(3,Riga).Value = Sheet.getCellRangeByName("F39").Value
DocName.store
DocName.Close(true)
MsgBox ("Preventivo aggiunto al file di contabilità")
Else
MsgBox ("Preventivo NON aggiunto al file di contabilità")
End If

End Sub
Allego riscontro avvenuta trascrizione dati.
.
Allegati
Test1.zip
(31.49 KiB) Scaricato 98 volte
amax
Messaggi: 99
Iscritto il: mercoledì 7 novembre 2012, 10:59

Re: Macro che funziona sul foglio visualizzato

Messaggio da amax »

Grazie Mille, ottimo.
Naturalmente la soluzione che avevo adottato (con il codice che avevo prima) era qella di mettere in ordine tutti idati in celle nascoste e farle copiare.
Mi sono intestardito per avere una soluzione più tecnica per poter imparare e non trovare sempre l'alternativa più fiacile.

Ringrazio tutti
macOS 14 Sonoma: LibreOffice 24.2.1
amax
Messaggi: 99
Iscritto il: mercoledì 7 novembre 2012, 10:59

Re: Macro che funziona sul foglio visualizzato

Messaggio da amax »

lucky63 ha scritto:.
Ricordati di inserire il [Risolto] come previsto
.
Non l'ho ancora fatto perchè sto facendo delle prove e per informazioni a chi legge:
  • Qeusto codice accoda i dati nelle celle vuote, questo vuol dire che se avete celle vuote ma con dei semplici bordi, i bordi vengono considerati come celle occupate (non so se è giusto utilizzare questo termni, ma non me ne vengono altri).
macOS 14 Sonoma: LibreOffice 24.2.1
Avatar utente
lucky63
Volontario assiduo
Volontario assiduo
Messaggi: 2996
Iscritto il: martedì 18 maggio 2010, 17:01

Re: Macro che funziona sul foglio visualizzato

Messaggio da lucky63 »

Sostituisci questo codice:

Codice: Seleziona tutto

Cursore = Preventivo.createCursor
Cursore.gotoEndOfUsedArea(false)
UltimaRiga = Cursore.RangeAddress.EndRow
Riga = UltimaRiga + 1
Con questo codice:

Codice: Seleziona tutto

REM ---Loop che controlla celle di colonna A ...
'incrementando il valore della variabile “Riga” fino a trovare il valore della prima riga libera
Riga = 1
Do while Preventivo.getCellByPosition(0,Riga).string <> ""
Riga = Riga + 1
Loop
Allego esito dei test fatti
.
Allegati
Test2.zip
(33.61 KiB) Scaricato 100 volte
amax
Messaggi: 99
Iscritto il: mercoledì 7 novembre 2012, 10:59

Re: Macro che funziona sul foglio visualizzato

Messaggio da amax »

Ottimo lucky63, pèroprio quello che cercavo, visto che ho il file con una serie di Confronta, almeno non devo cambiare il file per il 2020. Va da se che facendo fare tutto alla macro non mi serveno più tutti i Confronta e calcoli vari, quindi il file del 2021 sarà molto più semplince.

Adesso esagero, pure perchè sta diventando una enciclopedia, ma visto che la mia richiesta iniziale era basata sul impostare la macro sul foglio attivo "getActiveSheet()", esiste un modo per dire alla macro di andare a prendere il nome del foglio di destinazione direttamente dal foglio principale?
Mi spiego meglio, visto che quello che "abbiamo" scritto è stato fatto per il preventivo e quindi copia i dati nel foglio di destinazione "Preventivo" e lo indichiamo con

Codice: Seleziona tutto

Preventivo = DocName.Sheets.getbyname("Preventivo") ' il nome del foglio di destinazione
Visto che nello stesso file ho anche il foglio della fattura e per non riscrivere tutta la macro cambiando "Preventivo" con "Fattura" mi chiedo se esiste un modo per sostituire il codice sopra indicato con qualcosa del tipo (INVENTO)

Codice: Seleziona tutto

Preventivo = DocName.Sheets.getbyname("A15") ' il nome del foglio di destinazione
Dove in "A15" è segnato per il preventivo "Preventivo" e per la fattura "Fattura". Naturalmente il file di destinazione avrà i due fogli "Preventivo" e "Fattura"

Grazie e se ritenete che sia meglio iniziare una nuova discussione lo faccio, anche se credo che con questo la discussione è più completa.
macOS 14 Sonoma: LibreOffice 24.2.1
Avatar utente
lucky63
Volontario assiduo
Volontario assiduo
Messaggi: 2996
Iscritto il: martedì 18 maggio 2010, 17:01

Re: Macro che funziona sul foglio visualizzato

Messaggio da lucky63 »

Ho fatto qualche cambiamento veloce e forse il codice si poteva impostare meglio.
Test archiviazione fatti acquisendo "Preventivo" o "Fattura" da cella B6 (che puoi impostare da menu a tendina per selezionare la voce desiderata).
Allegati
Test3.zip
(33.83 KiB) Scaricato 103 volte
amax
Messaggi: 99
Iscritto il: mercoledì 7 novembre 2012, 10:59

Re: Macro che funziona sul foglio visualizzato

Messaggio da amax »

Va be, ma così mi state viziando ;) ;) ;)
Sempre per migliorare il codice ho modificato il testo nei messaggi da così

Codice: Seleziona tutto

sVar = MsgBox( "Vuoi continuare con il salvataggio [ " & NomeFoglioArchivio & " ]  nel file di contabilità?",   MB_YESNO )
a così

Codice: Seleziona tutto

sVar = MsgBox( "Vuoi continuare con il salvataggio [ " & NomeFoglioArchivio &  " " & sheet.getCellRangeByName("A14").string & " ]  nel file di contabilità?",   MB_YESNO )
così si ha anche il numero della Fattura o Preventivo

Grazie
macOS 14 Sonoma: LibreOffice 24.2.1
Rispondi