2015-08-19 3 views
0

Это является продолжением на вопрос нашел here.Краткий отчет: Модифицирование Решение

Решение, предлагаемое Grade «» EH Bacon предполагается, что каждый десятичный код соответствует определенному статусу, однако, что это не так. Десятичный код сначала должен быть преобразован в двоичный, и каждый бит соответствует конкретному описанию. Так, например, 0000000000000001 будет соответствовать только один статус «Idle Вырез Active», и 0000000001000001 будет соответствовать двум состояниям «Высокая температура охлаждающей жидкости» и «Idle Активный Выключатели».

Я придумал способ расколоть 16-битовую строку в каждый бит и заселить ряд столбцов таким образом, что мои данные выглядит следующим образом:

enter image description here

Примечание: Данные продолжается далеко за пределами строки, которая может быть видна на изображении выше; он идет до строки 8651.

Есть ли способ, которым это решение может быть изменено для подсчета столбцов с 1 по S вместо того, чтобы смотреть на десятичный код в столбце B ?. Я предполагаю, что это приведет к использованию большого количества колонок, поэтому, возможно, существует более оптимальный способ сделать то, что я пытаюсь сделать. Повторяю, что я хочу сделать, это найти время начала и окончания пяти или более последовательных 1 с отметками времени, которые находятся в пределах 2 минут от каждого, и иметь соответствующий дескриптор с отметкой времени начала и окончания, чтобы я мог достичь более читаемый формат для данных, которые появляются выше. Было бы выглядеть примерно так:

enter image description here

Итак, есть ли способ изменить текущее решение или я должен считать совершенно новое решение? Если позже, что бы вы порекомендовали?

экспериментировать:

Я соединил образец Workbook с раствором Grade «Eh» Бэкона реализованного и пример данных, которые я работаю. Рабочую книгу можно загрузить с here.

Спасибо,

Dan

EDIT 1:

Я изменил код Tim Williams отвечал, чтобы удовлетворить свои потребности, а также добавлены некоторые функции, чтобы сделать его лучше для чего Я делаю. Файл на Google Диске имеет обновленный код в полном объеме, но, чтобы подвести итог, я внес некоторые незначительные изменения в код Тима, чтобы он соответствовал данным, которые у меня были, а затем написал два дополнительных модуля. Во-первых, заменить все различные значения «Flag #: XX», которые появляются, когда код запускается с дескрипторами состояния двигателя, а другой - сортировать значения по маркам времени начала. Вот как выглядит его код с изменениями, которые я сделал:

Public Type flag 
     tStart As Variant 'flag start time 
     tLast As Variant 'last event time 
     Count As Long  'number of 1's 
End Type 
Sub Report() 
'Type to track data for each of the bit positions (event types) 

    Dim flags() As flag 
    Dim c As Range, nF As Long, i As Long, v, f, t 
    Dim shtReport As Worksheet, bContinue As Boolean 

    Set shtReport = ThisWorkbook.Sheets("Technician Report Summary") 
    Set c = Sheets("RAW DATA").Range("C2") 
    nF = Len(c.Value) 
    ReDim flags(1 To nF) 
    bContinue = True 

    Do 
     v = c.Value    'bitstring 
     t = c.Offset(0, -2).Value 'timestamp 

     If Len(v) = 0 Then 
      'No more data, so insert a "dummy" value to trigger 
      ' writing out any current "events" 
      v = String(nF, "0") 
      bContinue = False 
     End If 

     'loop over each "bit" in the string 
     For i = 1 To nF 
      f = Mid(v, i, 1) 
      If f = "1" Then 
       'first instance of this flag ? 
       If flags(i).Count = 0 Then 
        flags(i).tStart = t 'event begins - set start time 
       Else 
        flags(i).tLast = t 'event continues - set "last" time 
       End If 
       flags(i).Count = flags(i).Count + 1 
      End If 
      If f = "0" Then 
       'end of a run of 5 or more 1's ? 
       If flags(i).Count >= 5 Then 
        'write event to Report sheet 
        With shtReport.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) 
         .Value = "Flag#:" & i 
         .Offset(0, 1).Value = flags(i).tStart 
         .Offset(0, 2).Value = flags(i).tLast 
        End With 
       End If 
       flags(i).Count = 0 
      End If 
     Next i 

     Set c = c.Offset(1, 0) 

    Loop While bContinue 
    Call Sort 
    Call FindAndReplace 

End Sub 

Я думаю, что теперь он делает то, что я ищу. Я проверю дальше, но, поскольку он стоит, я думаю, что нашел решение, которое работает.

+0

Ваших ссылка требует, чтобы пользователь «запрашивал доступ» - было бы лучше, если бы нам не пришлось это делать. –

+0

@ Тим Уильямс. Вы правы, я изменил его так, чтобы любой, у кого есть ссылка, Теперь. Благодарю. – nickelcap

ответ

2

Вы могли бы попробовать что-то вроде этого:

'Type to track data for each of the bit positions (event types) 
Public Type flag 
    tStart As Variant 'flag start time 
    tLast As Variant 'last event time 
    Count As Long  'number of 1's 
End Type 

Sub Report() 

    Dim flags() As flag 
    Dim c As Range, nF As Long, i As Long, v, f, t 
    Dim shtReport As Worksheet, bContinue As Boolean 

    Set shtReport = ThisWorkbook.Sheets("Report") 
    Set c = Sheet1.Range("B2") 
    nF = Len(c.Value) 
    ReDim flags(1 To nF) 
    bContinue = True 

    Do 
     v = c.Value    'bitstring 
     t = c.Offset(0, -1).Value 'timestamp 

     If Len(v) = 0 Then 
      'No more data, so insert a "dummy" value to trigger 
      ' writing out any current "events" 
      v = String(nF, "0") 
      bContinue = False 
     End If 

     'loop over each "bit" in the string 
     For i = 1 To nF 
      f = Mid(v, i, 1) 
      If f = "1" Then 
       'first instance of this flag ? 
       If flags(i).Count = 0 Then 
        flags(i).tStart = t 'event begins - set start time 
       Else 
        flags(i).tLast = t 'event continues - set "last" time 
       End If 
       flags(i).Count = flags(i).Count + 1 
      End If 
      If f = "0" Then 
       'end of a run of 5 or more 1's ? 
       If flags(i).Count >= 5 Then 
        'write event to Report sheet 
        With shtReport.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) 
         .Value = "Flag#:" & i 
         .Offset(0, 1).Value = flags(i).tStart 
         .Offset(0, 2).Value = flags(i).tLast 
        End With 
       End If 
       flags(i).Count = 0 
      End If 
     Next i 

     Set c = c.Offset(1, 0) 

    Loop While bContinue 

End Sub 

EDIT: устроился несколько опечаток и составил то, что происходит в конце данных, если есть события «продолжается»

+0

Спасибо, это работает. Я сделал некоторые незначительные изменения, которые я опубликовал в своем оригинальном посте в качестве редактирования, если вам интересно. – nickelcap

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