Страницы: 1
RSS
возможно ли решение при помощи словаря или обработки массива
 
Всем доброго дня!
Задача состоит в следующем :
1. Есть таблица (база данных) в которой расписание работы для 4 смен на весь год.
И есть пустая таблица (на другом листе) куда необходимо
вставить данные по двум признакам: МЕСЯЦ и № СМЕНЫ.
В прикрепленном файле это реализовано при помощи 2-х циклов.
А как решить задачу при помощи словаря или обработки массива?
2. Есть ли возможность вставлять также цвет ячейки для суммирования праздничных дней?

П.С.
Похожий вопрос я уже задавал, но наверное
не очень ясно обьяснил суть поэтому точного ответа на него я не получил
(но все равно спасибо Hugo)

Прикрепляю файл
Excel 2010
 
Можно что-то подобное делать и на словаре - но думаю что-то с задачей не правильно. Или условия, или решение...
На словаре схема может быть такая - сперва циклом по второму листу помещаем в словарь ключи месяц(дата)-смена, каждому ключу в item значение (или массив значений) из пересечения этих значений.
Далее циклом по первому листу получаем ключ, по нему из словаря извлекаем значения.
Если делать по тому алгоритму, что в коде - сперва получаем словарь с 8-ю ключами, у каждого какой-то массив значений.
Далее второй цикл не нужен - по месяц-смена берём из словаря собранный массив и выгружаем.
Только зачем там даты 1-31? И причём тогда выходные?
 
Даты 1-31 потому что макс. в месяц может быть 31 день (эта таблица просто шаблон).
Выходные потому что так работают работники в смене:
1 день с 8 по 20 (11,5 ч.)
2 день с 20 по 24 (4ч.)
3 день с 24 по 8 (7,5 ч) - продовжение смены с предыдущего дня
4 день выходной (в)
 
Всё равно не понятно - на месяц данных только на 4 дня (непоятно правда каких). Что писать далее?
А если часы расписаны конкретно по дням - почему такие непонятные даты:
30.05.2013
31.05.2013
31.05.2013
31.05.2013
02.06.2013
02.06.2013
05.06.2013
06.06.2013
Вообще зачем там даты - тогда хватило бы только месяца, день и год лишнее.
 
Hugo, все верно, но это только пример.
1. Вся таблица состоит из 356 (или сколько там) строк (по кол-ву дней в году)
2.  
Цитата
Вообще зачем там даты - тогда хватило бы только месяца, день и год лишнее.
Таблица используется и для других целей так что дата в таком виде там нужна

Hugo,  если можна выложите кусок кода как такое реализуется с помощью словаря (т.е.
мне не надо чтоб месяц вынимался из формата 31.05.2013), просто две переменные таюлица 3*3
и как работать со словарем?
И еще есть ли все таки возможность подтянуть цвет из таблицы бази данных (как дополнительный критерий
на предмет праздник/непраздник) ?
 
Если всего 365 строк - то и цикл в цикле должен отрабатывать шустро. Если сперва возьмёте данные в массив и будете перебирать их - то вообще незаметно.
Всё равно ведь сейчас Вы используете только значения, без форматов.
Ну а копировать и данные, и формат, т.е. ячейку целиком можно и в случае перебора массивов - нашли нужное значение - по его координатам взяли ячейку.

По словарю - можно в item словаря помещать массив, в котором значение и индекс цвета. Тогда можно красить не обращаясь больше к ячекам.
Ну или помещать адрес - тогда по адресу копируем сразу всё.
В любом случае если хотите красить, а цвет брать из ячейки - это будет значительно дольше, чем если копировать только данные из массива/словаря.

Как именно делать на словаре пока не определился, но с примером на словаре вообще пока всё непонятно - вот почему на одном листе даты повторяются, а на другом нет?
Почему например 31.05.2013 у всех смен по 3 разных значения?
Изменено: Hugo - 28.08.2013 16:20:46
 
