Copia data maggiore
Hai un problema con Excel? 
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
Vuoi Approfondire?