Kategorie szkoleń | Egzaminy | Kontakt
  • 3
  • 4
  • 1.2K

Chciałbym do tabeli (Table1) doklejać wartości na jej końcu w konkretnej kolumnie, np. Column2.

W sieci znalazłem np.:

Sheets("Receipts")
    .Range("I2").Copy Destination:=Sheets("Payments").Range("A" & Rows.Count).End(xlUp).Offset(1)

Wiem, że do zakresu kolumny w tabeli można odwołać się np. tak:


Me.Range("Table1[Column2]")

A jak się odnieść do komórki, i to do tej pierwszej pustej w kolumnie?


Me.Range("Table1[Column2]") ....???... End(xlUp).Offset(1)

Z góry dziękuję i pozdrawiam serdecznie.

Jacek_Kotowski
  • Zapytał
  • @ Jacek_Kotowski | 09.03.2015
    • lider
    • laureat
    • ekspert
    • 60
    • 54
    • 94

Odpowiedzi (3)

  • 15

Panie Jacku.

Z pytania "A jak się odnieść do komórki, i to do tej pierwszej pustej w kolumnie? ..." zakładam, że chodzi Panu o pierwszą pustą komórkę w istniejącej kolumnie, a nie o pierwszy wiersz pod tabelą.

Wymyśliłem coś takiego:

Sub puste()
    Dim obiekt As ListObject
    Dim kolumna As Range
    Dim zakres As String

    ' w której tabeli
    Set obiekt = ActiveSheet.ListObjects("Tabela1")
    ' w której kolumnie tabeli
    Set kolumna = obiekt.ListColumns("nazwisko").DataBodyRange
    
    ' zakres komórek na których znajduje się aktualnie kolumna tabeli
    zakres = kolumna.Address
    
    For Each cell In Range(zakres)
    
        If cell.Value = "" Then
            cell.Value = "wstaw"
            Exit For
        End If
   
    Next cell
    
    
End Sub

Można by było prościej:

kolumna.End(xlDown).Offset(1)

 Ale TYLKO wtedy, kiedy ma Pan 200% pewności, że pierwsze wiersze tabeli nie są puste. Inaczej zostaniemy przeniesieni do pierwszej komórki wypełnionej, a następnie przesuniemy się do wiersza niżej.

Patrz załącznik.

Załączniki

  • xlsm

    pierwsza pusta.xlsm ( 21K )
  • Odpowiedział
  • @ | 10.03.2015
  • TRENER ALTKOM AKADEMII
  • 6

Panie Krzysztofie, bardzo dziękuję.

Rzeczywiście, mam pewność, że pierwsze wiersze tabeli nie są puste, ale i to bardziej rozwinięte rozwiązanie zachowam w moim notatniku.

Mogę się jedynie spodziewać, że ktoś ręcznie zwiększy zakres tabeli. Wstępnie wyszło mi coś takiego (dodałem też możliwość uzupełnienia wartości w sąsiednich kolumnach):

Sub LastInColumn()

With Sheets("Arkusz1").Range("Tabela1[[#Headers],[nazwisko]]").End(xlDown).Offset(1)
.Value = "test"
.Offset(0, 1).Value = "foo"
.Offset(0, -1).Value = "bar"
End With

End Sub

Przetestowałem i zauważyłem, że jeśli już nie ma pustych wierszy w tabeli i wartość zostanie dodana pod tabelą, tabela się rozszerzy. 

Wprawdzie mam pewność, że pierwsze wiersze tabeli nie są puste, ale nie mam pewności, czy ktoś nie doda kolumny do danych źródłowych. Dlatego ostatecznie zastosuję coś takiego:

Sub LastInColumnVer2()


Dim x, yNazwisko, yImie, yData As Integer

x = Sheets("Arkusz1").Range("Tabela1[[#Headers],[nazwisko]]").End(xlDown).Offset(1).Row
yNazwisko = Sheets("Arkusz1").Range("Tabela1[[#Headers],[nazwisko]]").Column
yImie = Sheets("Arkusz1").Range("Tabela1[[#Headers],[imie]]").Column
yData = Sheets("Arkusz1").Range("Tabela1[[#Headers],[data]]").Column


With Sheets("Arkusz1")
    .Cells(x, yNazwisko).Value = "test"
    .Cells(x, yImie).Value = "foo"
    .Cells(x, yData).Value = "bar"
End With

End Sub

Dziękuję za pomoc.

Jacek_Kotowski
  • Odpowiedział
  • @ Jacek_Kotowski | 10.03.2015
    • lider
    • laureat
    • ekspert
    • 60
    • 54
    • 94
  • 16

Witam serdecznie.

Poniżej dwie alternatywne wersje kodu, które zaznaczają pierwszą wolną komórkę w kolumnie 2:

Range("Tabela1[Kolumna2]").End(xlDown).Offset(1).Select

Lub (count liczy ilość danych w tabeli bez nagłówka, dlatego +2, kolejna dwójka oznacza nr kolumny):

Cells(Range("Tabela1[Kolumna2]").Count + 2, 2).Select

Pozdrawiam.
Paweł Niemyt.

pawel_niemyt
  • Odpowiedział
  • @ pawel_niemyt | 11.03.2015