Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1 2 След.
RSS
Формировать последовательные ячейки из входяших данных
 
Граждане, купите папиросы, тема печали такая. Две недели бъюсь.
С ком порта принимаю данные, тик один раз в минуту. Нужны строки с Temperature и Humidity. НО, с каждым тиком они ползают по ячейкам А18-А21, это раз, и крайний левый числовой индекс со временем увеличивает кол-во знаков, то есть было 15797968(8 знаков) и потом стало например 216798765(9 знаков) это два, в общем позицию искомого слова не угадаешь.
Что уже сделал -
-- в ячейках Е16-Е19 определяю начало позиции, с которого начинается слово (оба они начинаются с одной позиции)  
Код
=ПОИСК("Temperature";A18;10)  потом =ПОИСК("Temperature";A19;10) 
и так далее.

--Затем в Е14 создаю переменную для подстановки в формулу
Код
=ЕСЛИ(ЕЧИСЛО(E16);ПРАВСИМВ(E16;2);ЕСЛИ(ЕЧИСЛО(E17);ПРАВСИМВ(E17;2);ЕСЛИ(ЕЧИСЛО(E18);ПРАВСИМВ(E18;2);ЕСЛИ(ЕЧИСЛО(E19);ПРАВСИМВ(E19;2)))))
, то есть в результате в этой ячейке всегда число, означающее начало позиции искомого слова.

-- И затем в ячейке Е10 (тоже самое в Е12, только Tempe заменяется на Humidi) подставляю переменную плюс смещение на 13 знаков
Код
 =ЕСЛИ(ПСТР(A18;E14;5)="Tempe";ПСТР(A18;E14+13;19);ЕСЛИ(ПСТР(A19;E14;5)="Tempe";ПСТР(A19;E14+13;19);ЕСЛИ(ПСТР(A20;E14;5)="Tempe";ПСТР(A20;E14+13;19);ЕСЛИ(ПСТР(A21;E14;5)="Tempe";ПСТР(A21;E14+13;19);0))))

Конечно, с вашей точки зрения все формулы через лумумбу и можно было сделать наверное короче и изящнее, тем не менее, все тикает. Но это не совсем то что греет сердце.
Чего добиваюсь, чтоб выводилась температура в отдельный столбик каждый тик(через минуту) в отдельной ячейке с переходом на нижнюю ячейку для следующей записи. По влажности все точно так же.
Еще надо чтоб в другой таблице выводилось системное время: данные температуры 1 тика: данные температуры 2 тика: данные температуры 3 тика: данные температуры 4 тика, ячейка для записи закрывается, переходит на нижнюю ячейку и цикл повторяется. Эти выверты нужны для построения графиков. Моих мозгов уже ни на что не хватает. Эксель осваиваю второй раз в жизни через 10 лет, познания в нем почти нулевые.
Изменено: Tatarin_2 - 10 Мар 2018 00:15:38
 
Вы бы файл-эксель приложили вместо картинки
 
это он
 
Tatarin_2,
Что-то мне не понятно, к чему весь сыр бор если все что нужно необходимо обрабатывать при получении данных из COM, но это опустим.

Ежеминутно срабатывает Query читает данные. Что изменяется? Что и куда должно попадать? Почему вы берете именно данные с 18 строки?
 
Цитата
БМВ написал: Что изменяется? Что и куда должно попадать? Почему вы берете именно данные с 18 строки?
Содержание этих 4 строк А18-А21это значение нового тика, но чередуется, условно, на первом тике Temperature в А20, на следуюшем тике Temperature на А19. Так и елозит по строкам, при том что выше А18 значение нового тика не уходит, выше А18 там значения предыдущего тика(А17, А16 и т.д).
Посмотрите внимательно, я не беру в формулах именно А18 как источник, я перебираю все четыре на совпадение. Колонка А1 это данность, туда тикает ком порт.
Но это неважно, это я как то победил.

Цитата
БМВ написал: ...к чему весь сыр бор если все что нужно необходимо обрабатывать при получении данных из COM
Вот это я уже точно не умею, даже и спрашивать не буду.
 
Ну с упрощением формулы все просто
Покажите на примере как вы ходите видеть значения для нескольких "тиков", то есть после каждого обновления раз в минуту. Сразу скажу, без VBA тут ничего не сделать, но код очень маленький. Только по событию обновления Query поместить данные в следующие ячейки.
Изменено: БМВ - 9 Мар 2018 22:19:45
 
Цитата
БМВ написал: без VBA тут ничего не сделать
Такое подозрение у меня было, но это не совсем тот Бейсик, которым я давненько баловался. Да и забыл я его)

Цитата
БМВ написал: Покажите на примере как вы ходите видеть значения для нескольких "тиков", то есть после каждого обновления раз в минуту.
Вот так желательно
 
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 откуда? это следующее вроде значение.
Изменено: БМВ - 9 Мар 2018 23:21:17
 
Цитата
БМВ написал:
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 значения в ячейке с ситемной датой)
Изменено: Tatarin_2 - 9 Мар 2018 23:23:35
 
Ну допустим с форматом времени разберемся,  давайте пояснять, на каких этапах появляются какие цифры. Убейте а не понимаю, от куда и когда что берется, как это связано со временем.
 
Итак, приступим помолясь. Колонка А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 - 10 Мар 2018 00:11:22
 
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 - 10 Мар 2018 00:43:08
 
