Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Поиск + выбор? Добавлено: 15.07.09 22:03  

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

Time, ,Identifier, ,Parameter
11:16:01.594, ,On, ,Cal.Err
11:16:01.594, ,On, ,Loop Err
11:18:09.596, ,Off, ,Cal.Err
11:18:09.596, ,Off, ,Loop Err
11:20:41.594, ,On, ,BEAM_BLK
11:20:59.594, ,Off, ,BEAM_BLK
11:22:05.594, ,On, ,BEAM_BLK
11:23:34.661, ,Off, ,BEAM_BLK

Нужно вычислить интервал работы, но как вы видите ON OFF и Parameter не идут подряд, нужно чтобы макрос помогал находить начало-конец интервала и вычислял его

Time, ,Identifier, ,Parameter
11:16:01, ,On, ,Cal.Err
11:16:01, ,On, ,Loop Err
11:18:09, ,Off, ,Cal.Err
11:18:09, ,Off, ,Loop Err
(Ниже яснее on\off подряд и parameter одинаковый)
11:20:41, ,On, ,BEAM_BLK
11:20:59, ,Off, ,BEAM_BLK
11:22:05, ,On, ,BEAM_BLK
11:23:34, ,Off, ,BEAM_BLK

Впринципе я никогда не увлекался программированием, вот что я смог придумать прочитав хелпы, но этот алгоритм не работает, точнее работает но дыряво:

Sub Delay()
y = 1
x = 1
Do
    Do While Cells(x, 3) <> ""
          If (Cells(x + y, 8) = Cells(x, 8)) And (Cells(x + y, 4) = "Off") And (Cells(x, 4) = "On") Then
             Cells(x, 2) = Cells(x + y, 3) - Cells(x, 3)
                x = x + 2
                y = 1
    Else
y = y + 1
               End If
    Loop
    y = 1
Loop Until Cells(x + 1, 8) = Cells(x, 8)

End Sub

Прошу вашей помощи )







Ответить

  Ответы Всего ответов: 4  

Номер ответа: 1
Автор ответа:
 AngryBadger



Вопросов: 33
Ответов: 245
 Профиль | | #1 Добавлено: 16.07.09 09:28
А у тебя это в каком виде все представленно? Текстовый файл? Ексель? Или что-то еще? Если Ексель, то данные предоставленны строками, т.е. в ячейке строка Time, ,Identifier, ,Parameter или же они идут в разных ячейках? ?

Ответить

Номер ответа: 2
Автор ответа:
 Uriel



Вопросов: 3
Ответов: 2
 Профиль | | #2 Добавлено: 16.07.09 10:36
Представлено в екселе конечно же.
Вроде написал и вроде работает, буду рад если будут комментарии\замечания предложения как улучшить:

  1. Sub Delay()
  2. n = 14000 'количество строк
  3. For x = 1 To n
  4. y = x
  5. If y > n Then Exit For
  6.  If Cells(x, 2) = "On" Then
  7.    Do
  8.     If Cells(y, 2) = "Off" And Cells(y, 3) = Cells(x,3) Then
  9.        Cells(x, 4) = Cells(y, 1) - Cells(x, 1)
  10.        A = True
  11.         Else
  12.         y = y + 1
  13.         If y > n Then Exit Do
  14.     End If
  15.    Loop Until A = True
  16.         A = False
  17.            
  18.     End If
  19.    Next x
  20.  
  21. End Sub



Если коротко
1.Находит On
2.Смотрит подходит ли следующас ячейка по параметру и идентификатору, да - считает задержку, нет переходит на следующую строку
3.Если на какой-то On нету Off'a то он оставит его в покое когда y>n

Cells(n,1)- время
Cells(n,1)- идентификатор(On\Off)
Cells(n,3)-параметр(Beam Block,Cal.Error...)
Cells(n,4)- собственно, что и считалось - задержка

Ответить

Номер ответа: 3
Автор ответа:
 AngryBadger



Вопросов: 33
Ответов: 245
 Профиль | | #3 Добавлено: 17.07.09 11:44
Макрос который находит период времени от включения до выключения или наоборот. А вот по поводу параметра я чего-то не понял. Как должно быть? Нужно считать время между двумя включениями у которых совпадает параметр?

Option Explicit

Sub Delay()
Dim i As Long
Dim k As Long
Dim lRows As Long
    k = 1
    lRows = Cells(1, 2).End(xlDown).Row
        For i = 2 To lRows
            If Cells(i, 2).Value <> Cells(i - 1, 2).Value Then
                Cells(i, 4).Value = Cells(i, 1).Value - Cells(k, 1).Value
                k = i
            End If
        Next i
End Sub

Ответить

Номер ответа: 4
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #4
Добавлено: 17.07.09 12:20
Думаю, стоит написать, что эта задача была поставлена автором на другом форуме и решена (мной):
  1. Option Explicit
  2.  
  3. Private Sub cmdGetDelay_Click()
  4.     Dim i As Long
  5.     Dim j As Long
  6.     Dim s As String
  7.     Dim t As Date
  8.     
  9.     i = 2
  10.     Do While Not s01.Cells(i, 2).Value = Empty
  11.         
  12.         If s01.Cells(i, 2).Value = "Off" Then
  13.             t = s01.Cells(i, 1).Value
  14.             s = s01.Cells(i, 3).Value
  15.             
  16.             For j = i To 2 Step -1
  17.                 If s01.Cells(j, 3).Value = s And s01.Cells(j, 2).Value = "On" Then
  18.                     s01.Cells(i, 4).Value = t - s01.Cells(j, 1).Value
  19.                     Exit For
  20.                 End If
  21.             Next
  22.         End If
  23.         
  24.         i = i + 1
  25.     Loop
  26. End Sub

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам