2017-11-29 4 views
0

나는 특별한 요구 사항이있는 콤보 박스를 가지고 있습니다. 프로그램에 의해서만 선택할 수있는 항목이 있어야하며 (사용자가 탐지 한 특정 기준에 따라) 사용자가 선택할 수 없습니다. VBA Access에서이 작업을 수행 할 수있는 방법이 있습니까?VBA에서 사용자가 프로그래밍 방식으로 만 선택할 수있는 옵션이있는 콤보 상자

나는 this solution을 찾았지만, 더 나은 대안이 없다면 약간의 해결 방법이 될 것입니다. 내가 원하는 것은 옵션이 보이지 않는 것입니다. 당신이 할 수있는

...

+1

사용자가 값에 액세스하거나 값을 변경할 수 없으면 콤보 박스로 설정하는 것이 좋습니다. TextBox를 사용하여 표시 할 값을 표시하십시오. – Barns

+0

사용자가 선택할 수있는 다양한 옵션이 있습니다. 이 프로그램이 감지 할 수없는 것은 바로이 것입니다. 이 옵션을 설정하면 잠기고 프로그램 적으로 만 설정 해제 할 수 있습니다. –

+0

나는 항목을 추가하고 즉시 선택하고 잠글 수 있다고 가정합니다. 설정을 해제해야 할 때 잠금을 해제하고 값을 기본값으로 설정 한 다음 콤보 상자에서 항목을 제거 할 수 있습니다. –

답변

1

양식에서 비즈니스 로직을 이동해야합니다. 이 작업에는 두 가지 기능이 필요합니다.

Function SelectAndLock(ByRef SelectPicker As ComboBox, Id As Long) 

    Dim SQL_GET As String 
    SQL_GET = "SELECT ID, Text From ComboBoxValues WHERE [ID] = " & Id 

    SelectPicker.RowSourceType = "Table/Query" 
    SelectPicker.RowSource = SQL_GET 
    SelectPicker.Value = Id 
    SelectPicker.enabled = False 

End Function 

Function PopulateSelectPicker(ByRef SelectPicker As ComboBox) 

    Dim SQL_GET As String 
    SQL_GET = "SELECT ID, Text From ComboBoxValues WHERE [ID] not in (your system ids);" 

    SelectPicker.RowSourceType = "Table/Query" 
    SelectPicker.RowSource = SQL_GET 
    SelectPicker.Value = "" ' or null if your field is nullable 
    SelectPicker.enabled = True 

End Function 

지금 모델이 "시스템"조건을 dedected 경우, 시스템이 choses 및 콤보 상자를 고정 ID를 선택 할

call SelectAndLock(SelectPicker,id) 

을 부를 것이다.

다른 조건이나 기본적으로, 간단하게 볼 수 있어야 시스템 IDS 사용자를 제외한 모든 옵션을 나열합니다

call PopulateSelectPicker(SelectPicker) 

를 호출합니다.

이것은 단지 개념 일뿐입니다. 필요에 따라 조정하십시오.

0

이 상황은 매우 이상한 것, 그리고 나는 내 응용 프로그램에서 그것을 싶지는 않을 것입니다 ...하지만 원하는 방식이 정확하고 좋은 순간 수용 및 솔루션이 필요하다 데이터 소스 테이블 필드에 바인딩합니다 (MS Access에 있기 때문에 바인드 된 폼을 가정합니다.하지만 보장되지는 않습니다) txtYouNoSeeMe라고하는 숨겨진 컨트롤 (텍스트 상자, 가정합니다)을 통해 연결됩니다.

시스템이 NoPickMe로 선택되도록하려는 값 (사용자는 제외)을 참조 합니다.

이제 사용자에게 "대부분의 옵션"을 선택할 수있는 권한을 부여해야합니다. 필요한 경우 해당 콤보 상자 (cboYesYouSeeMe)를 설정하고 언 바운드 상태로 둡니다. NoPickMe는 해당 목록의 옵션이 아닙니다.

마지막으로 슬프게도 cboYesYouSeeMe에 대한 AfterUpdate 이벤트 처리에 일부 논리를 포함해야합니다. 사용자가 cboYesYouSeeMe에서 옵션을 선택하도록 허용하려면 선택한 값을 HIDDEN 바운드 컨트롤 txtYouNoSeeMe로 전송해야합니다. AfterUpdate 이벤트에서이를 수행하십시오.

"숨겨진"값 NoPickMe (사용자가 보지 말아야 함)를 선택하려면 숨겨진 txtYouNoSeeMe에 해당 값을 입력하십시오. 나는 당신이 cboYesYouSeeMe에서 (그런 경우에) 표시하고 싶은 것을 알지 못합니다.

레코드가 저장되면 txtYouNoSeeMe가 데이터베이스에 저장된 값을 저장합니다. 데이터베이스가 관련되어 있지 않으면 데이터 바인딩에 대한 내 참조를 무시하십시오.

이 솔루션은 작동하지만 일부 또는 두 가지를 설명하는 것을 잊어 버릴 수도 있습니다. 바라기를 당신은 아이디어를 얻는다.

1

"변경시"이벤트를 콤보 상자에 추가 할 수 있습니다. 프로그래밍 방식으로 만 선택할 수있는 옵션은 "프로그램 전용 항목"입니다. 나는 또한 당신이 우리가 초점을 되돌릴 수있는 형태의 이전 필드를 가지고 있다고 가정했다. 당신은이 옵션에 대한 기준이 무엇인지 언급하지 않았기 때문에 이전 필드가 0이 아닌 것으로 가정합니다 (기준에 맞게 if ... then 절을 변경해야합니다).

private sub cbo_list_change() 

if me.cbo_list.value "Program only item" then 
    if me.chk_previous.value = 0 then 
    msgbox "This item cannot be selected. Please select an alternative item", vbOKOnly 
    me.cbo_list.value ="" 
    chk_previous.setFocus 
    end if 
end if 

End sub 

당신은 기준이 충족 될 때 다른 이벤트에 me.cbo_list.value="program only option"을 사용할 수 있습니다.