Как использовать макрос из другой книги?

Программирование на Visual Basic for Applications
mavrados
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 12.09.2006 (Вт) 12:04

Как использовать макрос из другой книги?

Сообщение mavrados » 12.09.2006 (Вт) 12:53

Добрый день! подскажите!

Есть программа, которая генерит отчеты в EXCELе. В отчете много листов. Задача: сохранить каждый лист отчета в отдельном файле.

есть макрос:

Sub SplitWorkbook()
Dim ws As Worksheet
Dim DisplayStatusBar As Boolean
DisplayStatusBar = Application.DisplayStatusBar
Application.DisplayStatusBar = True
Application.ScreenUpdating = False

For Each ws In ThisWorkbook.Sheets
Dim NewFileName As String
Application.StatusBar = "осталось рабочих листов: " & _
ThisWorkbook.Sheets.Count

If ThisWorkbook.Sheets.Count <> 1 Then
NewFileName = ThisWorkbook.Path & "\" & ws.Name & _
".xls"
ws.Copy
ActiveWorkbook.Sheets(1).Name = "Sheet1"
ActiveWorkbook.SaveAs Filename:=NewFileName
ActiveWorkbook.Close SaveChanges:=False
Else
NewFileName = ThisWorkbook.Path & "\" & ws.Name & _
".xls"
ws.Name = "Sheet1"
ThisWorkbook.SaveAs Filename:=NewFileName
End If
Next
Application.StatusBar = False
Application.DisplayStatusBar = DisplayStatusBar
Application.ScreenUpdating = True

End Sub

Я сделал так:
Создал книгу с макросом и разместил ее в XLSTART. таким образом пользователю необходимо зайти Сервис-макрос-Редактор Visual Basic и перетащить модуль с макросом из одной книги в другую, а затем выполнить макрос.

Но для пользователей этот способ оказался сложным...

Может кто подскажет более простой способ?
Заранее благодарен.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.09.2006 (Вт) 13:05

А не проще ли копировать лист в новую книгу и сохранять эту новую книгу?
Lasciate ogni speranza, voi ch'entrate.

mavrados
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 12.09.2006 (Вт) 12:04

Сообщение mavrados » 12.09.2006 (Вт) 13:16

Увы! не проще... :(

листов много.

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 12.09.2006 (Вт) 14:09

Я бы сунул след. процедуру в некий перманентный add-in или как у тебя в файл в XLSTART и заставил бы юзера только запускать макрос и указывать путь к файлу с отчетом (но не содерж. макросов). Т.ч. копировать юзеру ничего не придется.

Код: Выделить всё
Option Explicit
Sub SplitWorkbook()

    Dim wb As Workbook
    Dim wbName As Variant
    Dim shcount As Long
    Dim i As Long
    Dim DisplayStatusBar As Boolean
   
    'Store initial UI
    DisplayStatusBar = Application.DisplayStatusBar
   
    With Application
        'Ask the user to choose the file
        wbName = .GetOpenFilename("Excel Files *.xls, *.xls")
       
        'Check if the file is already open
        If wbName = False Then Exit Sub
        On Error Resume Next
        Set wb = Workbooks(wbName)
        On Error GoTo 0
        If wb Is Nothing Then Set wb = Workbooks.Open(wbName, False)
       
        shcount = wb.Sheets.Count
        'Set the UI
        .DisplayStatusBar = True
        .ScreenUpdating = False
        'Start the StatusBar progress indicator
        .StatusBar = "осталось рабочих листов: " & shcount
   
        For i = 1 To shcount
            wb.Sheets(i).Copy
            'Disable alerts if files with the same name found (overwrite w/o prompting)
            .DisplayAlerts = False 'overwrites without prompting
            With ActiveWorkbook
                .SaveAs .Sheets(1).Name & ".xls"
                .Sheets(1).Name = "Sheet1"
                .Close True
            End With
            'Resume Alerts
            .DisplayAlerts = True
            'Update the StatusBar progress indicator
            .StatusBar = "осталось рабочих листов: " & shcount - i
        Next
       
        'Reset the UI
        .StatusBar = False
        .DisplayStatusBar = DisplayStatusBar
        .ScreenUpdating = True
    End With
   
    'Notify user of the result
    MsgBox "GAME OVER!!! YOU WIN!!!"
   
End Sub
Привет,
KL

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 12.09.2006 (Вт) 14:12

Запускать макрос юзер может например с пом. Alt+F8
Привет,
KL

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 12.09.2006 (Вт) 14:19

Поправка:

Вместо Set wb = Workbooks(wbName)
должно быть: Set wb = Workbooks(Dir(wbName))

Код: Выделить всё
Option Explicit
Sub SplitWorkbook()

    Dim wb As Workbook
    Dim wbName As Variant
    Dim shcount As Long
    Dim i As Long
    Dim DisplayStatusBar As Boolean
   
    'Store initial UI
    DisplayStatusBar = Application.DisplayStatusBar
   
    With Application
        'Ask the user to choose the file
        wbName = .GetOpenFilename("Excel Files *.xls, *.xls")
       
        'Check if the file is already open
        If wbName = False Then Exit Sub
        On Error Resume Next
        Set wb = Workbooks(Dir(wbName))
        On Error GoTo 0
        If wb Is Nothing Then Set wb = Workbooks.Open(wbName, False)
       
        shcount = wb.Sheets.Count
        'Set the UI
        .DisplayStatusBar = True
        .ScreenUpdating = False
        'Start the StatusBar progress indicator
        .StatusBar = "осталось рабочих листов: " & shcount
   
        For i = 1 To shcount
            wb.Sheets(i).Copy
            'Disable alerts if files with the same name found (overwrite w/o prompting)
            .DisplayAlerts = False 'overwrites without prompting
            With ActiveWorkbook
                .SaveAs .Sheets(1).Name & ".xls"
                .Sheets(1).Name = "Sheet1"
                .Close True
            End With
            'Resume Alerts
            .DisplayAlerts = True
            'Update the StatusBar progress indicator
            .StatusBar = "осталось рабочих листов: " & shcount - i
        Next
       
        'Reset the UI
        .StatusBar = False
        .DisplayStatusBar = DisplayStatusBar
        .ScreenUpdating = True
    End With
   
    'Notify user of the result
    MsgBox "GAME OVER!!! YOU WIN!!!"
   
End Sub
Привет,
KL

mavrados
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 12.09.2006 (Вт) 12:04

Сообщение mavrados » 12.09.2006 (Вт) 15:00

:D Спасибо!

Так лучше! Вот еще бы кто подсказал как избежать промежуточного сохранения отчета и я был бы совсем счастлив :D


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 52

    TopList