Вопрос не в скорости срабатывания макроса (скорость существующего перебора 2-я циклами меня устраивает)
Вопрос как это реализовать через массивы или словарем (может так "покрасивше" будет)
Я знаю что Вы хорошо владеете работой со словарем, поэтому и прошу маленький пример (3*3 или 4*4 ячейки с перебором (или ключами не знаю как правильно) по x и y) для последующего разбора и пережовывания информации.
И касательно информации по выложеному примеру: ну это ж пример там просто набор цифр :) , мне просто важно понять логику как делать. Что б Вас не смущали случайные цифре выкладываю "натуру" без макросов и всего лишнего.
 
Ну вот так понятно.
А где выбор месяца и смены?
Сейчас попробую сделать на словаре на этом новом примере. Но не мнгновенно...
А алгоритм я выше уже написал.
 
Выбор месяца ячейка "G5", смены "AK4" просто здесь ничего еще не автоматизировано (типа проверки данных и т.д.). За выше изложеный пример спасибо, но без кода я ничего не зделаю потому как не знаю даже какие комманды используються при работе со словарем (особеннно что означают такие закарлючки в конце переменных #,&).
Поэтому жду Вашего решения (и если удастся по цвету что-то сделать тоже)
 
Закорючки - это типы.
Вообще смело - почти сразу на массивы-словари :)
 
Похоже что сегодня сделать не успеваю...
 
Hugo, если на моем файле-примере долго (в силу каких-то дополнительных нюансов)
можете сделать наброску на своем примере, там массив 3*3 или 4*4 ячейке (уже выглядит как попрошайничество наверное  :D ). Вообще-то мне не горит главное что б незабыли совсем.
 
Нет, я уж на Вашем завтра сделаю.
Ну а на моём или другом - полно на форуме примеров, поищите по CreateObject("Scripting.Dictionary")
 
Успел :)
Код
Sub test1()
    Dim i As Long, m&
    Dim a(), d$, r As Range, rr As Range, yr&, x&
    Dim t$, sm$

    Select Case Sheets("ФормаПриЗв").Range("G5").Value
    Case "січень": m = 1
    Case "лютий": m = 2
    Case "березень": m = 3
    Case "квітень": m = 4
    Case "травень": m = 5
    Case "червень": m = 6
    Case "липень": m = 7
    Case "серпень": m = 8
    Case "вересень": m = 9
    Case "жовтень": m = 10
    Case "листопад": m = 11
    Case "грудень": m = 12
    End Select

    Set r = Sheets("БДЗалізнЦех").Range("I2:N368")
    a = r.Value
    yr = Year(a(2, 1))

    With CreateObject("Scripting.Dictionary")
        .comparemode = 1
        For i = 2 To UBound(a)
            d = Format(a(i, 1), "yyyy.mm.dd")
            For x = 2 To 5: .Item(d & "|" & a(1, x)) = r(i, x).Address: Next
            .Item(d & "|" & Left(a(1, 6), 1)) = r(i, 6).Address
        Next

        sm = Sheets("ФормаПриЗв").Range("AK4").Value
        For Each rr In Sheets("ФормаПриЗв").Range("G6:AK6")
            t = .Item(yr & "." & Format(m, "00") & "." & Format(rr.Value, "00") & "|" & sm)
            rr.Offset(1).Value = Sheets("БДЗалізнЦех").Range(t).Value
            rr.Offset(1).Interior.Color = Sheets("БДЗалізнЦех").Range(t).Interior.Color
        Next

    End With

End Sub

Код для последнего примера.
Кстати, можно выполнять по событию смены месяца или смены.
С месяцами вероятно можно сделать пооптимальнее, но не суть.
 
Большое спасибо! Сейчас буду смотреть.
Кстати тоже думал подцепить на изменение ячейки с месяцем и/или сменой.
 
Ой, Hugo, код ругается на месяц в котором меньше 31 дня  :(
 
Понятно - нет такого ключа. Нужно сперва проверить наличие...
Но можно проще - дополняем двумя строками, проверяем что есть адрес:

Код
            If Len(t) Then
            rr.Offset(1).Value = Sheets("БДЗалізнЦех").Range(t).Value
            rr.Offset(1).Interior.Color = Sheets("БДЗалізнЦех").Range(t).Interior.Color
            End If


Вообще по уму было бы не допускать в феврале 31 день :)
Изменено: Hugo - 29.08.2013 09:53:41
Страницы: 1
Читают тему
Наверх