VBA代码使用消息框执行,但不是没有

时间:2017-12-04 14:21:31

标签: vba excel-vba excel

我在VBA中有一个Sub,我需要能够多次运行。当我执行这段代码以找到工作表的最后一行时:

Dim lastRow As Long
With ActiveSheet
lastRow = xlWs.Cells(.Rows.count, "A").End(xlUp).Row
End With

我得到了

  

对象变量或未设置块变量

当我第二次执行它时,但如果我在变量集之前添加一个消息框:

Dim lastRow As Long
With ActiveSheet
MsgBox xlWs.Cells(.Rows.count, "A").End(xlUp).Row
lastRow = xlWs.Cells(.Rows.count, "A").End(xlUp).Row
End With

无论我运行多少次,它都能正常工作。有没有人遇到过这个问题?第一组代码出了什么问题,用第二组修正了?

2 个答案:

答案 0 :(得分:0)

您正在使用xlWs作为您定义的代码块lastrow中的工作表对象,在调用它之前我无法看到您在哪里定义它,这就是您收到错误的原因。如果您在先前的代码执行中设置了该对象,并且某种程度上该工作表处于活动状态,您将不会收到任何错误消息。我们在运行代码或运行代码时没有更多关于其他参数的信息,但是这里最好的问题是如何遵循对象的清晰和标准定义并使用它们在良好的代码行内。我会为最后一行编写一个函数,并使工作表和列号可选:

Function LastRowInColumn(Optional sh As Worksheet, Optional colNumber As Long = 1) As Long
    'Finds the last row in a particular column which has a value in it
    If sh Is Nothing Then
        Set sh = ActiveSheet
    End If
    LastRowInColumn = sh.Cells(sh.Rows.Count, colNumber).End(xlUp).row
End Function

此功能将管理为您设置正确的工作表,如果您输入它将使用它的工作表对象,如果没有,那么它将使用活动工作表。对于要定义最后一行的列也是如此,如果输入任何列号(例如colNumber = 3将是C列),它将找到该列中的最后一行,如果将其留空,则会考虑列甲

答案 1 :(得分:0)

我没有测试过这个,但我之前遇到过这个问题。

我认为问题在于你没有资格.Rows.count。尝试将其更改为xlWs.Rows.count。没有它,您将获得活动工作表的行数。

没有前面对象的点运算符指向With语句中定义的对象,即使它在cells()语句中是合格的。)

' Try This
Dim lastRow As Long
With ActiveSheet
    lastRow = xlWs.Cells(xlWs.Rows.count, "A").End(xlUp).Row
End With

我不确定你为什么使用"使用Active Sheet"。看起来你正试图获取工作表xlWs中的最后一行,我假设它是一个工作表对象。

因此,代码可以简化为:

' Better yet, try this
Dim lastRow As Long
lastRow = xlWs.Cells(xlWs.Rows.count, "A").End(xlUp).Row

消息框修复它的原因是因为活动工作表通过执行更改为xlWs .End(xlUp)

' This code changes the active worksheet to worksheet xlWs
' by doing .End(xlUp)
MsgBox xlWs.Cells(.Rows.count, "A").End(xlUp).Row