Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Форматирование вида отчета / 17 сообщений из 17, страница 1 из 1
26.09.2014, 01:02
    #38758273
endurance
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вида отчета
Приветствую!

Мне необходима помощь в решении задачки, а точнее понять концепцию, как решать такие типовые вещи.
Периодически возникает ситуация: есть два столбца, первый столбец - коды товаров (могут повторяться), второй столбец - коды элементов (не могут повторяться), фактически их комбинация формирует составной ключ из двух полей. Чтобы привести отчет к необходимому виду, мне приходится сравнивать коды товаров, запоминать последний товар, потом сравнивать его с товаром + 1, если товар не равен другому, то делаем одно, если равен, то делаем другое. Приходится заводить много промежуточных переменных, отсчитывать строки и ловить блох. Никак не могу понять правильно ли я делаю.

На данный момент ситуация такая:
1. Есть Excel файл (во вложении).
2. На Листе1 представлен первоначальный вид (1 столбец - код товара, 2 столбец - описание, 3 - какие-то атрибуты товара)
3. На Листе2 представлен конечный вид, как бы я хотел видеть отчет.
4. Сделал так: в коллекцию считал уникальные коды товаров, в массив считал весь диапазон данных. Беру один элемент из коллекции и начинаю его искать в массиве, как только нашел, печатаю, определяю последнюю заполненную строку и продолжаю цикл дальше. Но возникла проблема, при таком подходе не могу выводить пару код товара - описание товара.

Всегда при таком роде задач возникают у меня трудности, где необходимо сравнивать два стоящих рядом элемента.

Excel файл во вложении. Если будет необходимо, приложу файл с моим неполным решением.
...
Рейтинг: 0 / 0
26.09.2014, 01:03
    #38758275
endurance
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вида отчета
Сам файл
...
Рейтинг: 0 / 0
26.09.2014, 01:36
    #38758284
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вида отчета
Я не увидел у вас в примере, где находятсяendurance...второй столбец - коды элементов (не могут повторяться)...
А так - чем вам не угодили сводные?
...
Рейтинг: 0 / 0
26.09.2014, 09:33
    #38758417
endurance
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вида отчета
AndreTMЯ не увидел у вас в примере, где находятсяendurance...второй столбец - коды элементов (не могут повторяться)...
А так - чем вам не угодили сводные?

В моем примере, коды элементов - это третий столбец.

Сводная таблица не подходит, поскольку мне нужно обрабатывать это кодом VBA, после выгрузки в Excel. На обновление данных макрос автоматически срабатывает.
...
Рейтинг: 0 / 0
26.09.2014, 09:48
    #38758441
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вида отчета
То есть вам надо сделать "это" самописным алгоритмом, и никак иначе?

А то, что сводную можно удалить/добавить кодом, а потом использовать её данные в отчёте - это ничего? И вообще, есть ещё =ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ() А то, что "это" можно проделать, например, запросами, через ADO... или, может, сразу выгрузить так, как надо?

Ну или более подробно опишите, что именно у вас вызывает трудности реализации. Или пример рисуйте с бОльшим количеством разнообразных (и реальных, чего уж там) данных. А то вот по примеру вашему как раз непонятно, что вызывает затруднения :)
И да, как вы получаете исходные данные? что за "выгрузка"?
...
Рейтинг: 0 / 0
26.09.2014, 10:39
    #38758521
alex77755
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вида отчета
И самописным возникнут проблемы в таком предсталении данных и результатов
0004300000864 Кольцо с сапфиром+бриллиант 16.0 7
0004300005364 Кольцо с сапфиром+бриллиант 16.0 8
коды разные, а втаблице на странице 2 они в одной группе
0004300005364 такого кода нет вообще с том
авторкак бы я хотел видеть отчет
Чёрная бухгалтерия?
авторпри таком подходе не могу выводить пару код товара - описание товара
А что в Item словаря? не описание разве?
авторгде необходимо сравнивать два стоящих рядом элемента
То есть пару код-описание?
Коды могут повторяться?
Тогда в ключ словаря код & "|" & описание
...
Рейтинг: 0 / 0
26.09.2014, 11:11
    #38758573
alex77755
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вида отчета
Если по кодам. Макрос
...
Рейтинг: 0 / 0
26.09.2014, 11:42
    #38758628
endurance
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вида отчета
alex77755,
авторИ самописным возникнут проблемы в таком предсталении данных и результатов
0004300000864 Кольцо с сапфиром+бриллиант 16.0 7
0004300005364 Кольцо с сапфиром+бриллиант 16.0 8
коды разные, а втаблице на странице 2 они в одной группе
0004300005364 такого кода нет вообще с том
Мой косяк, опечатался при составлении тестового файла. (Во вложении поправил)

авторавторкак бы я хотел видеть отчет
Чёрная бухгалтерия?
Есть определенный стандарт для отчетности, при составлении запроса к ХД иногда не получается достичь желаемого вида отчета, поэтому приходится обрабатывать макросами.
авторавторпри таком подходе не могу выводить пару код товара - описание товара

