Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Скрытое создание листа / 25 сообщений из 37, страница 1 из 2
04.05.2010, 10:29
    #36610351
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
Задача следующая:
Есть лист со сводной таблицей. При двойном клике на pivot создается лист с детализацией данных.
В этот момент необходимо перехватывать создание этого листа и скрыв от пользователя взять с него данные и провести определенные действия. После чего лист удалить.

Код такой
располагается в коде книги

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Sub Workbook_NewSheet(ByVal Sh As Object)

Application.ScreenUpdating = False ' отключаем обновление экрана

' Тут я делаю всякие штуки-дрюки типа беру ключ по детализации и делаю запрос в базу

Application.DisplayAlerts = False ' отключаем сообщения
ActiveSheet.Delete  ' рубим лист
Application.DisplayAlerts = True ' включаем сообщения
Application.ScreenUpdating = True ' включаем обновление экрана

End Sub


Но есть косяк, в момент создания листа пользователь видит этот лист долю секунды. Потому кот выполняется после события.


Тогда в коде листа я вешаю следующую обработку

Код: plaintext
1.
2.
3.
4.
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
' тут я проверяю был ли тык в пивот или просто в свободные поля
Application.ScreenUpdating = False ' отключаем обновление экрана
End Sub

Соответственно в коде события нового листа я обновления только включаю в конце кода, но это мелочи.

Главная трабла в том, что код не помогает и создание нового листа я вижу.
Важный ньюанс, что происходит это все в офисе 2007. В 2003 не тестил, но это мой старый прием, он раньше по моему прокатывал легко.

Кто что может подсказать. Очень не эстетично когда юзверь видит все твои секретики.
...
Рейтинг: 0 / 0
04.05.2010, 10:30
    #36610354
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
кот это код :)
...
Рейтинг: 0 / 0
04.05.2010, 10:36
    #36610368
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
Ну и пример прикреплю
...
Рейтинг: 0 / 0
04.05.2010, 13:29
    #36610893
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
Может быть так?
Код: plaintext
1.
2.
3.
4.
5.
6.
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Sh.Visible = xlHidden
...
Application.DisplayAlerts = False
Sh.Delete
Application.DisplayAlerts = True
End Sub
...
Рейтинг: 0 / 0
04.05.2010, 13:29
    #36610896
sergeyvg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
можно подойти кардинально, моргать будет, но что там творится в момент "моргания" будет скрыто:)
в процедуре Worksheet_BeforeDoubleClick
Код: plaintext
Application.Visible = False
а в Workbook_NewSheet
Код: plaintext
Application.Visible = True
...
Рейтинг: 0 / 0
04.05.2010, 18:37
    #36611541
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
vlthМожет быть так?
Код: plaintext
1.
2.
3.
4.
5.
6.
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Sh.Visible = xlHidden
...
Application.DisplayAlerts = False
Sh.Delete
Application.DisplayAlerts = True
End Sub



спасибо не помогло
все также моргает
...
Рейтинг: 0 / 0
04.05.2010, 18:49
    #36611563
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
sergeyvgможно подойти кардинально, моргать будет, но что там творится в момент "моргания" будет скрыто:)
в процедуре Worksheet_BeforeDoubleClick
Код: plaintext
Application.Visible = False
а в Workbook_NewSheet
Код: plaintext
Application.Visible = True


спасибо, весело :)
но не подойдет
...
Рейтинг: 0 / 0
04.05.2010, 19:57
    #36611636
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
ShamanusvlthМожет быть так?
Код: plaintext
1.
2.
3.
4.
5.
6.
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Sh.Visible = xlHidden
...
Application.DisplayAlerts = False
Sh.Delete
Application.DisplayAlerts = True
End Sub



спасибо не помогло
все также моргает

Вариант: создать на время новый экземпляр Excel (objExcel.Visible=false). Подойдёт?
...
Рейтинг: 0 / 0
05.05.2010, 00:12
    #36611874
motorway
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
Странно, что у вас виден лист. У меня тоже в приложении создается скрытый лист, но я вешаю перед этим отключение обновления экрана, и ничего не видно. При удалении ставлю DisplayAlert=False.
...
Рейтинг: 0 / 0
05.05.2010, 03:07
    #36611938
ak787
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
лично у меня метод doubleclick не срабатывает на листе, нужно вызывать из книги
да и зачем тебе показывать тот лист, раз ты сам все делаешь?
такчто отменяй действие и сам делай что хош...

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
If Target.Row = 29 And Target.Column < 4 Then
Cancel = True
'твои штучки дрючки
End If
End Sub
...
Рейтинг: 0 / 0
05.05.2010, 03:14
    #36611940
