Excel 데이터 유효성 검사를 통해 실제로 유효성이 검증 된 것과 다른 데이터를 드롭 다운으로 표시하는 방법


1

한 열의 내용을 표시하지만 실제로 다른 열의 값을 셀에 쓰고 해당 두 번째 열의 값에 대해 유효성을 검사하는 셀에 드롭 다운 메뉴를 사용자에게 제공하려면 어떻게해야합니까?

나는 거의 이것을 수행하는 약간의 코드를 가지고있다 (신용 : Contextures site의 DV0005 ) :

Private Sub Worksheet_Change(ByVal Target As range)
On Error GoTo errHandler
If Target.Cells.Count > 1 Then GoTo exitHandler
If Target.Column = 10 Then
  If Target.Value = "" Then GoTo exitHandler
  Application.EnableEvents = False
  Target.Value = Worksheets("Measures").range("B1") _
    .Offset(Application.WorksheetFunction _
    .Match(Target.Value, Worksheets("Measures").range("Measures"), 0) - 1, 1)
End If

드롭 다운에는 하나의 열 (예 : 열 B)의 값이 표시되지만 선택한 경우 실제로 열 C에서 셀로 동일한 행에 값을 씁니다. 그러나 데이터 유효성 검사는 실제로 B 열에 대해 유효성을 검사하므로 셀의 C 열에서 수동으로 무언가를 입력하고 다른 셀로 이동하려고하면 데이터 유효성 검사에 오류가 발생합니다.


이것은 나에게 관심이 있지만, 나는 당신의 설명을 따르지 않습니다. Worksheet_Change는 드롭 다운 메뉴가 변경되는 경우뿐만 아니라 통합 문서의 거의 모든 변경 사항이라고 생각되는 이벤트입니다. 드롭 다운 메뉴를 정확히 어떻게 제공하고 데이터를 어떻게 검증합니까?
Jook

Worksheet_Change는 모든 변경 이벤트에 대해 호출되지만 조건이 변경되어 관심있는 변경 사항이 있는지 확인하고 나머지는 무시하므로 "If Target.Column"조건부입니다. 드롭 다운은 명명 된 범위에 대해 데이터 유효성 검사를 사용하여 작성되었습니다.
Memitim

답변:


0

내가 보는 유일한 방법은 데이터 유효성 검사를 제거하고 자신의 드롭 다운 상자를 코딩하는 것입니다.

이것의 장점은 드롭 다운이 실제 셀을 숨기므로 셀 자체는 여전히 정상적으로 편집 될 수 있다는 것입니다.

이 코드 ( here )는 드롭 다운을 추가하고 항목을 선택할 때 셀에 해당 값을 넣고 선택한 항목을 기반으로 다른 셀을 변경 한 다음 드롭 다운이 존재하지 않도록 자체를 제거하십시오. 이 코드를 재미있게 사용할 수 있어야합니다.

링크가 끊어진 경우를 대비하여 코드를 여기에 재현했습니다.

Option Explicit

Sub Test()
    AddDropDown Range("D4")
End Sub

Sub AddDropDown(Target As Range)
    Dim ddBox As DropDown
    Dim vaProducts As Variant
    Dim i As Integer

    vaProducts = Array("Water", "Oil", "Chemicals", "Gas")
    Set ddBox = Sheet1.DropDowns.Add(Target.Left, Target.Top, Target.Width, Target.Height)
    With ddBox
        .OnAction = "EnterProductInfo" ' name corrected
        For i = LBound(vaProducts) To UBound(vaProducts)
            .AddItem vaProducts(i)
        Next i
    End With
End Sub

Private Sub EnterProductInfo()
    Dim vaPrices As Variant

    vaPrices = Array(15, 12.5, 20, 18)
    With Sheet1.DropDowns(Application.Caller)
        .TopLeftCell.Value = .List(.ListIndex)
        .TopLeftCell.Offset(0, 2).Value = vaPrices(.ListIndex - Array(0, 1)(1))
        .Delete
    End With
End Sub

그래, 나는 프로그래밍 방식이 그것을 올바르게 얻는 유일한 방법이라는 것에 동의해야한다. 너무 가까웠습니다. 드롭 다운 목록을 가져 와서 원하는 것을 표시하고 원하는 셀에 값을 저장할 수 있지만 표시된 목록에는 데이터 유효성 검사가 적용됩니다. 따라서 사용자는 목록을 드롭 다운하고 "1122-Sweet Computer"를 선택하면 "1122"가 셀에 입력됩니다. 그러나 표시된 목록 (예 : "1122-Sweet Computer")에 대해 셀의 유효성이 검사되었으므로 사용자가 "1122"를 수동으로 입력하면 셀의 유효성이 검사되지 않습니다.
Memitim

1

보관 용 컨트롤을 사용하고 싶지 않다면 왜이 어프로치에 대해 생각하지 않습니까?

  • OnCellSelect 이벤트는 대상 군을 캡처합니다.
  • 셀 내 드롭 다운 유효성 검증을 추가하십시오.
  • 셀 내 드롭 다운에서 올바른 옵션을 선택한 후
  • OnChange 이벤트가 트리거됩니다
  • 변수에 값을 캡처
  • 나눠
  • 루프를 시작하지 않도록 이벤트를 끄십시오 ~
  • 세포 검증 제거
  • 변수 split으로 셀 값을 다시 씁니다.
  • 이벤트 켜기

셀 유효성 검사는 항상 onselect 이벤트에 추가되고 변경 이벤트에서 제거됩니다. 셀에 초점을 맞출 때마다 셀 유효성 검사 드롭 다운으로 표시되고, 일단 선택되면 셀 중지되고 원하는 값을 씁니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.