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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2011, 10:10   #1
OMEN_6666
Пользователь
 
Аватар для OMEN_6666
 
Регистрация: 26.10.2010
Сообщений: 34
Вопрос Проверка "вместимости" строк на лист при печати

Здравствуйте, форумчане.

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

Как в VBA можно получить данные, после какой строки остальные на печатный лист на поместятся и нужно вставлять итоговую и разрыв со следующей страницей?

Пока приходит в голову только мысль о подсчете суммарной высоты строк таблице и сравнении этого значения с "высотой" листа.
OMEN_6666 вне форума Ответить с цитированием
Старый 23.11.2011, 10:18   #2
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Смотрите в сторону коллекции Sheet.HPageBreaks.
Например, sheets("Лист1").HPageBreaks(1).Loca tion - диапазон (ячейка), НАД которой находится первый разрыв страницы.
sheets("Лист1").HPageBreaks(1).Loca tion.Address - адрес этой ячейки.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 23.11.2011, 11:18   #3
OMEN_6666
Пользователь
 
Аватар для OMEN_6666
 
Регистрация: 26.10.2010
Сообщений: 34
По умолчанию

Казанский, спасибо за помощь, что-то пока не получается, правда я в синтаксисе VBA не особо силен. Если не сложно, посмотрите, пожалуйста, где ошибка.
Вложения
Тип файла: rar Поиск разрывов.rar (13.6 Кб, 15 просмотров)
OMEN_6666 вне форума Ответить с цитированием
Старый 23.11.2011, 11:20   #4
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Цитата:
Сообщение от OMEN_6666 Посмотреть сообщение
Пока приходит в голову только мысль о подсчете суммарной высоты строк таблице и сравнении этого значения с "высотой" листа.
Эт мысль тоже правильная, но проще, как сказал, господин Казанский:
Код:
Sub io()
MsgBox ActiveSheet.HPageBreaks.Count + 1 ' кол-во листов на листе : )
End Sub
Тишина – самый громкий звук
nerv вне форума Ответить с цитированием
Старый 23.11.2011, 11:35   #5
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Цитата:
Сообщение от OMEN_6666 Посмотреть сообщение
Как в VBA можно получить данные, после какой строки остальные на печатный лист на поместятся
см. в окне Immediate
Код:
Sub io()
Dim x As Object
With ActiveWindow
    .View = xlPageBreakPreview
    For Each x In Sheets(1).HPageBreaks
        Debug.Print x.Location(0).Address
    Next
    .View = xlNormalView
End With
End Sub
Тишина – самый громкий звук

Последний раз редактировалось nerv; 23.11.2011 в 11:41.
nerv вне форума Ответить с цитированием
Старый 23.11.2011, 12:09   #6
OMEN_6666
Пользователь
 
Аватар для OMEN_6666
 
Регистрация: 26.10.2010
Сообщений: 34
По умолчанию

nerv, спасибо - полезное дополнение, но мне все-таки нужно, чтобы находилась именно последняя строка на каждом печатном листе, чтобы вместо нее вставлять строку с итогами, а ее (найденную строку) переносить на следующий лист.
Мне б только условие в операторе выбора правильно прописать, а то при компиляции ошибка выдается...
OMEN_6666 вне форума Ответить с цитированием
Старый 23.11.2011, 12:34   #7
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Цитата:
Сообщение от OMEN_6666 Посмотреть сообщение
последняя строка на каждом печатном листе, чтобы вместо нее вставлять строку с итогами, а ее (найденную строку) переносить на следующий лист.
Откуда мне знать, где у Вас строка с итогами? Из приложенного файла это не понятно. К тому же не ясно, какой именно строкой с итогами надо заменить: общей итоговой или итоговой по листу.

Утрированно: замените строку
Код:
Debug.Print x.Location(0).Address
на
Код:
x.Location(0).Value = "Results"
Тишина – самый громкий звук
nerv вне форума Ответить с цитированием
Старый 23.11.2011, 12:54   #8
OMEN_6666
Пользователь
 
Аватар для OMEN_6666
 
Регистрация: 26.10.2010
Сообщений: 34
По умолчанию

nerv, большое спасибо.
OMEN_6666 вне форума Ответить с цитированием
Старый 24.11.2011, 10:53   #9
OMEN_6666
Пользователь
 
Аватар для OMEN_6666
 
Регистрация: 26.10.2010
Сообщений: 34
По умолчанию

И все же помогите, пожалуйста, найти ошибку в коде. В приложенном ранее файле я пробовал на отвлеченном примере реализовать метод, предложенный господином Казанским. Суть заключалась в том, чтобы проверить, является ли проверяемая строка строкой, над которой находится разрыв со следующей страницей, потому что в алгоритме моей основной задачи (в моем вИдении) добавление строк осуществляется последовательно следующим образом:

1. В акт добавляется строка с данными.
2. Производится проверка, будет ли над этой строкой разрыв.
3а. Если разрыв будет, то перед предыдущей строкой вставляется строка с итогами и происходит переход к пункту 1.
3б. Если разрыва нет, то происходит переход к пункту 1.

Но в своем примере, я, видимо, неправильно прописал условие выбора:
Код:
Sub РазбивкаНаЛисты()
Dim i, j As Integer
j = 1
For i = 2 To 29
If Sheets("Лист1").HPageBreaks(j).Location.Address = Sheets("Лист1").Columns(1).Rows(i) Then
Sheets("Лист1").Columns(2).Rows(i) = "разрыв"
j = j + 1
End If
Next i
End Sub
OMEN_6666 вне форума Ответить с цитированием
Старый 24.11.2011, 12:31   #10
OMEN_6666
Пользователь
 
Аватар для OMEN_6666
 
Регистрация: 26.10.2010
Сообщений: 34
По умолчанию

Блгодаря, Вашим общим усилиям, разобрался:

Код:
Sub РазбивкаНаЛисты()
Dim i, j As Integer
j = 1
For i = 2 To 400
If j > Sheets("Лист1").HPageBreaks.Count Then
j = j - 1
End If
If Sheets("Лист1").HPageBreaks(j).Location(0).Address = Sheets("Лист1").Columns(1).Rows(i).Address Then
Sheets("Лист1").Columns(2).Rows(i) = "разрыв"
j = j + 1
End If
Next i
End Sub
СПАСИБО!!!
OMEN_6666 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Считывание строк из файла. перемещение по строкам "веред"-"назад" Larkin. Помощь студентам 2 15.06.2009 17:58
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder AleksP C++ Builder 7 11.04.2009 13:06
настроить при открытии Excel 2003 в окошке "Тип файлов" вывод пункта "Все файлы (*.*)" по умолчанию? Unior Microsoft Office Excel 2 01.03.2009 02:42