2010-05-11 4 views
1
Sub Macro1() 
' 
' Macro1 Macro 
' 

' 
    Worksheets("Drop-down").Select 
    For i = 1 To 10 
     ActiveSheet.Cells(i, 2).Select 
     With Selection.Validation 
      .Delete 
      ' Error in this line 
      .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
      xlBetween, Formula1:=Range(Worksheets("Misc").Cells(2, i), Worksheets("Misc").Cells(2, i).End) 
      .IgnoreBlank = True 
      .InCellDropdown = True 
      .InputTitle = "" 
      .ErrorTitle = "" 
      .InputMessage = "" 
      .ErrorMessage = "" 
      .ShowInput = True 
      .ShowError = True 
     End With 
    Next i 
End Sub 

Je reçois une erreur dans la ligne ci-dessous le commentaire, mais je ne sais pas comment le résoudre. Ce serait génial d'entendre quelques suggestions. Merci d'avance!VBA: Liste Valider les paramètres

+0

Quelle est l'erreur? –

+0

Erreur d'exécution 450. – stanigator

Répondre

4

Il y a deux problèmes; la première est qu'il vous manque un argument requis pour la fonction End, qui est une constante Excel nommée pour indiquer la direction.

Au lieu de Worksheets("Misc").Cells(2, i).End sur cette ligne essayer Worksheets("Misc").Cells(2, i).End(xlDown)

Vous pouvez utiliser xlLeft, droite ou haut aussi bien, mais je devine en bas est ce que vous recherchez.

Le deuxième problème est la valeur de Formule1 doit être une adresse de chaîne (je pense) et vous passez un objet de gamme réelle.

Essayez ceci pour cette ligne

.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=Range(Worksheets("Misc").Cells(2, i), Worksheets("Misc").Cells(2, i).End(xlDown)).Address

Cela a fonctionné sur ma machine, sans erreurs. Bien sûr, j'écrasai des données factices, donc je ne sais pas si elle est correcte pour votre feuille de calcul

EDIT (en réponse au commentaire de Stan)

Il peut y avoir une façon plus sexy, mais cela est une bonne et simple (qui est sexy aussi, dans son propre droit); l'instruction if vérifie simplement la cellule dans la ligne suivante. Si c'est non-vide, alors il continue avec la même solution que vous aviez auparavant. Si elle est vide, elle utilise uniquement cette cellule comme plage de validation.

For i = 1 To 10 
    If Worksheets("Misc").Cells(3, i).Value <> "" Then 
     Set validationRange = Range(Worksheets("Misc").Cells(2, i), Worksheets("Misc").Cells(2, i).End(xlDown)) 
    Else 
     Set validationRange = Worksheets("Misc").Cells(2, i) 
    End If 

    With Worksheets("Drop-down").Cells(i, 2).Validation 
     .Delete 
     .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ 
        Formula1:=validationRange.Address....... 

Je mettiez

Worksheet.Selection 
Selection.DoStuff 

paires, en

Worksheet.DoStuff 

Je pense qu'il a l'air un peu plus agréable.

Faites-moi savoir si cela fonctionne pour vous!

+0

Cela résout le bug. Il y a un autre problème avec cette ligne. Je ne sais pas comment gérer les cas où la i-ème colonne commençant à la deuxième ligne n'a qu'une seule entrée non vide. Ce serait génial d'avoir de vos nouvelles. Merci. – stanigator

+0

Dans ce cas, vous voulez que la liste de validation ne contienne qu'une seule cellule? – goggin13

+0

Ya, je veux un traitement de scénario dans ce cas. – stanigator

Questions connexes