[Risolto] Copia senza creare il foglio di lavoro "Temp"

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

[Risolto] Copia senza creare il foglio di lavoro "Temp"

Messaggio da chimico »

Saluti ,

                  Ho una macro che copia dal Foglio 1 i valori filtrati che contengono "x" nella colonna "B", quindi incolliamo in sequenza nel Foglio 2, questo processo funziona già molto bene .

                ma perché ciò accada è necessario creare un foglio di lavoro temporaneo chiamato "Temp", questo può essere visto nel file allegato .

               poi è nata una nuova conoscenza in cui è possibile copiare i valori filtrati e non è più necessario creare un foglio di lavoro temporaneo "Temp", questa nuova conoscenza è stata presentata dal sr. OOotremer971

              ma non sono in grado di adattare questa nuova conoscenza nella macro del file allegato, cioè, non è più necessario creare un foglio di lavoro temporaneo "Temp" .

            mi può aiutare ad adattare questa nuova conoscenza nel file macro allegato .


abbracci amici .
Allegati
copia le linee visibili con X.ods
(23.27 KiB) Scaricato 123 volte
Ultima modifica di chimico il venerdì 1 febbraio 2019, 20:57, modificato 2 volte in totale.
LibreOffice 5.4.4.2 no Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Copia senza creare il foglio di lavoro "Temp"

Messaggio da patel »

La macro di OOotremer971 copia il range dal foglio1 a foglio temp ed elimina da temp le righe che sono invisibili nel foglio 1, quindi non puoi eliminare la creazione del foglio temp. Il metodo che ti avevo indicato nella discussione precedente fa tutto questo in memoria e quindi non ha bisogno di creare un foglio di appoggio, ovviamente la macro è più lunga e complessa di quella di OOotremer971 e meno facile da capire
-------------------
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: Copia senza creare il foglio di lavoro "Temp"

Messaggio da chimico »

saluti sr. patel ,

Ho provato ad usare la tua macro , ma mi sono fermato nell'ERRORE che si è verificato inizialmente, ovvero, si è verificato un ERRORE nel comando qui sotto :

Codice: Seleziona tutto

oCursor = Sheet1.createcursor
osservazione:

1) deve avere un criterio, cioè deve copiare le righe visibili contenenti "x" nella colonna "B" .
2) è necessario copiare tutte le colonne nel database, qui in questo esempio è dalla colonna "A" alla colonna "C", ma potrebbero esserci più colonne in futuro .

segue il file allegato con la tua macro .

Grazie in anticipo per il vostro aiuto .
Allegati
copia le linee visibili con X (2).ods
(25.41 KiB) Scaricato 134 volte
LibreOffice 5.4.4.2 no Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Copia senza creare il foglio di lavoro "Temp"

Messaggio da patel »

l'errore dipende dal fatto che usi come variabile Sheet1, 2 ... , Sheet1 è una Reserved Word, non può essere usata come variabile, meglio usare Sh1 oppure oSheet1
-------------------
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
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Copia senza creare il foglio di lavoro "Temp"

Messaggio da patel »

prova questa macro

Codice: Seleziona tutto

sub CopyVisiblex
oDoc = ThisComponent
sh= oDoc.sheets(0)
sh1= oDoc.sheets(1)
rng= getUsedRange(sh)
oRanges = rng.queryVisibleCells()
oCell = sh1.getcellrangebyName("A1") ' destinazione
call copyVisibleRows(oDoc, oRanges, oCell,LastRow)
sh1.Columns.OptimalWidth  = True
FOR r = LastRow to 1 STEP -1
  IF Sh1.getCellByPosition(1, r).String <> "x" THEN 
    Sh1.Rows.removeByIndex(r, 1)
  end if
NEXT
end sub

Sub copyVisibleRows(oDoc,oRanges,oTopLeft,LastRow)

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
      If aNext.StartColumn > aPrev.StartColumn then
         aTgt.Column = aTgt.Column + aPrev.EndColumn - aPrev.StartColumn +1
         aTgt.Row = iRow
      elseIf aNext.StartRow > aPrev.StartRow then
         aTgt.Row = aTgt.Row + aPrev.EndRow - aPrev.StartRow +1
      endif
      oTgtRg = oTargetSheet.getCellRangeByPosition( _
         aTgt.Column, aTgt.Row, _
         aTgt.Column + aNext.EndColumn - aNext.StartColumn, _
         aTgt.Row + aNext.EndRow - aNext.StartRow)
      oTgtRg.setDataArray(oNext.getDataArray())
      aPrev = aNext
     LastRow=aTgt.Row
   wend
   oDoc.enableAutomaticCalculation(bCalc)
End sub

Function getUsedRange(oSheet)
Dim oRg
   oRg = oSheet.createCursor()
   oRg.gotoStartOfUsedArea(False)
   oRg.gotoEndOfUsedArea(True)
   getUsedRange = oRg
End Function
Comunque io non scarterei la soluzione con foglio Temp, è più facile da gestire
-------------------
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: Copia senza creare il foglio di lavoro "Temp"

Messaggio da chimico »

sr. patel ,

               è quasi perfetto , ha solo bisogno di adattare la macro per incollare i valori futuri, cioè, avrà nuovi valori da incollare in futuro , quindi è necessario incollarne uno al di sotto dell'altro in sequenza . :)

             seguire l'allegato , vedere i commenti che ho inserito nel foglio di lavoro 2 (Plan2) , è un modello del risultato desiderato .


amico abbraccio .
Allegati
copia le linee visibili con x (3).ods
(25.62 KiB) Scaricato 135 volte
LibreOffice 5.4.4.2 no Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Copia senza creare il foglio di lavoro "Temp"