Я честно пытался помочь, но если нет логики, то я бессилен. Только разве не логика отвечает за слово нужным тут?
Цитата
Tatarin_2 написал: раскидать по колонкам нужным образом
А с учетом что появились
Цитата
Tatarin_2 написал: четыре пары колонок
пойду спатеньки.
 
Хорошо, ответа нет.
Тогда может кто знает как заставить эксель выводить результат и переводить фокус на нижнюю ячейку для следующего вывода?
 
Вопрос не по теме.
 
для вас это будет Лист2.Range("H8").End(xlDown).Offset(1, 0)
Только это не фокус и вывод туда прсто так не произойдет.
 
Именно по теме. Первый пост - "Чего добиваюсь, чтоб выводилась температура в отдельный столбик каждый  тик(через минуту) в отдельной ячейке с переходом на нижнюю ячейку для  следующей записи."
Изменено: Tatarin_2 - 10 Мар 2018 18:36:31
 
Что это? Как функция в ячейку не влазит и матерится.
"Только это не фокус и вывод туда прсто так не произойдет." - Как это понять, если вывода не произойде, тогда нафига мне эта функция.
Код
Лист2.Range("H8").End(xlDown).Offset(1, 0)
 
Цитата
Tatarin_2 написал:
новый топик
это не поможет

Tatarin_2,  мне Ваша задача не утилитарна, но пока вы не поясните, как связаны Ваши данные, не думаю что кто-то поможет, так как вопросы будут теже.


Ваши тики в пояснении не нужны. Есть запрос раз в минуту, он получает набор строк с данными. Куда и что нужно переложить? Почему у Вас в примере на одну и тоже минуту вдруг 4 значения температуры, а почему не 5, от куда возьмется 24,50 ....  ?
 
Приходит пачка. В ней 20 строк, выбираем последние 4 строки, там новые значения. Из них
--находим строку со словом Temperature: 24.50 (цифра условная, в пачке десятые отделены именно точкой) , забираем из этой строки правые пять символов(они крайние, пять символов это с вместе с точкой) и кладем их в ячейку колонки "Температура" и переходим на ячейку ниже для следующей пачки,
--И, с этим же значением переходим в колонку "Температура" (которая по четыре значения), проверяем, там меньше четырех значений - кладем туда, иначе переходим на следующую ячейку, ставим системную дату-время и кладем в новую.
Все то же самое из этой пачки со строкой Humidity.

Почему четыре а не пять? Так надо, для удобства.
Почему на одну и ту же минуту приходится 4 значения? Здесь дата-время это фиксация времени приема первого значения.
Откуда возьмется 24,50 ? Я изобразил как бы уже (условно)поработавшую 8 минут таблицу и как бы принявшую и раскидавшую по ячейкам  8 пачек значений, поэтому 24,50 это из левого столбика "Температура", там она вторая сверху. Вы же просили набросать схемку как я вижу эти таблицы, ну я и разгулял фантазию во всю толщину.
Изменено: Tatarin_2 - 10 Мар 2018 20:14:47 (добавил текста)
 
Теперь более понятно, вы сами сбили с толку, поставив время 21:31 ведь там может быть только 21:34.
Из пачки точно берем только последние значения температуры и влажности (А18-А21) ?
 
"вы сами сбили с толку, поставив время 21:31 ведь там может быть только 21:34" - Ну наверное мы друг друга сначала недопоняли. Я, видимо, забыл откомментировать подробнее.

Да, точно А18-А21. Я немного подправил свой пост - "Приходит пачка. В ней 20 строк, выбираем последние 4 строки, там новые значения."
И вот уже с последними четырьмя строками работаем, выбираем из них.
Изменено: Tatarin_2 - 10 Мар 2018 20:47:31
 
Попробуйте,
Я не могу проверить Query так как нет источника.
Изменено: БМВ - 10 Мар 2018 22:55:39
 
Урааааааааа, уже работает, чуть неправильно, но работает.
Обгрызаются первые два символа в таблицах, пишет только точку и десятичные. Там где по четыре значения - ставит время-дату, правильно считает по 4 значения, но тоже обгрызает первые два знака. Со временем число индекса(крайняя левая группа чисел до знака :     ) удлиняется на один знак и, видимо, поиск и вывод сбиваются.

Там два макроса, test и еще один. Какой из них запускать? А то я и тот и тот запустил не помню в какой последовательности.

Файлы удалены: превышение допустимого размера вложения [МОДЕРАТОР]
 
test просто для отладки был,  он ненужен. Все запустится автоматом.
возможно так будет корректнее, хотя без реальных данных .....
Скрытый текст
Изменено: БМВ - 10 Мар 2018 22:54:39
 
Как нужно заменить? В макросах становлюсь на макрос со *.Start, кнопка Изменить, копирую Ваш исправленный текст на форуме, один в один заменяю в его в VB, закрываю VB и макрос исчезает из списка. Что не так делаю?
 
Это магия :-)  Заменил файл в #27
 
Пишет
Run-time Error 13
Type mismatch
Подсвечивает на эту строку
A(1, 1) = CDbl(Mid(Data(i, 1), 33, 19))
Изменено: Tatarin_2 - 10 Мар 2018 22:50:23
 
и правильно пишет :-) . Еще раз заменил.
Страницы: 1 2 След.
Читают тему (гостей: 1)
Наверх