ak787
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
да забыл в коде имя листа

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
If Sh.Name = "Лист4" Then
If Target.Row = 29 And Target.Column < 4 Then
Cancel = True
'твои штучки дрючки
End If
End If
End Sub
...
Рейтинг: 0 / 0
05.05.2010, 09:24
    #36612086
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
vlthShamanusvlthМожет быть так?
Код: plaintext
1.
2.
3.
4.
5.
6.
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Sh.Visible = xlHidden
...
Application.DisplayAlerts = False
Sh.Delete
Application.DisplayAlerts = True
End Sub



спасибо не помогло
все также моргает

Вариант: создать на время новый экземпляр Excel (objExcel.Visible=false). Подойдёт?

с этой темой незнаком
сейчас погуглю
...
Рейтинг: 0 / 0
05.05.2010, 09:34
    #36612108
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
ak787лично у меня метод doubleclick не срабатывает на листе, нужно вызывать из книги
да и зачем тебе показывать тот лист, раз ты сам все делаешь?
такчто отменяй действие и сам делай что хош...


ak787да забыл в коде имя листа

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
If Sh.Name = "Лист4" Then
If Target.Row = 29 And Target.Column < 4 Then
Cancel = True
'твои штучки дрючки
End If
End If
End Sub



Эта схема работает, лист не создается.
Просто тут косяк есть. Мои штуки дрюки это ключ к запросу по детализации сводной.
Ну т.е. например в сводной есть дата-магазин.

Дабл клик покажет все исходные данные для расчета величины на пересечении. Например все отделы этого магазина.

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

Но Ваш вариант очень интересный, если ничего не получится наверно буду рыть сюда.
...
Рейтинг: 0 / 0
05.05.2010, 09:35
    #36612111
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
motorway,

я думаю что косяк в версии офиса. В 2003 у меня тоже такой проблемы не было. А вообще попробуйте мой пример. Может быть он у Вас тоже не будет показывать лист.
...
Рейтинг: 0 / 0
05.05.2010, 10:27
    #36612223
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
Shamanusс этой темой незнаком
Код: plaintext
1.
2.
3.
4.
5.
6.
Dim oExcel As Excel.Application
...
Set oExcel = New Excel.Application
oExcel.Visible = True 'для демонстрации; в реальном проекте уберите эту строку
...

oExcel.Quit: Set oExcel = Nothing
...
Рейтинг: 0 / 0
05.05.2010, 11:49
    #36612486
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
vlthShamanusс этой темой незнаком
Код: plaintext
1.
2.
3.
4.
5.
6.
Dim oExcel As Excel.Application
...
Set oExcel = New Excel.Application
oExcel.Visible = True 'для демонстрации; в реальном проекте уберите эту строку
...

oExcel.Quit: Set oExcel = Nothing


попытался раскурить..хмм
Понял, что это такое, но не понял теперь как сделать открытие листа в этот новый эксель.

Получается я текущим проектом не управляю а дабл клик создает лист в текущем объекте.

Когда же я назначаю переменной текущий проект, то новые листы я тока сам могу создавать.
Код: plaintext
Set oExcel = Excel.Application
В общем пока не пойму, что делать.
...
Рейтинг: 0 / 0
05.05.2010, 12:24
    #36612608
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
В новой книге, открытой в новой копии Excel, уже будет сколько-то листов, поэтому создавать новый лист там не надо - достаточно получить ссылку на уже существующий:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim oExcel As Excel.Application, wSh As Worksheet
...
Set oExcel = New Excel.Application
oExcel.Visible = True 'для демонстрации; в реальном проекте уберите эту строку
oExcel.Workbooks.Add
Set wSh = oExcel.Workbooks( 1 ).Worksheets( 1 )
wSh.Cells( 1 ,  1 ) = "Трам-пам-пам"
...
oExcel.DisplayAlerts = False
oExcel.Quit: Set oExcel = Nothing: Set wSh = Nothing
...
Рейтинг: 0 / 0
05.05.2010, 14:26
    #36612998
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
vlthВ новой книге, открытой в новой копии Excel, уже будет сколько-то листов, поэтому создавать новый лист там не надо - достаточно получить ссылку на уже существующий:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim oExcel As Excel.Application, wSh As Worksheet
...
Set oExcel = New Excel.Application
oExcel.Visible = True 'для демонстрации; в реальном проекте уберите эту строку
oExcel.Workbooks.Add
Set wSh = oExcel.Workbooks( 1 ).Worksheets( 1 )
wSh.Cells( 1 ,  1 ) = "Трам-пам-пам"
...
oExcel.DisplayAlerts = False
oExcel.Quit: Set oExcel = Nothing: Set wSh = Nothing


ну хорошо
и как должна схема выглядеть. В какой момент времени мне нужно этот объект создавать чего то я не пойму?

После 2йного нажатия по pivot-у мне нужно создать объект невидимый,
экспортировать туда мой лист,
сымитировать нажатие и создание листа там
Прочесть на созданном там листе нужную мне инфу
Убить весь объект со всем содержимым

так чтоли?

А если Pivot тяжелый и процедура экспорта затянется на 2-3 минуты?

