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

我在为不同的列设置数据validation列表时遇到了问题,并且下面的代码中的部分导致错误并正确设置。 请查看下面的代码。 我也在尝试locking列A和B,并为列G和列H设置数据validation列表。列G和列H的数据validation列表的来源位于不同的图表上。

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 

谢谢,赫马

在添加具有相同types的新validation之前删除旧的validation。 作为一个好的做法,总是.Delete旧的validation规则。添加一个,除非你有一个理由。

你也有一些listdata1listdata2之间的拼写错误。 注意你不需要嵌套,只有一个。

  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