Excel ActiveSheet.受保护工作表上的粘贴错误[已解决]

Excel ActiveSheet.受保护工作表上的粘贴错误[已解决],excel,vba,Excel,Vba,我有两个工作表(输入和记录),我只想把一些数据从“输入”复制到“记录”,它工作了,但如果我保护“记录”工作表类的粘贴方法失败出现。 所以我添加了用于未受保护的工作表和保护工作表的脚本,但仍然出现了“1004”。 这里是我的项目的细节 输入工作表是我向一行输入一些值的区域。在一行中,在不同的列中至少有10个值 我最多可以添加十行 根据我要添加的输入工作表中的行数,记录工作表作为表1存储在数据库中 这是我的剧本 Sub adddata() 'this sub code from button o

我有两个工作表(输入和记录),我只想把一些数据从“输入”复制到“记录”,它工作了,但如果我保护“记录”工作表类的粘贴方法失败出现。 所以我添加了用于未受保护的工作表和保护工作表的脚本,但仍然出现了“1004”。 这里是我的项目的细节

  • 输入工作表是我向一行输入一些值的区域。在一行中,在不同的列中至少有10个值
  • 我最多可以添加十行
  • 根据我要添加的输入工作表中的行数,记录工作表作为表1存储在数据库中
这是我的剧本

Sub adddata() 'this sub code from button on "Input" sheet

Sheets("Input").Select
Range("C15").Offset(1, 0).Select 'select range start from C16
If Range("M27") = 1 Then 'value for how much row that i'll add
    Range(Selection, Selection.End(xlToRight)).Select
Else
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
End If
Selection.Copy

Sheets("Record").Select
Worksheets("Record").Unprotect Password:="4321"
If Range("B2").Offset(1, 0).Value = "" Then
    Range("B2").Offset(1, 0).Select
Else
    Range("B2").End(xlDown).Offset(1, 0).Select
End If
    ActiveSheet.Paste '<< The trouble maker
    Application.CutCopyMode = False
Worksheets("Record").Protect Password:="4321", UserInterfaceOnly:=True

End Sub
Sub adddata()”此子代码来自“输入”表上的按钮
工作表(“输入”)。选择
范围(“C15”)。偏移量(1,0)。选择“从C16开始选择范围”
如果Range(“M27”)=1,那么我将添加多少行的值
范围(选择,选择。结束(xlToRight))。选择
其他的
范围(选择,选择。结束(xlToRight))。选择
范围(选择,选择。结束(xlDown))。选择
如果结束
选择,复制
表格(“记录”)。选择
工作表(“记录”)。取消保护密码:=“4321”
如果范围(“B2”).偏移量(1,0).Value=”“,则
范围(“B2”)。偏移量(1,0)。选择
其他的
范围(“B2”)。结束(xlDown)。偏移量(1,0)。选择
如果结束

这个网站对新来者有点不友好。我不能评论,因为我没有足够的声誉。你能补充一下你的问题吗,你想做什么?我认为所有这些
Select
过程都是不必要的,您可以避免。我可以编辑我的答案,如果你愿意添加你的意图“你想做什么”

是否要从
Input
复制一些范围,并将其粘贴到
Record
始终粘贴到下一个空行

如果我没听错的话,也许是这样

Sub adddata()

    On Error GoTo ErrorHandler

    Application.ScreenUpdating = False
    ThisWorkbook.Worksheets("Record").Unprotect Password:="4321"
    
    Dim NextFreeCell As Range
    Set NextFreeCell = ThisWorkbook.Worksheets("Record").Cells(Rows.Count, "B").End(xlUp).Offset(RowOffset:=1)
    
    With ThisWorkbook.Worksheets("Input")
        If .Range("B2").Value = 1 Then
            .Range("C15", .Range("C15").End(xlToRight)).Copy
        Else
            .Range("C15", .Range("C15").End(xlDown).End(xlToRight)).Copy
        End If
    End With
    
    NextFreeCell.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    
    ThisWorkbook.Worksheets("Record").Protect Password:="4321", UserInterfaceOnly:=True

    ThisWorkbook.Worksheets("Input").Activate
    Application.ScreenUpdating = True
    Application.CutCopyMode = False
    
    Exit Sub
    
