Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Определение текущих разрывов страницы при заполнении таблицы в Экселе  (Прочитано 48943 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Polundra_Pi
Гость
« : 12-09-2006 11:47 » 

Доброго воремени суток!
Не знаю по адресу обращаюсь или нет, но рассчитываю на Вашу помощь,
уважаемые учасники Форума.
Постараюсь поянить в чём дело, тоесть для чего мне нужны подобные вещи.
С одной иерархической БД (Лотус) в Эксель выводится отчёт для каждой выбраной
организации На всех листа отчёта толжно писаться с 1-ой по 9-ю  строчку  почти одно и тоже, кроме строчки номер 4-ре. Свойство PrintTitleRows класса PageSetup очень полезная вещь, только мне его мешает использовать, то что Экселю не можно задать
такую запись
ActiveSheet.PageSetup.PrintTitleRows = "$1:$3;$5:$9", тоесть мне надо выводить на каждой странице все строчки с первой по девятую кроме четвёртой.
В четвёртой строчке пишется некоторый отчётный параметр, точнее организация,
выбранная из списка, отчёт строится циклом Фоал ... енд Фоал, причом перед каждым новым выполнением этого цыкла я указываю для разрыва страницы
xlSheet.HPageBreaks.Add(xlSheet.Cells(i, j)). Но как определить произошол ли разрыв страницы сам по себе я , прощу прощения,так и не понял. Я хочу просто шапку тейблы копировать на каждую новую страницу и в строчку номер 4 вписывать скриптом нужную организацию.
Поскажите как решить такую проблему?
Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #1 : 13-09-2006 07:30 » 

может создать процедуру, которая и будет писать эти строки
Код:
public sub CreateHeader(i as integer)
  xlSheet.Cells(i,1) = "sdfsddfs"
  xlSheet.Cells(i+1,1) = "sdfsddfs"
  xlSheet.Cells(i+3,1) = "sdfsddfs"
  xlSheet.Cells(i+5,1) = "sdfsddfs"
end sub

public sub Main()
  For Each
   ...
   ...
   xlSheet.HPageBreaks.Add(xlSheet.Cells(i, j))
   CreateHeader
  Next
end sub
Записан

I Have Nine Lives You Have One Only
THINK!
Polundra_Pi
Гость
« Ответ #2 : 13-09-2006 09:19 » 

может создать процедуру, которая и будет писать эти строки
Код:
public sub CreateHeader(i as integer)
  xlSheet.Cells(i,1) = "sdfsddfs"
  xlSheet.Cells(i+1,1) = "sdfsddfs"
  xlSheet.Cells(i+3,1) = "sdfsddfs"
  xlSheet.Cells(i+5,1) = "sdfsddfs"
end sub

public sub Main()
  For Each
   ...
   ...
   xlSheet.HPageBreaks.Add(xlSheet.Cells(i, j))
   CreateHeader
  Next
end sub
Спасибо, что откликнулись!
Ничего притив не имею, xlSheet.HPageBreaks.Add(xlSheet.Cells(i, j)) - разрыв выше указанной ячейки, процедура CreateHeader - выводит шапку таблицы,
но мне надо определить, когда призошол разрыв страницы сам по себе, тоесть когда отчётная таблица перевалилась на новую страницу, а потом вствлять шапку отчётной тейблы после того как разрыв страницы имел место. Да, то что Вы предложили справедливо новая организация встравляется разрыв страницы, на которую выводится шапка с вписаной в нужном месте органмзацией. Но как же все-таки определить разрыв страницы сам по себе?
Я планировал отчёт для каждой новой организации выводить на новом Экселевсом Листе,
тогда в отчётном цыкле я укажу PrintTitleRows = "$1:9", и для каждой организации все должно быть как положено с шапкой, но как быть с нумерацией страниц отчёта, напр., на листе 3 последняя страница была 17, тогда на листе 4 первая должна быть 18 и тд. И как учитывать  нумерацию, на удалённых листах, на которых вывелась одна только шапка, а данных нету их нумеровать не нужно.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 13-09-2006 09:37 » 

HPageBreaks - это коллекция
пробегаешь по коллекции и соответсвенно нумеруешь страницы
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Polundra_Pi
Гость
« Ответ #4 : 13-09-2006 10:02 » 

HPageBreaks - это коллекция
пробегаешь по коллекции и соответсвенно нумеруешь страницы
Если я Вас правильно понял, то в цикле по организациям после того как заполнена отчетная таблица для i-ой организации на i-ом Листе нужно вставить цикл типа
For Each pb in Worksheets(i).HPageBreaks
If pb.Extent = xlPageBreakFull Then
Kolpage = Kolpage+ 1
End If
Next
А попом указать для свойства
 .FirstPageNumber = page0+Kolpage?
А не можно ли последний номер страниц на текущем листе как-то определить с помощю кодов форматирования, задающих номера страниц, напр из этого Ен
.CenterHeader = "Страница &P из &N",
а потом для нового листа  .FirstPageNumber=N+1, только наверное  &N не выйдет в интеджер конвертнуть для прибавления , а потом в стринг?
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 13-09-2006 11:36 » 

Polundra_Pi, ты предложил, ты и пробуй Улыбаюсь
затрудняюсь сказать
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Polundra_Pi
Гость
« Ответ #6 : 13-09-2006 12:04 » 

Polundra_Pi, ты предложил, ты и пробуй Улыбаюсь
затрудняюсь сказать
Я-то пробую, только затрудняюсь получить конкретный результат ведь возле &P и &N мешает символ
&.
Попробую с pb.Extent = xlPageBreakFull .
Если будут какие-то предлжения как вывести тейблу на одном Экселевсом Листе, без выведения новых организаций на новых листа, то я Вас охотно выслушаю, и есле Вы не притв ими поделиться
Кстати, помимо этого интересно не видел такой инфы какой максимум Листов
И по проще,сорри, как програмно послать на печать содержимое всех Листов сразу без цикла для печати по листам, одной коммандой.


Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #7 : 13-09-2006 12:07 » 

может тогда использовать св-во
Код:
xlSheet.HPageBreaks.Count

тогда получим
Код:
Public Sub Report()
    Dim iPage As Integer
    Dim xlSheet As Worksheet
   
    iPage = 1
    For i = 1 To [Кол-во отчетов]
       
        'добавляем новый лист для отчета
        xlSheet = Workbook.Worksheets.Add
        xlSheet.PageSetup.PrintTitleRows = "$1:9"
        xlSheet.PageSetup.FirstPageNumber = iPage
       
        ' Фомируем отчет
        ...
        ...
       
        ' выбираем номер страницы для следующего отчета
        iPage = xlSheet.HPageBreaks.Count + 1
    Next i
End Sub
« Последнее редактирование: 16-12-2007 17:31 от Алексей1153++ » Записан

I Have Nine Lives You Have One Only
THINK!
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #8 : 13-09-2006 12:11 » 

И по проще,сорри, как програмно послать на печать содержимое всех Листов сразу без цикла для печати по листам, одной коммандой.

вероятно
Код:
Workbook.PrintOut
Записан

I Have Nine Lives You Have One Only
THINK!
Polundra_Pi
Гость
« Ответ #9 : 13-09-2006 12:36 » 

Я счас протестирую, возможно что-то выйдет, если возникнут какие-то трудности и у Вас, уважаемые учасники Форума будет желание и свободная минутка, чтобы их разрешить, то я сообщу о
них тут
Записан
Polundra_Pi
Гость
« Ответ #10 : 13-09-2006 14:10 » 

Не хочу огорчать помагающих, но идея с iPage не работает, особо привело в удивление другое
Напр., Задал начальное значение iPage=3, смотрю Параметры страниц первого Листа, да первая страница № 3,
но на остальных почемуто № 1. Как-то странно прямо и удивительно, что может быть не так.
А также почему-то у меня с Листа4 перескакиевает на Лист3 и начинает там выводить отчёт для организации №4.
С вторым как-то может мжно разобраться, но разьясните как разрешить первый вопрос с нумерацией страниц на всех Листах


Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 13-09-2006 14:31 » 

код в студию
но не забывай worksheets массив или коллекция
пробегаешь в цикле по всем листам устанавливаешь правильный iPage для каждого листа
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Polundra_Pi
Гость
« Ответ #12 : 14-09-2006 06:02 » 

код в студию
но не забывай worksheets массив или коллекция
пробегаешь в цикле по всем листам устанавливаешь правильный iPage для каждого листа
Нима проблем, там ничего особенного нету и код не составляет гостайну, так что я могу
 привести необходимые выдердки с кода, которые касаются проблемы последовательной нумерации
страниц на всех Листах. Код с небольшими сокращениями некасающимися непосредственно нумерации и коментариями, чтобы ввести в то, что делается в целом.
REM Вначале идёт описание и задание Лотусовских елементов, которые будут использованы при   построении отчёта


     Sub Click(Source As Button)
     Dim session As New NotesSession
     Dim db As NotesDatabase
     Set db = session.CurrentDatabase
     Dim doc As NotesDocument
     
     Dim wos As New NotesUIWorkspace
     Dim uidoc As notesuidocument
     Set uidoc=wos.currentdocument
     Call uidoc.Refresh 'Обновление всех полей текущего дока перед отчётоформированием
     
     Dim column As NotesViewColumn
     
     Torg=uidoc.document.orgs(0)
     
     If Torg="" Then Exit Sub
     BOX=uidoc.document.GetItemValue("orgs") 'Список организаций выбранных юзером, по которым строят отчёт.
     
     Set view = db.GetView( "Osobisti" ) 'Название вида в котором хранится доки, с которых циклом Вайл ...  Енд Вайл выбираются отчётные данные
REM Дальше идет определение значений констант Экселя, в соответствии со справкой по ВБА,
которые использовались в дальнейшем.
.....
REM  Дальше иницилизируем Эксель для работы с ним через Лотус Нотес.
 Set EWindow = CreateObject("Excel.Application")
     
     If EWindow  Is Nothing Then
          message$ = "Ошибка при запуске Excel." & Chr$( 10 ) & _
          "Может он у Вас не инсталлирован."
          Msgbox message$, 16, "Excel не запускается"
          Exit Sub
     End If
     
     EWindow.Caption="ПЕРЕЧЕНЬ ПО ОРГАНИЗАЦИЯМ" 'Заголовок Эксель-окна
     Set WorkBooks=EWindow.Workbooks
     WorkBooks.Add
     sh=1 'Number WorkSheet
     page0=uidoc.document.pagenumber(0)
%REM
Поле в текущем документе, куда юзер вводит начальный номер страницы, номер нимоно хранить где-то из-за того, что есть такие отчёты которые нужно составлять от руки, а нумерация у печатных и отчётов заполненных руками должа быть одинаковой
%END REM
     Forall TipOrg In BOX 'Цикл по выбранным организациям из поля orgs. Если не ошибаюсь аналог цикла  For Each ... Next
         
          If ( sh>3 ) Then 'Добавляем новый Лист новый, когда sh>3, ведь три Листа уже есть
               Call   ws.Select
               EWindow.Sheets.Add 
          End If       
          Set ws=EWindow.Workbooks(1).Worksheets(sh)
          With EWindow.Workbooks(1).Worksheets(sh).PageSetup
               .Orientation = xlLandscape
               .FirstPageNumber = page0
                   ..... ' и тд
          End With
          Call ws.Activate
          EWindow.visible=True 'Делать Эксель видимым юзерю при отчётопостроении
          'Дальше идет заполнение шапки таблицы
          ......
          'Потом заполнение самой отчётной тейблы цыклом Вайл ... Енд Вайл
              m=12 'Строка с которой начинается отчётозаполнение
          Set   doc=view.GetFirstDocument
          While Not ( doc Is  Nothing) 'цикл непосредственного заполнения тейблы данными при определённых условиях, указанныю юзером, пробегается по всем документам представления виев
               If   
....
   End If
               Set doc = view.GetNextDocument(doc)
          Wend
         'Оформляем тейблу (проводим линии, звадаем шрифты, словом делаем форматирование всей тейблы)
          sh=sh+1 'Новое выполнение цикла новый номер Листа
          page0=ws.HPageBreaks.Count+1 'Вот собственно то, что было предложено Помагающим
     End Forall
     EWindow.visible=True   
     Call ws.Cells(1,1).Select
End Sub

Если будут какие-то предложения, замечания, то, по возможномти, сообщите
     
     

« Последнее редактирование: 16-12-2007 17:32 от Алексей1153++ » Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #13 : 14-09-2006 06:15 » 

Цитата
page0=ws.HPageBreaks.Count+1 'Вот собственно то, что было предложено Помагающим

а если хорошенько подумать и заменить на

Код:
page0=ws.HPageBreaks.Count+page0

вот мой тестовый макрос
Код:
Public Sub Report()
    Dim iPage As Integer
    Dim xlSheet As Worksheet
   
    iPage = 1
    For i = 1 To 3
       
        'добавляем новый лист для отчета
        Set xlSheet = ThisWorkbook.Worksheets.Add
        xlSheet.PageSetup.PrintTitleRows = "$1:1"
        xlSheet.PageSetup.FirstPageNumber = iPage
        xlSheet.PageSetup.CenterFooter = "Страница &P из &N"
       
        ' Фомируем отчет
        xlSheet.Cells(1, 1) = "Шапка отчета"
        For j = 1 To 5 - i
            xlSheet.Cells(j * 2, 1) = "Какой-то текст листа " & Str(i)
            xlSheet.HPageBreaks.Add (xlSheet.Cells(j * 2 + 1, 1))
        Next
       
        ' выбираем номер страницы для следующего отчета
        iPage = iPage + xlSheet.HPageBreaks.Count
    Next i
    '   xlSheet.PrintOut
    '   ThisWorkbook.PrintOut
End Sub

только надо колонтилул поменять, а то пишет 8 страница из 2  Улыбаюсь
« Последнее редактирование: 16-12-2007 17:33 от Алексей1153++ » Записан

I Have Nine Lives You Have One Only
THINK!
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #14 : 14-09-2006 06:27 » 

дополнения

Цитата
          If ( sh>3 ) Then 'Добавляем новый Лист новый, когда sh>3, ведь три Листа уже есть
               Call   ws.Select
               EWindow.Sheets.Add
          End If   

не факт, у меня, к примеру, только 1 лист.
Может лучше пробежаться в начале по всем листам и удалить их, а потом честно добавлять
Код:
set ws=EWindow.Sheets.Add

Код:
          With EWindow.Workbooks(1).Worksheets(sh).PageSetup
               .Orientation = xlLandscape
               .FirstPageNumber = page0
                   ..... ' и тд
          End With

заменить на
Код:
          With ws.PageSetup
               .Orientation = xlLandscape
               .FirstPageNumber = page0
                   ..... ' и тд
          End With

вообще не использовать конструкцию
Код:
EWindow.Workbooks(1).Worksheets(sh)
раз получили объект листа
Код:
set ws=EWindow.Sheets.Add
то и работать с ним
раз получили объект книги
Код:
Set WrkBk=EWindow.Workbooks.Add
то и работать с ним
и тогда будет меньше возникать ошибок типа
Цитата
А также почему-то у меня с Листа4 перескакиевает на Лист3 и начинает там выводить отчёт для организации №4.


ЗЫЖ ИМХО
« Последнее редактирование: 16-12-2007 17:33 от Алексей1153++ » Записан

I Have Nine Lives You Have One Only
THINK!
Polundra_Pi
Гость
« Ответ #15 : 14-09-2006 07:03 » 

Спасибо!, за то, что как говорится на связи
Пробовал и так, но не помогло вывело на все страницах FirstPageNumber тот, который затал перед циклом Фоал, тоесть напр, page0=3, и на всех Листах первый номер равен трём.
Может таким образом считается, а именно
iPage = iPage + xlSheet.HPageBreaks.Count
производится подсчёт полько тех разрывов страниц, а не всех , что установились програмно
xlSheet.HPageBreaks.Add (xlSheet.Cells(j * 2 + 1, 1))?
А с Листами счас сделаю, как Вы посоветовали
Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #16 : 14-09-2006 08:11 » 

iPage = iPage + xlSheet.HPageBreaks.Count

насколько я понял считает кол-во всех разрывов

page0 = page0 + ws.HPageBreaks.Count

на этой строке поставьте бреакпоинт и проверяйте изменяется ли page0
Записан

I Have Nine Lives You Have One Only
THINK!
Polundra_Pi
Гость
« Ответ #17 : 14-09-2006 09:18 » 

С листами сделал как Вы рекомендовали, определик ексель-книгу перед цикло Фоал
               Set WrkBk=EWindow.Workbooks.Add
и в самом цикле поставив 
               Set ws=WrkBk.Sheets.Add.
Как удалить все Листи, ну перед циклом естественно, чтобы только один остался.
Я записал так
                     ForAll WkSt In WrkBk.Sheets
                    Call WkSt.Select
                    EWindow.ActiveWindow.SelectedSheets.Delete
                    End ForAll
Но понятное дело отладчик прервал выполнение скрипта Лотуса, когда Эксель выдал сообщение, что в книге обязательно должна быть хотя бы одна книга, которую удалить не можно.
Я пробовал написать так
                    ForAll WkSt In WrkBk.Sheets
                    If (WkSt<>WrkBk.Sheets(1)) Then
                    Call WkSt.Select
                    EWindow.ActiveWindow.SelectedSheets.Delete
                    End If
                    End ForAll
Но отладчику не понравилась запись в строке с (WkSt<>WrkBk.Sheets(1)), он выдает ошибку Тайп мисматч, несоответствие типов тоесть.
А насчёт page0. Мои сомнения вроде подтвердились ws.HPageBreaks.Count  задаёт количество разрывов заданых програмно ws.HPageBreaks.Add (ws.Cells(i+1, j)). Поставил в цикле Вайл.. Енд Вайл такую строку.Смотрю на первом заполненном Эксель-листе шесть страниц вышло, а на втором заполненном листе FirstPageNumbe=6 и на нем одна страница, на втором FirstPageNumbe=6  тоже.
Тоесть если произошел один разрыв, то страниц две есть, тоесть
iPage = iPage + xlSheet.HPageBreaks.Count+1, но на второй странице может и не быть данных, правда, я вроде зашол в заблуждение.
Наверное нужно другое свойство HPageBreaks или вобще другой метод применять.
Может можно все-таки програмно определить, что произошол разрыв странице са по себе,
тоесть, что достигнут конец страницы, тогда я смогу выводить отчёт для разных организаций на одном Листе, или если на разных, то как их последовательно пронумеровать страницы?






   

Записан
Polundra_Pi
Гость
« Ответ #18 : 14-09-2006 10:18 » 

Счас буду испробовать
For Each pb in ws.HPageBreaks
If pb.Extent = xlPageBreakFull Then
Kolpage = Kolpage+ 1
End If
Next
Только кроме full-screen page breaks есть еще и print-area page breaks, а они могут совпадать.
Есть у кого-то не пропала охота мне помочь, то, если есть вободная минутка и желание помочь, то помогите, пожалуйста
Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #19 : 14-09-2006 10:22 » 

тута проверил
если использовать метод Workbook.PrintOut, то он сам нормально проставляет номера страниц
и тогда не надо самому выставлять начальную страницу, т.е в вот этом надобность отпадает

.FirstPageNumber = page0
iPage = iPage + xlSheet.HPageBreaks.Count+1
Записан

I Have Nine Lives You Have One Only
THINK!
Polundra_Pi
Гость
« Ответ #20 : 14-09-2006 10:56 » 

тута проверил
если использовать метод Workbook.PrintOut, то он сам нормально проставляет номера страниц
и тогда не надо самому выставлять начальную страницу, т.е в вот этом надобность отпадает

.FirstPageNumber = page0
iPage = iPage + xlSheet.HPageBreaks.Count+1
Тоесть надо будет только указать FirstPageNumber только для самого первого Листа,
а потом все страницы, которые будут находиться на Втором Листах, будут начинаться с немер n+1,
если номер последней странице на Первом Листе был n?
Еще интересно такое можно как-то специфицески настроить Эксель может быть через конфигурационные файлы, чтобы выводилось не три и не четыре, а напр, с 25 Листов.
Кстати, нашол неплохой линк, может Вам пригодится, мне очень и очень пригодился,
там про русский коды форматирования для Экселя, ну напр., если к русскоязычному Экселю обращаться с другого приложения, то вместо ws.PageSetup..RightHeader ="&P" надо писать
ws.PageSetup..RightHeader ="&С"
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=920
Только у меня напр., &С+число  не работает



Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #21 : 14-09-2006 12:05 » 

Цитата
Тоесть надо будет только указать FirstPageNumber только для самого первого Листа,

да перед печатью задайте такие команды
Код:
Set ws = ThisWorkbook.Worksheets(1)
ws.PageSetup.FirstPageNumber = 3
wb.PrintOut
и остальные будут по порядку


Цитата
Еще интересно такое можно как-то специфицески настроить Эксель может быть через конфигурационные файлы, чтобы выводилось не три и не четыре, а напр, с 25 Листов.
а это не понял
Записан

I Have Nine Lives You Have One Only
THINK!
Polundra_Pi
Гость
« Ответ #22 : 14-09-2006 12:31 » 

Я имел ввиду, чтобы есле создать пустой эксель-файл, то чтобы в нем присутствовали по умолчанию Литст1, Лист2, ...., и тд до Лист25, ведь нареное как-то можно так сделать, просто поинтересовался.
О, и еще Эксель добавляет Листы как-то вроде неправильно. Ну напр., Если Стать на Лист3 и Добавить Лист4, то он будет стоять  не после Листа3, а перед ним. А также неясно почему, когда удалить все Листы (было их скажем 6 штук), за исключением одного какого-то, напр., Лита1, а потом добавить, то появится не Лист2, а Лист7. Эксель получается где-то хранит имена даже удалённых Листов?
Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #23 : 14-09-2006 13:06 » 

Цитата
Я имел ввиду, чтобы есле создать пустой эксель-файл, то чтобы в нем присутствовали по умолчанию Литст1, Лист2, ...., и тд до Лист25, ведь нареное как-то можно так сделать, просто поинтересовался.
Сервис-Параметры         вкладка Общие-Листов в новой книге
(но возможно в других версиях Ёкселя этого нет, у меня ХР)
Цитата
О, и еще Эксель добавляет Листы как-то вроде неправильно. Ну напр., Если Стать на Лист3 и Добавить Лист4, то он будет стоять  не после Листа3, а перед ним. А также неясно почему, когда удалить все Листы (было их скажем 6 штук), за исключением одного какого-то, напр., Лита1, а потом добавить, то появится не Лист2, а Лист7. Эксель получается где-то хранит имена даже удалённых Листов?
скорее хранит не имена листов а некий счетчик, который добавляется к имени листа

ЗЫЖ я всегда листы переименовываю
Записан

I Have Nine Lives You Have One Only
THINK!
Polundra_Pi
Гость
« Ответ #24 : 14-09-2006 13:40 » 

Нашол вкладку есть такая, у меня тоже Excel XP, если это Excel 2002 имеется ввиду.
Также наверное использование обращения к Листам по имени будет понадёжней чем по индексу,
напр,   так Call wb.Sheets("Организация7").Select, чем такое Call EWindow.ThisWorkbook.Worksheets(7)
есле организация7 находится на седьмом Листе соответственно?


Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #25 : 14-09-2006 14:28 » 

у sheets есть свойство name
организация7 может не обязательно находится на 7 листе
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Polundra_Pi
Гость
« Ответ #26 : 15-09-2006 05:57 » 

Доброго времени суток, уважаемые учасники Форума!
Звиняйте, что надоедаю, но помогите разобраться до конца.
Мне нужно удалять те листы, которые не содержат данных для организации, тоесть только шапку одну. Для этого я проверяю в конце цикла Фоал заполненная ли первая ячейка А10  отчёта, в которой если есть  данные, то они должны обязательно быть.
Код:
   
       If (ws.Cells(10, 1).Value="") Then
               Call ws.Select
               EWindow.ActiveWindow.SelectedSheets.Delete
          End If
Но перед удалением Эксель выдает сообщение о том, что Лист может содержать данные, если хотите его удалить, то нажлите Удалить. Можно ли делать как-то сделать, чтобы подобное сообщение не выскакивало, а то юзеря не любят когда много раз надо кнопки нажимать Улыбаюсь.
Так же почему-то когда передаю данные с Лотуса Нотеса в Эксель, то выдаётся сообщение типа
ОЛЕ Автомейшен обджект еррор на строке
Set ws = EWindow.ThisWorkbook.Worksheets(1).
Смотрел в хелпе все вроде так ThisWorkbook Member of Excel.Application, ну а EWindow как положено и было  задано Set EWindow = CreateObject("Excel.Application"). Но свойсва Worksheets у ThisWorkbook
я не нашол, я б записал просто      ws.PageSetup.FirstPageNumber = page0, но у меня может быть такое, именно этот Лист ws будет удалёт из Книги в последнем выполнении цикла?
Метод      wb.PrintOut  протестить возможность не подвернулась, сетевой принтер счас отключен временно, но вреча он работал, хоть бумаги не было. Значит я пустил на печать , а потом отменил для даной книги печать, смотрю просмотр перед печатью, на Первом Листе стоит Первый Номер страниты 3(пейдж0), а на других Листах Авто, смтрю в просморт, а там Первые Страницы с одного начинают для других листов, тоесть этот метод проставлет намера для станиц на других Листах последовательно, только при печати, что  тоже неплохо?
 





« Последнее редактирование: 15-09-2006 07:02 от Polundra_Pi » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #27 : 15-09-2006 07:12 » 

This example deletes Sheet3 in the active workbook without displaying the confirmation dialog box.

Application.DisplayAlerts = False
Worksheets("Sheet3").Delete
Application.DisplayAlerts = True

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Polundra_Pi
Гость
« Ответ #28 : 15-09-2006 08:29 » 

Спасибо!
Так помогло
          If (ws.Cells(10, 1).Value="") Then
               Call ws.Select
               EWindow.DisplayAlerts  =  False
               EWindow.ActiveWindow.SelectedSheets.Delete
               EWindow.DisplayAlerts  = True
          End If
А метод    wb.PrintOut так еще и не пртотестил. Но ничего думаю еще за текущущий день испробую.
Возник вопрос по поводу так называемых "мертвых зон печати", тоесть максимальных значений полей печати, меньше которых значения установить не моно. Так, напр., для одного принтера левое и правое поле по 0,6 см максимум для книжной ориентации, а для другогого прнтера левое 0,4 см, а правое только 1,2 и см и дальше не двигается, тоесть 1 см установить не моно. Эксель как видно учитывает эти "мёртвые зоны печати". Интересует можно ли их как-то определить для каждого принтера значения этих самых "мертвых зон печати", возможно даже через средства ВБА, а потом ствить некоторым полям, напр., теже левым и правым. максилальные  значения для текущего принтера.



Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #29 : 15-09-2006 11:10 » 

поищи вот здесь, может чем поможет
http://support.microsoft.com/?kbid=230743
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines