You are viewing a plain text version of this content. The canonical link for it is here.
Posted to utenti-it@openoffice.apache.org by "M. Manca" <m....@micronengineering.it> on 2012/04/24 16:27:55 UTC

[utenti] Inserire e copiare una riga del foglio corrente di calc

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.

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.


Re: [utenti] Inserire e copiare una riga del foglio corrente di calc

Posted by beppe <gi...@tin.it>.
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.