复制单元格内容时,vba崩溃

时间:2014-10-15 16:53:22

标签: excel vba excel-vba

我正在尝试将Excel电子表格设置为像数据库一样运行(用户没有MS Access等)。我将第二张表设置为数据透视表以分析数据记录。

为了确保用户一致地拼写名称,我已经设置了一个查找列,其中包含以前使用过的名称。如果检测到无法识别的名称,我将在查找列表上使用数据验证来要求用户确认拼写或指示它是要添加到系统的新名称。

然后我希望代码将名称复制到查阅列,并更改另一列的状态,该列控制用户能够填写的列。这一位使代码崩溃。

我已粘贴下面的子项,并将违规位设置为注释。

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.Unprotect


    Dim row As Integer
    Dim emptyrow As Integer
    Dim prevrow As Integer

    For emptyrow = 3 To 20000

        If ActiveSheet.Cells(emptyrow, 1).Text = "" Then
            row = emptyrow - 1
            prevrow = row - 1

            ActiveSheet.Range(Cells(emptyrow, 2), Cells(emptyrow, 26)).Locked = True

            If row > 2 Then
                ActiveSheet.Cells(row, 1).Locked = False
                ActiveSheet.Range(Cells(row, 2), Cells(row, 26)).Locked = True
            End If

            If prevrow > 2 Then ActiveSheet.Range(Cells(prevrow, 1), Cells(prevrow, 26)).Locked = True

      '      If ActiveSheet.Cells(row, 4).Text = "Y" Then
      '          ActiveSheet.Cells(row, 1).Locked = False
      '          ActiveSheet.Cells(row, 1).Text = "Add/update person"
      '          ActiveSheet.Cells(row, 29).Locked = False
      '          ActiveSheet.Cells(row, 29).Text = ActiveSheet.Cells(row, 3).Text
      '      End If

            If ActiveSheet.Cells(row, 1).Text = "Add/update person" Then
                ActiveSheet.Range(Cells(row, 17), Cells(row, 26)).Locked = True
                ActiveSheet.Range(Cells(row, 2), Cells(row, 16)).Locked = False
                ActiveSheet.Cells(row, 23).Locked = False
                ActiveSheet.Cells(emptyrow, 1).Locked = False
            ElseIf ActiveSheet.Cells(row, 1).Text = "Signposting" Then
                ActiveSheet.Range(Cells(row, 2), Cells(row, 26)).Locked = True
                ActiveSheet.Range(Cells(row, 2), Cells(row, 5)).Locked = False
                ActiveSheet.Range(Cells(row, 17), Cells(row, 18)).Locked = False
                ActiveSheet.Cells(row, 23).Locked = False
                ActiveSheet.Cells(emptyrow, 1).Locked = False
            ElseIf ActiveSheet.Cells(row, 1).Text = "Referral" Then
                ActiveSheet.Range(Cells(row, 2), Cells(row, 26)).Locked = True
                ActiveSheet.Range(Cells(row, 2), Cells(row, 5)).Locked = False
                ActiveSheet.Range(Cells(row, 19), Cells(row, 20)).Locked = False
                ActiveSheet.Cells(row, 23).Locked = False
                ActiveSheet.Cells(emptyrow, 1).Locked = False
            ElseIf ActiveSheet.Cells(row, 1).Text = "Training" Then
                ActiveSheet.Range(Cells(row, 2), Cells(row, 26)).Locked = True
                ActiveSheet.Range(Cells(row, 2), Cells(row, 5)).Locked = False
                ActiveSheet.Range(Cells(row, 21), Cells(row, 23)).Locked = False
                ActiveSheet.Cells(emptyrow, 1).Locked = False
            End If

            ActiveSheet.Cells(row, 23).Locked = False
            ActiveSheet.Cells(emptyrow, 1).Locked = False

            emptyrow = 20000

        End If

    Next emptyrow

    ActiveSheet.Protect

End Sub

2 个答案:

答案 0 :(得分:1)

我认为问题是使用.Text为单元格设置值。 text属性返回或设置对象的文本。您可以检查单元格是否包含某些文本,例如" Y"但是您无法按照设置的方式将文本添加到单元格中 我认为这应该有效:

If ActiveSheet.Cells(Row, 4) = "Y" Then
            ActiveSheet.Cells(Row, 1).Locked = False
            ActiveSheet.Cells(Row, 1) = "Add/update person"
            ActiveSheet.Cells(Row, 29).Locked = False
            ActiveSheet.Cells(Row, 29) = ActiveSheet.Cells(Row, 3)
        End If

If ActiveSheet.Cells(Row,4).Text = "Y" Then

也应该有效,但似乎多余。

答案 1 :(得分:1)

也许您收到错误"无法设置范围类"的文本值。这是因为text属性是只读的,你应该使用value属性。

  '          ActiveSheet.Cells(row, 29).Locked = False
  '          ActiveSheet.Cells(row, 29).value= ActiveSheet.Cells(row, 3).Text