Copia data maggiore



  • Copia data maggiore
    di Perry (utente non iscritto) data: 01/03/2014 17:18:06

    Non so come mai ma questo posto è finito in un' altro quindi lo rimando

    Buona giornata a tutti
    Riprovo a postare vecchia richiesta (non evasa)

    Quando con una macro aggiungo una riga in una tabella, inizializzo la cella in colonna G con il valore di una data a cui ho assegnata il nome "Excel_Data" (si tratta della data della penultima riga inserita).

    Poiché il completamento dei dati nella riga, appena aggiunta, può comportare la modifica della stessa data in colonna G, vorrei che il valore della cella "Excel_data" ne assumesse il nuovo valore quando maggiore.
    Ciò mi permette di inserire nuove righe con la data aggiornata.
    Grazie



  • di Vecchio Frac data: 01/03/2014 19:29:58

    Ma la data dell'ultimo post in "Excel_Data" cioè Gqualcosa la metti a mano? non credo... se sposti la cella di Excel_Data da G a F (subito sotto la cella che dice "Data ultimo post") e ci metti la formula =GRANDE(G:G;1) in automatico avrai la data più alta che è stata inserita, ottenendo il risultato desiderato.

    p.s. continuo ad avere errori col tuo file sul mio Excel 2003 perchè ci sono alcune istruzioni incompatibili (esempio .ListRows.Add alwaysinsert:=True dà errore perchè "alwaysinsert" non è un parametro riconosciuto). Se non ti interessa distribuire il lavoro puoi anche soprassedere, ma ritengo che l'idea è buona e andrebbe sostenuta :)

    p-p.s. perchè richiami la sub E_Righe in Pulsante1_Click? visto che non la richiami in nessun altro punto del progetto, è inutile. Metti direttamente il codice di E_Righe nella sub di pulsante1_Click.





  • di Perry (utente non iscritto) data: 01/03/2014 22:21:48

    Grazie v.Frac per la dritta (ne terrò buona nota),
    ma non funziona perché quando aggiungo una riga mi carica nella cella in G una formula e non il valore (vedi sub. E_righe).:

    Sub E_Righe()
    Dim E_oTbl As ListObject, Lr As Long
    Set E_oTbl = ActiveSheet.ListObjects("Excel_Tab")

    Application.EnableEvents = False
    With E_oTbl
    Lr = .ListRows.Count
    .ListRows.Add alwaysinsert:=True
    With .ListRows(Lr)
    .Range(1).Offset(-1).Copy .Range(1)
    .Range.Offset(-1).Copy
    .Range.PasteSpecial xlPasteFormats
    Range("Excel_Data").Copy <---- REPERISCE LA DATA
    .Range(1).Offset(, 6).PasteSpecial
    End With
    End With

    Application.EnableEvents = True
    Application.CutCopyMode = False
    Set E_oTbl = Nothing

    Range("D" & Lr + 1).Select
    End Sub

    Quello che voglio ottenere è :
    Caricare il valore (una data) nella cella G della riga di tabella che inserisco prendendola dalla cella a cui ho assegnato il nome "Excel_data".
    Nel completamento dei dati della riga appena aggiunta potrei dover cambiare la data che era stata memorizzata in cella G.

    Cerco di spiegarmi meglio.:
    - Devo caricare un nuovo post
    - eseguo sub. E_Righe
    - mi viene caricata una nuova riga con il formato delle righe di tabella e con precompilata la data che reperisce dalla cella "Excel_Data"
    - Il nuovo post i cui dati vado a completare può avere una data maggiore della data reperita in automatico in fase di aggiunta righe
    - Quindi vorrei che la cella Excel_Data assumesse automaticamente questo nuovo valore, evitandomi di correggere la data Excel_Data" ogni volta che inserisco un nuovo post con data maggiore (cambio giornata)
    Grazie per la pazienza
    Perry



  • di Perry (utente non iscritto) data: 01/03/2014 22:38:30

    V.Frac dixit.:
    p-p.s. perchè richiami la sub E_Righe in Pulsante1_Click? visto che non la richiami in nessun altro punto del progetto, è inutile. Metti direttamente il codice di E_Righe nella sub di pulsante1_Click.

    Sono solito usare questa soluzione perché sono in fase di sviluppo e potrei aggiungere/attivare altre sub al pulsante, è una forma mentale
    (dovuta ad anni di organizzazione e sviluppo su AS400)
    mantenere isolate e complete le singole funzioni ed eventualmente linkarle in funzioni di più alto livello.
    Grazie



  • di Zer0Kelvin data: 02/03/2014 11:27:53

    perchè richiami la sub E_Righe in Pulsante1_Click? visto che non la richiami in nessun altro punto ...
    ...Sono solito usare questa soluzione perché sono in fase di sviluppo e potrei aggiungere/attivare altre sub al pulsante...
    ____________________________________________


    Sono d'accordo, suddividere il codice in subroutines, lo rende più gestibile e più leggibile.
    C'era una vecchia "regoletta" di programmazione:
    - nessuna subroutine deve superare le dimensioni di una pagina stampata.

    Provatevi a leggere ed interpretare una sub con 200 righe di codice, poi provate a "spezzare" la routine inserendo parti autonome di codice in sub separate e vedrete la differenza.



  • di Vecchio Frac data: 02/03/2014 12:27:31

    Sì sì, naturalmente sono d'accordo anch'io con voi.
    Le mie procedure in Excel e Word di solito sono sempre piuttosto contenute.
    Come forma mentale attribuisco a un pulsante qualcosa di semplice.
    Ovviamente il gestionale in Access che mantengo in ufficio, vista la sua complessità, è molto modulare e quindi anch'io mi comporto nel senso da voi descritto.
    Zer0Kelvin ricorda una regola giustissima... non si dovrebbe superare la videata (anche se ciò è piuttosto difficile da realizzare con gestionali complessi).





  • di Vecchio Frac data: 02/03/2014 18:52:53

    cit. " Quindi vorrei che la cella Excel_Data assumesse automaticamente questo nuovo valore"
    ---> Nella worksheet_change, quando cambi manualmente la data inserita in automatico, se è maggiore dell'ultima in "excel_data" allora sostituisci questa altrimenti nessuna modifica.





  • di Perry (utente non iscritto) data: 03/03/2014 19:29:21

    Sto tentando di fare quanto hai suggerito ma non funziona, ti allego il codice.:

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim nome As String
    Dim data As String <-------- mia aggiunta ----------
    If Not Intersect(Target, [excel_tab].Columns(4)) Is Nothing And Target(1) <> "" Then
    nome = Target(1).Text
    If Application.CountIf([excel_tab].Columns(4), nome) > 1 Then
    Application.EnableEvents = False
    MsgBox "Titolo già inserito", , "EXCEL"
    Target = ""
    Application.EnableEvents = True
    Target.Select
    End If
    End If
    <-------- parte aggiunta -------------------------------------------------------->
    If Not Intersect(Target, [excel_tab].Columns(7)) Is Nothing And Target(1) > "Excel_data" Then
    Range("Excel_data") = Target(1).Text
    End If

    End Sub




  • di Perry (utente non iscritto) data: 03/03/2014 19:50:40

    Evviva ce l'ho fatta ecco la parte corretta.:

    <-------- parte aggiunta e corretta ------------------------------------------->
    If Not Intersect(Target, [excel_tab].Columns(7)) Is Nothing And Target(1) _
    > Range("Excel_data") Then
    Range("Excel_data") = Target(1).Text
    End If

    Scusate ma sono proprio una talpa



  • di Vecchio Frac data: 03/03/2014 20:36:09

    cit. "Scusate ma sono proprio una talpa "
    ---> LOL ^_^
    L'importante è risolvere.





  • di Perry (utente non iscritto) data: 03/03/2014 21:19:44

    Grazie a tutti



  • di Perry (utente non iscritto) data: 04/03/2014 13:47:29

    Ho gioito troppo presto ...
    La copia della data funziona ma mi inverte il giorno/mese (04/03/2014) della data di partenza in mese/giorno (03/04/2014) nella data di arrivo pur avendo lo stesso formato *gg/mm/aaaa !!!
    Grazie



  • di Vecchio Frac data: 04/03/2014 21:31:51

    Allora formatta il valore prima di assegnarlo a Range("Excel_data"):
    Range("Excel_data") = format(Target(1).Text, "dd/mm/yyyy")

    ovvero così:
    Range("Excel_data") = CDate(Target(1).Text)

    oppure formatta il range dopo avergli inserito il dato:
    Range("Excel_data").formatnumber = "dd/mm/yyyy"






  • di Vecchio Frac data: 04/03/2014 21:48:50

    p.s. dalle mie prove, CDate() dovrebbe funzionare bene.





  • di Perry (utente non iscritto) data: 05/03/2014 13:43:07

    Perfetto, grazie, grazie 1k