我在设置不同列的数据验证列表时遇到问题,下面代码中的该部分导致错误并正确设置。请查看下面的代码。我也在尝试锁定A列和B列,并为列G和H设置数据验证列表。列G和H的数据验证列表的来源位于不同的表格上。
Public Sub Button1_Click()
ActiveSheet.Unprotect
Dim sQry As String
Dim iRows As Integer
Dim iCols As Integer
Dim SQL As String
On Error GoTo ErrHandler
Call ClearExistingRows(4)
Call DBConnection.OpenDBConnection
Dim rsMY_Resources As ADODB.Recordset
Set rsMY_Resources = New ADODB.Recordset
SQL = "SELECT EmpID, EName, [Grouping], CCNum, CCName, ResTypeNum, ResName, Status from Employee_FTE Order by Status"
rsMY_Resources.Open SQL, DBConnection.oConn, adOpenStatic, adLockReadOnly
If rsMY_Resources.EOF = True Then
MsgBox ("No record found in database")
Exit Sub
End If
iRows = 3
For iCols = 0 To rsMY_Resources.Fields.Count - 1
ActiveSheet.Cells(iRows, iCols + 1).Value = rsMY_Resources.Fields(iCols).Name
Next
ActiveSheet.Range(ActiveSheet.Cells(iRows, 1), ActiveSheet.Cells(iRows, rsMY_Resources.Fields.Count)).Font.Bold = True
iRows = iRows + 1
ActiveSheet.Range("A" + CStr(iRows)).CopyFromRecordset rsMY_Resources
iRows = rsMY_Resources.RecordCount
rsMY_Resources.Close:
Set rsMY_Resources = Nothing
Call DBConnection.CloseDBConnection
MsgBox (CStr(iRows) + " records have been retrieved from the database!")
ActiveWorkbook.Names.Add Name:="listdata", RefersTo:= _
"='Data Sources'!$F$3:$F$4"
With Range("H4:H100")
With .Validation
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=listdata"
End With
End With
ActiveWorkbook.Names.Add Name:="listdata1", RefersTo:= _
"='ResNameSheet'!A:A"
With Range("G4:G100")
With .Validation
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=listdata2"
End With
End With
Columns("C:H").Select
Selection.Locked = False
ActiveSheet.Protect
Exit Sub
ErrHandler:
MsgBox (Error)
End Sub
谢谢, HEMA
答案 0 :(得分:0)
在添加具有相同类型的新验证之前删除旧验证。作为一种良好做法,除非您有理由,否则在.Delete
之前始终.Add
旧的验证规则。
此外,您在listdata1
和listdata2
之间也存在拼写错误。请注意,您不需要嵌套With
,只需要一个。
With Range("G4:G100").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:="=listdata1"
End With
With Range("H4:H100").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:="=listdata"
End With