[RISOLTO] macro Copia celle visibili e valori di incolla

Creare una macro - Scrivere uno script - Usare le API
Rispondi
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

[RISOLTO] macro Copia celle visibili e valori di incolla

Messaggio da chimico »

saluti

         Sto cercando una macro per copiare le celle filtrate per filtro automatico nel foglio di lavoro 1, cioè celle visibili e Incolla automaticamente valori non formattati nel foglio di lavoro 2
 
         a causa della grande quantità di linee e celle filtrate, è meglio fare operazioni con Macro

         Sto già provando a fare Macro, ma non ottengo la perfezione, quindi chiedo aiuto per te


Dettagli del problema

         nel foglio di lavoro 1 ha un filtro automatico dalla colonna A alla colonna Z, alcune colonne vengono filtrate

         la Macro deve copiare le celle visibili dalla colonna A alla colonna E, incolla i valori nella prima cella vuota della colonna A nel foglio di lavoro 2

         tornare al foglio di lavoro 1 e copiare le celle visibili dalla colonna "I" alla colonna "L" e incollare i valori nella prima cella vuota della colonna F in foglio di lavoro 2

         tornare al foglio di lavoro 1 e copiare le celle visibili dalla colonna "U" alla colonna W e incollare i valori nella prima cella vuota della colonna "J" nel foglio di lavoro 2

         infine, tornare al foglio di lavoro 1 e annullare tutti i filtri, ovvero pulire i filtri


Link Ho cercato di aiutare

https://forum.openoffice.org/en/forum/v ... 5&p=438954

https://forum.openoffice.org/en/forum/v ... 20&t=58810
        



Abbraccia gli amici
Ultima modifica di chimico il mercoledì 28 novembre 2018, 17:30, modificato 5 volte in totale.
LibreOffice 5.4.4.2 no Windows 7
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

Re: macro Copia celle visibili e valori di incolla

Messaggio da chimico »

Ho fatto delle ricerche e ho trovato un ottimo esempio di mr. "patel" sul seguente link

nome macro: sub filtracolonna ...

http://ooo-forums.apache.org/it/forum/v ... 94&p=49916

puoi aiutarmi ad adattare l'esempio di mr. "patel" al mio problema?


abbracci
LibreOffice 5.4.4.2 no Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: macro Copia celle visibili e valori di incolla

Messaggio da patel »

visto che hai letto quell'esempio dovresti aver notato che per prima cosa ho chiesto un file di esempio
-------------------
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
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

Re: macro Copia celle visibili e valori di incolla

Messaggio da chimico »

saluti sr. patel ,

segue un allegato di file di esempio

Grazie mille per la tua attenzione.
Allegati
Visibile.ods
(25.72 KiB) Scaricato 166 volte
LibreOffice 5.4.4.2 no Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: macro Copia celle visibili e valori di incolla

Messaggio da patel »

prova questa

Codice: Seleziona tutto

sub copiafiltro
   oDoc = ThisComponent
   sheet1= thiscomponent.sheets(0)
   sheet2= thiscomponent.sheets(1)
   oCursor = Sheet1.createcursor
   oCursor.gotoendofusedarea(false)
   nEndrow = oCursor.rangeaddress.Endrow
      
   rng=sheet1.getcellrangebyPosition(0,0,4,nEndrow)
   oRanges = rng.queryVisibleCells()
   oCell = Sheet2.getcellrangebyName("A1") ' destinazione
   oTargetRange = copyTiledRanges(oDoc, oRanges, oCell, bValues)
   sheet2.Columns.OptimalWidth  = True

   rng=sheet1.getcellrangebyPosition(8,0,11,nEndrow)
   oRanges = rng.queryVisibleCells()
   oCell = Sheet2.getcellrangebyName("F1") ' destinazione
   oTargetRange = copyTiledRanges(oDoc, oRanges, oCell, bValues)
   sheet2.Columns.OptimalWidth  = True

   rng=sheet1.getcellrangebyPosition(20,0,22,nEndrow)
   oRanges = rng.queryVisibleCells()
   oCell = Sheet2.getcellrangebyName("J1") ' destinazione
   oTargetRange = copyTiledRanges(oDoc, oRanges, oCell, bValues)
   sheet2.Columns.OptimalWidth  = True
'---------- ripristina il foglio1   
'  oFilterDesc = Sheet1.createFilterDescriptor(True)
'  Sheet1.filter(oFilterDesc)
end sub

