2016-06-27 1 views
0

주어진 수의 간단한 산술 질문을 요청할 VBA를 사용하여 매크로를 작성하려고합니다. 각 질문은 지정된 시간 동안 만 사용할 수 있습니다.시간 - 압력 산술에 대한 VBA 매크로

게임의 매개 변수를 설정할 수있는 워크 시트 (예 : 20 개의 질문에 각각 12 개의 질문이 있음)를 지정하고 12 초마다 입력 상자를 계속해서 버리는 이동 버튼을 클릭합니다 20 개의 질문 쿼터에 도달 할 때까지 12 초 동안 또는 이전에 "다음"또는 "확인"을 클릭 할 때 이전 질문을 삭제하고, 답변과 시간을 기록합니다.

저는 VBA에 새로운 것이지만 대부분이 사이트를 사용하여 많은 발전을 이루었습니다.

은 지금까지 나는 나에게 대답을 질문을 생성하고 기록 할 수 있도록 다음과 같습니다

Sub Rand_Arith() 

Dim practice As Workbook 
Dim answers As Worksheet 
Dim start As Worksheet 

Set practice = ActiveWorkbook 
Set answers = Sheets("answers") 
Set start = Sheets("Start") 

Dim x As Variant 
Dim a As Variant 
Dim b As Variant 
Dim answer As Variant 
Dim myanswer As Variant 

Dim i As Integer 
Dim correct As Integer 
Dim qs As Integer 'the number of questions we want 
Dim spq As Integer 'time in seconds per question 
Dim totaltime As Integer 

Dim operator As String 

qs = start.Cells(3, 3) 
spq = start.Cells(2, 3) 
totaltime = spq * qs 
correct = 0 

    If answers.Range("A1").Value = "" Then 
     i = answers.Range("A2").End(xlDown).Row 
    Else 
     i = 1 
    End If 

    Do Until i = qs + 1 

     x = Rnd 
     op = Int(x * 4) '0+ 1- 2* 3/ 

      If x < 0.25 Then 
      a = Round(Rnd * 10, 2) 
      b = Round(Rnd * 10, 2) 
      theanswer = Round(calc(a, b, op), 2) 
       ElseIf x < 0.5 Then 
       a = Round(Rnd * 10, 2) 
       b = Round(Rnd * 10, 2) 
       theanswer = Round(calc(a, b, op), 2) 
        ElseIf x < 0.75 Then 
        a = Round(Rnd * 10, 0) 
        b = Round(Rnd * 10, 0) 
        theanswer = Round(calc(a, b, op), 1) 
         Else: 
         a = Round(Rnd * 10, 0) 
         b = Round(Rnd * 10, 0) 
         theanswer = Round(calc(a, b, op), 1) 
      End If 

     theanswer = Round(calc(a, b, op), 2) 
     operator = s_op(op) 
     myanswer = Application.InputBox("What is " & a & operator & b & " = ?") 

     If theanswer = myanswer Then 
     correct = correct + 1 
     End If 

     runningscore = correct/i 

     answers.Cells(i + 1, 1) = i 
     answers.Cells(i + 1, 2) = a 
     answers.Cells(i + 1, 3) = operator 
     answers.Cells(i + 1, 4) = b 
     answers.Cells(i + 1, 5) = theanswer 
     answers.Cells(i + 1, 6) = myanswer 
     answers.Cells(i + 1, 7) = runningscore 

    i = i + 1 
    Loop 

End Sub 

이 함수의 난이 만든 호출에 있습니다

Function calc(n1, n2, op) 
    If op = 0 Then calc = n1 + n2 
    If op = 1 Then calc = n1 - n2 
    If op = 2 Then calc = n1 * n2 
    If op = 3 Then calc = n1/n2 
End Function 

Function s_op(op) 
    If op = 0 Then s_op = "+" 
    If op = 1 Then s_op = "-" 
    If op = 2 Then s_op = "*" 
    If op = 3 Then s_op = "/" 
End Function 
  1. 내가 가지고있는 한 가지 문제는 입력 상자에 입력 한 답은 값이 같을 때도 theanswer에 의해 계산 된 실제 답변과 같은 것으로 등록되지 않은 문자열을 반환한다는 것입니다. 결과적으로 올바른 및 runnningscore 변수는 0으로 유지됩니다.

  2. 타이밍 부분을 수행하는 방법을 알아낼 수 없습니다. 코드의 https://www.youtube.com/watch?v=sbJeGG_Xv8M

첫 번째 조각 :

Sub starttimer() 

Application.OnTime Now + TimeValue("00:00:01"), "nexttick" 

End Sub 

두 번째 조각

Sub nexttick() 

Dim practice As Workbook 
Dim start As Worksheet 

Set practice = ActiveWorkbook 
Set start = Sheets("Start") 

    If start.Range("c4").Value = 0 Then Exit Sub 

start.Range("c4").Value = start.Range("c4").Value - TimeValue("00:00:01") 

    If start.Range("c4").Value <= TimeValue("00:00:05") Then 
     start.Shapes("TextBox 3").Fill.ForeColor.RGB = RGB(255, 0, 0) 
    ElseIf start.Range("c4").Value <= TimeValue("00:00:10") Then 
     start.Shapes("TextBox 3").Fill.ForeColor.RGB = RGB(0, 0, 255) 
    ElseIf start.Range("c4").Value <= TimeValue("00:00:15") Then 
     start.Shapes("TextBox 3").Fill.ForeColor.RGB = RGB(0, 255, 0) 
    End If 

starttimer 

End Sub 
난이 비디오에서 단어를 더 많거나 적은 단어를 촬영 한 다음 카운트 다운 타이머 실험 한

마지막 :

