2014-10-21 10 views
5

Gdy masz tabelę danych w programie Excel, część standardowej funkcjonalności polega na tym, że naciśnięcie zakładki w ostatniej komórce powoduje dodanie nowego wiersza u dołu tabeli. Chcę automatycznie wypełnić ten nowy wiersz użytecznymi wartościami domyślnymi. W szczególności chcę umieścić aktualną datę-czas w jednej komórce i skopiować wartości do innych komórek z poprzedniego wiersza tabeli.Domyślne wartości dla pól w nowym wierszu tabeli danych

Nie można tego zrobić przy użyciu formuł - np. używanie =now() dla znacznika daty i czasu jest niewystarczające, ponieważ będzie automatycznie aktualizowane za każdym razem, gdy arkusz kalkulacyjny zostanie ponownie obliczony, podczas gdy chcę, aby zachował datę i godzinę w momencie dodania wiersza.

Tak więc próbuję napisać VBA, aby był uruchamiany przez zdarzenie dodawanego wiersza, oraz w tym kodzie, aby zapisać wartości w komórkach nowego wiersza. Od MS documentation myślałem, że DataTable.TableNewRow będzie odpowiednim wydarzeniem. Ale kiedy próbuję napisać dowolny kod dla tego zdarzenia, nie jest on wykonywany. Podczas wyszukiwania w przeglądarce obiektów VBA DataTable zdarzenie TableNewRow nie jest wyświetlane.

Wersje:

  • VBA for Applications 7.1
  • Excel 2013

Więc moje pytania:

  1. jest kierunek mojego prawa myślenia, czy można zaproponować lepsze podejście?
  2. Czy możesz zaoferować działający kod, który robi coś takiego?
  3. Czy DataTable.TableNewRow to wydarzenie, z którym powinienem pracować?
  4. Co muszę zrobić, aby wydarzenie było dostępne w moim kodzie VBA?

Odpowiedz

4

Można spróbować to:

napisać ten kod w ThisWorkbook.

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

Następnie poniżej kodu w Worsksheet obiektu.

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 

Będziesz również potrzebował moduł zadeklarować zmienną publiczną

Public ref_tbl As Range 

Więc w zasadzie, to powie, kiedy swój wzrost tabeli rozmiarów.
Jeśli uda nam się to uchwycić, wtedy możesz zrobić swoje rzeczy, gdy ten warunek zostanie spełniony.
Działa to w sytuacji opisanej w pytaniu.
Nie będzie to jednak działać po wstawieniu wiersza między wpisami w tabeli. W każdym razie, HTH.

+1

+1 Zdarzenie WorkSheet_Change jest wywoływane podczas wstawiania wierszy, więc może to być sposób na uzyskanie w razie potrzeby. –

+0

Nie próbowałem Twojego kodu (przepraszam), ale nie widzę, jak liczba wierszy w tabelach będzie większa niż jego liczba wierszy. Wygląda na to, że musisz przechowywać liczbę wierszy w publicznej zmiennej, a nie w tabeli.Pewnie po prostu czegoś brakuje. –

+0

@DougGlancy Ah, przechowuję zakres tabeli, a następnie oceniam liczbę wierszy za pomocą właściwości * Rows.Count *. Przy okazji nauczyłem się czegoś nowego. Zazwyczaj używam nazwanego zakresu do śledzenia wstawiania wierszy lub kolumn. * Zdarzenie Worksheet_Change * ułatwi. – L42