2013-04-24 2 views
1

VBA에서 프로그래밍을 처음 사용하고 Excel 워크 시트의 목록으로 데이터의 유효성을 검사하려고합니다. 문제는 드롭 다운 목록에서 다른 기준을 선택할 때마다 크기가 다양하다는 것입니다.VBA에서 동적 목록 유효성 검사 사용

예 : 내가 중국을 선택하면 목록이 10 개의 다른 판매자로 바뀝니다. 범위는 A1에서 A10이지만, 일본을 선택하면 A1에서 A5까지 5 명의 판매자 만 있습니다.

따라서 수식 1 부분에 새 범위가 필요합니다.

With Selection.Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
    xlBetween, Formula1:="=$Z$1:$Z$30" 
    .IgnoreBlank = True 
    .InCellDropdown = True 
    .InputTitle = "" 
    .ErrorTitle = "" 
    .InputMessage = "" 
    .ErrorMessage = "" 
    .ShowInput = True 
    .ShowError = True 
End With 

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

고정 된 범위를 벗어나면 작동 할 수 있지만 빈 공간이 많고 잘 보이지 않으므로 잘 안된다는 것을 알고 있습니다.

나는 그것이 이해되기를 바랍니다.

답변

1

당신은 그럼 당신은 단지 결과에 A1에서 Formula1 속성을 구축이

Worksheets("Sheet1").Range("A1").End(xlDown) 

처럼 뭔가 열의 라스 비어 있지 않은 셀을 얻을 수 있습니다.

Dim strFormula1 as string 
strFormula1 = "=$A$1:" & Worksheets("Sheet1").Range("A1").End(xlDown).Address() 

는 오류

0

다른 두 대답은 간단있을 수 있습니다 테스트하지 않은, 희망이 도움이,하지만 만약 당신이 검증 될 필요가 비 연속 비 빈 셀이있는 경우 작동하지 않습니다 명부. 이 방법은이를 극복해야합니다.

VBA에서 사용자 지정 함수를 사용하여 필터링 된 문자열 주소를 반환 할 수 있습니다. 필터 된 주소를 반환하거나 원래 주소를 반환합니다 IF 필터링 된 주소가 유효한 범위가 아닙니다.

반환 된 주소가 255 자 제한을 초과하면이 오류가 발생할 수 있습니다.

With Selection.Validation 
.Delete 
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
xlBetween, Formula1:=GetAddress(Range("$Z$1:$Z$30")) 
.IgnoreBlank = True 
.InCellDropdown = True 
.InputTitle = "" 
.ErrorTitle = "" 
.InputMessage = "" 
.ErrorMessage = "" 
.ShowInput = True 
.ShowError = True 
End With 

일반 코드 모듈에 기능을 배치하십시오.

Function GetAddress(myRange As Range) As String 

Dim cl As Range 
Dim c As Long: c = 1 
Dim tmpAddress As String 

For Each cl In myRange 
    If cl.Value <> vbNullString Then 
     'Create a string value of cell address matching criteria' 
     If tmpAddress = vbNullString Then 
      tmpAddress = myRange.Cells(c).Address 
     Else: 
      tmpAddress = tmpAddress & "," & myRange.Cells(c).Address 
     End If 
    End If 
    c = c + 1 
Next 

If Not Range(tmpAddress) Is Nothing Then 
    GetAddress = "=" & tmpAddress 
Else: 
    MsgBox "There are no non-empty cells in this range.", vbInformation 
    GetAddress = "=" & myRange.Address 
End If 

End Function 
+0

답변이 완벽하지만 시간이 많이 걸립니다. – Pietro

+0

문제 없습니다. 이 방법은 다른 사람이 할 수없는 유일한 방법은 빈 셀을 어디서나 포함 할 수있는 범위를 허용하는 것입니다. 다른 방법은 * 첫 번째 공백 셀에서 범위 끝을 요구합니다. 그게 문제의 범위라면, 다른 대답은 완벽하게 받아 들일 수 있습니다. 건배! –

+0

정확하게, 제 경우에는 그런 문제가 없지만, 당신의 미래를 염두에 두겠습니다. 다시 Thnx. – Pietro

1

가 공식/이름 관리자로 이동합니다 이름을 만들려면 공식

을 명명 된 범위를 사용하여/새

의 choise의 이름은, 예를 DataValidation를 들어, RefersTo에서 사용

=OFFSET(Sheet1!$Z$1,0,0,COUNTA(Sheet1!$Z:$Z),1) 

이제 동적 간격이 생겨 유효성 검사에 사용할 수 있습니다.