2012-06-06 2 views
0

사용자 폼에 텍스트 상자가 있습니다. 사용자가이 텍스트 상자에 아무 것도 입력하지 않으면 입력을 강제하기 위해 해당 텍스트 상자를 잡아야합니다. 이 작업을 충분히 쉽게 수행 할 수 있지만 항목을 작성해야하는 사용자에게 알린 후 포커스가 텍스트 상자로 돌아 가기를 원합니다. 지금 당장은 그렇게하지 않습니다.필요에 따라 텍스트 상자에 포커스를 두는 방법

Private Sub txtAnswer_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 

Select Case KeyCode 
    Case 13: 
     If Me.txtAnswer.Value = "" Then 
      temp = MsgBox("You need to enter an answer!", vbCritical + vbOKOnly, "No Answer Found!") 
      Me.txtAnswer.SetFocus 
     Else 
      recordAnswer 
     End If 
    End Select 

End Sub 

이 코드는 텍스트 상자가 비어있는 경우 메시지 박스가 팝업 점에서 잘 작동 : 여기 내 코드입니다. 메시지 상자를 지우고 Enter를 다시 누르면 즉시 메시지 상자가 나타나서 텍스트 상자에 포커스가 있음을 알립니다. 그러나 문자 (예 : 숫자 '1'과 같은)를 입력하려고하면 아무 것도 텍스트 상자에 표시되지 않습니다.

누구든지 데이터 입력을 허용하는 방식으로이 텍스트 상자에 다시 포커스를 가져올 수있는 방법을 제안 할 수 있습니까? 고맙습니다!

+0

제게 잘 작동합니다 ...'recordAnswer'는 무엇을합니까? –

+0

이상한. recordAnswer는 많은 자료를 처리하며 대부분 데이터를 워크 시트에 채 웁니다. 그 서브 루틴은 철저히 현장 테스트를 거쳐서 문제가 아닌 것으로 알고 있습니다. 나는 그대로 두는 것 같아. 사용자는 포커스를 다시 가져 오려면 텍스트 상자를 클릭하기 만하면됩니다. 감사! – Alex

+0

컨텍스트에서이 게시물이 도움이 될 가능성이 있습니다. http://blog.contextures.com/archives/2012/05/08/add-new-combobox-items-in-excel-userform/. 그녀는 다소 비슷한 문제를 겪고 있었고 그 의견에서 해결되었습니다. –

답변

6

왜 '확인'버튼을 사용하여 작업을 완료하지 않습니까?

양식에 입력하는 동안 메시지로 사용자를 괴롭히지 않아야합니다. 끝에서 해. 당신이 정말로 당신이 요청한 동작을 사용하려면

Private Sub OK_Click() 

    '// Validate form 
    If txtAnswer.Text = vbNullString Then 
     MsgBox "You need to enter an answer!", vbExclamation, "No Answer Found!" 
     txtAnswer.SetFocus 
     Exit Sub 
    End If 

    '// You have reached here so form is correct carry on 
    recordAnswer 

End Sub 

다음이 시도 :

Private Sub txtAnswer_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 

    Select Case KeyCode 
    Case 13: 
     If Me.txtAnswer.Value = "" Then 
      temp = MsgBox("You need to enter an answer!", vbCritical + vbOKOnly, "No Answer Found!")    
      KeyCode = 0 
     Else 
      recordAnswer 
     End If 
    End Select 

End Sub 

문제는 코드에 포커스를 설정하고 있지만, 입력 키가 이후 발사된다는 점이다. 이미 입력 키를 취소하기 만하면 텍스트 상자에 이미 포커스가 있으므로 포커스를 설정할 필요가 없습니다.

+1

+1 좋은 생각. 'txtAnswer.SetFocus' 다음에 'Exit Sub'를 추가하고 싶을 수도 있습니다. –

+0

와우, 고마워요. @Sidd, 내 게시물을 편집하면 언제든지 저처럼 멍청한 실수를 저지르는 것을 느낄 수 있습니다. – Reafidy

+0

아니요.이 프로그램은 아이들을위한 수학 프로그램입니다. 아이디어는 학생들이 기본적인 수학 문제를 통해 순환한다는 것입니다. 양식에 한 개의 텍스트 상자가있어 문제가 발생한 문제의 답을 입력 할 수 있습니다. (예 : 2 + 2 및 '4'입력). 그들의 대답을 입력하면 그들은 '엔터'를 쳤다.그들은 그 대답이 맞는지 아닌지를 알려주지 만 형태는 사라지지 않습니다. 단순히 새로운 문제가 발생합니다. 그들은 질문에 답하고 그들의 결과를보고 싶을 때만 "OK"버튼을 누르십시오. – Alex

0

다른 답변은 정말 복잡해 보입니다. 비슷한 문제가있어서 텍스트 경고가 실제로 필요했습니다. 입력이 올바르지 않은 경우 표시되는 보이지 않는 레이블을 양식에 작성하는 것이 더 쉬워 보였습니다. 또한 사용자가 뭔가 잘못되었음을 알 수 있도록 레이블의 배경을 빨간색으로 변경했습니다. 이 방법을 사용하면 커서가 보이지 않고 오른쪽에서 멈 춥니 다.

Public Function amount(ByRef cont As MSForms.TextBox) As Integer 
'makes sure that a number is used 
'could change to account for decimals if necessary 
Dim i As Long 
On Error Resume Next 
i = 0 
If (cont.Value = "") Then Exit Function 
    Do While i < 1000000 
     If (cont.Value = i) Then 
      UserForm1.Label257.Visible = False 
      Exit Function 
     End If 
     i = i + 1 
    Loop 
UserForm1.Label257.Visible = True 
amount = 1 
End Function 

Public Sub qty_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) 
If amount(UserForm1.qty) = 1 Then 
    Cancel = True 
End If 
End Sub 

이 문제가 나중에이 문제를 해결하는 데 도움이되기를 바랍니다.

-2

위의 코드를 보면 카운터를 계속 사용한다고 가정합니다. 죄송합니다 조금 녹슬었고, 코드를 작성한 지 몇 년이 지났습니다.

어쨌든 i = 0 일 때 항상 실행할 수있는 경우 do (또는 true).

죄송합니다. 여기에 처음 게시하는 것은 의미가 있기를 바랍니다.