Vba 动态最后一行

Vba 动态最后一行,vba,excel,Vba,Excel,我使用以下代码查找Sheet1和Sheet2中的最后一行 Dim 1LastRow As Long Dim 2LastRow As Long 1LastRow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row 2LastRow = Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row 这与最初的预期一样,但是我希望“1LastRow”进行调整以动态拾取最后一行 Dim 1LastRow

我使用以下代码查找Sheet1和Sheet2中的最后一行

Dim 1LastRow As Long
Dim 2LastRow As Long
1LastRow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
2LastRow = Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row
这与最初的预期一样,但是我希望“1LastRow”进行调整以动态拾取最后一行

Dim 1LastRow As Long
Dim 2LastRow As Long
1LastRow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
2LastRow = Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row
Sheets("Sheet2").Range("B2:B" & 2LastRow).Copy
Sheets("Sheet1").Range("D2").PasteSpecial xlPasteValues 
1LastRow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
例如,如果Sheet1最初有50行,但在之后:

Sheets("Sheet2").Range("B2:B" & 2LastRow).Copy
Sheets("Sheet1").Range("D2").PasteSpecial xlPasteValues 

Sheet1现在有55行。但是,“1LastRow”仍然假设Sheet1只有50行,因此在使用“1LastRow”时,代码的其余部分会产生不一致。非常感谢您的任何意见

嗯,变量本身并不会神奇地更新。您可以看到您有粘贴行的代码。当您更改最后一行时,只需重复为最后一行设置变量的代码

Dim 1LastRow As Long
Dim 2LastRow As Long
1LastRow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
2LastRow = Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row
Sheets("Sheet2").Range("B2:B" & 2LastRow).Copy
Sheets("Sheet1").Range("D2").PasteSpecial xlPasteValues 
1LastRow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
或者,您可以使用动态范围名称,并使用以下行的公式:

=INDEX(Sheet1!$A:$A,COUNTA(Sheet1!$A:$A))
然后参考该范围,如

ThisWorkbook.Worksheets("Sheet1").Range("OneLastRow").Row

但是,如果列包含空白单元格,则此操作将失败。

嗯,变量不会神奇地自我更新。您可以看到您有粘贴行的代码。当您更改最后一行时,只需重复为最后一行设置变量的代码

Dim 1LastRow As Long
Dim 2LastRow As Long
1LastRow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
2LastRow = Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row
Sheets("Sheet2").Range("B2:B" & 2LastRow).Copy
Sheets("Sheet1").Range("D2").PasteSpecial xlPasteValues 
1LastRow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
或者,您可以使用动态范围名称,并使用以下行的公式:

=INDEX(Sheet1!$A:$A,COUNTA(Sheet1!$A:$A))
然后参考该范围,如

ThisWorkbook.Worksheets("Sheet1").Range("OneLastRow").Row

但是,如果列包含空白单元格,则此操作将失败。

首先,您的代码无法在Office VBA环境中编译:变量名称不能以数字开头。因此,让我们将它们称为
LastRow1
LastRow2

第二,即使有一些自动生成变量自更新的方法,您的代码也会失败,因为您正在从
Sheet2
复制一个1列范围,并从
Sheet1
的单元格D2开始粘贴它,这对列的最后一行索引设置没有任何影响

综上所述,您可以使用返回所需行索引的
函数()

例如,此功能:

Function LastRow1() As Long
    With Sheets("Sheet1")
        LastRow1 = .Cells(.Rows.Count, 4).End(xlUp).Row
    End With
End Function
将返回
Sheet1
列D last not empty row index(如果列A完全为空,它实际上将失败,但这是一个简单的修复方法)

只需更改
.Cells(.Rows.Count,4)

因此,您的“主”代码如下所示:

