Excel VBA скопировать и вставить, чтобы исправить ячейки "#REF" - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь зарегистрировать чековую книжку в Excel 365. Я пытаюсь добавить функцию удаления строки (транзакции), но когда я запускаю свой код VBA, он выдает следующее сообщение: Ошибка времени выполнения '1004 ': Метод вставки класса рабочего листа завершился неудачей.

Когда я запускаю свой код для удаления строки, столбец баланса заполняется "#REF". Мои попытки исправить это, скопировав столбец баланса и вставив его обратно после удаления строки, не работают. Столбец баланса по-прежнему заполняется символами "#REF". Вот код, который я использую для копирования и вставки столбца баланса:

Sub DeleteTransactionRectangle_Click()
    Dim deletedRow

    Dim rng As Range
    Set rng = Selection

    deletedRow = rng.Row

    MsgBox (deletedRow)
    Worksheets("Register").Range("I:I").Copy 
    rng.EntireRow.Delete

    ActiveSheet.Paste Destination:=Worksheets("Register").Range("I:I")

End Sub

У кого-нибудь есть идеи, как сделать эту работу.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Удаление строк, содержащих формулы

enter image description here

Совет

В режиме разработки щелкните правой кнопкой мыши на кнопку управления и выберите Properties. Измените TakeFocusOnClick на False, поэтому, когда вы нажимаете командную кнопку, она не выделяется (фокус), но выделение на вашем листе остается прежним.

Формула

Ваша формула оказывается плохой при удалении строк. Вы можете изменить его на:

=SUM(H$1:H2)-SUM(F$1:F2)

, что означает «удаление столбцов».

Улучшение кода

Для изучения

Измените значения в разделе констант в соответствии с вашими потребностями.

Option Explicit

Sub DeleteTransactionRectangle_Click()

    Const rowFR As Long = 2       ' First Row of Data
    Const colFR As Long = 9       ' Formula Column

    Dim rowLR As Long             ' Last Row of Data
    Dim rng As Range              ' Current Area (For Each Control Variable)
    Dim rngTransAction As Range   ' Transaction (Column) Range
    Dim rngUnion As Range         ' Union Range
    Dim rngFinal As Range         ' Intersection (Final) Range

    ' Calculate Last Row of Data.
    rowLR = Columns(colFR).Find(What:="*", LookIn:=xlFormulas, _
      SearchDirection:=xlPrevious).Row

    ' From the selection, create Union Range which only contains cells
    ' of Formula Column, which will later be compared
    ' to Transaction (Column) Range.
    For Each rng In Selection.Areas
        If Not rngUnion Is Nothing Then
            Set rngUnion = Union(rngUnion, Cells(rng.Row, colFR) _
              .Resize(rng.Rows.Count))
        Else
            Set rngUnion = Cells(rng.Row, colFR).Resize(rng.Rows.Count)
        End If
    Next

    ' Define Transaction (Column) Range.
    Set rngTransAction = Cells(rowFR, colFR).Resize(rowLR - rowFR + 1)

    ' Create Intersection (Final) Range which will 'eliminate'
    ' all 'non-valid' areas of the Selection Range. 'Non-valid' areas are
    ' the ones before First Row of Data and after Last Row of Data.
    If Not rngUnion Is Nothing Then Set rngFinal _
      = Intersect(rngUnion, rngTransAction)

    ' Delete rows of Intersection (Final) Range.
    If Not rngFinal Is Nothing Then rngFinal.EntireRow.Delete

End Sub
0 голосов
/ 08 апреля 2020

У вас есть dim 'rngg', но вы установили 'rng' - не должны ли они быть одинаковыми?

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

rng.EntireRow.Delete
ActiveSheet.Range("I" & deletedRow - 1).Copy
ActiveSheet.Range("I" & deletedRow).Select
ActiveSheet.Paste
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...