Слишком многократная вставка новой строки Excel с VBA приводит к ошибке 1004. Ошибка вставки метода класса Range - PullRequest
0 голосов
/ 11 октября 2019

Этот код работал отлично. Тогда это просто перестало работать. Если я удаляю строку, она работает один раз, а затем снова завершается с ошибкой после этой точки:

Ошибка 1004 возникает в этой строке ниже в коде, когда достигается «порог» независимо от того, что его вызывает:

Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

Вот макрос Excel VBA:

 Sub InsertNewRow()
    '
    ' InsertNewRow Macro
    ' Inserts a new row at row 2 and adds the date/time and user name.
    '
    ' Keyboard Shortcut: Ctrl+Shift+N
    '
        ActiveSheet.Rows("2:2").Select
        Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        ActiveSheet.Range("H2").Select
        ActiveCell.FormulaR1C1 = Now()
        ActiveSheet.Range("J2").Select
        ActiveCell.FormulaR1C1 = UCase(Application.UserName & "")
        ActiveSheet.Range("A2").Select
    End Sub

Есть идеи о том, ПОЧЕМУ это происходит и как его можно навсегда предотвратить?

Error Message

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Данные приведены в таблице на листе. Если я просто выберу строку и затем попытаюсь вставить строку вручную, опция INSERT будет выделена серым цветом.

enter image description here

Если я выбираю строку таблицы целиком, а затем пытаюсь вставить строку таблицы, опция добавления строк в таблицу также становится серой. вне. Кажется, это ограничение таблиц в формате Excel. Я не уверен, почему он не может обрабатывать ниже 6000 строк. Кажется глючит.

enter image description here

Я попробовал это, чтобы увидеть, если это был предел самой таблицы:

enter image description here

... Получила эту ошибку:

enter image description here

1 Ответ

0 голосов
/ 11 октября 2019

Здесь попробуйте это:

Option Explicit 'force variable declaration
Sub InsertNewRow()

    'Lets assume your column with all the rows filled is H so if this is not correct, feel free to make the changes needed.
    'You need to avoid using .Select or .Activate and this is a way to do so:

    'Working with the With block will allow you to reference an object with just a dot. in this case a worksheet
    With ThisWorkbook.Sheets("YourSheet") 'fully quallify your ranges, ThisWorkbook means the workbook with the code and change YourSheet

        'Declare a variable to check the last row with data
        Dim LastRow As Long
        LastRow = .Cells(1, "H").End(xlDown).Row 'this could erase data if you have blank cells between

        'check if the last row with data is the last row for the sheet
        If LastRow = .Rows.Count Then
            MsgBox "Sorry, no more rows can be added to this sheet." 'if so, pop a warning
            Exit Sub
        Else
            .Rows(LastRow + 1 & ":" & .Rows.Count).Delete 'if not, delete all the rows below your last row to avoid problems
        End If

        .Rows(2).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        .Range("H2") = Now 'this will print a value, so it won't change every second
        .Range("J2") = UCase(Application.UserName & "")

    End With

        'There was no need to select anything in this code, your sheet could even be hidden and this will work

End Sub

И прочитайте это для получения дополнительной информации о том, как избежать использования выбора или активации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...