繁体   English   中英

excel vba 复制并粘贴以修复“#REF”单元格

[英]excel vba copy and paste to fix “#REF” cells

我正在尝试在 excel 365 上进行支票簿注册。我正在尝试添加删除行(事务)的功能,但是当我运行 vba 代码时,它会出现以下错误:运行时错误“1004”:粘贴工作表 class 的方法失败。

当我运行我的代码来删除一行时,余额列会填满“#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

任何人都有任何想法来完成这项工作。

你有 dim 'rngg' 但设置了 'rng' - 这些不应该是相同的吗?

当您删除该行时,复制的信息似乎从剪贴板中丢失了。 相反,您可以从前一行的 I 列中复制公式,然后将其粘贴回您删除的行中:

rng.EntireRow.Delete
ActiveSheet.Range("I" & deletedRow - 1).Copy
ActiveSheet.Range("I" & deletedRow).Select
ActiveSheet.Paste

删除包含公式的行

在此处输入图像描述

小费

在设计模式下,右键单击命令按钮和 select 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM