Piccolo Gestionale con Macro

Creare una macro - Scrivere uno script - Usare le API
Rispondi
sanraff
Messaggi: 316
Iscritto il: sabato 27 ottobre 2012, 14:08

Piccolo Gestionale con Macro

Messaggio da sanraff »

Buongiorno a tutti, al file di cui allego esempio, volevo realizzare un piccolo gestionale con l'uso di macro.
Premetto che ne esiste già una collegata al pulsante, che ho trovato all'interno di questo forum, però quest'ultima dà la possibilità di riportare i dati dal foglio1 al foglio2, mentre io vorrei che la cosa avvenisse nella stessa pagina come visibile dal file, cioè i dati di sinistra riportarli nella tabella di destra, premetto che è ancora in fase di sviluppo e questa è solo la partenza.
C'è qualcuno che mi può spiegare come va modificata la macro?

Spero di esser stato chiaro e ringrazio anticipatamente a chi mi darà una mano.
Allegati
Piccolo Gestionale.ods
(19.03 KiB) Scaricato 201 volte
OpenOffice 3.3 SU WINDOWS 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Piccolo Gestionale con Macro

Messaggio da patel »

la macro è molto semplice da capire, basta un po' di buona volontà, hai fatto qualche tentativo per modificarla ? cosa non capisci ?
per ottenere l'ultima riga occupata della colonna M devi utilizzare una funzione di questo tipo

Codice: Seleziona tutto

Function  LastRowNumberinColumn(oSheet, numcol) 
oCol = oSheet.getColumns().getByIndex(numcol)
rd = oCol.createReplaceDescriptor
rd.searchRegularExpression = true
rd.setSearchString(".")
find = oCol.FindAll(rd)
aray = Split(find.AbsoluteName,"$")
LastRowNumberinColumn = val(aray(ubound(Aray)))
end Function
che chiamerai con

Codice: Seleziona tutto

LastRow = LastRowNumberinColumn(Sh, 12)
-------------------
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
sanraff
Messaggi: 316
Iscritto il: sabato 27 ottobre 2012, 14:08

Re: Piccolo Gestionale con Macro

Messaggio da sanraff »

Ciao patel,
patel ha scritto:la macro è molto semplice da capire, basta un po' di buona volontà, hai fatto qualche tentativo per modificarla ? cosa non capisci ?
Premetto che prima di scrivere al forum, avevo già fatto delle prove, ed avevo corretto la macro in questo modo:

Codice: Seleziona tutto

Sub Main
Dim Doc As Object, Sh As Object
Doc = ThisComponent
Sh = Doc.Sheets.getByName("Foglio1")
c = Sh.createCursor
c.gotoEndOfUsedArea(false)
LastRow = c.RangeAddress.EndRow +1

Sh.getCellRangeByName("M6",  LastRow).String = Sh.getCellRangeByName("D2").String
Sh.getCellRangeByName("N6",  LastRow).String = Sh.getCellRangeByName("D4").String
Sh.getCellRangeByName("O6",  LastRow).String = Sh.getCellRangeByName("D6").Value
Sh.getCellRangeByName("P6",  LastRow).String = Sh.getCellRangeByName("D8").Value
Sh.getCellRangeByName("Q6",  LastRow).String = Sh.getCellRangeByName("D12").Value
Sh.getCellRangeByName("R6",  LastRow).String = Sh.getCellRangeByName("D18").Value
Sh.getCellRangeByName("S6",  LastRow).String = Sh.getCellRangeByName("D20").Value 
Sh.getCellRangeByName("T6",  LastRow).String = Sh.getCellRangeByName("D21").String

Sh.getCellRangeByName("D2:D10").ClearContents(4+1)

End Sub
e per errore avevo postato il file sbagliato, di cui allego quello corretto.

Quello che non riesco ad ottenere è la successione della scrittura nelle righe a partire dalla colonna M12 riga M6, cioè non avviene il

Codice: Seleziona tutto

"LastRow = c.RangeAddress.EndRow +1"
, ad ogni pressione del pulsante, la riga viene sovrascritta e non ho capito come si fa a realizzare la successione.

Ho provato anche a sostituire questa stringa:

Codice: Seleziona tutto

Sh.getCellByPosition("M6",  LastRow).String = Sh.getCellRangeByName("D2").String
con questa

Codice: Seleziona tutto

Sh.getCellByPosition(12,  LastRow).String = Sh.getCellRangeByName("D2").String
però il record a partire dalla colonna M12 viene posizionato in Riga M22 e non è quello che vorrei realizzare io.

Ho dato una lettura anche alla macro da te suggerita, però non ho capito come applicarla al mio file.

E' possibile sapere come devo modificare la mia macro?, e nel caso in cui dovesse essere sostituita dalla tua, come va applicata?, grazie
Allegati
Piccolo Gestionale1.ods
(19.36 KiB) Scaricato 189 volte
OpenOffice 3.3 SU WINDOWS 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Piccolo Gestionale con Macro

Messaggio da patel »

tu vai proprio a caso con le modifiche, ti avevo dato il suggerimento ma non ci hai neppure provato, prova così

Codice: Seleziona tutto

Sub Main
If MsgBox("Vuoi aggiungere nuova riga ? ", 32+4, "AGGIUNGI RIGA") = 7 Then Exit Sub

Dim Doc As Object, Sh As Object, Sh2 As Object
Dim LastRow As Long
Doc = ThisComponent
Sh = Doc.Sheets.getByName("Foglio1")
LastRow = LastRowNumberinColumn(Sh, 12)

Sh.getCellByPosition(12,  LastRow).String = Sh.getCellRangeByName("D2").String 
Sh.getCellByPosition(13,  LastRow).String = Sh.getCellRangeByName("D4").String 
Sh.getCellByPosition(14,  LastRow).Value = Sh.getCellRangeByName("D6").Value
Sh.getCellByPosition(15,  LastRow).Value = Sh.getCellRangeByName("D8").Value
Sh.getCellByPosition(16,  LastRow).Value = Sh.getCellRangeByName("D12").Value
Sh.getCellByPosition(17,  LastRow).Value = Sh.getCellRangeByName("D18").Value
Sh.getCellByPosition(18,  LastRow).Value = Sh.getCellRangeByName("D20").Value

'Sh.getCellRangeByName("D2:D10").ClearContents(4+1)
End Sub

Function  LastRowNumberinColumn(oSheet, numcol) ' la migliore
oCol = oSheet.getColumns().getByIndex(numcol)
rd = oCol.createReplaceDescriptor
rd.searchRegularExpression = true
rd.setSearchString(".")
find = oCol.FindAll(rd)
aray = Split(find.AbsoluteName,"$")
LastRowNumberinColumn = val(aray(ubound(Aray)))
end Function
-------------------
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