Il 24/04/2012 16:27, M. Manca ha scritto:
Vorrei mettere mano per l'ultima volta al foglio di calc con cui
gestisco la prima nota e ho 3 problemi sicuramente banalissimi per gli
esperti ma che mi stanno creando un po di grattacapi con
LibreOffice/OpenOffice.

1. Il foglio di prima nota lo ottengo da 2 fogli più complessi (SPESE e
RICAVI) dove grazie a qualche combo e qualche funzione CERCA posso
inserire degli altri dati per attribuire la spesa ad un centro di costo
piuttosto che ad un altro, il resto dei dati vengono inseriti manualmente.
La fonte di errore maggiore è l'aggiunta di una nuova riga che così
facendo non aggiorna totali ed altri calcoli (funziona inserendo una
nuova riga). Vorrei creare un bottone che mi inserisca prima dell'ultima
riga dati (sempre vuota e colorata per identificarla) una riga con dei
valori di default. Per farlo dopo la riga colorata ho aggiunto una riga
"modello" contenente le formule che mi servono, poi visto che non sono
esperto di OpenOffice Basic con il Registratore Macro ho provato a
registrare manualmente la macro facendo così:

a. metto il cursore sulla riga prima della quale voglio inserire la riga
nuova e attivo il registratore di macro
b. inserisco una riga vuota
c. sposto il cursore sulla riga "modello", la seleziono, clicco con il
tasto destro e seleziono Copia
d. sposto il cursore sulla riga vuota, la seleziono, clicco con il tasto
destro e seleziono Incolla
e. termino la registrazione

così mi inserisce sempre una riga vuota, ho provato anche con Incolla
Speciale selezionando tutto ma non cambia.

Quindi ho bisogno di qualche "dritta" per sapere dove ho sbagliato
oppure di qualche "dritta" su come inserire e copiare una riga da codice
OOo Basic.
Dovrebbe funzionare inserendo una riga vuota prima della penultima riga del foglio,
copiare l'ultima riga del foglio stesso e incollarla nella riga vuota.
Provala con attenzione prima di usarla, magari non ho capito bene cosa ti serve.
La riga msgbox serviva per leggere la variabile durante le prove .

ciao
Beppe


REM  *****  BASIC  *****

Sub nuova_riga
Dim Doc As Object
Dim Sheet As Object
Dim NewRow As Object

Doc = StarDesktop.CurrentComponent
Sheet = Doc.Sheets(0)

rem inserisce una riga vuota sopra la penultima riga
Sheet.Rows.insertByIndex(getLastUsedRow(Sheet)-1, 1)

rem copia la riga del modello con le formule
copia_riga_modello

End Sub

rem ultima riga usata nel foglio
Function getLastUsedRow(oSheet) as Integer
Dim oCell
Dim oCursor
Dim oAddress
Dim oSheet
oSheet = ThisComponent.Sheets.getByIndex( 0 )
oCell = oSheet.GetCellbyPosition( 0, 0 )
oCursor = oSheet.createCursorByRange(oCell)
oCursor.GotoEndOfUsedArea(True)
oAddress = oCursor.RangeAddress
GetLastUsedRow = oAddress.EndRow
rem msgbox GetLastUsedRow
End Function

rem ultima colonna usata nel foglio
Function getLastUsedColumn(oSheet as Object) as Integer
Dim oCell As Object
Dim oCursor As Object
Dim aAddress As Variant
Dim oSheet
 oSheet = ThisComponent.Sheets.getByIndex( 0 )
 oCell = oSheet.GetCellbyPosition( 0, 0 )
 oCursor = oSheet.createCursorByRange(oCell)
 oCursor.GotoEndOfUsedArea(True)
 aAddress = oCursor.RangeAddress
 GetLastUsedColumn = aAddress.EndColumn
rem  msgbox GetLastUsedColumn
End Function


rem seleziona le celle e le copia dopo aver inserito una riga sopra la penultima
Function copia_riga_modello
   Dim oCellDest As Object
   Dim oRangeSrc As New com.sun.star.table.CellRangeAddress
   Dim Doc As Object
   Dim Sheet As Object

   Doc = StarDesktop.CurrentComponent
   Sheet = Doc.Sheets(0)
