[Risolto] - Macro che funziona sul foglio visualizzato
[Risolto] - Macro che funziona sul foglio visualizzato
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
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.
Motivazione: Aggiunta ✔ verde.
macOS 14 Sonoma: LibreOffice 24.2.1
Re: Macro che funziona sul foglio visualizzato
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
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
Re: Macro che funziona sul foglio visualizzato
Ottimo, grazie
Un solo appunto non ha funzionato con ma con.
Non so il perchè ma può essere utile ad altri.
Grazie ancora Patel
Un solo appunto non ha funzionato con
Codice: Seleziona tutto
sh = Doc.currentcontroller.getActiveSheet()
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
Re: Macro che funziona sul foglio visualizzato
Adesso sto usando questo
e se volessi usare come range non solo D1 ma D1 e F3 ecc, come dovrei compilarlo?
Grazie
Codice: Seleziona tutto
Doc = ThisComponent
sheet = Doc.currentcontroller.getActiveSheet() 'Seleziona il foglio visualizzato
Range = Sheet.getCellRangeByName("D1").getDataArray ' range da copiare
Grazie
macOS 14 Sonoma: LibreOffice 24.2.1
Re: Macro che funziona sul foglio visualizzato
Per essere più chiaro, sto usando questo
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, ho provato con la "," ma non funziona
Grazie
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
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
Grazie
macOS 14 Sonoma: LibreOffice 24.2.1
Re: Macro che funziona sul foglio visualizzato
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
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
Re: Macro che funziona sul foglio visualizzato
Nooooo, un mito come te che mi da una risposta secca mi fa perdere ogni speranza.patel ha scritto:domanda cattiva, non so rispondere
Grazie
macOS 14 Sonoma: LibreOffice 24.2.1
Re: Macro che funziona sul foglio visualizzato
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
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
Re: Macro che funziona sul foglio visualizzato
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.patel ha scritto:Ci ho ripensato, guarda sopra
Grazie
macOS 14 Sonoma: LibreOffice 24.2.1
Re: Macro che funziona sul foglio visualizzato
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
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
Re: Macro che funziona sul foglio visualizzato
Grazie, ho aggiunto un file ZIP con la cartella ed i due file.
Spero che le indicazioni nel file siano chiare
Spero che le indicazioni nel file siano chiare
- Allegati
-
- Test.zip
- (29.99 KiB) Scaricato 143 volte
macOS 14 Sonoma: LibreOffice 24.2.1
Re: Macro che funziona sul foglio visualizzato
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
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
Re: Macro che funziona sul foglio visualizzato
Grazie, ho provata, ma non funziona, perchè cancella la cella principale e non la copia nel file di destinazioe.
Alleco codice inserito
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
Re: Macro che funziona sul foglio visualizzato
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
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
Re: Macro che funziona sul foglio visualizzato
Adegua la riga che inizia con sFileName al percorso sul tuo sistema operativo.
Notare le righe rimosse o modificate e soprattutto quelle aggiunte.
Allego riscontro avvenuta trascrizione dati.
.
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
.
- Allegati
-
- Test1.zip
- (31.49 KiB) Scaricato 98 volte
Re: Macro che funziona sul foglio visualizzato
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
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
Re: Macro che funziona sul foglio visualizzato
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
Re: Macro che funziona sul foglio visualizzato
Sostituisci questo codice:
Con questo codice:
Allego esito dei test fatti
.
Codice: Seleziona tutto
Cursore = Preventivo.createCursor
Cursore.gotoEndOfUsedArea(false)
UltimaRiga = Cursore.RangeAddress.EndRow
Riga = UltimaRiga + 1
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
.
- Allegati
-
- Test2.zip
- (33.61 KiB) Scaricato 100 volte
Re: Macro che funziona sul foglio visualizzato
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
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)
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.
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
Codice: Seleziona tutto
Preventivo = DocName.Sheets.getbyname("A15") ' il nome del foglio di destinazione
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
Re: Macro che funziona sul foglio visualizzato
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).
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
Re: Macro che funziona sul foglio visualizzato
Va be, ma così mi state viziando
Sempre per migliorare il codice ho modificato il testo nei messaggi da così
a così
così si ha anche il numero della Fattura o Preventivo
Grazie
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 )
Codice: Seleziona tutto
sVar = MsgBox( "Vuoi continuare con il salvataggio [ " & NomeFoglioArchivio & " " & sheet.getCellRangeByName("A14").string & " ] nel file di contabilità?", MB_YESNO )
Grazie
macOS 14 Sonoma: LibreOffice 24.2.1