Граждане, купите папиросы, тема печали такая. Две недели бъюсь. С ком порта принимаю данные, тик один раз в минуту. Нужны строки с Temperature и Humidity. НО, с каждым тиком они ползают по ячейкам А18-А21, это раз, и крайний левый числовой индекс со временем увеличивает кол-во знаков, то есть было 15797968(8 знаков) и потом стало например 216798765(9 знаков) это два, в общем позицию искомого слова не угадаешь. Что уже сделал - -- в ячейках Е16-Е19 определяю начало позиции, с которого начинается слово (оба они начинаются с одной позиции)
Код
=ПОИСК("Temperature";A18;10) потом =ПОИСК("Temperature";A19;10)
и так далее.
--Затем в Е14 создаю переменную для подстановки в формулу
Конечно, с вашей точки зрения все формулы через лумумбу и можно было сделать наверное короче и изящнее, тем не менее, все тикает. Но это не совсем то что греет сердце. Чего добиваюсь, чтоб выводилась температура в отдельный столбик каждый тик(через минуту) в отдельной ячейке с переходом на нижнюю ячейку для следующей записи. По влажности все точно так же. Еще надо чтоб в другой таблице выводилось системное время: данные температуры 1 тика: данные температуры 2 тика: данные температуры 3 тика: данные температуры 4 тика, ячейка для записи закрывается, переходит на нижнюю ячейку и цикл повторяется. Эти выверты нужны для построения графиков. Моих мозгов уже ни на что не хватает. Эксель осваиваю второй раз в жизни через 10 лет, познания в нем почти нулевые.
БМВ написал: Что изменяется? Что и куда должно попадать? Почему вы берете именно данные с 18 строки?
Содержание этих 4 строк А18-А21это значение нового тика, но чередуется, условно, на первом тике Temperature в А20, на следуюшем тике Temperature на А19. Так и елозит по строкам, при том что выше А18 значение нового тика не уходит, выше А18 там значения предыдущего тика(А17, А16 и т.д). Посмотрите внимательно, я не беру в формулах именно А18 как источник, я перебираю все четыре на совпадение. Колонка А1 это данность, туда тикает ком порт. Но это неважно, это я как то победил.
Цитата
БМВ написал: ...к чему весь сыр бор если все что нужно необходимо обрабатывать при получении данных из COM
Вот это я уже точно не умею, даже и спрашивать не буду.
Ну с упрощением формулы все просто Покажите на примере как вы ходите видеть значения для нескольких "тиков", то есть после каждого обновления раз в минуту. Сразу скажу, без VBA тут ничего не сделать, но код очень маленький. Только по событию обновления Query поместить данные в следующие ячейки.
08,03,18 21,30:24,40:24,50:24,80:24,80 - это что? 08,03,18 21,30: - дата и время, но почему в таком формате 24,40:24,50:24,80:24,80 - а это что? 24,40 понимаю, а 24,50 откуда? это следующее вроде значение.
БМВ написал: 08,03,18 21,30:24,40:24,50:24,80:24,80 - это что?08,03,18 21,30: - дата и время, но почему в таком формате
08,03,18 системная дата 21,30 системное время и 4 значения в одной ячейке. Почему в таком формате? А в каком? Просто если заменить запятые на точки то формат ячейки у меня расползается, всяко пробовал, а Эксель, собака, мне дату вместо цифир вставляет. Двоеточие можно заменить на точку с запятой.
Цитата
БМВ написал: 24,40:24,50:24,80:24,80 - а это что? 24,40 понимаю, а 24,50 от куда? это следующее вроде значение.
Все верно, следующий тик с новым значением. Цифры условные и взяты из столбика рядом слева(там тоже условные), которые в одну колонку. То есть новые значения должны появляться и в вертикальных столбиках и в столбиках с накоплением(которые по 4 значения в ячейке с ситемной датой)
Ну допустим с форматом времени разберемся, давайте пояснять, на каких этапах появляются какие цифры. Убейте а не понимаю, от куда и когда что берется, как это связано со временем.
Итак, приступим помолясь. Колонка А1. Туда прилетает очередной тик из com port, эту колонку я прицепил к обновлению из вэб, из локальной сети по вай-фай(Это локальный сервер на NodeMCU с прицепленными к нему датчиками температуры и влажности, будет еще датчик атм.давления и освещенности. Тема Arduino uno, у китайцев на Али). Обновляются строки с А2 до А21, при этом новые значения всегда в строках А18-А21, предыдущие в А14-А17, еще более ранние в А13-А16 и т.д. Суть в том, что новые значения с А18 по А21 имеют непостоянство, строки с Temperature: и Humidity идут одна за другой, но смещаются в пределах А18-А21, верхняя всегда Temperature: и она может быть или в А20, или в А19, или в А18, а Humidity за ней ниже, соответственно или в А21, или в А20, или в А19. Я не стал ломат мозг и вычислять алгоритм блуждания, я просто перебирал строки на предмет нахождения этих слов
Tatarin_2, не то. Нет разницы Arduino или другой контроллер поставляет данные. Вопрос, что вы хотите обработать эту пачку даных и превратить во что? Какя логика появления новых строк. Короче, чтоб после обновления что-то куда-то начало заносить нужно в модуль книги.
Код
Dim WithEvents q As QueryTablePrivate Sub q_AfterRefresh(ByVal Success As Boolean)
With Лист2
' тут то что хотите
End With
End SubPrivate Sub Workbook_Open()
Application.OnTime Now, Me.Name & ".Start"
End SubSub Start()
Set q = Лист2.QueryTables(1)
End Sub
Если с Arduino и C совладали, то и с этим справитесь.
БМВ написал: Вопрос, что вы хотите обработать эту пачку даных и превратить во что? Какя логика появления новых строк.
Я же говорил - в четыре колоноки с накапливающимися данными. Какая может быть у появления новых строк логика? Да никакой. Пришли новые данные безо всякой логики и их нужно раскидать по колонкам нужным образом.
Цитата
БМВ написал: Короче, чтоб после обновления что-то куда-то начало заносить нужно в модуль книги. Если с Arduino и C совладали, то и с этим справитесь.
Это утилитарная задача, в том плане что она мне нужна сейчас и один раз. Что ж мне теперь, изучать все подряд вплоть до ассемблера?. Я ведь никого не вынуждаю, просто попросил помощи. Вас я понял, VB не знаю даже на начальном уровне, но спасибо за внимание.
Именно по теме. Первый пост - "Чего добиваюсь, чтоб выводилась температура в отдельный столбик каждый тик(через минуту) в отдельной ячейке с переходом на нижнюю ячейку для следующей записи."
Что это? Как функция в ячейку не влазит и матерится. "Только это не фокус и вывод туда прсто так не произойдет." - Как это понять, если вывода не произойде, тогда нафига мне эта функция.
Tatarin_2, мне Ваша задача не утилитарна, но пока вы не поясните, как связаны Ваши данные, не думаю что кто-то поможет, так как вопросы будут теже.
Ваши тики в пояснении не нужны. Есть запрос раз в минуту, он получает набор строк с данными. Куда и что нужно переложить? Почему у Вас в примере на одну и тоже минуту вдруг 4 значения температуры, а почему не 5, от куда возьмется 24,50 .... ?
Приходит пачка. В ней 20 строк, выбираем последние 4 строки, там новые значения. Из них --находим строку со словом Temperature: 24.50 (цифра условная, в пачке десятые отделены именно точкой) , забираем из этой строки правые пять символов(они крайние, пять символов это с вместе с точкой) и кладем их в ячейку колонки "Температура" и переходим на ячейку ниже для следующей пачки, --И, с этим же значением переходим в колонку "Температура" (которая по четыре значения), проверяем, там меньше четырех значений - кладем туда, иначе переходим на следующую ячейку, ставим системную дату-время и кладем в новую. Все то же самое из этой пачки со строкой Humidity.
Почему четыре а не пять? Так надо, для удобства. Почему на одну и ту же минуту приходится 4 значения? Здесь дата-время это фиксация времени приема первого значения. Откуда возьмется 24,50 ? Я изобразил как бы уже (условно)поработавшую 8 минут таблицу и как бы принявшую и раскидавшую по ячейкам 8 пачек значений, поэтому 24,50 это из левого столбика "Температура", там она вторая сверху. Вы же просили набросать схемку как я вижу эти таблицы, ну я и разгулял фантазию во всю толщину.
Теперь более понятно, вы сами сбили с толку, поставив время 21:31 ведь там может быть только 21:34. Из пачки точно берем только последние значения температуры и влажности (А18-А21) ?
"вы сами сбили с толку, поставив время 21:31 ведь там может быть только 21:34" - Ну наверное мы друг друга сначала недопоняли. Я, видимо, забыл откомментировать подробнее.
Да, точно А18-А21. Я немного подправил свой пост - "Приходит пачка. В ней 20 строк, выбираем последние 4 строки, там новые значения." И вот уже с последними четырьмя строками работаем, выбираем из них.
Урааааааааа, уже работает, чуть неправильно, но работает. Обгрызаются первые два символа в таблицах, пишет только точку и десятичные. Там где по четыре значения - ставит время-дату, правильно считает по 4 значения, но тоже обгрызает первые два знака. Со временем число индекса(крайняя левая группа чисел до знака : ) удлиняется на один знак и, видимо, поиск и вывод сбиваются.
Там два макроса, test и еще один. Какой из них запускать? А то я и тот и тот запустил не помню в какой последовательности.
test просто для отладки был, он ненужен. Все запустится автоматом. возможно так будет корректнее, хотя без реальных данных .....
Скрытый текст
Код
Private Sub q_AfterRefresh(ByVal Success As Boolean)
Dim RefreshTime
RefreshTime = Now
Dim A(1 To 1, 1 To 2)
If Success Then
With Лист2
Data = .Range("A18:A21")
For i = 1 To UBound(Data)
If InStr(1, Data(i, 1), "Temperature:") > 0 Then
A(1, 1) = CDbl(Replace(Mid(Data(i, 1), 33, 19), ".", ","))
ElseIf InStr(1, Data(i, 1), "Humidity:") > 0 Then
A(1, 2) = CDbl(Replace(Mid(Data(i, 1), 30, 19), ".", ","))
End If
Next
.Cells(Rows.Count, 8).End(xlUp).Offset(1, 0).Resize(, 2) = A
B = .Cells(Rows.Count, 10).End(xlUp).Resize(, 2)
If Len(B(1, 1)) - Len(Replace(B(1, 1), ";", "")) < 4 And _
B(1, 1) <> "Температура" Then
B(1, 1) = B(1, 1) & ";" & Format(A(1, 1), "0.00")
B(1, 2) = B(1, 2) & ";" & Format(A(1, 2), "0.00")
.Range("J8").End(xlDown).Resize(, 2) = B
Else
B(1, 1) = Format(RefreshTime, "dd.mm.yyyy hh:mm") & ";" & Format(A(1, 1), "0.00")
B(1, 2) = Format(RefreshTime, "dd.mm.yyyy hh:mm") & ";" & Format(A(1, 2), "0.00")
.Cells(Rows.Count, 10).End(xlUp).Offset(1, 0).Resize(, 2) = B
End If
End With
End If
End Sub
Как нужно заменить? В макросах становлюсь на макрос со *.Start, кнопка Изменить, копирую Ваш исправленный текст на форуме, один в один заменяю в его в VB, закрываю VB и макрос исчезает из списка. Что не так делаю?