CftClub.ru
Клуб специалистов ЦФТ-Банк

Узнать номер страницы Excel
На страницу 1, 2  След.
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
omela
Участник со стажем


Вступление в Клуб: 01.07.2008
СообщениеВт Ноя 16, 2010 21:29   Узнать номер страницы Excel Ответить с цитатой
Полезность: Нет оценки
Реально ли узнать номер страницы Excel, на которой находимся в момент вывода информации?
Например: выводим построчно текст (с произвольной высотой строки) и надо узнать когда произошел переход на другую страницу.

Вопрос уже практически превратился в соц.опрос, а не в вопрос-ответ Smile
Кол-во страниц в документе посчитать смогло много народу. А узнать номер текущей страницы в момент вывода- пока еще никто не поделился ответом.

п.с. Чуть не забыла добавить: все происходит в пределах одного рабочего листа (назовем его Лист1) обычной книги Excel.
Текст выводится стандартно построчно: excel.write(row, 1, 'текст');
_________________
Трехглазый передает привет банкирам, и желает им долгого здравия (:.
kit83rd
Участник со стажем


Вступление в Клуб: 05.02.2010
СообщениеСр Ноя 17, 2010 02:38    Ответить с цитатой
Полезность: 1
Да, можно эту проблему решить.

у листа есть коллекция горизонтальных разделителей HPageBreaks (/*разрыв страницы*/)
у каждого разделителя есть свойство .Location.Row, которое содержит номер строки, перед которой этот разделитель вставлен.

Можеш почитать http://www.cyberforum.ru/vba/thread143607.html
там даже готовые функции есть.
omela
Участник со стажем


Вступление в Клуб: 01.07.2008
СообщениеСр Ноя 17, 2010 10:48    Ответить с цитатой
Полезность: Нет оценки
kit83rd пишет:
Да, можно эту проблему решить.

у листа есть коллекция горизонтальных разделителей HPageBreaks (/*разрыв страницы*/)
у каждого разделителя есть свойство .Location.Row, которое содержит номер строки, перед которой этот разделитель вставлен.

Можеш почитать http://www.cyberforum.ru/vba/thread143607.html
там даже готовые функции есть.


Что-то не получилось...
Запихнула этот скриптик в excel.cmd:
Код:

excel.cmd('For I = 1 To ActiveSheet.HPageBreaks.Count
If ActiveCell.Row < ActiveSheet.HPageBreaks(I).Location.Row - 1 Then Exit For   
Next
MsgBox "Текущая строка на " & CStr(I) & "-й странице" ');

Запустила формировалку. Выдает MsgBox:
Текущая строка на -й странице

Жму Ок на сообщение до тех пор пока видимо вывод не доходит до перехода на следующую страницу, тогда вываливается сообщение "Требуется объект ActiveSheet Ошибка выполнения Microsoft VBScript"
_________________
Трехглазый передает привет банкирам, и желает им долгого здравия (:.
kit83rd
Участник со стажем


Вступление в Клуб: 05.02.2010
СообщениеСр Ноя 17, 2010 11:01    Ответить с цитатой
Полезность: Нет оценки
omela пишет:

Жму Ок на сообщение до тех пор пока видимо вывод не доходит до перехода на следующую страницу, тогда вываливается сообщение "Требуется объект ActiveSheet Ошибка выполнения Microsoft VBScript"


Нужно так

Код:
 Sheet.HPageBreaks
omela
Участник со стажем


Вступление в Клуб: 01.07.2008
СообщениеСр Ноя 17, 2010 11:33    Ответить с цитатой
Полезность: Нет оценки
kit83rd пишет:
omela пишет:

Жму Ок на сообщение до тех пор пока видимо вывод не доходит до перехода на следующую страницу, тогда вываливается сообщение "Требуется объект ActiveSheet Ошибка выполнения Microsoft VBScript"


Нужно так

Код:
 Sheet.HPageBreaks

Ага, убрала начало выдавать: Текущая строка на 1-й странице , потом опять доходит до переходного момента и ругачка на ActiveCell %)

Забила пока на определение активной ячейки (ибо не знаю какой метод в данном случае поддерживает ЦФТ), подставила вместо ActiveCell.Row свое значение row (оно ведь по сути у меня = номеру строки активной ячейки в момент вывода), вижу в MsgBox, что все считает. Теперь интересно как в excel.cmd можно присвоить какой-то переменной это значение I, чтобы потом эту переменную анализировать в коде отдельно от excel.cmd?
_________________
Трехглазый передает привет банкирам, и желает им долгого здравия (:.
r00st
Эксперт


Вступление в Клуб: 14.09.2007
СообщениеСр Ноя 17, 2010 13:16    Ответить с цитатой
Полезность: Нет оценки
Цитата:
Теперь интересно как в excel.cmd можно присвоить какой-то переменной это значение I, чтобы потом эту переменную анализировать в коде отдельно от excel.cmd?

Не совсем понятна суть. Если нужно значение переменной использовать далее в клиент-скрипте, тут все просто:
Код:
excel.cmd ('CurrentPage = I');
... скрипт ...
excel.cmd ('msgbox CurrentPage');

Если в валидаторе - надо заполнять переменную на форме и обрабатывать событие.
omela
Участник со стажем


Вступление в Клуб: 01.07.2008
СообщениеСр Ноя 17, 2010 13:38    Ответить с цитатой
Полезность: Нет оценки
r00st пишет:
Цитата:
Теперь интересно как в excel.cmd можно присвоить какой-то переменной это значение I, чтобы потом эту переменную анализировать в коде отдельно от excel.cmd?

Не совсем понятна суть. Если нужно значение переменной использовать далее в клиент-скрипте, тут все просто:
Код:
excel.cmd ('CurrentPage = I');
... скрипт ...
excel.cmd ('msgbox CurrentPage');

Если в валидаторе - надо заполнять переменную на форме и обрабатывать событие.


Сейчас попытаюсь объяснить. Есть некий вывод в excel. Допустим вот такой:

Код:


procedure DRAW_REPORTS is
row             number  :=1;
CurrentPage     integer :=1;
OldCurrentPage  integer :=1;

begin

for doc in ::[ MAIN_DOCUM]
where doc.[DATE_PROV]>=V_DATE and doc.[DATE_PROV]<V_DATE+1
loop
    if CurrentPage!= OldCurrentPage then
       debug_pipe(‘Перешли на другую страницу…’,0);
    end if;
    -- печатаем реквизиты платежного документа
    excel.write (row, 1, doc.DOCUMENT_NUM]);
    excel.write (row, 2, doc.[SUM_NT];
    -- смотрим на какой странице мы находимся
    excel.cmd('For I = 1 To Sheet.HPageBreaks.Count
    If '||row||' < Sheet.HPageBreaks(I).Location.Row Then Exit For   
    Next');   
    OldCurrentPage:= CurrentPage;
    row:=row+1;
end loop;
end;

Так вот вопрос: "Где и как?" CurrentPage присвоить значение I, чтобы я могла воспользоваться для себя этой переменной прямо в Локальных описаниях.
Надеюсь вопрос понятен Sad Возможно то, что я спрашиваю - извращение, но это скорее "нужда заставила".
_________________
Трехглазый передает привет банкирам, и желает им долгого здравия (:.
r00st
Эксперт


Вступление в Клуб: 14.09.2007
СообщениеСр Ноя 17, 2010 20:15    Ответить с цитатой
Полезность: Нет оценки
Скрипт выполнится после того, как курсор полностью отработает, поэтому внутри курсора - никак.
kit83rd
Участник со стажем


Вступление в Клуб: 05.02.2010
СообщениеЧт Ноя 18, 2010 02:24    Ответить с цитатой
Полезность: Нет оценки
Как вариант можно в формируемом скрипте завести переменную которой будешь присваивать найденный номер страницы.

А потом опять же через cmd формировать скрипт в котором будешь обращаться к этой переменной.
omela
Участник со стажем


Вступление в Клуб: 01.07.2008
СообщениеЧт Ноя 18, 2010 23:03    Ответить с цитатой
Полезность: Нет оценки
kit83rd пишет:
Как вариант можно в формируемом скрипте завести переменную которой будешь присваивать найденный номер страницы.

А потом опять же через cmd формировать скрипт в котором будешь обращаться к этой переменной.


А можно примерчик какой-нибудь? Честно говоря не очень поняла чем мне это поможет.
Можно и по-другому пути пойти. Могу я из известной мне ячейки забрать ее value в переменную, чтобы опять же воспользоваться этой переменной в локальных описаниях?
Допустим мне при смене листа надо продолжить вывод не с row, а с row:=row+2.
Не уж то мне ради этого весь вывод в Excel (и прочие радости форматирования) надо пихать в скприпт, где я узнаю, что лист сменился ? Sad Мухи отдельно, котлеты отдельно... все как в сказке %)
_________________
Трехглазый передает привет банкирам, и желает им долгого здравия (:.
kit83rd
Участник со стажем


Вступление в Клуб: 05.02.2010
СообщениеПт Ноя 19, 2010 02:50    Ответить с цитатой
Полезность: Нет оценки
omela пишет:

А можно примерчик какой-нибудь? Честно говоря не очень поняла чем мне это поможет.



Не придумал что можно сделать с номер страницы, поэтому просто выведу в ячейку
Код:

[EXCEL].cmd(  'v_page = 44
          Sheet.Cells(1,4)= v_page' );


v_page это индекс массива HPageBreaks который здесь уже вычислялся.

omela пишет:

Можно и по-другому пути пойти. Могу я из известной мне ячейки забрать ее value в переменную, чтобы опять же воспользоваться этой переменной в локальных описаниях?


Можно но это все равно придется делать через cmd, уж лучше переменную испорльзовать
Код:

   [EXCEL].Write(1, 2,'3');
   [EXCEL].cmd('Sheet.Cells(1,3)= Sheet.Cells(1,2)');
kit83rd
Участник со стажем


Вступление в Клуб: 05.02.2010
СообщениеПт Ноя 19, 2010 02:52    Ответить с цитатой
Полезность: Нет оценки
omela пишет:
Не уж то мне ради этого весь вывод в Excel (и прочие радости форматирования) надо пихать в скприпт, где я узнаю, что лист сменился ?


Нет, в остальном работаешь как и работала
omela
Участник со стажем


Вступление в Клуб: 01.07.2008
СообщениеПт Ноя 19, 2010 16:07    Ответить с цитатой
Полезность: Нет оценки
kit83rd пишет:

[EXCEL].cmd('Sheet.Cells(1,3)= Sheet.Cells(1,2)');


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

Т.е. по сути мне надо так:
выводим построчно текст:
------------------------
------------------------
------------------------
------------------------

оп, страница поменялась (это анализируем в excel.cmd)

выводим заголовок или некий нужный нам текст:
------наш текст-------
и продолжаем вывод со следующей строки
row:=row+1; (а это в excel.cmd сделать нельзя).
------------------------
------------------------

Как быть?
_________________
Трехглазый передает привет банкирам, и желает им долгого здравия (:.
r00st
Эксперт


Вступление в Клуб: 14.09.2007
СообщениеПн Ноя 22, 2010 08:05    Ответить с цитатой
Полезность: 1
Так можно сделать только проверяя текущую страницу после заполнения каждой новой строки. При этом переменная текущей строки будет заполняться не в валидаторе, а в клиент-скрипте, ибо в валидаторе нельзя отследить изменение текущей страницы.

Что-нибудь в этом роде:
1. Сначала объявили и заинитили переменные текущей строки
и страницы
Код:
excel.cmd ('CurrentRow = 1
CurrentPage = 1
OldPage = 1');

2. Макроподстановка в валидаторе, для удобства.
Код:

pragma macro (put, 'excel.cmd (''Cells (CurrentRow, [1]).Value = [2]
For I = 1 To Sheet.HPageBreaks.Count
    If CurrentRow < Sheet.HPageBreaks(I).Location.Row Then
        CurrentPage = I
        Exit For   
    End If
Next   
if OldPage <> CurrentPage then
    'Действия при смене страницы, в том числе увеличение CurrentRow
    CurrentRow = CurrentRow + 1
    Cells (CurrentRow, [2]).Value = "Сменили страницу"
    OldPage = CurrentPage
end if
CurrentRow = CurrentRow + 1''', substitute);

3. Использование макроподстановки в валидаторе внутри цикла:
Код:

&put (col, text); -- col - столбец, text - текст ячейки

*Синтаксис не проверял. Полагаю, идея понятна.
omela
Участник со стажем


Вступление в Клуб: 01.07.2008
СообщениеВт Ноя 23, 2010 15:29    Ответить с цитатой
Полезность: Нет оценки
r00st пишет:
Так можно сделать только проверяя текущую страницу после заполнения каждой новой строки. При этом переменная текущей строки будет заполняться не в валидаторе, а в клиент-скрипте, ибо в валидаторе нельзя отследить изменение текущей страницы.


Да, пока такая идея и осталась.
Теперь только столкнулась с другой проблемой.
Вроде все верно написала, а выдается ошибка, что "Индекс выходит за пределы допустимого диапазона".... подозреваю, что проблема тут:
Код:
For I = 1 To Sheet.HPageBreaks.Count
    If CurrentRow < Sheet.HPageBreaks(I).Location.Row Then
        CurrentPage = I
        Exit For   
    End If
Next 

А подозреваю именно этот кусок, потому что когда я его убираю все сразу нормально выводиться.
_________________
Трехглазый передает привет банкирам, и желает им долгого здравия (:.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
На страницу 1, 2  След.
Страница 1 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru