Pannello di Controllo Moderatore ]

[Risolto] copia-incolla Range

Creare una macro - Scrivere uno script - Usare le API

[Risolto] copia-incolla Range

Messaggioda epico » mercoledì 8 maggio 2019, 17:39

Salve, stò già utilizzando questa macro:

Codice: Seleziona tutto   Espandi visualeStringi visuale
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 7 volte
Ultima modifica di epico il giovedì 9 maggio 2019, 14:33, modificato 1 volta in totale.
OpenOffice 4.1 su Win10
epico
 
Messaggi: 44
Iscritto il: mercoledì 4 giugno 2014, 11:53

Re: copia-incolla Range

Messaggioda patel » mercoledì 8 maggio 2019, 17:53

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.
-------------------
OpenOffice 4.1 e Libre Office 6.o.7.3 su Windows 10
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
patel
Volontario attivo
Volontario attivo
 
Messaggi: 3275
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: copia-incolla Range

Messaggioda epico » mercoledì 8 maggio 2019, 20:16

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: 44
Iscritto il: mercoledì 4 giugno 2014, 11:53

Re: copia-incolla Range

Messaggioda epico » mercoledì 8 maggio 2019, 20:35

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
epico
 
Messaggi: 44
Iscritto il: mercoledì 4 giugno 2014, 11:53

Re: copia-incolla Range

Messaggioda patel » giovedì 9 maggio 2019, 6:52

prova questa
Codice: Seleziona tutto   Espandi visualeStringi visuale
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
-------------------
OpenOffice 4.1 e Libre Office 6.o.7.3 su Windows 10
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
patel
Volontario attivo
Volontario attivo
 
Messaggi: 3275
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: copia-incolla Range

Messaggioda epico » giovedì 9 maggio 2019, 14:28

:super:
OpenOffice 4.1 su Win10
epico
 
Messaggi: 44
Iscritto il: mercoledì 4 giugno 2014, 11:53


Torna a Macro e UNO API

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite