Каждый час работы фиксировать в указанном листе

Автор Dennis, 15.07.2024, 03:35

« назад - далее »

Dennis

1. На листе «start|stop» вводится время начала и конца работы выбранного устройства (111,22222,33333). Так же вводится дата.

2. Далее на листе самого устройства (111,22222,33333) указывается время запуска и прописывается каждый час после старта работы до выключения.

    Скажите пожалуйста, как сделать чтобы на листе устройства время заполнялось автоматически с листа «start|stop»?

Hugo121

Макросом конечно можно сделать, но как-то...
Зачем это всё? Может пересмотреть схему, упростить всем жизнь?
Например

и фильтруй что хочешь посмотреть.
И почему раскладывать в листы по часам, а не минутам, раз в исходнике есть минуты? ))

Dennis

Цитата: Hugo121 от 15.07.2024, 12:16Макросом конечно можно сделать, но как-то...
Зачем это всё? Может пересмотреть схему, упростить всем жизнь?
Например

и фильтруй что хочешь посмотреть.
И почему раскладывать в листы по часам, а не минутам, раз в исходнике есть минуты? ))


Спасибо за ответ!
Рядом с каждым часом на отдельном листе устройства  будет указываются температура, которую нужно смотреть на датчике.

Dennis

Цитата: Dennis от 15.07.2024, 21:33Спасибо за ответ!
Рядом с каждым часом на отдельном листе устройства  будет указываются температура, которую нужно смотреть на датчике.

Будет выглядеть так (файл приложил).

Hugo121

Можно сделать генерацию этих листов процедурой.
Можно сделать обновление данных на этих листах при их активации, но это значит могут появиться расхождения с тем что там было ранее, если где-то изменяли данные.
Я бы наверное создавал из start|stop листы устройств.

Dennis

Цитата: Hugo121 от 15.07.2024, 22:32Можно сделать генерацию этих листов процедурой.
Можно сделать обновление данных на этих листах при их активации, но это значит могут появиться расхождения с тем что там было ранее, если где-то изменяли данные.
Я бы наверное создавал из start|stop листы устройств.

Hugo можешь набросать пример как бы ты это реализовал? Или пример макроса, может я с ним что-то придумаю.

Hugo121

Да я пока вот генерацию часов и минуты прорабатываю, но на сегодня уже всё...
Sub tt()
Dim i

For i = Hour([c5]) To Hour([d5])
Debug.Print i / 24
Next
Debug.Print Round([d5], 15)
If Round([d5], 15) <> Round((i - 1) / 24, 15) Then Debug.Print [d5]
End Sub
Ну и соотв. для строки 3

Hugo121

#7
Т.е. нагенерили часы, и если последнее значение с минутами - дописываем ниже ещё и его.
P.S. Ну вот механизм готов, в отладку всё выводит, осталось листы с этим нагенерить и не писать туда лишние даты, хотя чем мешают?
Sub tt()
Dim a, i&, t$, el, col

a = Sheets("start|stop").[a1].CurrentRegion.Value

With CreateObject("Scripting.Dictionary")
        For i = 2 To UBound(a)
        If a(i, 1) = "" Then a(i, 1) = a(i - 1, 1)
            t = a(i, 2)
            If Not .exists(t) Then .Add t, New Collection
            .Item(t).Add i
        Next

    For Each el In .keys
        Debug.Print "создаём лист " & el
    For Each col In .Item(el)
        If a(col, 4) > 0 Then
            For i = Hour(a(col, 3)) To Hour(a(col, 4))
                 Debug.Print a(col, 1) & "|" & CDate(i / 24)
            Next
            If Round(a(col, 4), 15) <> Round((i - 1) / 24, 15) Then Debug.Print a(col, 1) & "|" & CDate(a(col, 4))
        Else
            Debug.Print a(col, 1) & "|" & CDate(a(col, 3))
        End If
    Next
    Next

End With

End Sub

Hugo121

Добил.
Кнопку не ставил, для избежания ненужного запуска.
Любым способом в файле без листов с именами устройств выполнить макрос GeneritjUstroistva
Дополнительную красоту на листах не наводил, можете дополнять код.

Dennis

Цитата: Hugo121 от 16.07.2024, 08:39Добил.
Кнопку не ставил, для избежания ненужного запуска.
Любым способом в файле без листов с именами устройств выполнить макрос GeneritjUstroistva
Дополнительную красоту на листах не наводил, можете дополнять код.

Hugo спасибо тебе дружище! Покапаюсь.
Единственное, если тебе не сложно, можешь подписать в макросе какая строчка за что отвечает. В любом случае спасибо тебе за помощь!

Hugo121

#10
На комментарии сейчас времени нет, там много строк...
Логика такая - сперва исходные данные беру в массив, затем циклом по массиву в словаре каждому устройству собираю коллекцию номеров его строк в массиве. И сразу добиваю датами пустые элементы массива.
Далее цикл по словарю - создаю лист, цикл по строкам устройства в источнике - генерю часы.
Немного мороки с этим пустыми ячейками дат - это переменная tmp отслеживает.
Ну и рамки, ширина, форматы ячеек...
Всё.

Dennis

Цитата: Hugo121 от 16.07.2024, 22:45На комментарии сейчас времени нет, там много строк...
Логика такая - сперва исходные данные беру в массив, затем циклом по массиву в словаре каждому устройству собираю коллекцию номеров его строк в массиве. И сразу добиваю датами пустые элементы массива.
Далее цикл по словарю - создаю лист, цикл по строкам устройства в источнике - генерю часы.
Немного мороки с этим пустыми ячейками дат - это переменная tmp отслеживает.
Ну и рамки, ширина, форматы ячеек...
Всё.

Hugo, можешь немного поправить, чтобы каждый раз не новый лист с устройством создавался, а информация добавлялась в существующий?! Один лист с устройством будет порядка полугода использоваться.

Hugo121

Это чуть сложнее, и немного переписывать нужно код - нужно ведь создать если нет листа, и дописать если есть, а далее будут вопросы что нужно дописать если неполная пара заполнилась и т.д....
Не сегодня.

Dennis

Цитата: Hugo121 от 17.07.2024, 12:25Это чуть сложнее, и немного переписывать нужно код - нужно ведь создать если нет листа, и дописать если есть, а далее будут вопросы что нужно дописать если неполная пара заполнилась и т.д....
Не сегодня.

Тогда не заморачивайся, ты и так помог спасибо! Посмотрю, может сам смогу доделать.