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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2014, 12:14   #1
Aqil_f
Форумчанин
 
Регистрация: 12.05.2009
Сообщений: 273
По умолчанию Отчеты (курьерская служба)

Здравствуйте.
Есть XLS файл ( лист "POCT" ), используется как база. Из этого база надо получить отчеты, как показано в лист "REPORT".
Но, дело в том что, надо получить за день (столбец А (DATA1)) все отчеты сразу. Т,е, если выбрано 17-го число (17.01.2014), надо получить отчеты за все 3 записи 17-го число.
А за день может быть больше 300 записей. Как можно решать такую задачу с помощи макроса?
Можно конечно делать с помощи сводного отчета, но в этом случае вид не очень похоже на мои.
Помогите пожалуйста, как можно делать такое?
Вложения
Тип файла: rar kuryer.rar (9.0 Кб, 10 просмотров)
Aqil_f вне форума Ответить с цитированием
Старый 22.01.2014, 12:31   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Цель этого действа?
Если на печать по одному репорту на лист - тянуть данные В ОДИН ОТЧЁТ с второго листа по номеру накладной, а этот номер подставлять макросом при цикле по данным второго листа (проверяя дату).
Подставили, формулы подтянули данные, распечатали, подставили следующий номер.
Если где-то зажевало - можно вручную вписать номер и вручную распечатать (что будет затруднительно, если все данные подставлять макросом, что в общем тоже не сложно).

Если печатать например по 4 репорта на лист - можно в цикле вытягивать 4 номера и печатать.
Если нужно сразу сгенерить столбцом 300 репортов - тоже можно (разными способами), но зачем?
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 22.01.2014, 12:47   #3
Aqil_f
Форумчанин
 
Регистрация: 12.05.2009
Сообщений: 273
По умолчанию

Если на печать по одному репорту на лист - это можно сказать, уже есть.
Но, мне надо именно по дате, за день все отчеты сразу ( на 1 лист может поместится 4 или 6 репорт).
Это -для экономие бумагу и времени (чтобы за 1 клик все репорты за день)
Aqil_f вне форума Ответить с цитированием
Старый 22.01.2014, 12:55   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Так все сразу или по 4/6?
Если сразу все - скорее всего замучаетесь разбивать на страницы, если задумаете печатать.
Если печатать не нужно - так и говорите.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 22.01.2014, 13:02   #5
Aqil_f
Форумчанин
 
Регистрация: 12.05.2009
Сообщений: 273
По умолчанию

За 1 день все сразу, только по 4/6 репорта на одном листе?
Т,е, если за 1 день 15 записей есть, тогда получается 2 листа по 6 репорта (2*6=12)
и еще 1 лист -3 репорта.
Печатать нужно .
Aqil_f вне форума Ответить с цитированием
Старый 22.01.2014, 14:19   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Хорошо.
6 или всёж 4?
Как расположены на листе?
В каком порядке хотите заполнять?

Если настаиваете что нужно на один лист вывести все 300 - может и сделаю, но делить на страницы не буду (это дополнительная опция за отдельные деньги )

Думаю что сразу все выводить на один лист не нужно.

Ещё что - я думаю не страшно распечатать последнюю страницу с например двумя заполненными формочками и четырмя пустыми рамками?

Возится с этими рамками - это тоже дополнительная опция


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

Задача не сложная, но чтоб сделать оптимально/красиво - нужно подумать.
Через кучу if-then не интересно...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 22.01.2014, 15:16   #7
Aqil_f
Форумчанин
 
Регистрация: 12.05.2009
Сообщений: 273
По умолчанию

Спасибо, Hugo121.

В одном листе 8 будет. (Я сейчас проверяла 8 репорт помешается на 1 лист)
На листе расположены как в файле.

Не надо на один лист вывести все 300, на 1 лист 8 будет

Я тоже думаю что не страшно распечатать последнюю страницу так как Вы говорите.



__________________
Вложения
Тип файла: rar kuryer.rar (7.6 Кб, 10 просмотров)
Aqil_f вне форума Ответить с цитированием
Старый 22.01.2014, 15:24   #8
Volodshan
Форумчанин
 
