Запустить макрос автоматически после выгрузки книги Exel

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Запустить макрос автоматически после выгрузки книги Exel

Сообщение zna »

Здравствуйте, коллеги.
Имеется ситуация: выгружаем данные из "Галактики" в шаблон FileXltForJava.xlt из JavaScript, который содержит один лист "Отчёт" и нехитрый макрос:

Код: Выделить всё

Sub DownLoad()
    Dim book As String
    Dim sheet As String
    book = Application.ActiveWorkbook.Name
    sheet = Application.ActiveSheet.Name
    Workbooks(book).Activate
    With Application.Workbooks(book)
       Sheets("Gal_VarSheet").Visible = False       'Здесь ошибку выдаёт
       Sheets("Gal_TblSheet").Visible = False
    End With
    Worksheets("Gal_VarSheet").Activate
    Dim strDtb As String, strNom As String
    strDtb = Range("C2").Value
    strNom = Range("C3").Value
    Worksheets("Отчёт").Activate
    Range("F7").Value = strDtb
    Range("D7").Value = strNom
End Sub
После выгрузки формируется файл FileXltForJava1.xls, содержащий уже три листа: "Gal_VarSheet", "Gal_TblSheet" и "Отчёт".
Проблема: если привязать макрос DownLoad на событие Workbook_Open(), то он запускается до того, как сформируются листы "Gal_VarSheet" и "Gal_TblSheet", и выдаёт ошибку- нет листа.
Вопрос: как запустить DownLoad после того, как появятся все листы?
Вопрос исключительно по VBA, может кто решал такую задачу.
oiko
Местный житель
Сообщения: 418
Зарегистрирован: 29 мар 2005, 17:49

Re: Запустить макрос автоматически после выгрузки книги Exel

Сообщение oiko »

Может имеет смысл макрос сразу в шаблоне прописать и какой нибудь ключ выгружать для его активации?
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Запустить макрос автоматически после выгрузки книги Exel

Сообщение zna »

oiko писал(а):Может имеет смысл макрос сразу в шаблоне прописать и какой нибудь ключ выгружать для его активации?
Макрос прописан в шаблоне Exel, ключ в виде переменной в него передать не проблема, вопрос в том,как запустить макров на выполнение автоматом.
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Запустить макрос автоматически после выгрузки книги Exel

Сообщение Den »

Принципиально макросом нужно сделать ?
Дописать свой код в конец макроса служебного того шаблона, пересохранить шаблон, и пусть последний запускается...?
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Запустить макрос автоматически после выгрузки книги Exel

Сообщение zna »

Den писал(а):Принципиально макросом нужно сделать ?
Дописать свой код в конец макроса служебного того шаблона, пересохранить шаблон, и пусть последний запускается...?
Да, примерно так я и иду, понимая под "служебным" макросом процедуру реакции Экселя на какое-либо событие. Перенёс обсуждение на специализированный форум:http://www.planetaexcel.ru/forum.php?thread_id=32621
lStep
Новичок
Сообщения: 28
Зарегистрирован: 27 июл 2006, 16:49

Re: Запустить макрос автоматически после выгрузки книги Exel

Сообщение lStep »

насчет VBA не знаю.
А когда из Vip выгружаю, то использую 2 (две) книги.
Книга1 - без макросов -шаблон, куда выгружаю данные и метку!!!
Книга2 - макросы, которые запускаю для раскрасок листов, где находим метку.

Итог - отчет без макросов и ругани про безопасность.
Полагаю, если в другую книгу сохранить макрос и открыть её после формирования отчета - должно получится.
Semi-bit
Постоянный обитатель
Сообщения: 123
Зарегистрирован: 01 фев 2007, 12:45
Откуда: Магнитогорск
Контактная информация:

Re: Запустить макрос автоматически после выгрузки книги Exel

Сообщение Semi-bit »

iStep,
автору надо запустить макрос после формирования XLT-отчёта. Исходника на випе, я так понимаю, у него нет. Надо отлавливать события смены или скрытия листа.
Испытываю траблы с даблами
ВИП — Велосипедо-Изобретательская Парадигма
САППОРТ — Сборище Абсолютно Пустых Посредственно Образованных Ржущих Троллей
oiko
Местный житель
Сообщения: 418
Зарегистрирован: 29 мар 2005, 17:49

Re: Запустить макрос автоматически после выгрузки книги Exel

Сообщение oiko »

Если вы сделали шаблон на основе стандартного Галакического (или дизайнером не помню) то он содержит Модуль1 вот с таким текстом. Корежте его как хотите и разукрашивайте.
Option Explicit

' Библиотека сервисных функций формирования отчетов
Public Const GalLibName As String = "GalRepBuilder"
Public Const GalLib As String = GalLibName & ".xla!"

' Книга XLS-БД
Dim DBWB As Workbook

' Получить значение переменной XLS-БД
' по наименованию ее диапозона
Function GetDBVar(sDBVar As String) As Variant
GetDBVar = ""
If Not (DBWB Is Nothing) Then
GetDBVar = Application.Run(GalLib & "GetDBVar", DBWB, sDBVar)
End If
End Function

' Вывести в отчет все переменные и таблицы
' sRepWS - наименование листа
Sub PrintToSheet(sRepWS As String)
If Not (DBWB Is Nothing) Then
Call Application.Run(GalLib & "PrintAllToSWS", DBWB, ThisWorkbook, sRepWS)
End If
End Sub

' Сформировать отчет
' на основании данных заданной XLS-БД
Sub LoadRepFromDB(sDBWB As String)

Set DBWB = Application.Workbooks(sDBWB)
Dim WB As Worksheet

Call PrintToSheet("Отчет")
Set WB = DBWB.Worksheets("Отчет")
'WB.PageSetup.Orientation = xlPortrait
End Sub

' Сформировать отчет
' на основании данных текущей XLS-БД
Sub LoadReport()
LoadRepFromDB (ThisWorkbook.Name)
ThisWorkbook.Worksheets("Gal_VarSheet").Visible = False
ThisWorkbook.Worksheets("Gal_TblSheet").Visible = False
End Sub
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Запустить макрос автоматически после выгрузки книги Exel

Сообщение zna »

Итак, опытным путём установлено, что моментом окончания выгрузки из "Галактики" является событие установки определённого диапазона ячеек. Код такой:

Код: Выделить всё

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If (Sh.Name = "Gal_VarSheet" And Target.Address = "$A$2:$C$1001") Then
Call DownLoad
End If
End Sub
После отработки DownLoad лист "Отчёт" получает нужные данные и форматирование.
Тему можно закрыть, всем в ней написавшим- спасибо!
Ответить