2013-02-27 133 views
3

我正在尝试动态地将validation(使用DataValidation:List)添加到工作表中的范围。我记录所产生的下面的代码宏:Excel VBA - 使用单元格引用范围

With Worksheets("Clusters").Range("C2:C100").Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
    xlBetween, Formula1:="=Managers" 
    .IgnoreBlank = True 
    .InCellDropdown = True 
    .InputTitle = "" 
    .ErrorTitle = "" 
    .InputMessage = "" 
    .ErrorMessage = "" 
    .ShowInput = True 
    .ShowError = True 
End With 


用于静态范围C2这是工作的罚款:C100,但该列可以不总是C.我有一个可变cMANFCM包含列数。我尝试编辑使用此代码:

With Worksheets("Clusters").Range(Cells(2,cMANFCM), Cells(100, cMANFCM)).Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
    xlBetween, Formula1:="=Managers" 
    .IgnoreBlank = True 
    .InCellDropdown = True 
    .InputTitle = "" 
    .ErrorTitle = "" 
    .InputMessage = "" 
    .ErrorMessage = "" 
    .ShowInput = True 
    .ShowError = True 
End With 


为什么不这项工作,如何解决呢?

+2

尝试'随着工作表(“集群”)范围(“A2:A100”)。偏移(,cMANFCM -1)。验证' – 2013-02-27 22:26:59

+1

或'Worksheets(“Clusters”)。Cells(2,cMANFCM).Resize(100,1)' – 2013-02-27 22:41:10

+4

'Cells()'without quali fying工作表总是引用ActiveSheet,所以不要使用(例如)sht.Range(Cells(1,1),Cells(100,1))''你应该使用'sht.Range(sht.Cells(1, 1),sht.Cells(100,1))' – 2013-02-27 23:21:41

回答

1

您的代码工作在我的 - 我已经添加了一条线,删除所有现有验证和它没有出现任何的错误创造新的验证:

大量的验证参数大概可以忽略不计...和你有如何引用当其他表活跃的表/范围选择:

Option Explicit 
Sub control() 
    'Call changeValidation(4) 
    'Call changeValidationPAlbert(5) 
    Call changeValidationTWilliams(6) 
End Sub 

Sub changeValidation(cMANFCM As Integer) 

With Excel.ThisWorkbook.Worksheets("Clusters") 
    .Cells.Validation.Delete 
    .Range(.Cells(2, cMANFCM), .Cells(100, cMANFCM)).Validation.Add _ 
      Type:=xlValidateList, _ 
      AlertStyle:=xlValidAlertStop, _ 
      Operator:=xlBetween, _ 
      Formula1:="=managers" 
End With 

End Sub 
Sub changeValidationAlbert(cMANFCM As Integer) 

With Excel.ThisWorkbook.Worksheets("Clusters") 
    .Cells.Validation.Delete 
    .Range("A2:A100").Offset(, cMANFCM - 1).Validation.Add _ 
      Type:=xlValidateList, _ 
      AlertStyle:=xlValidAlertStop, _ 
      Operator:=xlBetween, _ 
      Formula1:="=managers" 
End With 

End Sub 
Sub changeValidationTWilliams(cMANFCM As Integer) 

With Excel.ThisWorkbook.Worksheets("Clusters") 
    .Cells.Validation.Delete 
    .Cells(2, cMANFCM).Resize(100, 1).Validation.Add _ 
      Type:=xlValidateList, _ 
      AlertStyle:=xlValidAlertStop, _ 
      Operator:=xlBetween, _ 
      Formula1:="=managers" 
End With 

End Sub 
+1

如果“群集”不是活动工作表,则会出错:请参阅上面的注释。 – 2013-02-27 23:24:11

+0

- 正确的蒂姆:我现在已经修改和测试,它似乎工作时,其他表被激活。我没有意识到OPer想要这个功能(但可能是为什么首先得到这个错误)......虽然这是一个很好的做法和防御性编码来包含它 – whytheq 2013-02-28 07:31:10

相关问题