2013-08-16 3 views
1

Я очень новичок в VBA. Я попытался вычислить медиану для вектора. Следующий код продолжает получать предупреждение о «Блокировать, если без End if». Я попытался изменить место «End IF», но это привело к еще одному предупреждению «Блокировать конец, если нет, если». Ваш вклад будет оценен. Благодарю.Блок, если без конца, если

Sub CalculateMedian() 

    DoCmd.SetWarnings False 

    Dim db As DAO.Database 
    Dim onet As DAO.Recordset 

    Dim Ocode As String 
    Dim ag As DAO.Recordset 
    Dim agMedian As Integer 

    Set db = CurrentDb 

    'select one variable in current database 
    Set onet = db.OpenRecordset("SELECT DISTINCT ONetCode FROM Single WHERE LEN(ONetCode)>8") 

    Do While Not onet.EOF 

     'assigning value to a variable does not need a "SET" 
     Ocode = onet.Fields("ONetCode") 
     'any data meet the criterion--&Ocode& can vary 
     Set ag = db.OpenRecordset("SELECT AG FROM Single WHERE ONetCode='" & Ocode & "' ORDER BY AG") 

     'using .recordcount needs to use .movelast first 
     ag.MoveLast 
     ag.MoveFirst 
     If ag.RecordCount Mod 2 = 1 Then 
      agMedian = ((ag.RecordCount + 1)/2) 
      thecount = 0 
      Do While Not ag.EOF 
       thecount = thecount + 1 
       If thecount = agMedian Then 
        'inset the result into a new table, and need to create a new table in advance 
        DoCmd.RunSQL ("INSERT INTO PCImedian(onetcode, agMedian) VALUES('" & Ocode & "'," & ag("AG") & ");") 
        Exit Do 
     End If 

     If ag.RecordCount Mod 2 = 0 Then 
      agMedian = ag.RecordCount/2 
      thecount = 0 
      Do While Not ag.EOF 
       thecount = thecount + 1 
       If thecount = agMedian Then 
        m1 = ag("AG") 
       ElseIf thecount = agMedian + 1 Then 
        m2 = ag("AG") 
        DoCmd.RunSQL ("INSERT INTO PCImedian(onetcode, agMedian) VALUES('" & Ocode & "'," & ((m1 + m2)/2) & ");") 
        Exit Do 
     End If 

    Loop 

    DoCmd.SetWarnings True 

End Sub 
+0

Пожалуйста, см http://stackoverflow.com/questions/1896161/ms-access-2007-sql-functions/1896461?noredirect=1#comment26805083_1896461 и http://stackoverflow.com/questions/11213892/ whats-the-difference-between-docmd-setwarnings-and-currentdb-execute – Fionnuala

ответ

1

Код не указан End If. И было 2 отсутствующих заявления Loop.

Когда код достаточно сложный, чтобы сортировка операторов конца блока становилась сложной, сделайте копию процедуры и выбросьте в основном все, кроме операторов управления блоком. Этот метод оставляет это из вашего текущего кода.

Do While Not onet.EOF 
     If ag.RecordCount Mod 2 = 1 Then 
      Do While Not ag.EOF 
       If thecount = agMedian Then 
     End If 
     If ag.RecordCount Mod 2 = 0 Then 
      Do While Not ag.EOF 
       If thecount = agMedian Then 
       ElseIf thecount = agMedian + 1 Then 
     End If 
    Loop 

А вот моя догадка, что вам нужно вместо этого. Я приложил комментарии к нескольким из этих утверждений, потому что это помогает мне правильно подобрать их.

Do While Not onet.EOF 
     If ag.RecordCount Mod 2 = 1 Then 
      Do While Not ag.EOF 
       If thecount = agMedian Then 
       End If ' thecount 
      Loop ' Not ag.EOF 
     End If ' ag.RecordCount Mod 2 = 1 
     If ag.RecordCount Mod 2 = 0 Then 
      Do While Not ag.EOF 
       If thecount = agMedian Then 
       ElseIf thecount = agMedian + 1 Then 
       End If ' thecount 
      Loop ' Not ag.EOF 
     End If ' ag.RecordCount Mod 2 = 0 
    Loop ' Not onet.EOF 
1

кажется, что вам не хватает конца, если после выхода сделать в первом блоке кода. Там должно быть 2, один для закрытия последнего оператора if и один для закрытия первого блока.

Sub CalculateMedian() 

    DoCmd.SetWarnings False 

    Dim db As DAO.Database 
    Dim onet As DAO.Recordset 

    Dim Ocode As String 
    Dim ag As DAO.Recordset 
    Dim agMedian As Integer 

    Set db = CurrentDb 

    'select one variable in current database 
    Set onet = db.OpenRecordset("SELECT DISTINCT ONetCode FROM Single WHERE LEN(ONetCode)>8") 

    Do While Not onet.EOF 

     'assigning value to a variable does not need a "SET" 
     Ocode = onet.Fields("ONetCode") 
     'any data meet the criterion--&Ocode& can vary 
     Set ag = db.OpenRecordset("SELECT AG FROM Single WHERE ONetCode='" & Ocode & "' ORDER BY AG") 

     'using .recordcount needs to use .movelast first 
     ag.MoveLast 
     ag.MoveFirst 
     If ag.RecordCount Mod 2 = 1 Then 
      agMedian = ((ag.RecordCount + 1)/2) 
      thecount = 0 
      Do While Not ag.EOF 
       thecount = thecount + 1 
       If thecount = agMedian Then 
        'inset the result into a new table, and need to create a new table in advance 
        DoCmd.RunSQL ("INSERT INTO PCImedian(onetcode, agMedian) VALUES('" & Ocode & "'," & ag("AG") & ");") 


        End If 'ends the If thecount = agMedian if statement -- will continue to iterate until EOF 

        Exit Do 'EOF hit. 


     End If 'ends the If ag.RecordCount Mod 2 = 1 block 

     If ag.RecordCount Mod 2 = 0 Then 
      agMedian = ag.RecordCount/2 
      thecount = 0 
      Do While Not ag.EOF 
       thecount = thecount + 1 
       If thecount = agMedian Then 
        m1 = ag("AG") 
       ElseIf thecount = agMedian + 1 Then 
        m2 = ag("AG") 
        DoCmd.RunSQL ("INSERT INTO PCImedian(onetcode, agMedian) VALUES('" & Ocode & "'," & ((m1 + m2)/2) & ");") 
        Exit Do 
     End If 'thecount = agMedian if statement 
     End If 'end ag.RecordCount Mod 2 = 0 

    Loop 

    DoCmd.SetWarnings True 

End Sub 
+0

Я попытался добавить конец, если между «exit do» и «end if», и сделал в каждом блоке. Но он дал предупреждение как «Конец, если нет, если». – lucyh

+0

обновленный ответ, чтобы сделать его немного более заметным относительно того, чего вам не хватало. – user2366842

+0

Спасибо. Я изменил его на основе вашего совета, но он дал сообщение об ошибке «Завершить, если без блока, если». – lucyh

Смежные вопросы