Function copyTiledRanges(oDoc,oRanges,oTopLeft, bVal As Boolean)
Dim oTargetSheet, oEnum, aTgt, oTgtRg, oNext, aNext, aPrev, iRow&, bCalc As Boolean
Dim oResult as New com.sun.star.table.CellRangeAddress
   bCalc = oDoc.isAutomaticCalculationEnabled()
   oDoc.enableAutomaticCalculation(False)
   aTgt = oTopLeft.getCellAddress()
   iRow = aTgt.Row
   oTargetSheet = oDoc.getSheets.getByIndex(aTgt.Sheet)
   oResult.Sheet = aTgt.Sheet
   oResult.StartColumn = aTgt.Column
   oResult.StartRow = aTgt.Row
   oEnum = oRanges.createEnumeration()
   while oEnum.hasMoreElements()
      oNext = oEnum.nextElement()
      aNext = oNext.getRangeAddress()
      if not isUnoStruct(aPrev) then aPrev = aNext
      REM SheetCellRanges-collections are sorted ascending by StartColumn and StartRow
      REM therefore we go down column by column
      If aNext.StartColumn > aPrev.StartColumn then
         'start new column at top row, right of previous range
         aTgt.Column = aTgt.Column + aPrev.EndColumn - aPrev.StartColumn +1
         aTgt.Row = iRow
      elseIf aNext.StartRow > aPrev.StartRow then
         'target cell below the previous range in same column
         aTgt.Row = aTgt.Row + aPrev.EndRow - aPrev.StartRow +1
      endif
      oTargetSheet.copyRange(aTgt, aNext)
      if bVal Then
         oTgtRg = oTargetSheet.getCellRangeByPosition( _
            aTgt.Column, aTgt.Row, _
            aTgt.Column + aNext.EndColumn - aNext.StartColumn, _
            aTgt.Row + aNext.EndRow - aNext.StartRow _
         )
         oTgtRg.setDataArray(oNext.getDataArray())
      endif
      aPrev = aNext
   wend
   oResult.EndColumn = aTgt.Column + aNext.EndColumn - aNext.StartColumn
   oResult.EndRow = aTgt.Row + aNext.EndRow - aNext.StartRow
   oDoc.enableAutomaticCalculation(bCalc)
   copyTiledRanges = oTargetSheet.getCellRangeByPosition( _
   oResult.StartColumn, oResult.StartRow, oResult.EndColumn, oResult.EndRow )
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
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8786
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: macro Copia celle visibili e valori di incolla

Messaggio da charlie »

Ciao @chimico e benvenuto sul forum.
Se ti vuoi presentare puoi farlo qui: viewforum.php?f=16
Per una panoramica delle regole del forum puoi consultare il Manuale di sopravvivenza: http://forum.openoffice.org/it/forum/vi ... hp?f=1&t=2
Buon proseguimento.
charlie
macOS 14.3 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

Re: macro Copia celle visibili e valori di incolla

Messaggio da chimico »

sr. patel ,

ottimo il tuo codice, sono grato ora per il tuo aiuto

osservazione

          manca solo una cosa, la macro ha bisogno di incollare i valori nella prima cella "vuota" della colonna nel foglio di lavoro 2, così posso salvare una storia nel foglio di lavoro 2

          la macro corrente ha incollato i valori su, cioè incollati sopra i valori numerici che erano lì

          Dovevo incollare sotto i valori numerici, cioè nella prima cella "vuota" che trovo mentre sfoglio i dati che esistono nella colonna, quindi salverò una cronologia dei valori filtrati

          è possibile farlo nella macro corrente?

          segue il foglio di calcolo mentre la macro scorreva


Grazie mille per la tua attenzione.

amici abbracci
Allegati
Visibile.ods
(31.74 KiB) Scaricato 103 volte
LibreOffice 5.4.4.2 no Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: macro Copia celle visibili e valori di incolla

Messaggio da patel »

modifica così la prima sub

Codice: Seleziona tutto

sub copiaFiltro
   oDoc = ThisComponent
   sheet1= thiscomponent.sheets(0)
   sheet2= thiscomponent.sheets(1)
   oCursor = Sheet1.createcursor
   oCursor.gotoendofusedarea(false)
   nEndrow = oCursor.rangeaddress.Endrow
   oCursor = Sheet2.createcursor
   oCursor.gotoendofusedarea(false)
   LR2 = oCursor.rangeaddress.Endrow + 1 ' +2 per lasciare una riga vuota
      
   rng=sheet1.getcellrangebyPosition(0,0,4,nEndrow)
   oRanges = rng.queryVisibleCells()
   oCell = Sheet2.getcellrangebyName("A" & LR2) ' destinazione
   oTargetRange = copyTiledRanges(oDoc, oRanges, oCell, bValues)
   sheet2.Columns.OptimalWidth  = True

   rng=sheet1.getcellrangebyPosition(8,0,11,nEndrow)
   oRanges = rng.queryVisibleCells()
   oCell = Sheet2.getcellrangebyName("F"  & LR2) ' destinazione
   oTargetRange = copyTiledRanges(oDoc, oRanges, oCell, bValues)
   sheet2.Columns.OptimalWidth  = True

   rng=sheet1.getcellrangebyPosition(20,0,22,nEndrow)
   oRanges = rng.queryVisibleCells()
   oCell = Sheet2.getcellrangebyName("J"  & LR2) ' destinazione
   oTargetRange = copyTiledRanges(oDoc, oRanges, oCell, bValues)
   sheet2.Columns.OptimalWidth  = True
   
'---------- ripristina il foglio1   
'  oFilterDesc = Sheet1.createFilterDescriptor(True)
'  Sheet1.filter(oFilterDesc)

end sub
-------------------
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
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

Re: macro Copia celle visibili e valori di incolla

Messaggio da chimico »

Sto inviando il file allegato con i nuovi risultati nel foglio di lavoro 2

sta incollando le intestazioni delle intestazioni sull'ultima riga


osservazione

Non si dovrebbero copiare intestazioni dal foglio di lavoro 1

copia solo dalla riga 2 in basso

non copiare i titoli del foglio di lavoro 1


amici abbracci
Allegati
Visibile.ods
(31.84 KiB) Scaricato 132 volte
LibreOffice 5.4.4.2 no Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: macro Copia celle visibili e valori di incolla

Messaggio da patel »

Codice: Seleziona tutto

sub copiaFiltro
   oDoc = ThisComponent
   sheet1= thiscomponent.sheets(0)
   sheet2= thiscomponent.sheets(1)
   oCursor = Sheet1.createcursor
   oCursor.gotoendofusedarea(false)
   nEndrow = oCursor.rangeaddress.Endrow
   oCursor = Sheet2.createcursor
   oCursor.gotoendofusedarea(false)
   LR2 = oCursor.rangeaddress.Endrow + 1 ' +2 per lasciare una riga vuota
      
   rng=sheet1.getcellrangebyPosition(0,1,4,nEndrow) '<<<<<<<<<<<
   oRanges = rng.queryVisibleCells()
   oCell = Sheet2.getcellrangebyName("A" & LR2) ' destinazione
   oTargetRange = copyTiledRanges(oDoc, oRanges, oCell, bValues)
   sheet2.Columns.OptimalWidth  = True

   rng=sheet1.getcellrangebyPosition(8,1,11,nEndrow)'<<<<<<<<<<<
   oRanges = rng.queryVisibleCells()
   oCell = Sheet2.getcellrangebyName("F"  & LR2) ' destinazione
   oTargetRange = copyTiledRanges(oDoc, oRanges, oCell, bValues)
   sheet2.Columns.OptimalWidth  = True

   rng=sheet1.getcellrangebyPosition(20,1,22,nEndrow)'<<<<<<<<<<<
   oRanges = rng.queryVisibleCells()
   oCell = Sheet2.getcellrangebyName("J"  & LR2) ' destinazione
   oTargetRange = copyTiledRanges(oDoc, oRanges, oCell, bValues)
   sheet2.Columns.OptimalWidth  = True
   
'---------- ripristina il foglio1   
'  oFilterDesc = Sheet1.createFilterDescriptor(True)
'  Sheet1.filter(oFilterDesc)

end sub
ho segnalato con '<<<<<<<<<<< le righe modificate
-------------------
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
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

Re: macro Copia celle visibili e valori di incolla

Messaggio da chimico »

[Risolto]

sr. Patel ,

codice eccellente, sembrava fantastico, funzionava come dovrebbe :bravo:

grazie amico per ora per il grande aiuto


abbracci
LibreOffice 5.4.4.2 no Windows 7
Rispondi