[Risolto] copia-incolla Range

Creare una macro - Scrivere uno script - Usare le API
Rispondi
epico
Messaggi: 58
Iscritto il: mercoledì 4 giugno 2014, 11:53

[Risolto] copia-incolla Range

Messaggio da epico »

Salve, stò già utilizzando questa macro:

Codice: Seleziona tutto

Sub Go
REM copia-incolla Range 

Doc = ThisComponent
Dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
Frame1 = Doc.CurrentController.Frame

Sheet1 = Doc.Sheets(0)
Sheet2 = Doc.Sheets(1)

Col1 = Sheet1.getColumns().getByIndex(3) ' colonna D Foglio1
Col2 = Sheet2.getColumns().getByIndex(3) ' colonna D  Foglio2

 Range2 = Col2.queryEmptyCells.RangeAddresses
 LastRow2 = Range2(0).StartRow 

 Range22 = Sheet2.getCellRangeByName("A3:F" & LastRow2) 
 Doc.CurrentController.Select(Range22)
 Dispatcher.executeDispatch(Frame1, ".uno:Copy", "", 0, Array())

 Range1 = Col1.queryEmptyCells.RangeAddresses
 LastRow1 = Range1(0).StartRow +1

 CellAddress = Sheet1.getCellRangeByName("A" & LastRow1) 
 Doc.CurrentController.Select(CellAddress)
 Dispatcher.executeDispatch(Frame1, ".uno:Paste", "", 0, Array())

end sub
copia un range nel Foglio2 e l'incolla nel Foglio1 nella colonna A alla fine dei dati (in base alla colonna D)
uso la colonna D di riferimento perchè è l'unica piena di dati

Il problema è che dovrei lasciare la cella D1 vuota e si incasina (se metto un carattere da risultare piena – funziona correttamente)

sostituendo
Range1 = Col1.queryEmptyCells.RangeAddresses
LastRow1 = Range1(0).StartRow +1

con
c = Sheet1.createCursor
c.gotoEndOfUsedArea(false)
LastRow1 = c.RangeAddress.EndRow + 2

sarebbe ok ma si incasina ugualmente perchè a destra della colonna G ci sono degli altri dati

Grazie
Allegati
Prova-1.ods
(17.63 KiB) Scaricato 155 volte
Ultima modifica di epico il giovedì 9 maggio 2019, 14:33, modificato 1 volta in totale.
OpenOffice 4.1 su Win10
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: copia-incolla Range

Messaggio da patel »

non è molto chiaro, anche perché nell'esempio allegato il foglio 1 è vuoto, comunque se ho capito bene tu vuoi una funzione che trova l'ultima cella piena di una determinata colonna.
-------------------
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
epico
Messaggi: 58
Iscritto il: mercoledì 4 giugno 2014, 11:53

Re: copia-incolla Range

Messaggio da epico »

Se fai partire la macro prende i dati dal Foglio2 e li mette nel Foglio1 a partire dalla colonna A ma in base ai dati già inseriti secondo la colonna D perchè è l'unica colonna con tutte le righe piene
Quindi adesso che non ci sono ancora dati deve partire da A3
Dopo sempre dalla colonna A ma come discriminante la colonna D

Mi rendo conto che può sembrare un ragionamento un pò contorto... :ucrazy:
OpenOffice 4.1 su Win10
epico
Messaggi: 58
Iscritto il: mercoledì 4 giugno 2014, 11:53

Re: copia-incolla Range

Messaggio da epico »

Nel Foglio2 non ho problemi a selezionare il range in base alla colonna D perchè la cella D1 c'è un trattino

Nel Foglio1 avrei la necessità di lasciare la cella D1 vuota, e come funziona adesso la macro mi mette i dati in A1
OpenOffice 4.1 su Win10
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: copia-incolla Range

Messaggio da patel »

prova questa

Codice: Seleziona tutto

Sub Go
REM copia-incolla Range 

Doc = ThisComponent
Dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
Frame1 = Doc.CurrentController.Frame

Sheet1 = Doc.Sheets(0)
Sheet2 = Doc.Sheets(1)

Col1 = Sheet1.getColumns().getByIndex(3) ' colonna D Foglio1
Col2 = Sheet2.getColumns().getByIndex(3) ' colonna D  Foglio2

 Range2 = Col2.queryEmptyCells.RangeAddresses
 LastRow2 = Range2(0).StartRow 

 Range22 = Sheet2.getCellRangeByName("A3:F" & LastRow2) 
 Doc.CurrentController.Select(Range22)
 Dispatcher.executeDispatch(Frame1, ".uno:Copy", "", 0, Array())

' Range1 = Col1.queryEmptyCells.RangeAddresses
 LastRow1 = LastRowInColumn(Sheet1,3) + 2
 CellAddress = Sheet1.getCellRangeByName("A" & LastRow1) 
 Doc.CurrentController.Select(CellAddress)
 Dispatcher.executeDispatch(Frame1, ".uno:Paste", "", 0, Array())

end sub
Function LastRowInColumn(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
       LastRowInColumn = - 1
  Else   
       LastRowInColumn = oRangePiena(Ubound(oRangePiena)).EndRow
  End if 
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
epico
Messaggi: 58
Iscritto il: mercoledì 4 giugno 2014, 11:53

Re: copia-incolla Range

Messaggio da epico »

:super:
OpenOffice 4.1 su Win10
Rispondi