Регистрация: 20.05.2008
Сообщений: 241
По умолчанию

Вам здесь - планета - предложили вариант слияния в Ворд, вы же сказали, что печатать НЕ НАДО. Кому и где верить?!
Volodshan вне форума Ответить с цитированием
Старый 22.01.2014, 15:30   #9
Aqil_f
Форумчанин
 
Регистрация: 12.05.2009
Сообщений: 273
По умолчанию

Volodshan, я не сказала что печатать НЕ НАДО.
Да, предложили мне вариант слияния в Ворд, но я не смогла этого делать.
Aqil_f вне форума Ответить с цитированием
Старый 22.01.2014, 18:42   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

1. Очистите лист репортов от всех данных в этих формах, кроме заголовков полей.
2. Нижнюю формочку подвиньте выше, чтоб была как все
3. На листе "Poct" поставьте курсор на ячейку с нужной датой, выполните код (можно сделать кнопку, или по Alt+F8, или меню ячейки можно сообразить, не важно как):


Код:
Option Explicit
Option Base 1

Sub NaPecatj()
    Dim a(), b(), trep(), i&, ii&, tdata As Date, cnt As Long, ans&
    Dim adresR, adresC, komuR, komuC, kuryerR, kuryerC, dataR, dataC, nomerR, nomerC

    On Error GoTo gotoout

    tdata = Selection(1).Value
    cnt = Application.CountIf(Sheets("Poct").[a1].CurrentRegion.Columns(1), Selection(1))

    ans = MsgBox("Отобрано " & cnt & " записей." & vbLf & "Печатать?", vbExclamation + vbYesNo)

    If ans <> vbNo Then
        trep = Sheets("Report").[a2:k40].Value
        
        adresR = Array(2, 2, 12, 12, 22, 22, 32, 32)
        adresC = Array(1, 7, 1, 7, 1, 7, 1, 7)
        komuR = Array(2, 2, 12, 12, 22, 22, 32, 32)
        komuC = Array(4, 10, 4, 10, 4, 10, 4, 10)
        kuryerR = Array(6, 6, 16, 16, 26, 26, 36, 36)
        kuryerC = Array(1, 7, 1, 7, 1, 7, 1, 7)
        dataR = Array(6, 6, 16, 16, 26, 26, 36, 36)
        dataC = Array(4, 10, 4, 10, 4, 10, 4, 10)
        nomerR = Array(7, 7, 17, 17, 27, 27, 37, 37)
        nomerC = Array(4, 10, 4, 10, 4, 10, 4, 10)

        a = Sheets("Poct").[a1].CurrentRegion.Value
        b = trep: ii = 0
        For i = 2 To UBound(a)

            If a(i, 1) = tdata Then
                ii = ii + 1:
                b(adresR(ii), adresC(ii)) = a(i, 4)
                b(komuR(ii), komuC(ii)) = a(i, 3)
                b(kuryerR(ii), kuryerC(ii)) = a(i, 7)
                b(dataR(ii), dataC(ii)) = a(i, 1)
                b(nomerR(ii), nomerC(ii)) = a(i, 8)

                If ii = 8 Then
                    With Sheets("Report")
                        .[a2].Resize(38, 10) = b
                        .PrintOut
                    End With
                    b = trep: ii = 0
                End If
            End If
        Next

        If ii < 8 Then
            With Sheets("Report")
                .[a2].Resize(38, 10) = b
                .PrintOut
            End With
        End If

        Sheets("Report").[a2].Resize(38, 10) = trep
    End If
    
gotoout:
End Sub
Вроде должно быть понятно - адреса полей в массиве, можно в принципе их менять как угодно.

Option Base 1 обязательно! Или меняйте код.
webmoney: E265281470651 Z422237915069 R418926282008

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отчеты MINDKILLER БД в Delphi 0 09.05.2012 17:33
ОТЧЕТЫ ИЗ 1С Андрей_Ш Microsoft Office Excel 2 12.12.2011 13:23
Отчеты Крокодил Помощь студентам 5 21.05.2009 11:12
Отчеты wolf950 Помощь студентам 3 28.02.2009 12:03
Отчеты? Ash БД в Delphi 1 09.12.2008 08:55