Messaggio da patel »

Non ho capito quale dovrebbe essere il risultato desiderato, allega un file più complesso
Perché non vuoi copiare i titoli ? cosa sono i valori futuri ?
-------------------
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: Copia senza creare il foglio di lavoro "Temp"

Messaggio da chimico »

Voglio già ringraziarti per la tua dedizione e il tuo aiuto, le tue risposte mi hanno sempre aiutato molto, grazie, amico mio . :super:

il risultato desiderato è come una scala, cioè, si incolla in sequenza uno dopo l'altro, come nel modello del foglio di lavoro 2 (Plan2) che ho precedentemente allegato .

questo processo servirà per salvare una cronologia dei filtri, se annulli il filtro noterai che ci sono altri valori diversi, quindi ci sono giorni che avranno valori diversi, cioè il criterio "x" potrebbe cambiare posizione nella colonna "B" .

ho dei nuovi valori da copiare, quindi voglio salvare una cronologia, anche se non è chiedere troppo, sarebbe bello apparire automaticamente nella colonna "D" del foglio di lavoro 2 (Plan2) la data attuale del trasferimento, questo aiuterà anche molto nella costruzione della storia, cioè avrò una cronologia completa che indica la data del giorno in cui è stato effettuato il trasferimento per ogni valore copiato .

È possibile quando si incollano i valori, anche inserire la data corrente nella colonna "D" per ogni valore copiato ?

per Titoli, è già nella posizione in Plan2, non è necessario copiare nuovamente .


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

Re: Copia senza creare il foglio di lavoro "Temp"

Messaggio da patel »

chimico ha scritto: ho dei nuovi valori da copiare, quindi voglio salvare una cronologia, anche se non è chiedere troppo, sarebbe bello apparire automaticamente nella colonna "D" del foglio di lavoro 2 (Plan2) la data attuale del trasferimento.
In un post precedente hai detto:
chimico ha scritto: 2) è necessario copiare tutte le colonne nel database, qui in questo esempio è dalla colonna "A" alla colonna "C", ma potrebbero esserci più colonne in futuro .
ora vuoi mettere la data in colonna D, non puoi cambiare continuamente le carte in tavola
-------------------
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: Copia senza creare il foglio di lavoro "Temp"

Messaggio da chimico »

sr. patel ,

            perdonami, avevo dimenticato questo importante dettaglio, :crazy: .... buona cosa mi hai ricordato, grazie

            è possibile identificare l'ultima colonna con i valori nel database del foglio di lavoro 1 (Plan1) e quindi inserire la data corrente nella colonna successiva (+1) ? ovvero , se la dimensione del database contiene 5 colonne, la data aggiornata verrà inserita nella colonna "F" del foglio di lavoro 2 (Plan2) , È possibile ?

           Grazie e scusa per il mio fallimento ? :(


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

Re: Copia senza creare il foglio di lavoro "Temp"

Messaggio da patel »

ho evidenziato le righe aggiunte o modificate con ' <<<<

Codice: Seleziona tutto

sub CopyVisiblex
oDoc = ThisComponent
sh= oDoc.sheets(0)
sh1= oDoc.sheets(1)
rng= getUsedRange(sh)
rng1= getUsedRange(sh1) ' <<<<
LastRow1 = rng1.RangeAddress.EndRow ' <<<<
Lastcol = rng.RangeAddress.EndColumn ' <<<<
oRanges = rng.queryVisibleCells()
oCell = sh1.getcellByPosition(0,LastRow1+1) ' <<<<
call copyVisibleRows(oDoc, oRanges, oCell,LastRow)

sh1.Columns.OptimalWidth  = True
FOR r = LastRow to LastRow1+1 STEP -1 ' <<<<
  IF Sh1.getCellByPosition(1, r).String <> "x" THEN 
    Sh1.Rows.removeByIndex(r, 1)
  else ' <<<<
    sh1.getcellByPosition(Lastcol+1,r).String =  Date ' <<<<
  end if
NEXT
end sub

Sub copyVisibleRows(oDoc,oRanges,oTopLeft,LastRow)

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
      If aNext.StartColumn > aPrev.StartColumn then
         aTgt.Column = aTgt.Column + aPrev.EndColumn - aPrev.StartColumn +1
         aTgt.Row = iRow
      elseIf aNext.StartRow > aPrev.StartRow then
         aTgt.Row = aTgt.Row + aPrev.EndRow - aPrev.StartRow +1
      endif
      oTgtRg = oTargetSheet.getCellRangeByPosition( _
         aTgt.Column, aTgt.Row, _
         aTgt.Column + aNext.EndColumn - aNext.StartColumn, _
         aTgt.Row + aNext.EndRow - aNext.StartRow)
      oTgtRg.setDataArray(oNext.getDataArray())
      aPrev = aNext
     LastRow=aTgt.Row
   wend
   oDoc.enableAutomaticCalculation(bCalc)
  
End sub

Function getUsedRange(oSheet)
Dim oRg
   oRg = oSheet.createCursor()
   oRg.gotoStartOfUsedArea(False)
   oRg.gotoEndOfUsedArea(True)
   getUsedRange = oRg
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
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

Re: Copia senza creare il foglio di lavoro "Temp"

Messaggio da chimico »

[RISOLTO]

Sta funzionando molto bene , è stato perfetto . :D

questo è quello che stavo cercando . :super:

Congratulazioni per la tua conoscenza . :bravo: :bravo: :bravo:


Un grande abbraccio amico . :super:
LibreOffice 5.4.4.2 no Windows 7
Rispondi