А что в Item словаря? не описание разве?
В Item словаря у меня уникальные коды товаров. Хотелось бы добавить еще туда описание соответствующих кодов товаров. Потому что потом коды товаров идут в один столбец, соответствующее описание идет в соседний столбец. Но словарь это не массив, я же не смогу записать туда код и его описание, а потом по отдельности вытащить сначала код, а потом описание.

Поэтому сделал так: сколлектил уникальные коды товаров в словарь, сформировал второй массив, в котором собрал пару код товара - описание. И далее начинаю сравнивать значения в массиве "код товара - описание" с исходным массивом, в котором у меня хранится весь диапазон данных.

В итоге у меня получилось: один цикл собирает значения в словарь, следующие два ищут совпадение для формирования массива "код товара-описание", следующие два сопоставляют конечный результат включая атрибуты. Возможно ли пройти все это за один цикл? Просто считать данные в массив и сравнивая два рядом стоящих элемента как-то выводить результат?
...
Рейтинг: 0 / 0
26.09.2014, 12:21
    #38758680
endurance
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вида отчета
alex77755, сейчас иду по шагам ваш макрос, у меня возникли вопросы, можете, пожалуйста, объяснить что происходит в строчках:

For R = 1 To UBound(RD)
SL(RD(R, 1)) = RD(R, 2) ' не очень понимаю вот эту конструкцию
Next

и

.Cells(R, 1) = " ' " & (E) ' и тут не понимаю
.Cells(R, 2) = SL(E)

Как так получается, что в первом случае у нас код материала отображается, а во втором случае - описание??? Ведь в словаре хранится только код товара?
Или где можно почитать об этом, знаю только о методах Exists, Add, Count и т.д. с помощью них только все делал.
...
Рейтинг: 0 / 0
26.09.2014, 12:34
    #38758710
alex77755
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вида отчета
SL(RD(R, 1)) = RD(R, 2) назначение ключу словаря RD(R, 1) (из массива первая колонка) значения Item = RD(R, 2) (из массива вторая колонка с описанием)
For Each E In SL.Keys перебираем все ключи словаря
.Cells(R, 1) = " ' " & (E) назначаем в первую колонку значение кода равное значению ключу (я считал, что код в первой колонке )
.Cells(R, 2) = SL(E) назначаем описание из Item словаря
.Cells(R, 2) = тут уже из массива вытаскиваем значение третьей колонки
...
Рейтинг: 0 / 0
26.09.2014, 12:35
    #38758716
alex77755
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вида отчета
почитать с примерами словарь-коллекция
...
Рейтинг: 0 / 0
26.09.2014, 12:43
    #38758738
alex77755
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вида отчета
SL(RD(R, 1)) = RD(R, 2)
в классическом варианте записывается так

SL.Item(RD(R, 1)) = RD(R, 2) так назначается. если ключа такого не было RD(R, 1),
то он создастся и ему присвоится значение = RD(R, 2)

или как в примере это было бы

SL.Add RD(R, 1), RD(R, 2)
но тогда если такой ключ уже имеется, то будет ошибка, которую надо перехватывать

If Not SL.Exists(RD(R, 1)) Then SL.Add RD(R, 1), RD(R, 2)

Мне нравится первы вариант. Ну перезапишется лишний раз...
...
Рейтинг: 0 / 0
26.09.2014, 12:46
    #38758745
endurance
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вида отчета
alex77755, спасибо, как всегда выручили! Совсем забыл про Item, там же и могу хранить описание.
За файл отдельное спасибо!
...
Рейтинг: 0 / 0
26.09.2014, 12:46
    #38758747
alex77755
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вида отчета
авторВедь в словаре хранится только код товара
В словаре хранятся пары ключ-значение.
Ключ уникален
...
Рейтинг: 0 / 0
26.09.2014, 12:53
    #38758762
endurance
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вида отчета
alex77755, спасибо, как всегда выручили! Совсем забыл про Item, там же и могу хранить описание.
За файл отдельное спасибо!
...
Рейтинг: 0 / 0
26.09.2014, 12:59
    #38758773
endurance
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вида отчета
авторавтор
Ведь в словаре хранится только код товара

В словаре хранятся пары ключ-значение.
Ключ уникален

Точно! Тогда мой вариант урезается по одному циклу. Еще раз спасибо!
...
Рейтинг: 0 / 0
26.09.2014, 17:44
    #38759234
endurance
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование вида отчета
AndreTMТо есть вам надо сделать "это" самописным алгоритмом, и никак иначе?

А то, что сводную можно удалить/добавить кодом, а потом использовать её данные в отчёте - это ничего? И вообще, есть ещё =ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ() А то, что "это" можно проделать, например, запросами, через ADO... или, может, сразу выгрузить так, как надо?

Ну или более подробно опишите, что именно у вас вызывает трудности реализации. Или пример рисуйте с бОльшим количеством разнообразных (и реальных, чего уж там) данных. А то вот по примеру вашему как раз непонятно, что вызывает затруднения :)
И да, как вы получаете исходные данные? что за "выгрузка"?

Да, сделать необходимо было только макросом.
Вид сводной таблицы не подходит по стандарту внешних видов отчетности.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Форматирование вида отчета / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]