VBA调试头痛

时间:2016-07-18 00:07:02

标签: vba excel-vba macros excel

我编写了这段代码,用于分析工作表中导入数据的大小。目标是确定导入数据的最后一行和哪一行,然后选择该范围并将其格式化为表并为其指定名称。听起来很简单,对吧?

当我运行我的代码时,我似乎在我定义要格式化的范围的部分出现错误。我使用变量lCol和lRow作为范围的末尾,代表最后一列和最后一行,如前面的代码中所示。 我得到的错误是:

Run-time error '1004':

Method '_Default' of object 'Range' failed

我真的在每个论坛上挖掘了我能找到的关于这件事的帖子,但我还是没有弄清楚出了什么问题。我也是VBA的新手,请原谅我,如果涉及一个非常简单的解决方案。

整个代码是:

Sub TextBox1_Click()

End Sub

Sub Range_Find_Method_Row()

    Worksheets("Copy Quick Report Here").Activate

'Finds the last non-blank row on a sheet/range.

Dim lRow As Long

    On Error Resume Next
    lRow = Cells.Find(What:="*", _
                    After:=Range("A1"), _
                    LookAt:=xlPart, _
                    LookIn:=xlFormulas, _
                    SearchOrder:=xlByRows, _
                    SearchDirection:=xlPrevious, _
                    MatchCase:=False).Row
    On Error GoTo 0


End Sub


Sub Range_Find_Method_Column()
'Finds the last non-blank row on a sheet/range.

Dim lCol As Long

    On Error Resume Next
    lCol = Cells.Find(What:="*", _
                    After:=Range("A1"), _
                    LookAt:=xlPart, _
                    LookIn:=xlFormulas, _
                    SearchOrder:=xlByColumns, _
                    SearchDirection:=xlPrevious, _
                    MatchCase:=False).Column
    On Error GoTo 0


End Sub

Sub Format_as_Table()


' Format_as_Table Macro
' This Macro formats the imported Quick Report as a table. This creates headers which are necessary for
' the summary calculations.

    Sheet1.Activate
    Sheet1.Range(Cells(5, 2), Cells(lRow, lCol)).Select     %%%%ERROR HERE%%%%%
    ActiveSheet.ListObjects.Add(xlSrcRange, Range(Cells(5, 2), Cells(lRow, lCol)), , xlYes).Name = "KPI_Table"
    Range("KPI_Table[#All]").Select
    ActiveSheet.ListObjects("KPI_Table").TableStyle = "TableStyleLight1"
    ActiveWindow.ScrollColumn = 1


End Sub

如果有人可以帮助我,我将非常感激。 问候 D.

1 个答案:

答案 0 :(得分:1)

你的问题是你创造了3个不同的子,每个子都彼此独立 您需要了解life cycle and scope of a variable

话虽如此,您的变量let realm = try! Realm() override func viewDidLoad() { super.viewDidLoad() // retrieve all objects from realm let readers = realm.objects(Reader) print(readers) } lrow在程序lcolRange_Find_Method_Row()完成执行后立即销毁。

您的第三个也是最后一个程序Range_Find_Method_Row()无法识别。

现在,我们如何让它发挥作用。好吧,第一个答案是在我发布的链接中。您可以将其声明为Format_as_Table() 或我们大多数人称之为Module-Level 我的错误,全局变量使用 Global Variable < em>关键字而不是 Public 。这样,在您调用它的过程之后,您的变量持久化事件将完成执行。像这样:

Dim
Option Explicit
Dim lcol As Long
Dim lrow As Long

Sub Range_Find_Method_Row()
    '~~> Notice that I did a little modification here, I'm not a fan of Activate Method
    Dim ws As Worksheet
    Set ws = Worksheets("Copy Quick Report Here")

    On Error Resume Next
    lRow = ws.Cells.Find(What:="*", _
                After:=ws.Range("A1"), _
                LookAt:=xlPart, _
                LookIn:=xlFormulas, _
                SearchOrder:=xlByRows, _
                SearchDirection:=xlPrevious, _
                MatchCase:=False).Row
    On Error GoTo 0
End Sub
Sub Range_Find_Method_Column()
    Dim ws As Worksheet
    Set ws = Worksheets("Copy Quick Report Here")

    On Error Resume Next
    lCol = ws.Cells.Find(What:="*", _
                After:=ws.Range("A1"), _
                LookAt:=xlPart, _
                LookIn:=xlFormulas, _
                SearchOrder:=xlByColumns, _
                SearchDirection:=xlPrevious, _
                MatchCase:=False).Column
    On Error GoTo 0
End

第二个(实际上这应该是第一个)是将所有子组合成一个大程序。我认为你没有理由不想这样做。

第三种情况是,如果您要在代码的其余部分中经常检查最后一行和列,则可能需要使用函数。类似的东西:

Sub Format_as_Table()
    '~~> I'm not a fan of select/Activesheet as well, so re-tailored your code a bit
    With Sheet1
        .ListObjects.Add(xlSrcRange, Range(Cells(5, 2), _
            Cells(lRow, lCol)), , xlYes).Name = "KPI_Table"
        .ListObjects("KPI_Table").TableStyle = "TableStyleLight1"
    With
End Sub

然后您可以在程序中的任何位置使用此功能,如下所示:

Function Range_Find_Last(ws As Worksheet, Optional SearchOrder As XlSearchOrder = xlByRows)
    Dim r As Range
    On Error Resume Next
    Set r = ws.Cells.Find(What:="*", _
                After:=ws.[A1], _
                LookAt:=xlPart, _
                LookIn:=xlFormulas, _
                SearchOrder:=SearchOrder, _
                SearchDirection:=xlPrevious, _
                MatchCase:=False)
    On Error GoTo 0

    If Not r Is Nothing Then
        If SearchOrder = xlByRows Then
            Range_Find_Last = r.Row
        Else
            Range_Find_Last = r.Column
        End If
    Else
        Range_Find_Last = "#Null!"
    End If
End Function

这种功能已经有很多变化和/或找到最后一行和列的方法。你可以发现更多。