通过VBA复制行时出现Excel崩溃

时间:2018-01-23 09:02:22

标签: excel vba excel-vba

新手在Excel VBA上。我想问一下如何解决我得到的错误?我试图根据条件复制整行,并将其粘贴到另一张表(同一工作簿)上。这是我的代码:

Dim ws As Worksheet
Dim ws1 As Worksheet
Dim endRow As Range

Set ws = Sheets("FIELD OFFICE DATABASE")
Set ws1 = Sheets("Transferred Items")

set endRow = Range("B" & Rows.Count).End(xlUp).Offset(1, 0)

ws.Activate
ws.Unprotect "321321"
Range("B2").Select

Do Until endRow
    If ActiveCell.Value = Me.cmbemn.Text Then
        ActiveCell.Rows("B:S").Select
        Selection.copy
        ws1.Activate
        ws1.Unprotect "321321"
        endRow.Select
        ActiveSheet.Paste
    Else
        ActiveCell.Offset(1, 0).Select
    End If
Loop

发生的事情是我的Excel崩溃,或弹出错误说"对象需要"。但主要是它崩溃了。

请帮忙!谢谢!

2 个答案:

答案 0 :(得分:0)

尝试将循环终止条件更改为:

Do Until ActiveCell.Address = endRow.Address

我认为您可以提前终止:

Set endRow = ws.Range("B" & Rows.Count).End(xlUp)

您还应明确使用您正在使用的工作表,否则将使用当前的活动表。我假设您正在使用ws

Rows不应指定其中的列:

ActiveCell.Rows("B:S").Select

它应该有一个Rows规范。你可能会做类似的事情:

ActiveCell.EntireRow.Copy

或者根据以后的评论,

currCell.EntireRow.Copy

副本不需要.Select,然后是第二行。你可以在一行中做。

另请注意@ Jeeped对Unprotect的评论。

我的偏好是指定一个loopRange,例如

Set loopRange = ws.Range("B2:B" & ws.Range("B" & Rows.Count).End(xlUp).Row)

然后遍历该范围。

Dim currCell As Range

For Each currCell in loopRange

    If currCell.Value .....do stuff

Next currCell

除了使用activecell之外,还有其他好处。

答案 1 :(得分:0)

取消保护工作表会取消复制/粘贴操作。

使用以下参数

保护您的工作表
UserInterfaceOnly:=true
'example:
ws1.Protect password:="321321", UserInterfaceOnly:=true

现在,您可以在VBA中对其进行任何操作,而无需取消保护