2017-04-26 4 views
0

私はエクセルテーブル内の最後の空でないセルの最後の行の値を返すラストローコードを定義しようとしました。 (ITS表としてフォーマット)ラストローとエクセルテーブル。

マイexceltable持って1から1005までCOL Aの値は、1から414から何を私がしたいことは1 LASTROWを持つことである1005

から414へとCOL CでCOL B 414を返すコードと1005を返すコードです。問題は、テーブル内にあるためです。私のコード

 lastrow3 = ThisWorkbook.Worksheets("DataÖnskemål").Range("A" & Rows.Count).End(xlUp).Row 
     lastrow2 = ThisWorkbook.Worksheets("DataÖnskemål").Range("B" & Rows.Count).End(xlUp).Row 

どちらも1005です。私のテーブルでこれを回避することはできますか、それとも何らかの問題を形作っていますか?予め

よろしくと感謝 /D

+0

を試してみてください –

+0

テーブルの最後の行を知る必要があるのはなぜですか? 2つの列が関連していない場合は、実際には別々の表にする必要があります。 – Rory

+0

= ""を評価するか、iferror(1/cell)を使用して空白の最初の行を見つけるには、列Bの行を1から列Aの最後の行までループすることができます。 – Luuklag

答えて

2

データがシートにExcelの表の下に存在している場合は、問題を持っています。エクセルテーブルの最後の行を見つけている間は、テーブルの列を参照する方が常に良いです。

Sub FindLastRowInExcelTableColAandB() 
Dim lastRow1 As Long, lastRow2 As Long 
Dim ws As Worksheet 
Set ws = Sheets("DataÖnskemål") 
'Assuming the name of the table is "Table1" 
lastRow1 = ws.ListObjects("Table1").Range.Columns(1).Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 
lastRow2 = ws.ListObjects("Table1").Range.Columns(2).Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 
End Sub 
+0

ListColumns(_index _)。Rangeはおそらく '.Range.Columns(_index_)'よりも優れていますが、どちらも同じ結果をもたらすようです。 –

+0

私はそのように使うことを好む。 :) – sktneer

+0

私はそれを笑っていない限り、私はする。 。範囲。列はより簡単で親しみやすいです。 –

1

表(ListObject)から列AとB列の最後の行を取得するために以下のコードを試してください:

Option Explicit 

Sub LastRowTable() 

Dim Tbl As ListObject 
Dim LastRow2 As Long, LastRow3 As Long 

' modify "Table1" to your table's Name 
Set Tbl = ThisWorkbook.Worksheets("DataÖnskemål").ListObjects("Table1") 

LastRow3 = Tbl.ListColumns(1).Range.Rows.Count '<-- last row in Column A in your Table 
LastRow2 = Tbl.ListColumns(2).Range(LastRow3, 1).End(xlUp).Row '<-- last row with data in Column B in your Table 

End Sub 
+2

同じ表内のリスト列は、常に同じ数の行を持ちます。 – Rory

+0

@Rory true、ありがとう、コードを編集しました;) –

+1

'Tbl.ListColumns(1).Range.Rows.Count'は行数を表しますが、最後の行は表しません(ただし、表がシート)。 –

1

の最後の行を見つけますテーブルは少し混乱します。特に、ユーザーがデータをフィルタリングした場合に対応する必要がある場合が多いためです。複数のチェックを含むループは、テーブル内のデータのニーズに合わせて調整することができます。

また、最終行が実際に表であることが確実かどうかは言及していません。

.Find関数は、テーブル内であろうとなかろうと空でないセルや、非表示かどうかにかかわらず(フィルター処理されたテーブルには対応していませんが)便利です。 (例えば、空の文字列ではなく、「空でないセル」といっても当てはまらないかもしれませんが、これらの例外はあなたにとって問題にならないかもしれません)。とにかくあなたのコードは次のようになります。

With Sheet1 
    lastRow1 = .Columns(1).Find(What:="*", _ 
           After:=.Columns(1).Cells(1), _ 
           LookAt:=xlPart, _ 
           LookIn:=xlFormulas, _ 
           SearchOrder:=xlByRows, _ 
           SearchDirection:=xlPrevious, _ 
           MatchCase:=False).Row 

    lastRow2 = .Columns(2).Find(What:="*", _ 
           After:=.Columns(2).Cells(1), _ 
           LookAt:=xlPart, _ 
           LookIn:=xlFormulas, _ 
           SearchOrder:=xlByRows, _ 
           SearchDirection:=xlPrevious, _ 
           MatchCase:=False).Row 
End With 
+0

データをフィルタリングするユーザーのケースは、何かをする前にフィルタがクリアされていることを確認することによって、かなり簡単に処理されます。 – Selkie

0

あなた `Table`の名前は何ですか?この

Dim DataRange As Range 

Set DataRange = Range("A1:M" & LastRow) 
関連する問題