Pagina 1 di 1

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

Inviato: martedì 29 gennaio 2019, 21:20
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 .

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

Inviato: mercoledì 30 gennaio 2019, 8:33
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

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

Inviato: mercoledì 30 gennaio 2019, 20:56
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 .

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

Inviato: giovedì 31 gennaio 2019, 9:19
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

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

Inviato: giovedì 31 gennaio 2019, 10:24
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

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

Inviato: giovedì 31 gennaio 2019, 14:17
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 .

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

Inviato: giovedì 31 gennaio 2019, 15:32
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 ?

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

Inviato: giovedì 31 gennaio 2019, 17:57
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 .

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

Inviato: giovedì 31 gennaio 2019, 18:16
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

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

Inviato: giovedì 31 gennaio 2019, 20:19
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 .

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

Inviato: venerdì 1 febbraio 2019, 18:50
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

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

Inviato: venerdì 1 febbraio 2019, 20:55
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: