Архив

Публикации с меткой ‘Файлы’

Как из Excel обратиться к другому приложению

Иногда бывает необходимо перенести что-то из Excel в другое приложение. Я возьму для примера Word. Например скопировать ячейки и вставить. Обычно мы это так и делаем — скопировали в Excel, открыли Word — вставили. Но сделать это при помощи кода чуть сложнее, хотя если разобраться никаких сложностей нет. Ниже приведен пример кода, который открывает Word, открывает в нем определенный документ, копирует данные из Excel и вставляет в открытый документ Word.

Sub OpenWord()
    Dim objWrdApp As Object, objWrdDoc As Object
    'создаем новое приложение Word
    Set objWrdApp = CreateObject("Word.Application")
    'Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме
    'objWrdApp.Visible = True
    'открываем документ Word - документ "Doc1.doc" должен существовать
    Set objWrdDoc = objWrdApp.Documents.Open("C:\Doc1.doc")
    'Копируем из Excel диапазон "A1:A10"
    Range("A1:A10").Copy
    'вставляем скопированные ячейки в Word - в начала документа
    objWrdDoc.Range(0).Paste
    'закрываем документ Word с сохранением
    objWrdDoc.Close True    ' False - без сохранения
    'закрываем приложение Word - обязательно!
    objWrdApp.Quit
    'очищаем переменные Word - обязательно!
    Set objWrdDoc = Nothing: Set objWrdApp = Nothing
End Sub
Sub OpenWord()
    Dim objWrdApp As Object, objWrdDoc As Object
    'создаем новое приложение Word
    Set objWrdApp = CreateObject("Word.Application")
    'Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме
    'objWrdApp.Visible = True
    'открываем документ Word - документ "Doc1.doc" должен существовать
    Set objWrdDoc = objWrdApp.Documents.Open("C:\Doc1.doc")
    'Копируем из Excel диапазон "A1:A10"
    Range("A1:A10").Copy
    'вставляем скопированные ячейки в Word - в начала документа
    objWrdDoc.Range(0).Paste
    'закрываем документ Word с сохранением
    objWrdDoc.Close True    ' False - без сохранения
    'закрываем приложение Word - обязательно!
    objWrdApp.Quit
    'очищаем переменные Word - обязательно!
    Set objWrdDoc = Nothing: Set objWrdApp = Nothing
End Sub

В файле-примере, приложенном к данной статье, в комментариях к коду есть несколько добавлений. Например, как вставить текст из ячеек в опрделенные закладки Word-а и как добавить новый документ, а не открывать уже имеющийся. Так же так есть код проверки — открыто ли приложение Word в данный момент. Порой это тоже может пригодиться, чтобы работать с запущенным приложением Word, а не создавать новое:

Sub Check_OpenWord()
    Dim objWrdApp As Object
    On Error Resume Next
    'пытаемся подключится к объекту Word
    Set objWrdApp = GetObject(, "Word.Application")
    If objWrdApp Is Nothing Then
        'если приложение закрыто - создаем новый экземпляр
        Set objWrdApp = CreateObject("Word.Application")
        'делаем приложение видимым. По умолчанию открывается в скрытом режиме
        objWrdApp.Visible = True
    Else
        'приложение открыто - выдаем сообщение
        MsgBox "Приложение Word уже открыто", vbInformation, "Check_OpenWord"
    End If
End Sub
Sub Check_OpenWord()
    Dim objWrdApp As Object
    On Error Resume Next
    'пытаемся подключится к объекту Word
    Set objWrdApp = GetObject(, "Word.Application")
    If objWrdApp Is Nothing Then
        'если приложение закрыто - создаем новый экземпляр
        Set objWrdApp = CreateObject("Word.Application")
        'делаем приложение видимым. По умолчанию открывается в скрытом режиме
        objWrdApp.Visible = True
    Else
        'приложение открыто - выдаем сообщение
        MsgBox "Приложение Word уже открыто", vbInformation, "Check_OpenWord"
    End If
End Sub

В принципе, активировать или вызвать(если закрыто) другое приложение Офиса можно одной строкой:

Sub Open_AnotherApp()
    Application.ActivateMicrosoftApp xlMicrosoftWord
End Sub
Sub Open_AnotherApp()
    Application.ActivateMicrosoftApp xlMicrosoftWord
End Sub

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

По сути, методами CreateObject и GetObject можно обратиться к любому стороннему приложению(например Internet Explorer). Куда важнее при обращении к этим объектам знать объектную модель того приложения, к которому обращаетесь. Чтобы увидеть свойства и методы объектной модели приложения, можно в редакторе VBA подключить необоходимую библиотеку, объявить переменную, назначив ей тип приложения. Покажу на примере того же Word-а.
Для начала открываем меню Tools-References:

