我正在尝试将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
答案 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