如何为工作表中的不同列设置数据验证列表?

时间:2017-07-11 19:00:39

标签: excel vba

我在设置不同列的数据验证列表时遇到问题,下面代码中的该部分导致错误并正确设置。请查看下面的代码。我也在尝试锁定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

1 个答案:

答案 0 :(得分:0)

在添加具有相同类型的新验证之前删除旧验证。作为一种良好做法,除非您有理由,否则在.Delete之前始终.Add旧的验证规则。

此外,您在listdata1listdata2之间也存在拼写错误。请注意,您不需要嵌套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