이것은 질문자의 새로운 정보를 바탕으로 완전히 다시 작성된 답변입니다.
제대로 이해하면 셀의 색을 변경하는 사용자 지정 함수를 만들려고합니다. 사용자 정의 기능에 대한 마이크로 소프트의 도움말에서 다음 텍스트는 없습니다 말한다 : 당신은 사용자 정의 함수에서 사용할 수있는 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
희망이 있습니다.
표시된 함수가 아무 것도 반환하지 않습니다 ... VLOOKUP()과 같은 워크 시트 수식을 사용한 것으로 생각하십니까? 함수 (워크 시트에서 호출 된 경우)는 시트를 변경할 수 없으며 호출 셀에만 값을 반환 할 수 있습니다. 색상을 추가해야하는 경우 조건부 서식을 사용할 수 있습니다. –
수식을 수정했습니다. 나는 그 기능이 시트를 바꿀 수 없다는 것을 몰랐다. 조건부 서식으로, Sub로 기능을 추가하는 것이 더 편리할지 모르겠습니다. 나는 일반 사용자가 일을 바꿀 수 없도록하고 싶지만 PW로 작업 공간을 보호하고 싶지는 않다. – Pragabhava