Страница 1 из 1

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

Добавлено: 07 окт 2011, 16:30
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, может кто решал такую задачу.

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

Добавлено: 07 окт 2011, 19:36
oiko
Может имеет смысл макрос сразу в шаблоне прописать и какой нибудь ключ выгружать для его активации?

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

Добавлено: 09 окт 2011, 19:09
zna
oiko писал(а):Может имеет смысл макрос сразу в шаблоне прописать и какой нибудь ключ выгружать для его активации?
Макрос прописан в шаблоне Exel, ключ в виде переменной в него передать не проблема, вопрос в том,как запустить макров на выполнение автоматом.

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

Добавлено: 09 окт 2011, 21:11
Den
Принципиально макросом нужно сделать ?
Дописать свой код в конец макроса служебного того шаблона, пересохранить шаблон, и пусть последний запускается...?

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

Добавлено: 10 окт 2011, 09:28
zna
Den писал(а):Принципиально макросом нужно сделать ?
Дописать свой код в конец макроса служебного того шаблона, пересохранить шаблон, и пусть последний запускается...?
Да, примерно так я и иду, понимая под "служебным" макросом процедуру реакции Экселя на какое-либо событие. Перенёс обсуждение на специализированный форум:http://www.planetaexcel.ru/forum.php?thread_id=32621

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

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

Итог - отчет без макросов и ругани про безопасность.
Полагаю, если в другую книгу сохранить макрос и открыть её после формирования отчета - должно получится.

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

Добавлено: 12 окт 2011, 10:28
Semi-bit
iStep,
автору надо запустить макрос после формирования XLT-отчёта. Исходника на випе, я так понимаю, у него нет. Надо отлавливать события смены или скрытия листа.

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

Добавлено: 12 окт 2011, 13:38
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

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

Добавлено: 12 окт 2011, 15:29
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 лист "Отчёт" получает нужные данные и форматирование.
Тему можно закрыть, всем в ней написавшим- спасибо!