Подключаем библиотеку:

Затем объявляем переменную и присваиваем ей тип нужного приложения:

Sub OpenWord()
    Dim objWrdApp As Word.Application
    Set objWrdApp = New Word.Application
    objWrdApp.Visible = True
End Sub
Sub OpenWord()
    Dim objWrdApp As Word.Application
    Set objWrdApp = New Word.Application
    objWrdApp.Visible = True
End Sub

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

Так же можно нажать F2 и через поиск найти Word и просмотреть все методы и свойства данного приложения.

Скачать пример »

  Tips_Macro_OpenWord.xls (49,5 KiB, 112 скачиваний)

Categories: Tags: ,

Как запустить файл с включенными макросами?

22 Октябрь 2011 4 comments

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

Вариант 1:
Самый простой и легко исполняемый способ. Создаете в нужной книге новый лист. Называете его «WARNING». На листе мы пишем инструкцию по действиям пользователя для включения макросов. Что-то типа:
Для работы с файлом требуется разрешить макросы!
Excel 2003:Сервис-Безопасность-Уровень макросов «Низкий»
Excel 2007:Меню-Параметры Excel-Центр управления безопасностью-Параметры центра управления безопасностью-Параметры макросов-Разрешить все макросы.

И скрываем все листы в книге, кроме листа «WARNING». Теперь в остается дело за мылым: в модуль книги вставляете следующий код:

'Данная процедура скрывает перед закрытием книги все листы,
'кроме листа "WARNING"
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.ScreenUpdating = False
    Dim wsSh As Worksheet
    Sheets("WARNING").Visible = -1
    For Each wsSh In ThisWorkbook.Sheets
        If wsSh.Name <> "WARNING" Then wsSh.Visible = 2
    Next wsSh
    ThisWorkbook.Save
End Sub
'Данная процедура показывает перед открытием книги все листы,
'кроме листа "WARNING"
Private Sub Workbook_Open()
    Dim wsSh As Worksheet
    For Each wsSh In ThisWorkbook.Sheets
        wsSh.Visible = -1
    Next wsSh
    ThisWorkbook.Sheets("WARNING").Visible = 2
End Sub
'Данная процедура скрывает перед закрытием книги все листы,
'кроме листа "WARNING"
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.ScreenUpdating = False
    Dim wsSh As Worksheet
    Sheets("WARNING").Visible = -1
    For Each wsSh In ThisWorkbook.Sheets
        If wsSh.Name <> "WARNING" Then wsSh.Visible = 2
    Next wsSh
    ThisWorkbook.Save
End Sub
'Данная процедура показывает перед открытием книги все листы,
'кроме листа "WARNING"
Private Sub Workbook_Open()
    Dim wsSh As Worksheet
    For Each wsSh In ThisWorkbook.Sheets
        wsSh.Visible = -1
    Next wsSh
    ThisWorkbook.Sheets("WARNING").Visible = 2
End Sub

Из кода видно, что если макросы будут отключены, то код Workbook_Open не будет выполнен. Следовательно пользователь увидит только лист «WARNING», на котором у нас написаны инструкции по включению макросов, которые ему в любом случае придется выполнить, если есть желание работать с файлом.

Вариант 2:
Этот способ подразумевает создание отдельного файла, который будет запускать файл Excel. Я предоставлю на выбор либо скрипт VBS, либо созданный мной файл EXE. В чем прелесть. При использовании данного способа совершенно неважно запущен ли уже у пользователя Excel или нет, разрешены ли макросы. Скрипт или EXE сам все запустит и разрешит.
Что такое скрипт VBS? Это обычный текстовый файл, сохраненный с расширением VBS. Такой файл распознается операционной системой как исполняемый и код, расположенный в нем, запускается при двойном щелчке на файле. Чтобы создать такой файл необходимо: создать обычный текстовый файл. Открыть его. Записать в него текст:

test
Sub test()
    Dim objXL
    Dim Secur
    Set objXL = CreateObject("Excel.Application")
    objXL.Visible = TRUE
    secur = objXL.AutomationSecurity
    objXL.AutomationSecurity = 1
    objXL.Workbooks.Open replace(Wscript.ScriptFullName,".vbs",".xls"),,,,"4321"
    objXL.AutomationSecurity = secur
End Sub
test
Sub test()
    Dim objXL
    Dim Secur
    Set objXL = CreateObject("Excel.Application")
    objXL.Visible = TRUE
    secur = objXL.AutomationSecurity
    objXL.AutomationSecurity = 1
    objXL.Workbooks.Open replace(Wscript.ScriptFullName,".vbs",".xls"),,,,"4321"
    objXL.AutomationSecurity = secur
End Sub

Сохранить. Поменять расширение текстового файла с .txt на .vbs.

Если не отображается расширение:
Панель управления-Свойства папки(для Win 7 — Параметры папок)-вкладка «Вид»-Снять галочку с «Скрывать расширение для зарегистрированных типов файлов»

Скрипт запускает файл Excel, имя которого совпадает с именем скрипта и расположенного в той же папке. В примере к статье это файл «Test». Таким образом Вы можете давать любое имя файлу Excel и файлу скрипта, лишь бы они совпадали. Т.е. назвав скрипт «Run», Вы должны будете и файл Excel назвать так же — «Run». В приведенном коде так же есть возможность указать пароль для открытия файла. Это сделано для того, чтобы при попытке запустить файл Excel без скрипта был запрошен пароль. Т.е. без скрипта файлом не воспользоваться.
Плюсы использования скрипта:

  • пользователь совершает минимум действий;
  • макросы разрешены как ни крутись.

Минусы:

  • необходимость создания отдельного файла и привязка к имени;
  • возможность подсмотреть пароль к файлу, просто сменив расширение файла-скрипта на .txt;
  • возможность сменить/снять пароль к файлу после его открытия скриптом(можно избежать, внеся некоторый код в файл. Например сохранять только с нужным паролем). В примере пароль к файлу: 4321


Файл EXE. Долго пояснять не буду. Основные моменты все те же, что и со скриптом, т.к. в принципе это одно и то же, за исключением того, что код файла EXE нельзя подсмотреть, просто сменив расширение. Создается этот файл в специальной программной среде: С++, VisualBasic, VisualStudio и т.п. Основной минус: нельзя поменять пароль к файлу, не скомпилировав новый файл EXE. Т.е. если планируете использовать не с одним файлом, то надо всем им давать один и то же пароль, либо вообще не устанавливать пароль на открытие.

В примере Вы найдете файлы для всех описанных способов.

Скачать пример »

  Run_Wit_Macro.zip (28,1 KiB, 333 скачиваний)

Также см.:
Почему не работает макрос?
Управление безопасностью макросов

Categories: Tags: ,

Как объединить несколько текстовых файлов в один?

 

В общем-то проблема не такая распространенная, как сбор данных из нескольких файлов/листов в Excel, но все же. Решил вот написать, как просто и быстро можно из множества текстовых файлов собрать информацию в один новый текстовый файл. Притом это не потребует от Вас никаких усилий, кроме как нажатия кнопочки и выбора нужных файлов. Ну и скачивания файла с этой странички. Или ручной вставки кода в свою книгу. Собственно, сам код:

Sub Get_All_TXT_Text()
    Dim avFiles, li As Long
    avFiles = Application.GetOpenFilename("TXT Files(*.txt),*.txt", , , , True)
    If VarType(avFiles) = vbBoolean Then Exit Sub
    Dim objFSO As Object, objTxtFile As Object, sTxt, sAllTxt
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    For li = LBound(avFiles) To UBound(avFiles)
        Set objTxtFile = objFSO.OpenTextFile(avFiles(li), 1)
        sTxt = objTxtFile.ReadAll
        sAllTxt = sAllTxt & vbNewLine & sTxt
        objTxtFile.Close
    Next li
    Set objTxtFile = objFSO.CreateTextFile("C:/AllText.txt", True)
    objTxtFile.WriteLine sAllTxt
    objTxtFile.Close
    Set objTxtFile = Nothing: Set objFSO = Nothing
End Sub
Sub Get_All_TXT_Text()
    Dim avFiles, li As Long
    avFiles = Application.GetOpenFilename("TXT Files(*.txt),*.txt", , , , True)
    If VarType(avFiles) = vbBoolean Then Exit Sub
    Dim objFSO As Object, objTxtFile As Object, sTxt, sAllTxt
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    For li = LBound(avFiles) To UBound(avFiles)
        Set objTxtFile = objFSO.OpenTextFile(avFiles(li), 1)
        sTxt = objTxtFile.ReadAll
        sAllTxt = sAllTxt & vbNewLine & sTxt
        objTxtFile.Close
    Next li
    Set objTxtFile = objFSO.CreateTextFile("C:/AllText.txt", True)
    objTxtFile.WriteLine sAllTxt
    objTxtFile.Close
    Set objTxtFile = Nothing: Set objFSO = Nothing
End Sub