Sub stoptimer() 

On Error Resume Next 
Application.OnTime Now + TimeValue("00:00:01"), "nexttick", , False 

End Sub 

나는 여기서 많은 성공을 거두지 못했습니다. 나는 카운트 다운 매크로가 다른 매크로가 함께 실행되는 것을 허용하지 않는 것처럼 느낀다?

나는 또한 Application.Wait 및 Application.OnTime을 사용하여 작업을 시도했지만, 내가 원했던 것과 같은 것을 원격으로 수행하는 질문 생성기를 이미 결합한 방법을 실제로 연습 할 수는 없습니다. 할 것.

나는 이것으로 뛰어 들었을 것이고 아마도 내가 VBA로 원하는 것을 할 수 없을 것이라고 걱정한다. (또는 실제로는 매우 어렵다).

어쨌든 도움/건설적인 비판은 대단합니다!

더 나아가, 문제/기술에 대한 나의 접근 방식에 대한 더 일반적인 의견/조언을 크게 높이 실 수 있습니다! 언급했듯이, 나는 단지 시작하고 다른 언어로도 경험이 없습니다.

답변

1

데니스, 프로젝트를 완료하는 방법에 대한 일반적인 조언을 제공 한 다음 특정 문제에 대한 답변을 시도하겠습니다.그렇게하기 전에 VBA가 당신의 과제를 성취 할 수있는 능력 이상이며, 제시 한 코드를 토대로 당신은 당신의 머리를 쓰지 않습니다.

일반 조언 당신이 정말로 데니스 사용자 정의 폼 여기에 필요한 것은

. IDE (코드가있는 곳)에서 삽입> 사용자 정의 폼으로 이동하십시오. 이미 볼 수 없다면보기> 도구 상자로 이동하십시오. 여기에는 단추 및 텍스트 상자와 같은 여러 컨트롤이 양식으로 끌어다 놓을 수 있습니다. 각 컨트롤 뒤에있는 코드를 더블 클릭하여 편집 할 수 있습니다. 예를 들어 버튼 컨트롤을 두 번 클릭하면 사용자가 버튼을 클릭 할 때 실행되는 코드를 작성할 수 있습니다.

컨트롤의 나머지 부분을 이해하도록 하겠지만 양식을 사용하면 내가 생각하는 사용자 상호 작용을 제어 할 수 있습니다. 그것은 Userform없이 그것을 할 수 있습니까? 물론, 나는 그것을 추천하지 않을 것이다.

일반 레이아웃

몇 년 전 나는 당신과 매우 유사한 프로젝트를 썼다. 질문에 대한 텍스트 상자 (또는 레이블), 사용자 응답을위한 텍스트 상자, 제출 단추 및 종료 할 취소 단추로 설정합니다. 제출 버튼을 클릭하면 계산이 수행되고 다음 질문이 실행됩니다.

타이밍

는 VBA를 참조 DateDiff 기능 내장했습니다

DateDiff("s", "06/27/2016 16:42:51", Now()) 

첫번째 매개 변수 "S"는 시간 단위를 나타낸다. 이 경우 초입니다. 내 프로젝트에서 관심이있는 유일한 시간은 사용자가 질문에 대답하는 데 걸리는 시간이었습니다. 이를 위해 질문이 제시되었을 때 변수에 Now()을 저장하고 사용자가 DateDiff 기능을 사용하여 제출을 클릭 한 시간과 비교했습니다. 자신의 케이스에서 퀴즈 기간을 제한하는 것처럼 쉽게 사용할 수 있습니다. VBA는 우리가 당신의 변수는 문자열이나 정수, 또는 뭔가 다른 여부를 더 자주 못하는 것보다 인터프리터가 당신을 위해 알아낼 것을 의미, 느슨한 타입 언어를 부르는

정수 비교

. 즉, 염두에 두어야 할 것이 있습니다.

1) 변수를 선언하는 것이 좋습니다. Dim theanswer as Integer 또는 Dim theanswer as Double입니다. 종종 VBA가 정수를 문자열로, myanswer를 정수로 처리하고 두 정수를 비교하려고하는 가능성을 제거하는 데 도움이됩니다.

2) 비교할 워크 시트의 셀에서 값을 가져 오는 경우 셀 (x, y)을 가져 와서 당깁니다.

3) 때때로 Debug.Print를 사용하여 비교할 값이 실제로 예상 한 값인지 확인하십시오. 예 : Debug.print theanswer. 해당 명령문의 출력은보기 메뉴에서 사용 가능하게 할 수있는 "즉시"창에서 볼 수 있습니다.

이렇게하면 나머지 프로젝트와 관련하여 도움이되기를 바랍니다.나는이 지위에 주목할 것이므로, 그들이 당신에게 오는대로 후속 질문을 게시 할 자유롭게 느끼십시오. 행운을 빕니다!

+0

안녕하세요 짐, 많은 도움에 감사드립니다. 나는 아직 UserForms에 대한 경험이별로 없기 때문에 약간의 독서를하고 다른 것을 할 것입니다! 감사합니다 또한 DateDiff 함수에 대한 내가 어떻게 지금 내가 테스트 시간을 제한 할 수 있습니다 생각을 볼 수 있습니다. 또한 변수 정의는 정답을 추적하여 문제를 분류했습니다! 내가 완전히 완료했을 때 다시 체크 할 것입니다. –

+0

안녕하세요 Jim은 datediff와 application.OnTime의 조합을 사용하여 결국이 작업을했습니다. 저기서 대답을 받아 들였습니다. 도움에 다시 한번 감사드립니다. –

+0

안녕 데니스, 다행스럽게 들으세요! 나머지 프로젝트와 함께 행운을 빈다. –