rem qui in base a cosa e dove dovrai copiare le formule cambierai i parametri oCellDest = Sheet.GetCellByPosition( 0, getLastUsedRow(Sheet)-2 ).CellAddress oRangeSrc = Sheet.getCellRangeByPosition( 0, getLastUsedRow(Sheet), getLastUsedColumn(Sheet), getLastUsedRow(Sheet)).RangeAddress
   Sheet.CopyRange(oCellDest, oRangeSrc)

End Function

2. Per ragioni di verifica vorrei generare da foglio delle SPESE e dal
foglio RICAVI l'equivalente dei registri IVA acquisti e vendite.
L'idea è di creare una funzione basic attivata alla fine
dell'inserimento di una riga (va benissimo una casella di controllo
posta in ultima colonna in ogni riga del foglio) che copi un
sottoinsieme delle celle della riga del foglio SPESE nel foglio TEST IVA
ACQUISTI.

Ovviamente ho lo stesso problema della funzione di cui al punto 1.

3. Esiste qualche modo per riempire un foglio (destinazione) con dei
dati provenienti da un altro foglio opportunamente filtrati? Ad esempio
se in un foglio ho più righe di dati contenenti nella colonna C lo
stesso dato vorrei che nel nuovo foglio vi fosse un'unica riga con in
colonna C il dato comune ed in colonna D la somma dei valori contenuti
nella colonna G del foglio originale. Vorrei che aggiungendo una riga
nel foglio origine automaticamente venissero aggiornati i dati nel
foglio destinazione.
--

le nuvole non hanno regole,
perchè non hanno mai rinunciato
alla libertà di sognare.


REM  *****  BASIC  *****

Sub nuova_riga
Dim Doc As Object
Dim Sheet As Object
Dim NewRow As Object

Doc = StarDesktop.CurrentComponent
Sheet = Doc.Sheets(0)

Sheet.Rows.insertByIndex(getLastUsedRow(Sheet)-1, 1)
copia_riga_modello

End Sub

rem ultima riga usata nel foglio
Function getLastUsedRow(oSheet) as Integer
Dim oCell
Dim oCursor
Dim oAddress
Dim oSheet
oSheet = ThisComponent.Sheets.getByIndex( 0 )
oCell = oSheet.GetCellbyPosition( 0, 0 )
oCursor = oSheet.createCursorByRange(oCell)
oCursor.GotoEndOfUsedArea(True)
oAddress = oCursor.RangeAddress
GetLastUsedRow = oAddress.EndRow
rem msgbox GetLastUsedRow
End Function

rem ultima colonna usata nel foglio
Function getLastUsedColumn(oSheet as Object) as Integer
Dim oCell As Object
Dim oCursor As Object
Dim aAddress As Variant
Dim oSheet
 oSheet = ThisComponent.Sheets.getByIndex( 0 )
 oCell = oSheet.GetCellbyPosition( 0, 0 )
 oCursor = oSheet.createCursorByRange(oCell)
 oCursor.GotoEndOfUsedArea(True)
 aAddress = oCursor.RangeAddress
 GetLastUsedColumn = aAddress.EndColumn
rem  msgbox GetLastUsedColumn
End Function


rem seleziona le celle e le copia dopo aver inserito una riga sopra la penultima
Function copia_riga_modello
   Dim oCellDest As Object
   Dim oRangeSrc As New com.sun.star.table.CellRangeAddress
   Dim Doc As Object
   Dim Sheet As Object

   Doc = StarDesktop.CurrentComponent
   Sheet = Doc.Sheets(0)
   oCellDest = Sheet.GetCellByPosition( 0, getLastUsedRow(Sheet)-2 ).CellAddress
   oRangeSrc = Sheet.getCellRangeByPosition( 0, getLastUsedRow(Sheet), 
getLastUsedColumn(Sheet), getLastUsedRow(Sheet)).RangeAddress
   Sheet.CopyRange(oCellDest, oRangeSrc)

End Function


---------------------------------------------------------------------
Per cancellarsi: [email protected]
Per informazioni: http://www.openoffice.org/it/
Per avviare una nuova discussione: [email protected]
Archivi: http://mail-archives.apache.org/mod_mbox/incubator-ooo-utenti-it

Rispondere a