Вот и все. Теперь этот код необходимо вставить в стандартный модуль и…Пользоваться!
После работы кода на диске «С» будет создан файл «AllText.txt», в котором и будут содержаться данные всех выбранных файлов.

Скачать пример »

  Tips_Macro_Get_All_TXT_Text.xls (37,5 KiB, 1 107 скачиваний)

Так же см.:
Сбор данных с нескольких листов/книг
Как собрать данные с нескольких листов или книг?

Как получить данные из закрытой книги?

 

Достаточно часто появляется вопрос: как извлечь данные из закрытой книги Excel через VBA? Звучит может быть странновато, но это так: вопрос регулярно поднимается на форумах. Собственно, именно в связи с этим и появилась на свет данная статья. В принципе ничего сложного в задаче нет. Это легко сделать при помощи нескольких строк:

Sub Get_Value_From_Close_Book_Formula()
    Dim sPath As String, sFile As String, sShName As String
    sPath = "C:\Documents and Settings\"
    sFile = "Книга1.xls"
    sShName = "Лист1"
    With Range("A1:A100")
        .Formula = "='" & sPath & "[" & sFile & "]" & sShName & "'!" & "A1:A100"
        .Value = .Value
    End With
End Sub
Sub Get_Value_From_Close_Book_Formula()
    Dim sPath As String, sFile As String, sShName As String
    sPath = "C:\Documents and Settings\"
    sFile = "Книга1.xls"
    sShName = "Лист1"
    With Range("A1:A100")
        .Formula = "='" & sPath & "[" & sFile & "]" & sShName & "'!" & "A1:A100"
        .Value = .Value
    End With
End Sub

Данный код работает достаточно медленно, но с его помощью можно «вытащить» из закрытой книги значения сразу нескольких ячеек. Код ниже работает быстрее, но с его помощью можно извлечь значения лишь одной ячейки:

Sub Get_Value_From_Close_Book_Excel4Macro()
    Dim sPath As String, sFile As String, sShName As String
    Dim sAddress As String, vData
    sPath = "C:\Documents and Settings\"
    sFile = "Книга1.xls"
    sShName = "Лист1"
 
    sAddress = "'" & sPath & "[" & sFile & "]" & sShName & "'!" & Range("A1").Address(ReferenceStyle:=xlR1C1)
    vData = ExecuteExcel4Macro(sAddress)
End Sub
Sub Get_Value_From_Close_Book_Excel4Macro()
    Dim sPath As String, sFile As String, sShName As String
    Dim sAddress As String, vData
    sPath = "C:\Documents and Settings\"
    sFile = "Книга1.xls"
    sShName = "Лист1"

    sAddress = "'" & sPath & "[" & sFile & "]" & sShName & "'!" & Range("A1").Address(ReferenceStyle:=xlR1C1)
    vData = ExecuteExcel4Macro(sAddress)
End Sub

Если честно, сам я не очень-то люблю ни один из данных методов, т.к. они совершенно лишены гибкости. Я предпочитаю открывать книгу. Делаю это, скрывая от пользователя при помощи свойства ScreenUpdating объекта Application.

Sub Get_Value_From_Close_Book()
    Dim sShName As String, sAddress As String, vData
    'Отключаем обновление экрана
    Application.ScreenUpdating = False
    Workbooks.Open "C:\Documents and Settings\Книга1.xls"
    sAddress = "A1:C100" 'или одна ячейка - "A1"
    'получаем значение
    vData = Sheets("Лист1").Range(sAddress).Value
    ActiveWorkbook.Close False
    'Записываем данные на активный лист книги,
    'с которой запустили макрос
    If IsArray(vData) Then
        [A1].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
    Else
        [A1] = vData
    End If
    'Включаем обновление экрана
    Application.ScreenUpdating = True
End Sub
Sub Get_Value_From_Close_Book()
    Dim sShName As String, sAddress As String, vData
    'Отключаем обновление экрана
    Application.ScreenUpdating = False
    Workbooks.Open "C:\Documents and Settings\Книга1.xls"
    sAddress = "A1:C100" 'или одна ячейка - "A1"
    'получаем значение
    vData = Sheets("Лист1").Range(sAddress).Value
    ActiveWorkbook.Close False
    'Записываем данные на активный лист книги,
    'с которой запустили макрос
    If IsArray(vData) Then
        [A1].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
    Else
        [A1] = vData
    End If
    'Включаем обновление экрана
    Application.ScreenUpdating = True
End Sub

