Pagina 1 di 1

[Risolto] Macro Sposta dati da una riga ad un altra

Inviato: giovedì 25 agosto 2016, 12:29
da Andrea Toniolo
Buongiorno a tutti,
Vi chiedo se fosse possibile avere un aiuto per scrivere una macro che automatizzi lo spostamento di dati da una riga ad un altra nello stesso foglio.
Mi spiego meglio:
Nel Foglio1, Range A1:D1 ho dei valori.
La Macro deve spostare i dati due righe più sotto (Range A3:D3), ripulire A1:D1 e al successivo inserimento deve scrivere i dati nella prima riga vuota.
Purtroppo non sono in grado di scriverla da solo, ho cercato nel forum ma ho trovato solo macro che fanno lo stesso lavoro che vorrei fare io ma da un foglio ad un altro e non sono riuscito a modificarla.

Vi ringrazio anticipatamente e spero di riuscire a risolvere questo problema

Re: Macro Sposta dati da una riga ad un altra

Inviato: giovedì 25 agosto 2016, 17:52
da patel
allega un file di esempio con i dati ed il risultato desiderato

Re: Macro Sposta dati da una riga ad un altra

Inviato: giovedì 25 agosto 2016, 18:19
da Andrea Toniolo
Ciao e grazie per l'interessamento,
in pratica come puoi vedere nell'esempio allegato, la macro attivabile dal pulsante, deve spostare i dati inseriti nel range di celle A2:D2 nella tabella sottostante andando a scrivere nella prima riga vuota e a pulire il range appena citato A2:D2.
Successivamente avevo pensato di agganciare una macro che allo stesso tempo li ordini in ordine di data, ma questo non dovrebbe essere un problema.

Rimango a disposizione per eventuali chiarimenti

Ancora Grazie

Re: Macro Sposta dati da una riga ad un altra

Inviato: giovedì 25 agosto 2016, 19:24
da patel
prova questa

Codice: Seleziona tutto

sub CopiaIncollaUltimaRiga 
Doc = ThisComponent
Sheet = Doc.Sheets(0)
LastRow =LastRowInColonna(Sheet,0) + 2
Sheet.getCellRangeByName("A" & Lastrow & ":D" & Lastrow).setDataArray(Sheet.getCellRangeByName("A2:D2").getDataArray
End Sub

Function LastRowInColonna(oSheet As Object, Col As Long) As Long
  Dim c As Object, oRangePiena As Object, LastRow As Long
  c = oSheet.createCursor
  c.gotoEndOfUsedArea(false)
  LastRow = c.RangeAddress.EndRow
  oRangePiena = oSheet.getCellRangeByPosition(Col, 0, Col, LastRow).queryContentCells(1+2+4).RangeAddresses
  If Ubound(oRangePiena) < 0 Then
       LastRowInColonna = - 1
  Else   
       LastRowInColonna = oRangePiena(Ubound(oRangePiena)).EndRow
  End if 
End Function

Re: Macro Sposta dati da una riga ad un altra

Inviato: giovedì 25 agosto 2016, 22:02
da Andrea Toniolo
Grazie,
Domani la provo e ti faccio sapere
Buona serata

Re: Macro Sposta dati da una riga ad un altra

Inviato: venerdì 26 agosto 2016, 8:38
da Andrea Toniolo
Ciao,
Ho provato la tua Macro che in linea di massima va bene, solo che non riesco ad adattarla al mio reale foglio, sono alle prime armi con Calc ed è più difficile di quello che pensavo :-(.
Potresti per cortesia aiutarmi ad adattarlo al reale foglio?
I dati vengono scritti nel Range di Celle E4:O4 e devono essere spostati dalla prima riga sottostante E5:O5.
Inoltre dovendo pensavo di creare con il registratore di Macro anche una macro che cancella i dati nella riga iniziale dopo averli spostati e una che ordina i dati nella tabella per data, ti volevo chiedere come fare ad eseguire contemporaneamente più macro con lo stesso comando, con excel ero in grado di farlo, funziona nello stesso modo?
Allego il nuovo esempio e ti ringrazio per la tua disponibilità e pazienza

Buona giornata

Re: Macro Sposta dati da una riga ad un altra

Inviato: venerdì 26 agosto 2016, 14:00
da patel
il basic di Calc è molto diverso ed il registratore di macro produce codice incomprensibile e spesso non funzionante.
un buon testo è http://www.pitonyak.org/oo.php

Codice: Seleziona tutto

sub CopiaIncollaUltimaRiga
Doc = ThisComponent
Sheet = Doc.Sheets.getByName("prova") 
LastRow =LastRowInColonna(Sheet,4) + 2 ' 4 indica la colonna E (su calc la numerazione inizia da zero)
Sheet.getCellRangeByName("E" & Lastrow & ":O" & lastrow).setDataArray(Sheet.getCellRangeByName("E4:O4").getDataArray
End Sub
la copia di un range non copia i formati, quindi predisponi la tabella con i formati corretti

Re: Macro Sposta dati da una riga ad un altra

Inviato: sabato 27 agosto 2016, 7:56
da Andrea Toniolo
Ciao
Ho provato la nuova macro ma mi da un errore che puoi vedere nell'allegato.
GRazie anche per le altre utili indicazioni

Re: Macro Sposta dati da una riga ad un altra

Inviato: sabato 27 agosto 2016, 9:44
da patel
la nuova macro sostituisce la precedente pari nome e deve essere accompagnata dalla function che rimane immutata

Codice: Seleziona tutto

sub CopiaIncollaUltimaRiga
Doc = ThisComponent
Sheet = Doc.Sheets.getByName("prova")
LastRow =LastRowInColonna(Sheet,4) + 2 ' 4 indica la colonna E (su calc la numerazione inizia da zero)
Sheet.getCellRangeByName("E" & Lastrow & ":O" & lastrow).setDataArray(Sheet.getCellRangeByName("E4:O4").getDataArray
End Sub

Function LastRowInColonna(oSheet As Object, Col As Long) As Long
  Dim c As Object, oRangePiena As Object, LastRow As Long
  c = oSheet.createCursor
  c.gotoEndOfUsedArea(false)
  LastRow = c.RangeAddress.EndRow
  oRangePiena = oSheet.getCellRangeByPosition(Col, 0, Col, LastRow).queryContentCells(1+2+4).RangeAddresses
  If Ubound(oRangePiena) < 0 Then
       LastRowInColonna = - 1
  Else   
       LastRowInColonna = oRangePiena(Ubound(oRangePiena)).EndRow
  End if 
End Function

Re: Macro Sposta dati da una riga ad un altra

Inviato: lunedì 29 agosto 2016, 14:20
da Andrea Toniolo
Ciao,
Grazie per la correzione, non avevo capito.
Ora la macro funziona correttamente e sono riuscito anche a registrare le altre due che ordinano per data la tabella e puliscono la prima riga.
Per eseguirle contemporaneamente ho creato una quarta macro che richiama le prime tre in ordina:
Call CopiaSotto
Call Ordina
Call Pulisci PrimaRiga
Grazie ancora del tuo preziosissimo supporto e di tutti quelli come te che si dedicano a questo utilissimo Forum.

Buona giornata a tutti