Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2014, 14:53   #1
Омега
Пользователь
 
Регистрация: 10.10.2012
Сообщений: 18
По умолчанию Создать таблицу - отчет.

Добрый день.
Требуется помощь специалистов.
Нужно создать таблицу (сводная она или нет сказать не могу) чтобы информация из всех листов (вкладок) собиралась в один лист, при этом пустые (не заполненные столбцы) не попадали в нее.
Пример во вложенном файле (с примечаниями и вопросами).

Дополнительно:
Прошу прощения (если таковое требуется) за новую тему, но поиск не рулит, когда сформулировать задачу тяжело. Долго ковырял сводные таблицы, подстановки, функции, но вразумительного от них я не добился (результат вообще 0). С Excel дружу хорошо, но попадая в темы форума, понимаю, что я вообще с ним не знаком (думаю у многих это происходит). Решать стандартным образом (которым решал множество задач) гиперссылками и функциями Если и т.д. не вариант (с ума сойду - это раз, да и некоторые рабочие файлы уже весят по 183 метра - это два). Сильно прошу не пинать.
Спасибо.
Вложения
Тип файла: rar Сводная таблица заказов мт14.rar (70.8 Кб, 27 просмотров)
Омега вне форума Ответить с цитированием
Старый 18.03.2014, 15:20   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Вот такая заготовка на доделку:
Код:
Sub tt()
    Dim i&
    ReDim a(1 To 4, 1 To 1)
    For i = 2 To Sheets.Count
        t = Sheets(i).[E36:K39].Value
        For ii = 1 To 7
            If t(1, ii) <> 0 Then
                a(1, UBound(a, 2)) = t(1, ii)
                a(2, UBound(a, 2)) = t(2, ii)
                a(3, UBound(a, 2)) = t(3, ii)
                a(4, UBound(a, 2)) = t(4, ii)
                ReDim Preserve a(1 To 4, 1 To UBound(a, 2) + 1)
            End If
        Next
    Next

    [b30].Resize(4, UBound(a, 2) - 1) = a
End Sub
Тут как раз к месту ReDim Preserve двумерного массива.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 18.03.2014, 15:33   #3
Омега
Пользователь
 
Регистрация: 10.10.2012
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Вот такая заготовка на доделку:
Код:
Sub tt()
...
Тут как раз к месту ReDim Preserve двумерного массива.
Вот тут-то, когда я писал про то, что посещая форум, частенько считаю себя неучем (можно смеяться), я и имел ввиду такого рода решения.
Честно спрошу: "Куда это пихать?".
Без обид, уж если кое-какие коды и понимаю, то тут просто швах!
Омега вне форума Ответить с цитированием
Старый 18.03.2014, 15:42   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Пихать стандартно в стандартный модуль - поищите где-то как делаются макросы
Тут для примера собранные данные по

Просроченные заказы (№)
Просроченные заказы (заказчик)
Просроченные заказы (стоимость)
Просроченные заказы (количество)

выводятся ниже таблицы, но можно их выгрузить не в [b30], а в [b6]
Ну и дорабатывайте, когда разберётесь в "механике" - или сразу собирать 3 аналогичных массива, или выполнять код 3 раза, меняя диапазоны.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 18.03.2014, 18:33   #5
Омега
Пользователь
 
Регистрация: 10.10.2012
Сообщений: 18
По умолчанию

О да задачка так задачка. Уже глаза болят (хотя руки что-то делают), но сложно это, ОООчень сложно. Что можно еще применить товарищи??

пысы: не лентяй ни в коем случае. Просто есть куча всяких задач, и залипать на познание непознанного просто нет времени, да и самостоятельно своими мозгами до этого не дотукать.
Омега вне форума Ответить с цитированием
Старый 18.03.2014, 18:51   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Вроде всё подсказал уже...
Код:
Sub vizov()
svod "E36:K39", "b30"
svod "E40:K43", "b34"
svod "E44:K47", "b38"
End Sub


Private Sub svod(r1 As String, r2 As String)
    Dim i&, ii&, t
    ReDim a(1 To 4, 1 To 1)
    For i = 2 To Sheets.Count
        t = Sheets(i).Range(r1).Value
        For ii = 1 To 7
            If t(1, ii) <> 0 Then
                a(1, UBound(a, 2)) = t(1, ii)
                a(2, UBound(a, 2)) = t(2, ii)
                a(3, UBound(a, 2)) = t(3, ii)
                a(4, UBound(a, 2)) = t(4, ii)
                ReDim Preserve a(1 To 4, 1 To UBound(a, 2) + 1)
            End If
        Next
    Next

    Sheets("общие данные").Range(r2).Resize(4, UBound(a, 2) - 1) = a
End Sub
Диапазоны/адреса выгрузки подправьте, когда проверите работу.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 18.03.2014, 21:03   #7
Омега
Пользователь
 
Регистрация: 10.10.2012
Сообщений: 18
По умолчанию

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

Примечание:
- страницы имеют название (иногда длинные) кириллицей
- страницы расположены не по порядку (хотя это не важно)
Могу попросить небольшие пометки для не образованных, типа
<вводим название страницы>
<диапазон ввода от столбца 1 до 14>
Ну и т.д.
Не сочтите за наглость, но в тех вопросах, в которых разбираюсь дам максимально развернутый ответ, ну а где «туплю» прошу доходчиво объяснить, дабы не приставать и мучить людей до беспамятства.
Омега вне форума Ответить с цитированием
Старый 19.03.2014, 10:51   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

