Я пишу код VBA для нахождения last_row следующего листа на листе диаграммы, в диаграмме я использую функции Chart_MouseUp и Chart_MouseDown, здесь я объясняю Chart_MouseUp внутри события Chart_MouseDown, которое я принимаю, я беру начальную точку x и y с координатами диаграммы и и и в событии Chart_MouseUp я беру координаты x и y конечной точки диаграммы, и после этого процесса я сохраняю координаты начальной и конечной точек x внутри столбца "AQ" следующего листа, для этого мне нужно знать номер ячейки, который в столбце AQ отсутствует, для этого я должен знать last_Row ячейки AQ, и для этого я использую этот код

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

Ошибка во время выполнения «1004» Метод «Строки» Object_Global не удалось

Всякий раз, когда код, как

'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 ответ1

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: Инструменты -> Параметры -> Вкладка редактора -> Требуется объявление переменной

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .