Non ho parole........ sei un grande! Azzeccata in pieno la richiesta e funziona che è una meraviglia.
Grazie infinite.
Danilo.



Paolo Mantovani ha scritto:
Ciao Danilo,


Nord Studio snc ha scritto:


Buongiorno, mi chiamo Danilo.
Abbiamo appena migrato il pacchetto Office verso OpenOffice ma ci stiamo imbattendo in un muro per quanto riguarda l'utilizzo di una macro per il nostro sistema di pianificazione settimanale.

C'è qualcuno che ci può aiutare nell'operazione?
In parole povere utilizziamo due fogli in Calc dove sul primo denominato "produzione" ci sono delle righe che descrivono le varie commesse con i dati di lavorazione. Quando l'operatore finisce quel determinato lavoro, clicca sul pulsante collegato alla macro che sposta l'intera riga selezionata (quindi c'è un problema di cella attiva perchè non sempre i lavori vengono ultimati sequenzialmente) e spostati (tagliati) sul secondo foglio denominato ""archivio" Eseguiti" nella riga 3 spostando verso il basso le righe già presenti e inserendo la data e l'ora dell'avvenuta operazione nella cella C3.

Allego se può essere utile la macro originale in VBA.

Premetto che hai fatto benissimo ad allegare il codice, purtroppo però in questo caso, il codice VBA è stato ottenuto mediante registratore di macro, contiene molte ripetizioni (c'è un copia/incolla effettuato sugli stessi dati per ben 3 volte) e parti apparentemente inutili. Non è una buona base di partenza perché richiederebbe un po di pulizia tenendo sottomano Excel per le varie prove.


Io ho provato a decodificare StarBasic ma se devo essere sincero è abbastanza complicato e non di facile interpretazione.

Detto francamente, ho grosse perplessità riguardo quanto affermi, comunque, bando alle ciance e veniamo al sodo.

Provo a riepilogare quello che hai detto sperando di avere inteso bene tutto quanto:

0) situazione iniziale:
======================
hai due tabelle: chiamiamole "produzione" e "archivio"
L'utente è nella tabella "produzione", seleziona una cella che fa parte del record da spostare e clicca su un pulsante che aziona la macro.

La macro a questo punto deve fare alcune cose

1) tabella "produzione":
    copiare i dati contenuti nella riga individuata dalla cella
    attiva

2) tabella "archivio":
    inserire una riga vuota nella posizione 3
    incollare i valori precedentemente copiati
    inserire la data corrente nella cella C3
3) tabella "produzione":
    eliminare la riga contenente la cella selezionata


La procedura che ho descritto ha un punto debole, ovvero: che succede se l'utente nella tabella "produzione" ha selezionato un range con più righe? e in caso di selezione multipla?

Per questo motivo, io prima di procedere con le istruzioni successive farei controllino alla selezione.

Ok  ora vediamo come tradurre in codice l'algoritmo descritto.
....vedi codice alla fine di questo post....

NB:
Il codice sotto riportato può potenzialmente causare perdita di dati o altri problemi e risultati imprevedibili. Sconsiglio vivamente l'utilizzo del codice a meno che non si sappia esattamente quello che si sta facendo.
In ogni caso declino qualunque responsabilità.

NB2: il codice è solo una proposta, dovrai adattarlo alle tue necessità.


saluti
Paolo Mantovani


-----------------8<-----------------
REM  *****  BASIC  *****

Sub Main

  'inizializzamo alcune variabili
  oDoc = ThisComponent
  oSelection = oDoc.getCurrentSelection()
  oActiveSheet = oDoc.CurrentController.ActiveSheet
  oShProduzione = oDoc.Sheets.getByName("produzione")
  oShArchivio = oDoc.Sheets.getByName("archivio")

  'sanity checks:
  If Not (oActiveSheet.Name = "produzione") Then
    sMsg = "Per lanciare la procedura occorre spostarsi "
    sMsg =  sMsg & "sulla tabella ""produzione"""
    MsgBox sMsg, 64
    Exit Sub
  End If

  If Not oSelection.supportsService("com.sun.star.sheet.SheetCell") Then
    sMsg = "Ce l'hai quasi fatta ma "
    sMsg =  sMsg & "è necessario selezionare una sola cella"
    MsgBox sMsg, 64
    Exit Sub
  End If

  'ok se siamo arrivati fino a qui la selezione è a posto!

  'individuo la riga contenente la cella attiva:
  iRowIndex = oSelection.CellAddress.Row

  'ottengo il range da spostare (l'intera riga)
  oSrcRow = oShProduzione.Rows.getByIndex(iRowIndex)

  'tabella "archivio":
  'inserisco una riga vuota nella posizione 3 (ovvero indice 2)
  oShArchivio.Rows.insertByIndex(2, 1)

  'incollare i valori contenuti nella riga selezionata
  'della tabella archivio
  aDest = oShArchivio.getCellRangeByName("A3").CellAddress()
  aSrc = oSrcRow.RangeAddress()
  oShArchivio.copyRange(aDest, aSrc)

  'inserire la data corrente nella cella C3
  oShArchivio.getCellRangeByName("C3").FormulaLocal = Now()

  'tabella "produzione":
  'eliminare la riga contenente la cella selezionata
  oShProduzione.Rows.removeByIndex(iRowIndex, 1)

End Sub

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]




---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Rispondere a