2016-07-01 1 views
0

VBA 코드는 매우 새롭습니다. 이제 Excel 시트의 데이터를 확인하는 작업을 수행하도록 지정되었습니다.다른 셀의 값을 기준으로 셀을 잠그고 데이터 유효성 검사를 수행하는 방법

예를 들어 내 열 A에는 사용자가 "예"또는 "아니오"사이에서만 선택할 수있는 드롭 다운 메뉴가 있습니다.

  • 사용자가 "예"를 선택한 경우 열 B와 열 C의 셀은 필수로 표시되고 비워 둘 수 없습니다. 이것에 유효성 검사 오류를 넣고 싶습니다.

    **Example 1: If A1 and A30 == YES** 
    
    • B1과 C1, B30 및 C30은

    • 가 필수 셀 색상을 채우고 셀 값을 이미

    • 투사 A를 가질 때 채움 색상을 제거 것인가 필수 이 셀이 비어있을 때 유효성 검사 오류가 발생하고 문자 수를 초과하는 경우

      예 2 : A99 == NO

    • B99이 고정되며 사용자는이 셀에 데이터를 입력 할 수 되지 않습니다. 우리가 혼란

내가 데이터 검증 및 조건부 서식을 사용하여이를 캡처 할 수있었습니다을 피하기 위해 "NA"로 셀 값을 추가 할 수있는 가능성. 그러나 연구마다 VBA 코드가 필요하기 때문에 잠긴 기능을 수행 할 수 없습니다.

+0

나는 당신이 검증 과정에서 논리를 통해 할 수있을 것이라고 생각합니다. –

+0

당신이 이것을 찾을 수 있습니다 [질문 도움] (http://stackoverflow.com/questions/3037400/how-to-lock-the -data-in-a-cell-in-excel-using-vba)을 사용합니다. TL :'ActiveSheet.Protect'는 워크 시트를 잠글 것입니다. Range ("A1 : D5"). Locked = False는 expcetions를 잠금으로 설정합니다. 마지막으로'ActiveSheet.Unprotect'는 읽기/쓰기 접근을 복구합니다. –

답변

1

이와 비슷한 것이 작동해야합니다.

적용 할 시트의 코드 모듈에 넣으십시오.

Private Sub worksheet_change(ByVal target As Range) 

    ''''' CHECK IF THE CHANGED CELL IS IN RANGE A1:A99 (OR ANY OTHER RANGE YOU DEFINE) 
    If Not Intersect(target, Range("A1:A99")) Is Nothing Then 

     ''''' UNPROTECT THE SHEET 
     ActiveSheet.Unprotect 

     ''''' IF THE CELL CHANGED IS NOW 'YES' 
     If target = "Yes" Then 

      ''''' WE DEFINE HOW MANY COLUMNS TO MOVE ACROSS FROM THE CELL THAT CHANGED AND DO THE ACTIONS IN THE CODE BELOW 
      ''''' SO IN THIS EXAMPLE WE'RE MOVING ACROSS 1 CELL TO B1 AND THEN 2 CELLS TO C1 
      ''''' SO TO GET TO AA1 AND AB2 WE'D DO i = 26 to 27 
      ''''' IF WE WANTED TO ACCESS AA1 ALL THE WAY THROUGH TO AZ1 WE'D DO i = 26 to 51 
      For i = 1 To 2 

       ''''' MOVE ACROSS i NUMBER OF CELLS FROM THE CELL THAT CHANGED 
       With target.Offset(0, i) 

        ''''' UNLOCK THE CELL 
        .Locked = False 

        '''''SET THE CONDITIONAL FORMATTING 
        .FormatConditions.Add Type:=xlExpression, Formula1:="=ISBLANK(" & target.Offset(0, i).Address & ")" 
        With .FormatConditions(.FormatConditions.Count) 
         .SetFirstPriority 
         .Interior.ColorIndex = 37 
        End With 

       End With 

      ''''' INCREASE i BY 1 AND LOOP TO AFFECT THE NEXT CELL 
      Next i 

     ''''' IF THE CELL CHANGED IS NOW 'NO' 
     ElseIf target = "No" Then 

      ''''' WE DEFINE HOW MANY COLUMNS TO MOVE ACROSS FROM THE CELL THAT CHANGED AND DO THE ACTIONS IN THE CODE BELOW 
      For i = 1 To 2 

       ''''' MOVE ACROSS i NUMBER OF CELLS FROM THE CELL THAT CHANGED 
       With target.Offset(0, i) 

        ''''' SET THE CELL VALUE TO BLANK 
        .Value = "" 

        ''''' LOCK THE CELL 
        .Locked = True 

        ''''' REMOVE THE CONDITIONAL FORMATTING 
        .FormatConditions.Delete 

         ''''' ADD NEW CONDITIONAL FORMATTING HERE IF REQUIRED 

       End With 

      ''''' INCREASE i BY 1 AND LOOP TO AFFECT THE NEXT CELL 
      Next i 

     End If 

     '''''PROTECT THE SHEET 
     ActiveSheet.Protect 

    End If 

End Sub 

은 목록 드롭 다운이 나 사용자가 시트가 잠겨있는 동안 값 드롭 다운을 변경할 수 없습니다를 A 열에서 false로 고정 설정해야합니다.

+0

코드가 작동했지만 문제가있는 것 같습니다. 처음에는 작동하지만 A2에서 다른 인스턴스를 시도해도 작동하지 않으며이 셀도 잠겨 있다는 오류가 발생합니다. – PeterS

+0

내 답변 끝에 내 메모를 참조하십시오. A 열은 기본적으로 잠겨 있습니다. 시트의 보호를 해제하고 ('검토'탭의 '보호 해제'에서) 드롭 다운 목록이있는 모든 셀을 열 A에 선택하고 마우스 오른쪽 단추로 클릭 한 다음 셀을 포맷하고 '보호'탭을 클릭 한 다음 '잠김'을 선택하십시오. –

+0

감사합니다! :),하지만 다른 셀을 지정해야한다면 어떻게해야합니까? 예를 들어 "예"를 누른 다음 AA1, AB2와 같은 다른 셀을 필수로, 셀 K1과 P1을 옵션의 표시기로 다른 색상으로 만 선택적으로 사용 하시겠습니까? – PeterS