2014-10-21 3 views
5

Quando si dispone di una tabella dati in Excel, parte della funzionalità standard è che premendo la scheda nell'ultima cella si aggiunge una nuova riga nella parte inferiore della tabella. Voglio compilare automaticamente quella nuova riga con valori predefiniti utili. In particolare, voglio inserire la data-ora corrente in una cella e copiare i valori in alcune altre celle dalla riga precedente della tabella.Valori predefiniti per i campi in una nuova riga di una tabella dati

Non è possibile farlo utilizzando le formule, ad es. l'utilizzo di =now() per il timestamp di data e ora è inadeguato perché verrà aggiornato automaticamente ogni volta che il foglio di calcolo viene ricalcolato, mentre io voglio che mantenga la data-ora nel momento in cui è stata aggiunta la riga.

Quindi sto cercando di scrivere VBA per essere attivato dall'evento della riga che si sta aggiungendo e in quel codice per scrivere i valori nelle celle della nuova riga. Da MS documentation ho pensato che DataTable.TableNewRow sarebbe l'evento appropriato. Ma quando provo a scrivere un codice per quell'evento non viene eseguito. Quando cerco DataTable nel browser degli oggetti VBA l'evento TableNewRow non è elencato.

Versioni:

  • VBA per le applicazioni 7.1
  • Excel 2013

Così le mie domande:

  1. è la direzione del mio pensiero giusto, o si può suggerire un approccio migliore?
  2. Potete offrire qualsiasi codice funzionante che faccia qualcosa di simile?
  3. È DataTable.TableNewRow l'evento con cui dovrei lavorare?
  4. Cosa devo fare per ottenere quell'evento accessibile nel mio codice VBA?

risposta

4

Si può provare questo:

scrivere questo codice in ThisWorkbook.

Private Sub Workbook_Open() 
    Set ref_tbl = Sheet1.ListObjects(1).DataBodyRange 
End Sub 

Poi sotto il codice in un Worsksheet oggetto.

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    On Error GoTo halt 
    Application.EnableEvents = False 
    Dim tbl_rng As Range 
    Set tbl_rng = Me.ListObjects(1).DataBodyRange 
    If Not Intersect(Target, tbl_rng) Is Nothing Then 
     If tbl_rng.Rows.Count > ref_tbl.Rows.Count Then 
      MsgBox "Table increase in size" 
      '~~> Do your stuff here 
      Set ref_tbl = tbl_rng 
     End If 
    End If 
forward: 
    Application.EnableEvents = True 
    Exit Sub 
halt: 
    MsgBox Err.Number & ": " & Err.Description 
    Resume forward 
End Sub 

Avrete anche bisogno di un modulo per dichiarare la variabile pubblica

Public ref_tbl As Range 

Quindi, in pratica, questo vi dirà quando il vostro tavolo aumento in termini di dimensioni.
Se siamo in grado di catturarlo, allora puoi fare le tue cose quando questa condizione è soddisfatta.
Questo funziona nella situazione che descrivi nella tua domanda.
Non funzionerà se si inserisce una riga tra le voci nella tabella. Comunque, HTH.

+1

+1 L'evento WorkSheet_Change si attiva quando si inseriscono le righe, pertanto potrebbe essere un modo per ottenerlo, se necessario. –

+0

Non ho provato il tuo codice (mi dispiace) ma non vedo come il numero di righe delle tabelle sarà mai maggiore del proprio conteggio delle righe. Sembra che dovresti memorizzare il conteggio delle righe in una variabile pubblica, non nella tabella.Probabilmente mi manca qualcosa. –

+0

@DougGlancy Ah, memorizzo l'intervallo di tabelle, quindi valuto il numero di righe utilizzando la proprietà * Rows.Count *. A proposito, ho imparato qualcosa di nuovo. Di solito, utilizzo un intervallo denominato per tenere traccia dell'inserimento di righe o colonne. * L'evento Worksheet_Change * renderà più semplice. – L42