При таком подходе пользователь разницы не увидит, а действия можно производить с ячейками разные: и сравнение, и отбор по критериям, и фильтровать, и сортировать и т.д. Но выбирать метод получения значений из закрытых книг вам. Все зависит от ситуации….

Categories: Tags: ,

Как программно снять пароль с VBA проекта?

 

Предположу, что не очень многим может понадобиться снимать пароль с проекта VBA средствами самого VBA. Но все же данная тема имеет спрос, как я смог убедиться, общаясь на форумах. Прежде всего это может пригодиться тем, кто создает свои приложения на VBA и периодически нужно вносить изменения в уже созданные проекты(например копирование модулей и кодов из одного проекта в другой). Сразу оговорюсь: я не рассматриваю ситуации, когда вам не известен пароль к проекту. Предполагается, что вы знаете пароль и можете снять его вручную.

Я лично знаю два способа снять пароль программно: через метод SendKeys и использовании функций API. Т.к. второй способ довольно громоздкий и сложный для понимания — я в данной статье опишу лишь первый способ. Он не содежит каких-либо изысков и довольно прост.

Sub Unprotect_VBA()
    Dim objVBProject As Object, objVBComponent As Object, objWindow As Object
 
    Workbooks.Open "C:\1.xls"
    Set objVBProject = ActiveWorkbook.VBProject
    'просматриваем все окна проекта в поисках окна снятия защиты
    For Each objWindow In objVBProject.VBE.Windows
        ' Type = 6 - это нужное нам окно
        If objWindow.Type = 6 Then
            objWindow.Visible = True
            objWindow.SetFocus: Exit For
        End If
    Next
    'вводим пароль и подтверждаем ввод
    SendKeys "~1234~", True: SendKeys "{ENTER}", True
    'здесь Ваш код по внесению изменений в проект
    Set objVBProject = Nothing: Set objVBComponent = Nothing: Set objWindow = Nothing
    ActiveWorkbook.Close True
End Sub
Sub Unprotect_VBA()
    Dim objVBProject As Object, objVBComponent As Object, objWindow As Object

    Workbooks.Open "C:\1.xls"
    Set objVBProject = ActiveWorkbook.VBProject
    'просматриваем все окна проекта в поисках окна снятия защиты
    For Each objWindow In objVBProject.VBE.Windows
        ' Type = 6 - это нужное нам окно
        If objWindow.Type = 6 Then
            objWindow.Visible = True
            objWindow.SetFocus: Exit For
        End If
    Next
    'вводим пароль и подтверждаем ввод
    SendKeys "~1234~", True: SendKeys "{ENTER}", True
    'здесь Ваш код по внесению изменений в проект
    Set objVBProject = Nothing: Set objVBComponent = Nothing: Set objWindow = Nothing
    ActiveWorkbook.Close True
End Sub

Код сначала открывает необходимую книгу, а затем снимает пароль с проекта.

«C:\1.xls» — полный путь к книге, включая расширение файла.

«~1234~» — пароль к проекту. Тильды нужны, но они не являются частью кода. Т.е. сам код это — 1234.

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

Также см.:
Копирование модулей и форм из одной книги в другую
Как удалить макросы в книге?

Categories: Tags: ,

Как проверить открыта ли книга?

 

Собственно суть темы отражена в названии. Как при выполнении кода из VBA узнать перед обращением к книге открыта она или нет? Ведь если книга закрыта, то обращение к ней вызовет ошибку, а если открывать без проверки — то это может повлечь за собой утерю данных, если предварительно эта книга не была сохранена. Ни один ни второй вариант, естественно, не устраивают. Я покажу два способа проверки через функции. Если функция вернет True — книга открыта, если False — закрыта. Для проверки функций используем проверочную процедуру Check_Open_Book:

Sub Check_Open_Book()
    If bBookOpen("Книга1.xls") Then
        MsgBox "Книга открыта", vbInformation, "Сообщение"
    Else
        MsgBox "Книга закрыта", vbInformation, "Сообщение"
    End If
End Sub
Sub Check_Open_Book()
    If bBookOpen("Книга1.xls") Then
        MsgBox "Книга открыта", vbInformation, "Сообщение"
    Else
        MsgBox "Книга закрыта", vbInformation, "Сообщение"
    End If
End Sub

Данная процедура вызывает функцию bBookOpen, передавая ей в качестве параметра имя книги, «открытость» которой мы хотим проверить. Я приведу два варианта самой функции bBookOpen.
Вариант 1:

Function bBookOpen(wbName As String) As Boolean
    Dim wbBook As Workbook
    For Each wbBook In Workbooks
        If wbBook.Name <> ThisWorkbook.Name Then
            If Windows(wbBook.Name).Visible Then
                If wbBook.Name = wbName Then bBookOpen = True: Exit For
            End If
        End If
    Next wbBook