Sub main()
    Dim LastRow2 As Long
    LastRow2 = Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row 

    Sheets("Sheet2").Range("B2:B" & LastRow2).Copy
    Sheets("Sheet1").Range("D2").PasteSpecial xlPasteValues

    MsgBox LastRow1 ' this would return Sheet1 column D last not empty row index

    MsgBox Sheets("Sheet1").Range("D2:D" & LastRow1).Address 'this would return the address of Sheet1 column D range from cell D2 down to last not empty cell

End Sub

首先,您的代码不会在Office VBA环境中编译:变量名称不能以数字开头。因此,让我们将它们称为
LastRow1
LastRow2

第二,即使有一些自动生成变量自更新的方法,您的代码也会失败,因为您正在从
Sheet2
复制一个1列范围,并从
Sheet1
的单元格D2开始粘贴它,这对列的最后一行索引设置没有任何影响

综上所述,您可以使用返回所需行索引的
函数()

例如,此功能:

Function LastRow1() As Long
    With Sheets("Sheet1")
        LastRow1 = .Cells(.Rows.Count, 4).End(xlUp).Row
    End With
End Function
将返回
Sheet1
列D last not empty row index(如果列A完全为空,它实际上将失败,但这是一个简单的修复方法)

只需更改
.Cells(.Rows.Count,4)

因此,您的“主”代码如下所示:

Sub main()
    Dim LastRow2 As Long
    LastRow2 = Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row 

    Sheets("Sheet2").Range("B2:B" & LastRow2).Copy
    Sheets("Sheet1").Range("D2").PasteSpecial xlPasteValues

    MsgBox LastRow1 ' this would return Sheet1 column D last not empty row index

    MsgBox Sheets("Sheet1").Range("D2:D" & LastRow1).Address 'this would return the address of Sheet1 column D range from cell D2 down to last not empty cell

End Sub

您使用什么触发代码运行?这实际上取决于数据更新的频率以及信息在代码中的使用方式。编辑:键入新数据将每天粘贴到Sheet2中(数据转储),需要执行代码以更新Sheet1上的值。您使用什么触发代码运行?这实际上取决于数据更新的频率以及信息在代码中的使用方式。编辑:键入新数据将每天粘贴到Sheet2中(数据转储),需要执行代码以更新Sheet1上的值。感谢您的回复。我相信在最后一行调整后重新设置变量将是我的数据的最佳解决方案。VBA对我来说是一门新语言,你说的“重复代码”是什么意思?这样做会产生重复的错误。我尝试在粘贴附加行的代码行之后创建一个名为3LastRow的新LastRow,但它没有按预期获得最后一行。再次感谢。你知道你可以一次又一次地将同一个变量设置为不同的值,对吗?因此,在执行粘贴命令后,下一行应该是
1LastRow=Sheets(“Sheet1”)。单元格(Rows.Count,1)。End(xlUp)。Row
-无需使用新的变量名。同样,VBA对我来说是一种新语言,通过不同的课程/调查以前的问题,我无法掌握一些东西。所以不,我不知道你可以一次又一次地将同一个变量设置为不同的值。但我很欣赏这种编辑,“变量”的概念就是,值是“可变的”,即它可以改变。您只需要发出命令,用变量现在应该具有的值刷新变量值。我很失望,你接受了一个与你在问题中描述的不符的答案。我向您展示了如何将变量调整为所需的值。我建议你取消所选答案的标记,并将我的帖子标记为答案,因为它符合你的要求。谢谢你的回复。我相信在最后一行调整后重新设置变量将是我的数据的最佳解决方案。VBA对我来说是一门新语言,你说的“重复代码”是什么意思?这样做会产生重复的错误。我尝试在粘贴附加行的代码行之后创建一个名为3LastRow的新LastRow,但它没有按预期获得最后一行。再次感谢。你知道你可以一次又一次地将同一个变量设置为不同的值,对吗?因此,在执行粘贴命令后,下一行应该是
1LastRow=Sheets(“Sheet1”)。单元格(Rows.Count,1)。End(xlUp)。Row
-无需使用新变量名。同样,VBA是一个新的变量