"- определяя диапазон просмотра, механизм собирает не всю информацию (проверяя в ручную, получаю гораздо больше данных)." - Вы в файле написали:
"Причем Лист 1, 2 и т.д. содержит максимум возможных столбцов (т.е. последний задействованный столбец это "IJ1""
Т.к. в самом файле последний столбец с данными "K" (и непонятно, что за столбец "IJ1") , то я в коде прописал по максимуму возможных столбцов файла - "E36:K39". Если в рабочем файле нужно до "IJ", то измените на "E36:IJ39" и далее аналогично.
И ниже нужно скорректировать количество столбцов в цикле (ниже подробнее).

- определяя диапазон просмотра, механизм собирает не всю информацию (проверяя в ручную, получаю гораздо больше данных). - на примере собирает всё. Значит некорректный пример, или поменяйте диапазон в Sub vizov() как я написал выше.


<вводим название страницы> - не вводим, берём все подряд от второй и до "забора"
<диапазон ввода от столбца 1 до 14> - уже написал: svod "E36:IJ39" - и будет собирать от E до IJ.
и тогда в строке
For ii = 1 To 7
нужно задать цикл по количеству столбцов от E до IJ.
А ещё лучше так:
For ii = 1 To Range(r1).Columns.Count
Код:
Option Explicit

Sub vizov()
    svod "E36:IJ39", "b30"
    svod "E40:IJ43", "b34"
    svod "E44:IJ47", "b38"
End Sub


Private Sub svod(r1 As String, r2 As String)
    Dim i&, ii&, t
    
    ReDim a(1 To 4, 1 To 1)
    For i = 2 To Sheets.Count
        t = Sheets(i).Range(r1).Value
        For ii = 1 To Range(r1).Columns.Count
            If t(1, ii) <> 0 Then
                a(1, UBound(a, 2)) = t(1, ii)
                a(2, UBound(a, 2)) = t(2, ii)
                a(3, UBound(a, 2)) = t(3, ii)
                a(4, UBound(a, 2)) = t(4, ii)
                ReDim Preserve a(1 To 4, 1 To UBound(a, 2) + 1)
            End If
        Next
    Next

    Sheets("общие данные").Range(r2).Resize(4, UBound(a, 2) - 1) = a
End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 19.03.2014, 14:44   #9
Омега
Пользователь
 
Регистрация: 10.10.2012
Сообщений: 18
По умолчанию

Примного признателен, но к сожалению мой ум пока постиг только долю по макросам.

Код между
Sub vizov() и End Sub
целиком и полностью понятен (меняем диапазон и все).
Разве что…границы между выводимой информации нет (для читабельности), а когда пытаюсь изменить b34 на b35 или b38 на b40 - тогда строчку пропускает, а значения искажаются (разбиваются на две части). Тут у меня засада конечно.

Код.
For ii = 1 To 7 Тоже понятен. Формируем с 1 по 7 значит с каждой страницы берем от 1 до 7 (если 0 то пропускаем).
Код.
For ii = 1 To Range(r1).Columns.Count тут выводим все, что находим на страницах. Причем в этом варианте получается огромная портянка, которую вывести на печать не реально. Я так понимаю нужно, как-то (для меня это вообще не мыслимо) заставить формировать в формате А4, где заполнение идет привычным нам образом слева-направо →/сверху-вниз↓. 2 ли это листа или 3 уже не так важно.

Далее:
1) По вводу имени страницы: реально требуется эта задача, так как в книге много листов с разносторонней информацией, которую вообще нет смысла выводить. Хотя если нельзя разрешать, то может быть можно запрещать не читать определенные имена страниц.
Омега вне форума Ответить с цитированием
Старый 19.03.2014, 15:01   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

For ii = 1 To 7
заменено на
For ii = 1 To Range(r1).Columns.Count
т.к. так универсальнее (автоматически определяется количество столбцов в зависимости от заданного диапазона). Вообще эти две строки в частном случае взаимозаменяемы и делают одно дело - просмотр всех нужных столбцов.

По вводу имени страницы - да, если есть список нужных или ненужных листов, то их можно фильтровать.
Или перебирать только нужные, или перебирать все и анализировать нужные, или наоборот (неанализировать ненужные ).
Конкретный код зависит от конкретной задачи.

Да, с А4 - это отдельная задача, если вручную (или как придётся) печатать не годится, то думаю нужно смотреть вообще форму вывода данных.
В общем, конкретно разбираться с конкретным файлом кокнкрентно как Вам нужно.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 19.03.2014 в 15:13.
Hugo121 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Требуется создать отчет по 1с за $ KitoPoni Фриланс 0 30.05.2013 15:48
создать отчет из формы незнайка315 Microsoft Office Access 5 23.05.2011 23:09
Как создать отчет? пОЛЯрная Помощь студентам 1 26.11.2010 07:41
Свзяать три таблицы одно БД в один отчет/таблицу LA1001 Microsoft Office Access 1 11.11.2010 15:08