2013-02-27 8 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

Try 'с Таблицах ("Кластеры") Range ("A2: A100"). Offset (cMANFCM, -1) .Validation' –

+1

или 'Worksheets (« Кластеры »). Ячейки (2, cMANFCM) .Resize (100,1)' –

+4

'Ячейки()' без квалификации (например, «sht.Range (Ячейки (1,1),« Ячейки »(100,1)), вы должны использовать' sht.Range (sht.Cells (1, 1), sht.Cells (100,1)) ' –

ответ

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

это будет ошибка, если «Кластеры» не являются активным листом: см. Мой комментарий выше. –

+0

- правильный Тим: теперь я исправлен и протестирован и, похоже, работает, когда активируются другие листы. Я не понимал, что OPER хочет эту функциональность (но, вероятно, почему она получила ошибку в первую очередь) ... хотя это хорошая практика и защитная кодировка, чтобы включить ее – whytheq

Смежные вопросы