Это является продолжением на вопрос нашел here.Краткий отчет: Модифицирование Решение
Решение, предлагаемое Grade «» EH Bacon предполагается, что каждый десятичный код соответствует определенному статусу, однако, что это не так. Десятичный код сначала должен быть преобразован в двоичный, и каждый бит соответствует конкретному описанию. Так, например, 0000000000000001 будет соответствовать только один статус «Idle Вырез Active», и 0000000001000001 будет соответствовать двум состояниям «Высокая температура охлаждающей жидкости» и «Idle Активный Выключатели».
Я придумал способ расколоть 16-битовую строку в каждый бит и заселить ряд столбцов таким образом, что мои данные выглядит следующим образом:
Примечание: Данные продолжается далеко за пределами строки, которая может быть видна на изображении выше; он идет до строки 8651.
Есть ли способ, которым это решение может быть изменено для подсчета столбцов с 1 по S вместо того, чтобы смотреть на десятичный код в столбце B ?. Я предполагаю, что это приведет к использованию большого количества колонок, поэтому, возможно, существует более оптимальный способ сделать то, что я пытаюсь сделать. Повторяю, что я хочу сделать, это найти время начала и окончания пяти или более последовательных 1 с отметками времени, которые находятся в пределах 2 минут от каждого, и иметь соответствующий дескриптор с отметкой времени начала и окончания, чтобы я мог достичь более читаемый формат для данных, которые появляются выше. Было бы выглядеть примерно так:
Итак, есть ли способ изменить текущее решение или я должен считать совершенно новое решение? Если позже, что бы вы порекомендовали?
экспериментировать:
Я соединил образец 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
Я думаю, что теперь он делает то, что я ищу. Я проверю дальше, но, поскольку он стоит, я думаю, что нашел решение, которое работает.
Ваших ссылка требует, чтобы пользователь «запрашивал доступ» - было бы лучше, если бы нам не пришлось это делать. –
@ Тим Уильямс. Вы правы, я изменил его так, чтобы любой, у кого есть ссылка, Теперь. Благодарю. – nickelcap