2011-12-14 6 views
1

범위의 특정 값을 검색하고 인접한 특성을 반환하는 함수를 만들었습니다. A1:A10에서 valor에 대한 일치하는 경우VBA : #VALUE의 셀 서식 지정 오류

Function Busca(valor As String) 
    Dim bus(0 To 1) 
    bus(0) = Worksheets("Sheet2").Range("A1:A10").Find(valor, LookAt:=xlWhole). _ 
     Offset(0, 1) 
    bus(1) = Worksheets("Sheet2").Range("A1:A10").Find(valor, LookAt:=xlWhole). _ 
     Offset(0, 2) 
    Busca = bus 
End Function 

, 함수는 느릅 나무는 괜찮습니다, {#VALUE,#VALUE}을 반환하지만 나는 주어진 색상에서 "일치"셀과, {"No match", ""}처럼 대신 뭔가를 반환하고 싶습니다. 데이터 유효성 검사, 오류 처리 및 IfThenActiveCell.Interior.ColorIndex을 사용해 보았습니다. 또한 오류가 해결되면 셀을 투명하게 되돌리려합니다.

이벤트 처리기가 트릭을 수행 할 수 있다고 생각하지만 VBA를 처음 사용하는 사람이라면 이해할 수없는 것들이 많이 있습니다.

수정 제안으로

, 명확하게하기 : I 출력 셀 (들) 일치하는 항목이없는 경우 색상을 변경하고, 일치하는 경우에는 색이없는 것으로를 어떻게해야합니까

찾았습니까 (VBA에서)?

+1

표시된 함수가 아무 것도 반환하지 않습니다 ... VLOOKUP()과 같은 워크 시트 수식을 사용한 것으로 생각하십니까? 함수 (워크 시트에서 호출 된 경우)는 시트를 변경할 수 없으며 호출 셀에만 값을 반환 할 수 있습니다. 색상을 추가해야하는 경우 조건부 서식을 사용할 수 있습니다. –

+0

수식을 수정했습니다. 나는 그 기능이 시트를 바꿀 수 없다는 것을 몰랐다. 조건부 서식으로, Sub로 기능을 추가하는 것이 더 편리할지 모르겠습니다. 나는 일반 사용자가 일을 바꿀 수 없도록하고 싶지만 PW로 작업 공간을 보호하고 싶지는 않다. – Pragabhava

답변

3

이것은 질문자의 새로운 정보를 바탕으로 완전히 다시 작성된 답변입니다.

제대로 이해하면 셀의 색을 변경하는 사용자 지정 함수를 만들려고합니다. 사용자 정의 기능에 대한 마이크로 소프트의 도움말에서 다음 텍스트는 없습니다 말한다 : 당신은 사용자 정의 함수에서 사용할 수있는 VBA 키워드

수는 매크로에서 사용할 수있는 수보다 작다. 사용자 지정 함수가 워크 시트 또는 다른 VBA 매크로 또는 함수에서 사용되는 식의 수식에 값을 반환하는 것 외에는 아무 것도 할 수없는 이 없습니다. 예를 들어, 사용자 지정 함수는 창 크기를 조정하거나 의 수식을 편집하거나 셀의 에있는 텍스트의 글꼴, 색 또는 패턴 옵션을 변경할 수 없습니다. 이 종류의 "조치"코드를 함수 프로 시저에 포함하면 함수는 # VALUE! 오류.

귀하의 요구 사항을 충족시킬 수있는 두 가지 대안이 있습니다. 세 번째 대안은 나중에 영감을 얻은 후에 추가되었습니다.

대안 1 : 허용 된 값

위치 제한 값을 가지고있는 셀에 커서의 드롭 다운 목록을 제공합니다. 도구 모음에서 데이터를 선택한 다음 유효성 검사를 선택하십시오. 데이터 유효성 검사 양식이 표시됩니다.

아직 선택하지 않은 경우 설정 탭을 선택하십시오. '허용 :'아래의 확인란을 클릭하고 목록을 선택하십시오. 소스 상자에 "= $ A $ 1 : $ A $ 10"을 입력하십시오. ("="필요합니다.이 셀의 복사본을 만들려면 $ s 중요합니다.) 확인을 클릭하십시오.

사용자가 커서를 해당 셀에 위치 시키면 허용 값을 입력하거나 목록에서 허용 값을 선택할 수 있습니다. 다른 값을 입력하려고하면 오류 메시지가 나타납니다. 데이터 유효성 검사 양식의 다른 탭을 사용하여 도움말 메시지와 사용자 자신의 오류 메시지를 입력 할 수 있습니다.

원본 상자의 $ s 때문에 원래 셀과 유효성 검사를 다른 셀로 복사 할 수 있습니다.

대안 2 : 허용 된 값이 범위 인 경우 조건부 서식

는, 조건부 서식은 당신의 요구 사항을 충족합니다. 예를 들어 허용되는 범위는 10-20입니다.

도구 모음에서 형식을 선택한 다음 조건부 서식을 선택하십시오.

조건 1의 상자가 표시됩니다. "사이"가 이미 표시됩니다. 오른쪽에있는 상자에 10 및 20

클릭 "미만"에 의해 "사이에 교환 조건 (2)에 대한 상자를 표시하려면 추가를 입력합니다. 다음 상자 10. 형식을 입력합니다. 색상을 클릭합니다. 레드를 선택합니다. 클릭 확인.

추가를 클릭하여 조건 3의 상자를 표시합니다. "다음"사이에 "다음"사이에 바꿉니다. 다음 상자에 20을 입력하십시오. 형식을 클릭하십시오. 색상을 클릭하십시오. 빨간색을 선택하십시오. 확인을 클릭하십시오.

조건부 서식을 적용하려면 확인을 클릭하십시오.

사용자들은 셀에 원하는 것을 입력 할 수 있지만, 당신이 원하는대로 당신은 포맷 된 셀의 많은 복사본을 만들 수 있습니다

10 ~ 20 경우를 제외하고는 빨간색으로 표시됩니다.

워크 시트 변경 이벤트는

내가 전에 이벤트를 생각해야한다. 나는 이것이 당신이 원하는 것과 정확히 일치한다고 믿습니다.

VBA 편집기 내에서 프로젝트 탐색기는 일반적으로 화면 왼쪽에 표시됩니다. 그렇지 않은 경우 Ctrl+R을 클릭하십시오.

선택한 값을 제어 할 워크 시트의 행을 마우스 오른쪽 단추로 클릭하십시오. View Code을 클릭하십시오.

코드 영역은 워크 시트로 표시되지만 그렇지 않은 경우 비어있게됩니다. 이 영역에는 다양한 루틴을 배치 할 수 있지만 관련 루틴은 워크 시트 이벤트 루틴입니다. 워크 시트 활성화 또는 비활성화와 같은 이벤트가 발생할 때마다 호출되는 루틴입니다. 원하는 이벤트는 사용자가 셀을 변경할 때마다 호출되는 변경입니다. 이 루틴의 매력은 원하는 모든 것을 할 수 있다는 것입니다.

아래의 Worksheet_Change 루틴을 복사하여 워크 시트 코드 영역에 붙여 넣으십시오.

매개 변수는 사용자가 변경 한 셀의 주소입니다.

TgtRngList는 정찰하려는 범위 목록으로 설정됩니다. C1 : C1000, F1 : F1000 및 A1으로 설정했습니다. 이 범위를 순찰하고자하는 범위로 변경해야합니다.

OKValueList는 감시 범위에 허용되는 값의 목록으로 설정됩니다. 그들은 어딘가에서 시트에있을 수 있지만 여기에 정의하는 것이 더 쉽다고 생각합니다. 목록을 원하는대로 변경하십시오.

코드는 변경된 셀이 감시 영역 중 하나에 있는지 확인합니다. 일치하는 경우 허용 된 값이 있는지 확인합니다. 이 검사 결과 셀이 검은 색 또는 빨간색으로 설정됩니다.

Option Explicit 
Sub Worksheet_Change(ByVal ChangedCell As Range) 

    ' This routine is called whenever the user changes a cell. 
    ' It is not called if a cell is changed by Calculate 

    Dim ColChanged As Integer 
    Dim InxOV As Integer 
    Dim InxTR As Integer 
    Dim OKValueList() As Variant 
    Dim Patrolled As Boolean 
    Dim RowChanged As Integer 
    Dim TgtColLeft As Integer 
    Dim TgtColRight As Integer 
    Dim TgtRngPartList() As String 
    Dim TgtRngList() As Variant 
    Dim TgtRngPart As String 
    Dim TgtRowBottom As Integer 
    Dim TgtRowTop As Integer 
    Dim ValueChanged As String 
    Dim ValueOK As Boolean 

    ' Fill TgtRngList withe ranges that are to be patrolled by this routine 
    TgtRngList = Array("C1:C1000", "F1:F1000", "A1") 

    ' Fill OKValueList with the permitted values for these cells. 
    OKValueList = Array("V1", "V2", "V3", "V4", "V5", _ 
         "V6", "V7", "V8", "V9", "V10") 

    ColChanged = ChangedCell.Column 
    RowChanged = ChangedCell.Row 

    Patrolled = False 
    For InxTR = LBound(TgtRngList) To UBound(TgtRngList) 
    TgtRngPartList = Split(TgtRngList(InxTR), ":") 
    ' Decode top left of range 
    TgtRngPart = TgtRngPartList(LBound(TgtRngPartList)) 
    TgtRowTop = Range(TgtRngPart).Row 
    TgtColLeft = Range(TgtRngPart).Column 
    If LBound(TgtRngPartList) = UBound(TgtRngPartList) Then 
     ' There is no colon so single cell range 
     TgtRowBottom = TgtRowTop 
     TgtColRight = TgtColLeft 
    Else 
     TgtRngPart = TgtRngPartList(UBound(TgtRngPartList)) 
     TgtRowBottom = Range(TgtRngPart).Row 
     TgtColRight = Range(TgtRngPart).Column 
    End If 
    If RowChanged >= TgtRowTop And RowChanged <= TgtRowBottom And _ 
     ColChanged >= TgtColLeft And ColChanged <= TgtColRight Then 
     ' This is a patrolled cell 
     Patrolled = True 
     Exit For 
    End If 
    Next 
    If Patrolled Then 
    With ActiveSheet 
     ValueChanged = .Cells(RowChanged, ColChanged).Value 
     ' Check value against permitted list 
     ValueOK = False 
     For InxOV = LBound(OKValueList) To UBound(OKValueList) 
     If ValueChanged = OKValueList(InxOV) Then 
      ValueOK = True 
      Exit For 
     End If 
     Next 
     If ValueOK Then 
     ' Set cell black 
     .Cells(RowChanged, ColChanged).Font.Color = RGB(0, 0, 0) 
     Else 
     ' Set cell red 
     .Cells(RowChanged, ColChanged).Font.Color = RGB(255, 0, 0) 
     End If 
    End With 
    End If 

End Sub 

희망이 있습니다.

+0

실제로 코드에서 괄호가 누락되었습니다. 위의 주석을 참조하십시오. 목적은 입력 (이 경우 valor)을 범위 (A1 : A10)와 비교하는 것입니다. 'A3'에서 일치하는 것이 발견되면, 함수는'B3 : C3'의 값을 반환합니다. 일치하는 항목이 없으면 출력 셀의 색상이 변경되기를 원합니다. 이것은 실제 문제입니다. 색상 부분이 바뀌고 찾기 부분이 아닙니다 (심하게 코딩되었을 수 있음). "If"'Then' 부분을 포함하지 않아서 죄송합니다. – Pragabhava

+0

기능에 대한 정보는 매우 유용했습니다. 드롭 다운은 좋은 해결책이 아니지만 조건부 서식이 좋습니다. '# VALUE'이 리턴되면, 10,000,000과 같은 wierd 값을 asign하기 위해 에러 핸들링을 한 다음, 말한대로 조건부 포맷팅을 사용할 수 있습니다. 나는 여전히 VBA 솔루션을 선호 할 것입니다. 즉, 귀하의 대답에 명시된 바와 같이, 제 기능에 의해 트리거되는 매크로를 만드는 것을 의미합니다. – Pragabhava

+0

나는 영감을 얻었다. 내 대답에서 세 번째 대안을 참조하십시오. –

0

전체 셀을 검사할지 여부를 나타내는 xlWhole에 오프셋을 추가 할 위치가 확실하지 않습니다. 다음은 몇 가지 노트입니다. find는 객체를 반환합니다.

Function Busca(valor As String) 
''http://msdn.microsoft.com/en-us/library/aa195730(v=office.11).aspx 
Dim bus(0 To 1) 
With Worksheets("Sheet2").Range("A1:A10") 
    Set c = .Find(valor, LookAt:=xlWhole) 
    If Not c Is Nothing Then 
     bus(0) = c.Address 

     Set c = .FindNext(c) 
     If Not c Is Nothing Then 
      bus(1) = c.Address 
     Else 
      bus(1) = "None" 
     End If 
    Else 
     bus(0) = "None" 
    End If 
End With 
Debug.Print bus(0), bus(1) 
Busca = bus 
End Function 
+0

아, 이건 부끄럽네. 코드에 누락 된 괄호가 있습니다. Range ("A1 : A10"). (valor, LookAt : = xlWhole) .Offset (0, 1)'을 찾습니다. 나는 지금 그것을 바로 잡았다. 요점은 일치하는 셀의 정보와 일치하는 정보의 오른쪽 두 셀을 검색하는 것입니다. – Pragabhava

+0

@Manuel "일치하는 것이 없으면 출력 셀의 색이 바뀝니다."라고 말합니다. 출력 셀은 무엇입니까? 나는 아직도 당신이 분명하지 않다는 것을 두려워합니다. 오른쪽에있는 셀이 일치하면, 무언가를 찾으시겠습니까? 그렇지 않다면, 셀의 색상을 오른쪽으로 변경하십시오. – Fionnuala

+0

명확성이 부족해서 죄송합니다. 출력 셀은 기능이 입력 된 셀입니다. @ TonyDallimore의 답에 달린 주석 에서처럼'F10 : F11' 셀에 함수를 입력한다고 가정합니다. 일치하는 것이 발견되지 않으면'F10'이 색상을 변경하길 원합니다. – Pragabhava