ErrorHandler:

    Application.CutCopyMode = False
    ThisWorkbook.Worksheets("Input").Activate
    Application.ScreenUpdating = True

    ThisWorkbook.Worksheets("Record").Protect Password:="4321", UserInterfaceOnly:=True

End Sub
以下是它的工作原理:


这不包括在你原来的问题中。因此,您必须创建一个新问题,并在原始问题的基础上添加其他信息。不过这次我会在这里回答,但下次不会

以下是表的代码:

Sub adddata()

    On Error GoTo ErrorHandler

    Application.ScreenUpdating = False
    ThisWorkbook.Worksheets("Record").Unprotect Password:="4321"
    
    With ThisWorkbook.Worksheets("Record").ListObjects("Table1").ListRows.Add
    
        With ThisWorkbook.Worksheets("Input")
            If .Range("B2").Value = 1 Then
                .Range("C15", .Range("C15").End(xlToRight)).Copy
            Else
                .Range("C15", .Range("C15").End(xlDown).End(xlToRight)).Copy
            End If
        End With
        
        .Range.Cells(1, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    End With
    
    ThisWorkbook.Worksheets("Record").Protect Password:="4321", UserInterfaceOnly:=True

    ThisWorkbook.Worksheets("Input").Activate
    Application.ScreenUpdating = True
    Application.CutCopyMode = False

    Exit Sub

ErrorHandler:

    Application.CutCopyMode = False
    ThisWorkbook.Worksheets("Input").Activate
    Application.ScreenUpdating = True

    ThisWorkbook.Worksheets("Record").Protect Password:="4321", UserInterfaceOnly:=True

End Sub
删除上一个数据下表中的所有空单元格。此代码将向表中添加新行。此外,表名应与表名相对应。可在Excel中的
格式表下找到

试试这个

Sub adddata()

Worksheets("Record").Unprotect Password:="4321" ' Unlock the target sheet before copying.

Sheets("Input").Select
Range("C15").Offset(1, 0).Select
If Range("M27") = 1 Then
    Range(Selection, Selection.End(xlToRight)).Select
Else
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
End If
Selection.Copy

Sheets("Record").Select
If Range("B2").Offset(1, 0).Value = "" Then
    Range("B2").Offset(1, 0).Select
Else
    Range("B2").End(xlDown).Offset(1, 0).Select
End If
    Activecell.PasteSpecial xlAll
    Application.CutCopyMode = False
Worksheets("Record").Protect Password:="4321", UserInterfaceOnly:=True

End Sub

工作表“输入”是我在一行中输入一些值的区域&根据我输入值的多少,一行在不同的列中至少有10个值。我添加输入的最大行数是10行。表“记录”是基于表“输入”的数据库。第一次记录必须为空,但它会随着时间的推移而增加。我的代码是尝试在每一行上从“输入”复制到“记录”,这就是为什么我把“M27”作为要复制的行数,并为此添加循环代码。@user14036929我已经编辑了我的答案。很抱歉,这个子代码来自我放在“输入”表上的按钮,在我的代码中,B2在“记录”表上。我将更具体地编辑我的问题。@user14036929按钮有什么问题?我添加了gif,你可以看到它是如何工作的。代码上没有区别是不是按钮。很抱歉@Tabisamsa,按钮没有问题,我只是过早地总结了你的代码。它实际上是有效的,但您的代码会将值粘贴到“记录”表的底部。。再说一次,我想我忘了告诉你,“记录”表上的数据库是一个表谢谢,但又出现了另一个错误,“工作表类的PasteSpecial方法失败”很抱歉,我使用了activesheet而不是activecell。我已经更正了我的答案。