End Function
Function bBookOpen(wbName As String) As Boolean
    Dim wbBook As Workbook
    For Each wbBook In Workbooks
        If wbBook.Name <> ThisWorkbook.Name Then
            If Windows(wbBook.Name).Visible Then
                If wbBook.Name = wbName Then bBookOpen = True: Exit For
            End If
        End If
    Next wbBook
End Function

Функция просматривает все открытые книги и если находит среди них книгу с указанным именем, то функция возвращает True. Есть небольшая особенность — функция исключает скрытые книги(это либо надстройки, либо PERSONAL.XLS). Так же из просмотра исключена та книга, в которой расположен сам код. Если Вам нужно проверить наличие книги независимо от её видимости, то необходимо просто заменить блок

    If Windows(wbBook.Name).Visible Then
        If wbBook.Name = wbName Then bBookOpen = True: Exit For
    End If
    If Windows(wbBook.Name).Visible Then
        If wbBook.Name = wbName Then bBookOpen = True: Exit For
    End If

на одну строку(просто убрать лишнее условие проверки)

    If wbBook.Name = wbName Then bBookOpen = True: Exit For
    If wbBook.Name = wbName Then bBookOpen = True: Exit For

Либо можно воспользоваться Вариантом 2:

Function bBookOpen(wbName As String) As Boolean
    Dim wbBook As Workbook: On Error Resume Next
    Set wbBook = Workbooks(wbName)
    bBookOpen = Not wbBook Is Nothing
End Function
Function bBookOpen(wbName As String) As Boolean
    Dim wbBook As Workbook: On Error Resume Next
    Set wbBook = Workbooks(wbName)
    bBookOpen = Not wbBook Is Nothing
End Function

Данный способ обращается к любой открытой книге — будь то PERSONAL.XLS или надстройка.

Также см.:
Как узнать существует ли лист в книге?

Categories: Tags: ,

Путь к файлу

 
С помощью данной команды можно вставить полное имя файла(полное — имеется ввиду путь к файлу и имя файла, включая расширение), путь к папке указанного файла и путь к нескольким указанным файлам. Для чего это нужно? Ну во-первых это может пригодится при использовании данной надстройки, т.к. некоторые команды, представленные в ней, требуют указания пути к файлу. Во-вторых и в-третьих я еще не придумал, но может быть кому пригодится и для других целей.
Путь к файлу

Полный путь, включая имя файла — вставляет в активную ячейку полный путь к указанному файлу(например «C:\Documents and Settings\Мои документы\Мои рисунки\Новый рисунок (1).bmp«).

Путь только к папке с указанным файлом — вставляет в активную ячейку путь к папке, в которой находится указанный файлC:\Documents and Settings\Мои документы\Мои рисунки«).

Занести последовательно в ячейки пути ко всем выбранным файлам — в данном случае Вы выбираете сразу группу файлов и полный путь каждого файла будет занесен в новую ячейку, начиная от активной. Например: у Вас активна ячейка А1. Вы жмете кнопку Путь к файлу, выбираете, скажем, 3 файла — Текст1, Текст2 и Текст3, расположенных в »C:\Documents and Settings\Мои документы«. После нажатия кнопки Ок:

  • в ячейку А1 будет занесено значение »C:\Documents and Settings\Мои документы\ Текст1.txt«;
  • в ячейку А2 - »C:\Documents and Settings\Мои документы\ Текст2.txt«;
  • в ячейку А3 — «C:\Documents and Settings\Мои документы\ Текст3.txt«.

Последовательность может отличаться от приведенной в примере.

Поиск по всем книгам

 

Достаточно актуальная на мой взгляд проблема. Если у Вас одновременно открыто несколько книг и необходимо найти какое-либо значение просматривая именно ВСЕ книги. Excel, как ни странно этого делать не умеет… Возможен лишь поиск по всем листам активной книги. Я решил немного исправить такую несправедливость и сделал команду «Поиск по всем книгам«. Данная команда делает все то же самое, что и стандартный поиск, но может искать заданное значение по всем открытым книгам. И небольшая особенность — при указании пустого значения в поле «Найти:» и выполнения поиска появиться предупреждение:

Если не задан критерий поиска рис.1

Если нажать «Да», то будут выведены адреса первых пустых ячеек на листе/листах/книгах. Я еще опишу данный момент поподробнее.
Итак, Вы решили воспользоваться данной командой.

Поиск по всем книгам рис.2

Найти: - указывается значение для поиска. Может быть любой символ.

Искать:

  • на листе — поиск указанного значения осуществляется только на активном листе;
  • в книге — поиск осуществляется во всех листах активной книги(скрытые листы не просматриваются);
  • во всех книгах — поиск осуществляется по всем открытым книгам на видимых листах(скрытые листы не просматриваются).

Просматривать:

  • по строкам — поиск ведется слева-направо сверху-вниз — т.е. сначала просматривается каждая ячейка строки, а потом осуществляется переход на следующую строку;
  • по столбцам — поиск ведется сверху-вниз слева-направо — сначала просматривается каждая ячейка столбца, а потом осуществляется переход на следующий столбец.
  • Выбранный метод влияет на вывод результатов поиска(при выборе Найти все) и на переход по найденным ячейкам(Найти далее).

Область поиска:

  • формулы — поиск будет осуществляться по действительному содержимому ячейки(то, которое отображается в строке формул при активации ячейки), а не по отображаемому значению;
  • значения — поиск будет осуществляться отображаемому содержимому ячейки;
  • примечания — поиск осуществляется исключительно в тексте примечаний в ячейках.

Везде(по умолчанию) — поиск будет осуществляться по всему листу.
Только выделенный диапазон — поиск будет осуществляться по выделенному диапазону. Диапазон задается один для всех листов, исходя из выделенного на активном листе диапазона.
Найти все — результаты поиска будут выведены в поле, отображаемое после поиска. При нажатии на любое из найденных значений выбранное значение будет активировано. Если критерий поиска не задан(пустое значение), то в поле будут выведены адреса всех первых пустых ячеек на листах(зависит от выбранного метода просмотра — Просматривать).
Найти далее — будет активироваться каждое найденное значение по кругу.

Также см.:
Как заменить/удалить/найти звездочку?
Как определить последнюю ячейку на листе через VBA?
Как получить последннюю заполненную ячейку формулой?
Как найти значение в другой таблице или сила ВПР

Удаление макросов из активной книги

 

Скорей всего, команда понадобится немногим, т.к. слегка специфична. Она удаляет все указанные компоненты VBA проекта. Может пригодится в случаях, если Вы сначала обрабатываете отчет с помощью различных макросов(записанных макрорекордером или созданных иным способом), которые размещены непосредственно в этом отчете. Но отправить этот отчет Вам надо без всех этих макросов. Если все они находятся в одном модуле — это не проблема. А если нет? Если у Вас помимо стандартных модулей есть еще Пользовательские формы(UserForm), Модули классов(ClassModule) и коды в листах? Тут поболее минуты времени может потребоваться. И чтобы это время сократить до минимума можно воспользоваться данной командой.

Удаление макросов

Стандартные модули(Modules) — будут удалены все стандартные модули из проекта активной книги.

Модули классов(Class Modules)> — будут удалены все модули классов из проекта активной книги.

Пользовательские формы(UserForms) — будут удалены все пользовательские формыиз проекта активной книги.

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

Примечание: VBA проект книги, из которой планируется удаление макросов не должен быть защищен, иначе появится окно, сообщающее о наличии защиты. Макросы не будут удалены.

Также см.:
Как программно снять пароль с VBA проекта?
Копирование модулей и форм из одной книги в другую

Сбор данных с нескольких листов/книг

 
Еще одна распространенная проблема, с которой сталкивались многие, кто работает в Excel. Когда необходимо собрать данные за месяц, год, годы… А данные расположены в разных папках, книгах и не на одном листе. И руками собирать не всегда быстро получается, особенно если книг более 50.
Данная команда поможет сделать это чуть быстрее.

Собрать данные со всех листов выбранных книг — собираются данные со всех листов книг, которые присутствуют в ListBox(окно с именами файлов).

Собрать данные с одного листа выбранных книг — данные собираются только с листа, имя которого совпадает с указанным в поле. Делится на два значения:

  • Номер листа — указывается порядковый номер листа, с которого собирать данные. Можно применять символы подстановки — * и ?. Например, указав 1* Вы в итоге соберете данные со всех листов, индекс которых начинается с 1(1,10,11,12,13,…,101,102 и т.д.), а указав 1? — 10,11,12,…,19.
  • Имя листа — указывается имя листа, с которого собирать данные. Также как и с номером можно применять символы подстановки — * и ?. Взять пример с рисунка — *отчет*. Данные будут собраны со всех листов, в имени которых встречается «отчет» — первый отчет, 2 отчет, отчет №3, четвертый отчет за период и т.д.

Собрать данные со всех листов текущей книги — собираются данные со всех листов(кроме активного) активной книги.

Собирать диапазоны, начиная с указанной ячейки — данные с листов будут собираться начиная с ячейки, указанной в окне выбора. На рисунке указан адрес — Лист3!$A$5, следовательно данные будут собираться начиная именно с этой ячейки. Может пригодится, если в Ваших данных присутствуют заголовки, шапки и прочее. Просто указываете ячейку, с которой начинаются действительные данные. Применяя данную опцию необходимо следить, чтобы структура документов во всех книгах была одинакова.

Собирать только выбранный диапазон — будут собраны только указанные диапазоны. Актуально в случае, когда помимо шапки, есть еще и подпись(или что-то наподобии её).

Копировать только строку, в которой присутствует значение: — включение данной опции позволяет копировать из диапазонов листов лишь те строки, в ячейках которых присутствует указанное в текстовом поле значение. Можно применять символы подстановки — * и ?. На рисунке введено слово «*итог*«. Значит скопированы будут лишь те строки, в ячейках которых будет найдено слово или словосочетание, содержащие «итог«. Это и «подитог» и «промежуточный итог«, и «итого» и т.д.

Заданное значение  будет искаться в диапазоне, указанном в этом же разделе. Например, если выбран пункт Собирать только выбранный диапазон, то значение «итог» будет искаться только в этом диапазоне листа. И скопирована будет только строка, не выходящая за пределы указанного диапазона.

Копировать только значения и форматы — в итоговый лист будут скопированы исключительно значения и форматы с выбранных файлов/листов. Это значит, что если в каких-либо листах есть формулы, то будет скопирован лишь результат их вычислений — сами формулы на итоговый лист не попадут. Может пригодиться, когда на листах для сбора есть много формул, ссылающихся на разные листы и книги. При копировании таких формул в итоговом листе может появиться ошибочное значение(#ССЫЛКА!, #Н/Д и др.).


Собирать с листа данные, если содержимое ячейки равно:

  • Значению — в итоговый лист будут собраны данные лишь с тех листов, значение указанной ячейки в которых равно записанному в данное поле. Можно применять символы подстановки — * и ?. Если оставить пустым — появится сообщение, предупреждающее о пустом поле. Вы сможете либо согласиться собирать данные, если ячейка пустая, либо отменить выполнение и заполнить поле  значением. В примере указано значение «Ведомость» и ячейка, которой это значение просматривать: Лист3!$A$1. Значит данные будут собираться только с тех листов, содержимое ячейки A1 равно Ведомость.
  • Содержимому ячейки — в итоговый лист будут собраны данные лишь с тех листов, значение указанной ячейки в которых равно значению в этой ячейке.

Добавить имена листов перед данными — в итоговый лист будет добавлен столбец, в который напротив каждого значения будет записано имя листа, с которого эти данные были занесены. Столбец добавляется первым столбцом, т.е. перед данными.

Добавить имена книг перед данными — в итоговый лист будет добавлен столбец, в который напротив каждого значения будет записано имя книги, с которой эти данные были занесены. Столбец добавляется первым столбцом(если также был выбран пункт — Добавить имена листов перед данными — то информация об именах книг будет добавлена перед информацией об именах листов). Пункт недоступен при выборе Собрать данные со всех листов текущей книги.


Преобразовать выбранные файлы в формат «.xlsx» — 2007 Excel — активна только при использовании надстройки в версии Excel, старше 2003. Преобразует выбранные для обработки файлы в формат 2007 Excel. Необходимо для тех случаев, когда собираемые данные могут занять больше места на листе, чем 65536 строк(максимум для 2003 Excel). А дело в том, что даже работая в 2007 Excel с файлами 2003 Вы сталкиваетесь со всеми ограничениями 2003 Excel(за исключением формул — они будут работать, но только при открытии файла в 2007).

Удалить преобразованные файлы после сбора данных — все в названии самого пункта. Если преобразованные файлы Вам не нужны после сбора данных — они удаляются. Исходники при этом никаким образом не пострадают.

Обновлять связи при открытии книг — по умолчанию данная опция отключена, т.к. в противном случае при открытии книги со связями будет появляться сообщении с предложением обновить или нет и так для каждой книги. А это редко когда требуется. Но если все же требуется обновлять связи — просто включите опцию.

Дополнение: Если полный путь к файлу не помещается в окне выбора файлов, а посмотреть его надо, то можно просто выделить этот файл в окне выбора файлов и внизу формы будет отображен полный путь к файлу.

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

Также см.:
Как собрать данные с нескольких листов или книг?
Как объединить несколько текстовых файлов в один?
Создание отдельных книг из листов текущей книги