Или я что то неверно понял?
...
Рейтинг: 0 / 0
05.05.2010, 14:57
    #36613095
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
Shamanus, да схема такая.

А если Pivot тяжелый и процедура экспорта затянется на 2-3 минуты?А почему экспорт должен быть значительно дольше, чем в "родном" Excel? - ведь всё будет происходить точно так же. Нет?
...
Рейтинг: 0 / 0
05.05.2010, 15:22
    #36613173
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
vlthShamanus, да схема такая.

А если Pivot тяжелый и процедура экспорта затянется на 2-3 минуты?А почему экспорт должен быть значительно дольше, чем в "родном" Excel? - ведь всё будет происходить точно так же. Нет?

это будет запасной план :)

спасибо за помощь.
...
Рейтинг: 0 / 0
05.05.2010, 16:15
    #36613340
sergeyvg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
небольшие замечания
1. кроме двойного клика есть еще пункт меню "Показать детали", его тоже надо будет обрабатывать
2. речь все время идет об обработке события "Workbook_NewSheet", но лист то к этому моменту уже засветился, мелькнул.
...
Рейтинг: 0 / 0
05.05.2010, 17:51
    #36613611
ak787
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
Shamanusak787лично у меня метод doubleclick не срабатывает на листе, нужно вызывать из книги
да и зачем тебе показывать тот лист, раз ты сам все делаешь?
такчто отменяй действие и сам делай что хош...


ak787да забыл в коде имя листа

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
If Sh.Name = "Лист4" Then
If Target.Row = 29 And Target.Column < 4 Then
Cancel = True
'твои штучки дрючки
End If
End If
End Sub


ну если лист нужен ончень, то вот так

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
If Sh.Name = "Лист4" Then
If Target.Row = 29 And Target.Column < 4 Then
Cancel = True
Application.ScreenUpdating = False
Selection.ShowDetail = True
'твои штучки дрючки
End If
End If
End Sub






Эта схема работает, лист не создается.
Просто тут косяк есть. Мои штуки дрюки это ключ к запросу по детализации сводной.
Ну т.е. например в сводной есть дата-магазин.

Дабл клик покажет все исходные данные для расчета величины на пересечении. Например все отделы этого магазина.

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

Но Ваш вариант очень интересный, если ничего не получится наверно буду рыть сюда.
...
Рейтинг: 0 / 0
05.05.2010, 17:53
    #36613617
ak787
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
ak787Shamanusak787лично у меня метод doubleclick не срабатывает на листе, нужно вызывать из книги
да и зачем тебе показывать тот лист, раз ты сам все делаешь?
такчто отменяй действие и сам делай что хош...


ak787да забыл в коде имя листа

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
If Sh.Name = "Лист4" Then
If Target.Row = 29 And Target.Column < 4 Then
Cancel = True
'твои штучки дрючки
End If
End If
End Sub


ну если лист нужен ончень, то вот так

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
If Sh.Name = "Лист4" Then
If Target.Row = 29 And Target.Column < 4 Then
Cancel = True
Application.ScreenUpdating = False
Selection.ShowDetail = True
'твои штучки дрючки
End If
End If
End Sub






Эта схема работает, лист не создается.
Просто тут косяк есть. Мои штуки дрюки это ключ к запросу по детализации сводной.
Ну т.е. например в сводной есть дата-магазин.

Дабл клик покажет все исходные данные для расчета величины на пересечении. Например все отделы этого магазина.

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

Но Ваш вариант очень интересный, если ничего не получится наверно буду рыть сюда.


чтото я напутал с порядком сообщений...
короче, вот....

ну если лист нужен ончень, то вот так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
If Sh.Name = "Лист4" Then
If Target.Row =  29  And Target.Column <  4  Then
Cancel = True
Application.ScreenUpdating = False
Selection.ShowDetail = True
'твои штучки дрючки
End If
End If
End Sub
...
Рейтинг: 0 / 0
05.05.2010, 17:59
    #36613639
ak787
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
забыл удаление листа добавить (метод New_Sheet не нужен)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
If Sh.Name = "Лист4" Then
If Target.Row =  29  And Target.Column <  4  Then
Cancel = True
Application.ScreenUpdating = False
Selection.ShowDetail = True
Application.DisplayAlerts = False

'твои штуки дрюки

ActiveSheet.Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End If
End If
End Sub
...
Рейтинг: 0 / 0
06.05.2010, 08:48
    #36614459
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрытое создание листа
ak787забыл удаление листа добавить (метод New_Sheet не нужен)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
If Sh.Name = "Лист4" Then
If Target.Row =  29  And Target.Column <  4  Then
Cancel = True
Application.ScreenUpdating = False
Selection.ShowDetail = True
Application.DisplayAlerts = False

'твои штуки дрюки

ActiveSheet.Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End If
End If
End Sub



Прикольно решение. Спасибо. 5 баллов за идею :)
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Скрытое создание листа / 25 сообщений из 37, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]