Nano Hash - криптовалюты, майнинг, программирование

Вставка новой строки Excel с помощью VBA слишком много раз приводит к ошибке 1004: сбой метода вставки класса Range

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

Ошибка 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

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

Сообщение об ошибке

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

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

введите здесь описание изображения

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

введите здесь описание изображения

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

введите здесь описание изображения

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

введите здесь описание изображения

11.10.2019

  • у вас есть данные в последней строке листа? 11.10.2019
  • Привет, почему бы тебе просто не использовать Rows(2).Insert shift:=xlShiftDown. 11.10.2019
  • В последней строке листа не было данных. 11.10.2019
  • Относительно того, почему не просто Rows (2)... потому что мой опыт работы с VBA говорит мне, что выбор ячеек, как правило, намного надежнее, чем манипулирование ими, когда они не выбраны. Таким образом, VBA имеет тенденцию быть более глючным. Но ясно, что в этот раз все наоборот. 11.10.2019
  • Я удалил все пустые строки в электронной таблице снизу, и теперь я не могу воспроизвести ее после вставки 400 строк с кодом. На данный момент это исправлено, но я действительно хотел бы понять, ПОЧЕМУ он сломался, чтобы я мог предотвратить это в будущем. Кажется, что был достигнут какой-то порог, и это вызвало это, но в электронной таблице было всего 4000 строк, так что это не было ситуацией с 40 000 строк плюс. 11.10.2019
  • Я использовал резервную копию, в которой все еще была проблема, и использовал код Rows(2).Insert shift:=xlShiftDown вместо моей строки 2, и все равно выдавал ту же ошибку 1004. 11.10.2019
  • Даже если в последней строке не было данных, возможно, имело место некоторое форматирование, т. е. если эта последняя строка была затронута в любой момент, к ней мог быть привязан артефакт. Заполните последнюю ячейку цветом, например. и выдает ту же ошибку 1004. 11.10.2019
  • Также: Office 365/Excel — это версия Excel, в которой это происходит. 11.10.2019
  • поскольку мой опыт работы с VBA говорит мне, что выбор ячеек, как правило, намного надежнее, чем манипулирование ими, когда они не выбраны, я никогда не видел ничего, что подтверждало бы это утверждение. Наоборот, отказ от выборки делает код чище, быстрее и надежнее. 11.10.2019
  • Управление листом, который не выбран, было проблемой, по крайней мере, исторически. 11.10.2019
  • @EricI Только если вы попытаетесь .Select ячеек на этих неактивированных листах, что может привести к ошибкам. В любом другом случае вы можете реально манипулировать листами, которые не активны, просто нужно делать это правильно. 11.10.2019
  • Наиболее вероятной причиной этого является то, что UsedRange расширился до последней строки листа. Если это произойдет снова, запустите Debug.Print ActiveSheet.Usedrange.Address, чтобы проверить это. 11.10.2019
  • Re Управление листом, который не выбран, было проблемой, по крайней мере, исторически наиболее распространенной причиной этого являются неявные ссылки ActiveSheet (ссылки диапазона без явной ссылки на рабочий лист). 11.10.2019
  • Использование Select может иметь катастрофические последствия. Это позволяет вещам происходить между выбором и действием. Если у вас есть сценарии, которые выполняются в течение нескольких секунд, пользователь может делать всевозможные вещи, которые могут вводить действие между строками вашего кода. 11.10.2019
  • В резервной версии, в которой все еще есть проблема, ?ActiveSheet.UsedRange.Address возвращает $A$1:$T$5156. Это не совсем убедительно, почему это может быть проблемой. 11.10.2019
  • @Ericl хорошая информация! Это исключает Userange как проблему. Не могли бы вы добавить скриншот всплывающего окна с сообщением об ошибке? 11.10.2019
  • Кстати, вы должны добавить эту информацию в Q. 11.10.2019
  • Добавлено изображение ошибки 11.10.2019
  • Я пробовал: ThisWorkbook.Sheets(Настоящее имя рабочего листа здесь).Rows(2).Insert shift:=xlShiftDown, и это привело к той же ошибке 1004. Похоже, это не связано со ссылкой на рабочий лист или активным выбором. 11.10.2019
  • ДРУГАЯ ПОДСКАЗКА: если я просто выберу строку, щелкну правой кнопкой мыши, я увижу, что INSERT неактивен. Это не код. Лист НЕ защищен, так что проблема не в защите. 11.10.2019
  • Я добавил еще несколько принтскринов в исходный пост. Кажется, это ошибка/проблема в форматированных таблицах Excel. Там нет задокументированного ограничения строк в отформатированных таблицах, которые я могу найти. Я бы предположил, что это будет тот же предел, что и для строк в электронной таблице. Конечно, если я продолжаю прогуливаться вниз, это продолжает визуально увеличивать стол. 11.10.2019
  • @ericl тот факт, что у вас есть таблица на листе, очень важен. Последняя ошибка, которую вы опубликовали, означает, что что-то простирается до нижней части листа. Если это не UsedRange, возможно, это таблица Databodyrange. 11.10.2019

Ответы:


1

Вот, попробуйте это:

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

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

11.10.2019
  • Я не могу слепо удалять строки. Пользователи иногда помещают в данные пустые строки, поэтому приведенный выше код не будет надежно работать. Мне было бы лучше время от времени удалять строки вручную, чем полагаться на этот код выше, чтобы никогда не удалять реальные данные. Но спасибо за ваш вклад. 11.10.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..