2017-02-17 13 views
0

У меня есть следующий код. Но цикл if-else выполняется неправильно. То есть MsgBox (Hour(strTime)) печатает 14,Неправильное выполнение внутри if else loop

Так If (Hour(strTime) = 17 & Minute(time) = 31 & Weekday(time) <> 1 & Weekday(time) <> 2) должен не Execute. Но это все равно. Оцените, есть ли у кого-нибудь ошибки в коде. С наилучшими пожеланиями

Private RunWhen As Date 
Private Const StartTime As Date = #2:14:30 PM# 
Private Const EndTime As Date = #5:34:55 PM# 
Private Const cRunInterval = "00:01:00" 
Private Const cRunWhat = "Data" ' the name of the procedure to run 


Sub StartTimer() 
Dim strTime 
strTime = time 

    If RunWhen = 0 Then 
     RunWhen = StartTime 
    Else 
     RunWhen = RunWhen + TimeValue(cRunInterval) 
    End If 
    MsgBox (Hour(strTime)) 
    If (RunWhen <= EndTime & Weekday(time) <> 1 & Weekday(time) <> 2) Then 
     If (Hour(strTime) = 17 & Minute(time) = 31 & Weekday(time) <> 1 & Weekday(time) <> 2) Then 
      'MsgBox ("Mail") 
      Call CDO_Mail_Small_Text 
     Else 
      If (Hour(strTime) = 17 & Minute(time) = 33 & Weekday(time) <> 1 & Weekday(time) <> 2) Then 
       MsgBox ("clear") 
       Call ClearData 
      Else 
      Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, Schedule:=True 
      End If 
     End If 
    End If 


End Sub 

Sub Data() 
Dim RowNo As Long 
Dim RowNo2 As Long 
RowNo = Sheets(1).Cells(Rows.Count, 11).End(xlUp).Row 
RowNo2 = Sheets(1).Cells(Rows.Count, 14).End(xlUp).Row + 1 
    Sheets(1).Cells(RowNo2, 15) = Sheets(1).Cells(RowNo, 11) 
    Sheets(1).Cells(RowNo2, 16) = Sheets(1).Cells(RowNo, 12) 
    Sheets(1).Cells(RowNo2, 17) = Sheets(1).Cells(RowNo, 13) 
    Sheets(1).Cells(RowNo2, 14) = time 

    StartTimer ' Reschedule the procedure 
End Sub 

ответ

3

Я считаю, что ваши проблемы есть с помощью & вместо булева оператора AND.

Sub StartTimer() 
Dim strTime 
strTime = time 

If RunWhen = 0 Then 
    RunWhen = StartTime 
Else 
    RunWhen = RunWhen + TimeValue(cRunInterval) 
End If 
MsgBox (Hour(strTime)) 
If (RunWhen <= EndTime AND Weekday(time) <> 1 AND Weekday(time) <> 2) Then 
    If (Hour(strTime) = 17 AND Minute(time) = 31 AND Weekday(time) <> 1 AND Weekday(time) <> 2) Then 
     'MsgBox ("Mail") 
     Call CDO_Mail_Small_Text 
    Else 
     If (Hour(strTime) = 17 AND Minute(time) = 33 AND Weekday(time) <> 1 & Weekday(time) <> 2) Then 
      MsgBox ("clear") 
      Call ClearData 
     Else 
     Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, Schedule:=True 
     End If 
    End If 
End If 


End Sub 

Кроме того, я не уверен, что если вы вызываете этот сабвуфер с аргументами из другой подпрограммы, но когда я тестировал я получал многочисленные переменные, которые не были определены.

Это хорошая практика, чтобы гарантировать, что Option Explicit объявлен в начале вашего модуля.

Это гарантирует, что все переменные объявлены, и он спас меня от бесчисленных часов отслеживания переменных из-за опечаток.

+0

Спасибо, я программировал много javascript ... Забыл, что у VBA есть 'AND': P Я не получаю никаких неопределенных ошибок и теперь имею опцию явным образом. – user1665355

+0

Рад это слышать. Я полностью понимаю трудности при переключении языков. Я уверен, что это случается с лучшими из нас! –