运行时错误‘1004’Object_Global 的方法‘Rows’失败

运行时错误‘1004’Object_Global 的方法‘Rows’失败

我正在编写 VBA 代码来查找图表工作表中下一张工作表的最后一行,在图表中我使用 Chart_MouseUp 和 Chart_MouseDown 函数,在这里我正在解释 Chart_MouseDown 事件中的 Chart_MouseUp 我正在获取图表起点 x 和 y 坐标,并在 Chart_MouseUp 事件中获取图表终点 x 和 y 坐标,在此过程之后,我将起点和终点 x 坐标存储在下一张工作表“AQ”列中为此我必须知道在 AQ 列中空白的单元格数量为此我必须知道 AQ 单元格的最后一行,为此我正在使用这段代码

           Dim last_Row As Integer
           last_Row = Sheets(5).Range("B" & Rows.count).End(xlUp).Row
           MsgBox last_Row

运行时错误‘1004’Object_Global 的方法‘Rows’失败

每当代码如下

'Sheets(5).Range("AQ4") = startX
'Sheets(5).Range("AQ5") = endX

在同一张表内工作这里是 Chart_MouseUp 事件代码如果您有处理此问题的想法请指导我

Private Sub Chart_MouseUp(ByVal Button As Long, ByVal Shift As Long, _
        ByVal x As Long, ByVal y As Long)

    Dim ElementID As Long, Arg1 As Long, Arg2 As Long
    Dim myX As Variant, myY As Double
  With ActiveChart
        ' Pass x & y, return ElementID and Args
        .GetChartElement x, y, ElementID, Arg1, Arg2
        ' Did we click over a point or data label?
        If ElementID = xlSeries Or ElementID = xlDataLabel Then
            If Arg2 > 0 Then
                ' Extract x value from array of x values
                myX = WorksheetFunction.Index _
                    (.SeriesCollection(Arg1).XValues, Arg2)
                ' Extract y value from array of y values
                myY = WorksheetFunction.Index _
                    (.SeriesCollection(Arg1).Values, Arg2)
                     endX = CDate(myX)
                     endY = myY
                   ' Display message box with point information
                     MsgBox "X = " & startX & vbCrLf _
                    & "Y = " & startY & vbCrLf _
                    & "X = " & endX & vbCrLf _
                    & "Y = " & endY
                    'Sheets(5).Range("AQ4") = startX
                    'Sheets(5).Range("AQ5") = endX
                    Dim last_Row As Integer
                    'Dim sh As Worksheet
                    last_Row = Sheets(5).Range("B" & Rows.count).End(xlUp).Row
                    MsgBox last_Row

            End If
        End If
    End With

End Sub

答案1

解释:

您的问题并不完全清楚,但问题似乎是您在代码的这一行收到 1004 错误:last_Row = Sheets(5).Range("B" & Rows.count).End(xlUp).Row

如果是这种情况,并且假设您的图表是“图表工作表”(即,仅包含图表的单独工作表),而不是简单嵌入“标准工作表”(即,包含行和列的工作表)的图表,那么预计会出现该错误。

原因是Rows当活动工作表为“图表工作表”时,该对象不可用,因为此类工作表不包含任何行(或列)。显然,当您的代码运行时,“图表工作表”确实是活动工作表,因为您的代码在触发图表Mouse_Up事件时运行。


解决:

这个问题的解决方案很简单。假设这Worksheets(5)是一张包含行和列的工作表,用下面的代码替换有问题的代码行:

last_Row = Sheets(5).Range("B" & ThisWorkbook.Worksheets(5).Rows.Count).End(xlUp).Row

或者,更好的选择可能是用这些来替换问题行:

Dim sh As Worksheet: Set sh = ThisWorkbook.Worksheets(5)
last_Row = sh.Range("B" & sh.Rows.Count).End(xlUp).Row


笔记:

您的代码使用了四个未声明的变量(其中两个甚至没有赋值)。这与 1004 错误无关,但在使用变量之前声明它们是一种很好的编码习惯。

为了避免将来出现此问题,您可以Option Explicit在模块顶部包含一个语句,这将强制声明该模块中的所有变量。您可以阅读更多相关信息这里

要为每个新创建的模块自动执行此操作,请在 VBA 编辑器中启用此选项:工具 -> 选项 ->编辑器选项卡-> 要求变量声明

相关内容