Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba lastrow和excel表格。_Vba_Excel - Fatal编程技术网

Vba lastrow和excel表格。

Vba lastrow和excel表格。,vba,excel,Vba,Excel,我试图定义一个lastrow代码,该代码将返回excel表中最后一个非空单元格的最后一行值。(其格式为表格) 我的exceltable的值在A列1到1005之间,B列1到414之间,C列414到1005之间 我想要的是一个lastrow代码返回414,一个返回1005。我遇到的问题是,因为它在一张桌子里。我的密码 lastrow3 = ThisWorkbook.Worksheets("DataÖnskemål").Range("A" & Rows.Count).End(x

我试图定义一个lastrow代码,该代码将返回excel表中最后一个非空单元格的最后一行值。(其格式为表格)

我的exceltable的值在A列1到1005之间,B列1到414之间,C列414到1005之间

我想要的是一个lastrow代码返回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

尝试下面的代码从表中获取A列和B列的最后一行(
ListObject
):

选项显式
子LastRowTable()
作为ListObject的Dim Tbl
调暗最后一行2的长度,最后一行3的长度
'将“Table1”修改为表名
Set Tbl=此工作簿。工作表(“数据Önskemål”)。列表对象(“表1”)

LastRow3=Tbl.ListColumns(1).Range.Rows.Count'查找表的最后一行有点麻烦,尤其是当您经常需要满足用户已过滤数据的情况时。具有多个检查的循环可能更适合您,因为您可以根据自己对表中数据的需要对其进行调整

您也没有提到是否可以确定最后一行确实是一个表

鉴于以上几点,可能
.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

如果工作表上excel表格下有数据,则会出现问题。在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
试试这个

 Dim DataRange As Range

Set DataRange = Range("A1:M" & LastRow)

我一直在寻找一个类似的答案,最终找到了一个替代方案。我发现它在测试用例中非常有效。试试这个例子:

Dim loTable As ListObject
Dim lngRowLast1 As Long
Dim lngRowLast2 As Long

'Set reference to your specific table
Set loTable = ThisWorkbook.Sheets(1).ListObjects("Table1")
With loTable
    'I use the following as a catch in case the table is empty
    If .DataBodyRange Is Nothing Then 
        .ListRows.Add
        lngRowLast1 = 1
        lngRowLast2 = 1
    Else
        lngRowLast1 = .DataBodyRange.Cells(.ListRows.Count, 1).End(xlUp).Row
        lngRowLast2 = .DataBodyRange.Cells(.ListRows.Count, 2).End(xlUp).Row
    End If
End With
我认为工作表中的End命令将始终停止在表体的最后一行,无论该行中是否有内容。取而代之的是在dataodyrange中使用End(xlUp)命令,该命令的行为与您希望查找最后使用的行的行为相同


我还将您的引用从一个范围切换到另一个单元格,因为我发现为列引用传入变量更容易。

您的
表的名称是什么
?我可以问一下为什么您需要知道一个表的不同“最后”行吗?如果这两列不相关,那么它们实际上应该是单独的表。您可以在B列中的行之间循环,从A列的1到最后一行,通过计算“”或使用IFEROR(1/单元格)来查找第一行为空,该行试图作为的副本关闭,但它没有专门针对表。同样的原则也适用,正如@sktneer在下面回答的那样。同一表格中的Listcolumns将始终具有相同的行数。
Tbl.Listcolumns(1.Range.rows.Count
表示行数,但不表示最后一行(表格从工作表的第1行开始的情况除外)。
Listcolumns(\u index\u1).Range
可能比
.Range.Columns(\u index_41;
更好,但两者似乎产生相同的结果。我更喜欢这样使用它。:)我会的,除非我想一想。lol..range.columns更容易/熟悉。通过确保在做任何事情之前清除过滤器,用户过滤数据的情况相当容易处理。
Dim loTable As ListObject
Dim lngRowLast1 As Long
Dim lngRowLast2 As Long

'Set reference to your specific table
Set loTable = ThisWorkbook.Sheets(1).ListObjects("Table1")
With loTable
    'I use the following as a catch in case the table is empty
    If .DataBodyRange Is Nothing Then 
        .ListRows.Add
        lngRowLast1 = 1
        lngRowLast2 = 1
    Else
        lngRowLast1 = .DataBodyRange.Cells(.ListRows.Count, 1).End(xlUp).Row
        lngRowLast2 = .DataBodyRange.Cells(.ListRows.Count, 2).End(xlUp).Row
    End If
End With