Excel vba если файл открыт то закрыть

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

Здравствуйте.
Подскажите пожалуйста, как избавиться от ошибки. Если файл открыт, то не отрывать, если закрыт, то
Workbooks.Open FileName:=»F:ЛогистикаКнига.XLSM»

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Ёк-Мок

Пользователь

Сообщений: 1775
Регистрация: 16.01.2013

«on error resume next»?

Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.

 

Казанский

Пользователь

Сообщений: 8839
Регистрация: 11.01.2013

#3

14.04.2015 10:20:18

1 способ

Код
Dim wb As Workbook
On Error Resume Next
Set wb = Workbooks("Книга.XLSM")
If Err Then 'книга не открыта
  Err.Clear
  Set wb = Workbooks.Open(Filename:="F:ЛогистикаКнига.XLSM")
End If
On Error GoTo 0
'...

2 способ

Код
Set wb = GetObject("F:ЛогистикаКнига.XLSM")
wb.Windows(1).Visible = True

Если книга не открыта, она будет открыта, но в невидимом режиме, и лучше сделать ее видимой.

Изменено: Казанский14.04.2015 10:23:31

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

#5

14.04.2015 11:06:36

Вроде ошибка исчезла, но теперь копирование на Лист «Шате-М» не происходит.
???

Скрытый текст

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

The_Prist

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#6

14.04.2015 11:20:22

Код
Set Wb = GetObject("F:ЛогистикаКнига.XLSM")
Wb.Windows(1).Visible = True 
Workbooks.Open FileName:="F:ЛогистикаКнига.XLSM"

Либо Open, либо GetObject

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

Спасибо большое. Заработало.
:)

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Бывает GetObject() барахлит… Вдруг и неожиданно на файлах, которые (другие оттуда же) ранее открывались без проблем.
Ктоб сказал почему?

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

Тоже с этим сталкивался. Теперь всегда делаю через Workbooks.Open

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

Нет, при открытом файле «F:ЛогистикаКнига.XLSM» всё-таки не работает, при закрытом полный порядок.

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

The_Prist

Пользователь

Сообщений: 14181
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#11

14.04.2015 12:23:45

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

Берете оттуда функцию IsBookOpen. Далее:

Код
If IsBookOpen("Книга.XLSM")Then
    Set Wb = Workbooks("Книга.XLSM")
Else
    Set Wb = Workbooks.Open FileName:="F:ЛогистикаКнига.XLSM"
EndIf

и потом уже к Wb обращаетесь. Все должно работать.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#12

14.04.2015 13:13:32

Доброе время суток
Владимир, попробуйте такой функцией определить открыт ли файл

Код
Public Function IsFileOpen(ByVal FileName As String) As Boolean
On Error GoTo errHandle
    Dim fso As Object, pStream As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set pStream = fso.OpenTextFile(FileName, 8)
    pStream.Close
    IsFileOpen = False
Exit Function
errHandle:
    IsFileOpen = True
End Function
 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

#13

14.04.2015 13:37:27

IsBookOpen всё время артачится — ошибку выдаёт, чем только не обзывал — Boolean, Srting, Workbook, Name

Код
...
On Error Resume Next
    If IsBookOpen("Книга.xlsm") Then
        Set Wb = Workbooks("Книга.xlsm")
    Else
        Workbooks.Open FileName:="F:ЛогистикаКнига.xlsm"""
    End If
Set Wb = GetObject("F:ЛогистикаКнига.xlsm")
Wb.Windows(1).Visible = True
....

Изменено: Владимир14.04.2015 13:38:20

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#14

14.04.2015 13:49:00

Владимир, немного не так

Код
Public Sub Test()
    'если файл не открыт, то открыть его
    If Not IsFileOpen("F:ЛогистикаКнига.xlsm") Then
        Workbooks.Open FileName:="F:ЛогистикаКнига.xlsm"
        'иначе, по условию #1, ничего не делаем (не открываем)
    End If
End Sub
 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

Никак не пойму, зачем в данном случае огород с IsFileOpen?
В #3 вполне рабочий код, и без всяких выкрутасов.
Только не надо было его кастрировать, и применять оба способа одновременно.

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

Андрей, теперь на IsFileOpen ругается. Да как же их объявить?

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#17

14.04.2015 14:00:17

RAN, А если файл открыт в другом экземпляре Excel?
Владимир, а как ругается? Для страховки код полностью

Код
Public Function IsFileOpen(ByVal FileName As String) As Boolean
On Error GoTo errHandle
    Dim fso As Object, pStream As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set pStream = fso.OpenTextFile(FileName, 8)
    pStream.Close
    IsFileOpen = False
Exit Function
errHandle:
    IsFileOpen = True
End Function

Public Sub Test()
    'если файл не открыт, то открыть его
    If Not IsFileOpen("c:IntelxlIns.xlsb") Then
        Workbooks.Open FileName:="c:IntelxlIns.xlsb"
        'иначе по условию #1 ничего не делаем (не открываем)
    End If
End Sub

с моими проверочными данными

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

Открываю с web_a  исходный файл, параллельно открыт файл «Книга.xlsm» куда копируются данные. Запускаю макрос и происходит выделение «IsFileOpen»..

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#19

14.04.2015 14:20:02

Цитата
Андрей VG написал: RAN, А если файл открыт в другом экземпляре Excel?

А если на другом компьютере? :D
Тогда без огорода никак.
Конкретизировать надо, однако.

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Ещё вариант — перебрать все открытые книги и у каждой проверить полный путь (совпадает ли с нужным) — так не спутаете книги, если у них одинаковые названия, но лежат в разных папках (и открыта например ненужная).

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

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

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Вообще-то у меня нет никакой ошибки в первоначальном коде (и ранее помню не было ошибок). Проверьте путь.

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#23

14.04.2015 14:46:33

Цитата
Владимир написал: Этот файл у меня постоянно открыт, т.к. он является основным рабочим.

Код из #3 как раз именно для этого случая.

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

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

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

А там на строке With Sheets(«Шате-М») спотыкается.

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Где там? :)

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#27

14.04.2015 15:00:09

Код
With Wb.Sheets("Шате-М") 

или

Код
With oWb.Sheets("Шате-М"

)
В зависимости от того, в какой книге нужный лист.

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

Андрей, точно. Вот где собакин порылся. Приставку забыл.
Вот я балбес..:D

Спасибо. Теперь с открытой книгой тоже работает.
Ребята, всем спасибо.

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

#29

19.02.2016 11:49:11

Алексей, спасибо.
..давеча твой метод освоил.

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

Содержание

  1. Открытие / закрытие книги VBA
  2. Откройте книгу в VBA
  3. Открыть книгу из пути
  4. Открыть книгу — ActiveWorkbook
  5. Откройте книгу и назначьте переменной
  6. Диалог открытия файла книги
  7. Открыть новую книгу
  8. Открыть новую книгу в переменной
  9. Синтаксис открытой книги
  10. Открыть книгу только для чтения
  11. Открыть книгу, защищенную паролем
  12. Примечания к синтаксису Open Workbook
  13. Закройте книгу в VBA
  14. Закрыть конкретную книгу
  15. Закрыть активную книгу
  16. Закройте все открытые книги
  17. Закрыть первую открытую книгу
  18. Закрыть без сохранения
  19. Сохранить и закрыть без запроса
  20. Другие примеры открытых книг
  21. Открыть несколько новых книг
  22. Открыть все книги Excel в папке
  23. Проверьте, открыта ли рабочая книга
  24. Workbook_Open Событие
  25. VBA Excel. Открыта или закрыта книга (проверка состояния)
  26. Проверка по краткому имени
  27. Использование объектной переменной
  28. Перебор открытых книг циклом
  29. Проверка по полному имени
  30. Примеры проверки состояния книги
  31. По краткому имени
  32. По полному имени
  33. 6 комментариев для “VBA Excel. Открыта или закрыта книга (проверка состояния)”
  34. Свойства и методы ActiveWorkbook
  35. Краткое руководство по книге VBA
  36. Начало работы с книгой VBA
  37. Доступ к рабочей книге VBA по индексу
  38. Поиск всех открытых рабочих книг
  39. Открыть рабочую книгу
  40. Проверить открыта ли книга
  41. Закрыть книгу
  42. Сохранить книгу
  43. Копировать книгу
  44. Использование диалогового окна «Файл» для открытия рабочей книги
  45. Использование ThisWorkbook
  46. Использование ActiveWorkbook
  47. Примеры доступа к книге
  48. Объявление переменной VBA Workbook
  49. Создать новую книгу
  50. With и Workbook
  51. Резюме
  52. Заключение

Открытие / закрытие книги VBA

В этом руководстве вы узнаете, как использовать VBA для открытия и закрытия книги Excel несколькими способами.

VBA позволяет открывать или закрывать файлы стандартными методами. .Открытым а также .Закрывать.

Если вы хотите узнать, как проверить, существует ли файл, прежде чем пытаться открыть файл, вы можете щелкнуть по этой ссылке: VBA File Exists

Откройте книгу в VBA

Открыть книгу из пути

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

1 Рабочие книги. Откройте «C: VBA Folder Sample file 1.xlsx»

Эта строка кода открывает файл «Образец файла 1» из «Папки VBA».

Открыть книгу — ActiveWorkbook

Когда вы открываете книгу, она автоматически становится ActiveWorkbook. Вы можете ссылаться на недавно открытую книгу следующим образом:

Когда вы ссылаетесь на лист или диапазон и опускаете имя книги, VBA предполагает, что вы имеете в виду ActiveWorkbook:

1 Таблицы («Sheet1»). Name = «Input»

Откройте книгу и назначьте переменной

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

123456 Подложка OpenWorkbookToVariable ()Dim wb As WorkbookУстановите wb = Workbooks.Open («C: VBA Folder Sample file 1.xlsx»)wb.SaveКонец подписки

Назначение книг переменным при их открытии — лучший способ отслеживать ваши книги

Диалог открытия файла книги

Вы также можете вызвать диалоговое окно открытия файла книги. Это позволяет пользователю перейти к файлу и открыть его:

12345678 Подложка OpenWorkbook ()Dim strFile As StringstrFile = Application.GetOpenFilename ()Workbooks.Open (strFile)Конец подписки

Как вы можете видеть на изображении 1, при таком подходе пользователи могут выбирать, какой файл открыть. Диалоговое окно «Открыть файл» можно сильно настроить. Вы можете по умолчанию выбрать определенную папку, выбрать, какие типы файлов будут отображаться (например, только xlsx) и многое другое. Прочтите наше руководство по диалоговому окну «Открыть файл» для получения подробных примеров.

Открыть новую книгу

Эта строка кода откроет новую книгу:

1 Рабочие тетради. Добавить

Открыть новую книгу в переменной

Эта процедура откроет новую книгу, присвоив ее переменной wb:

1234 Sub OpenNewWorkbook ()Dim wb As WorkbookУстановите wb = Workbooks.Add.Конец подписки

Синтаксис открытой книги

Когда вы используете Workbooks.Open, вы можете заметить, что при открытии книги доступно множество опций:

Требуется имя файла. Все остальные аргументы необязательны — и вам, вероятно, не нужно знать большинство других аргументов. Вот два наиболее распространенных:

Открыть книгу только для чтения

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

1 Книги. Откройте «C: VBA Folder Sample file 1.xlsx»,, True

Открыть книгу, защищенную паролем

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

1 Рабочие книги. Откройте «C: VBA Folder Sample file 1.xlsx». «пароль»

Примечания к синтаксису Open Workbook

Обратите внимание, что на изображении выше мы включили круглую скобку «(», чтобы показать синтаксис. Если вы используете круглые скобки при работе с Workbooks.Open, вы должны назначить книгу переменной:

1234 Sub OpenWB ()Dim wb As WorkbookУстановите wb = Workbooks.Open («C: VBA Folder Sample file 1.xlsx», True, True)Конец подписки

Закройте книгу в VBA

Закрыть конкретную книгу

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

1 Workbooks.Close («C: VBA Folder Sample file 1.xlsx»)

Эта строка кода закрывает файл «Образец файла 1», если он открыт. В противном случае он вернет ошибку, поэтому вам следует позаботиться об обработке ошибок.

Закрыть активную книгу

Если вы хотите закрыть рабочую книгу, которая в настоящее время активна, эта строка кода позволит вам сделать это:

Закройте все открытые книги

Чтобы закрыть все открытые книги, вы можете просто использовать этот код:

Закрыть первую открытую книгу

Это закроет первую открытую / созданную книгу:

1 Рабочие тетради (1) .Закрыть

Замените 1 на 2, чтобы закрыть вторую открытую / созданную книгу и так далее.

Закрыть без сохранения

Это закроет книгу без сохранения и без отображения запроса на сохранение:

1 ActiveWorkbook.Close savechanges: = False

Сохранить и закрыть без запроса

Точно так же это сохранит и закроет книгу без отображения запроса на сохранение:

1 ActiveWorkbook.Close savechanges: = True

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

Другие примеры открытых книг

Открыть несколько новых книг

Эта процедура откроет несколько новых книг, назначив новые книги массиву:

12345678 Sub OpenMultipleNewWorkbooks ()Dim arrWb (3) Как рабочая тетрадьDim i как целое числоДля i = от 1 до 3Установите arrWb (i) = Workbooks.AddДалее яКонец подписки

Открыть все книги Excel в папке

Эта процедура откроет все книги Excel в папке с помощью средства выбора диалогового окна «Открыть файл».

12345678910111213141516 Sub OpenMultipleWorkbooksInFolder ()Dim wb As WorkbookDim dlgFD как FileDialogDim strFolder как строкаDim strFileName As StringУстановите dlgFD = Application.FileDialog (msoFileDialogFolderPicker)Если dlgFD.Show = -1 ТогдаstrFolder = dlgFD.SelectedItems (1) и Application.PathSeparatorstrFileName = Dir (strFolder & «* .xls *»)Сделать пока strFileName «»Установите wb = Workbooks.Open (strFolder & strFileName)strFileName = DirПетляКонец, еслиКонец подписки

Проверьте, открыта ли рабочая книга

Эта процедура проверяет, открыта ли книга:

1234567891011 Sub TestByWorkbookName ()Dim wb As WorkbookДля каждого ББ в книгахЕсли wb.Name = «New Microsoft Excel Worksheet.xls», тоMsgBox «Нашел»Код вызова Exit Sub ‘здесь, мы просто выйдем сейчасКонец, еслиСледующийКонец подписки

Workbook_Open Событие

События VBA — это «триггеры», которые говорят VBA выполнить определенный код. Вы можете настроить события книги для открытия, закрытия, до сохранения, после сохранения и т. Д.

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

Источник

VBA Excel. Открыта или закрыта книга (проверка состояния)

Открыта или закрыта книга Excel? Проверяем с помощью кода VBA по краткому или полному имени файла, используя объектную переменную, цикл или оператор Open.

Проверка по краткому имени

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

Использование объектной переменной

Вариант пользовательской функция VBA Excel, предназначенной для проверки, открыта или закрыта рабочая книга, путем определения результата присвоения ссылки на нее объектной переменной. Присвоение состоялось (BookOpenClosed = True) – книга открыта, произошла ошибка и присвоение не состоялось (BookOpenClosed = False) – книга закрыта.

  • wbName – краткое имя проверяемой рабочей книги.

Перебор открытых книг циклом

Этот вариант функции BookOpenClosed перебирает с помощью цикла все открытые книги Excel и проверяет их краткие имена на совпадение с кратким именем проверяемой книги. Совпадение найдено (BookOpenClosed = True) – книга открыта, совпадение не найдено (BookOpenClosed = False) – книга закрыта.

В коллекцию Workbooks входят и скрытые книги, в том числе Личная книга макросов, и книга с функцией.

Проверка по полному имени

Проверка по полному имени с помощью оператора Open позволяет узнать, открыта ли рабочая книга каким-либо другим процессом: текущим экземпляром Excel, в котором открыта книга с проверяющим кодом, другим экземпляром Excel или сторонним приложением.

  • wbFullName – полное имя проверяемой рабочей книги.

Эта функция открывает с помощью оператора Open файл проверяемой книги с разрешением чтения и записи (параметр access) и запретом чтения и записи, если этот файл уже открыт другим процессом (параметр lock).

Если файл уже открыт другим процессом, а указанный тип доступа (параметр access) не разрешен (параметр lock), операция открытия завершится с ошибкой, а выражение (Err.Number <> 0) возвратит значение True.

Примеры проверки состояния книги

По краткому имени

По полному имени

6 комментариев для “VBA Excel. Открыта или закрыта книга (проверка состояния)”

Большое спасибо за подробную информацию

Примеры проверки состояния книги
По краткому имени
Сначала вставляем функцию, потом код в макрос.
все работает

Добрый день!
При вставке данной функции появляется ошибка «Sub or function not defined». Что это значит и как ее исправить?

Здравствуйте, Анна!
Такая ошибка может произойти, когда имя функции в вызывающей ее процедуре записано с ошибкой. Также, обратите внимание, что функция BookOpenClosed должна быть с таким именем одна в модуле.

Источник

Свойства и методы ActiveWorkbook

Мы тонем в информации, но жаждем знаний

Эта статья содержит полное руководство по использованию рабочей книги VBA.

Если вы хотите использовать VBA для открытия рабочей книги, тогда откройте «Открыть рабочую книгу»

Если вы хотите использовать VBA для создания новой рабочей книги, перейдите к разделу «Создание новой рабочей книги».

Для всех других задач VBA Workbook, ознакомьтесь с кратким руководством ниже.

Краткое руководство по книге VBA

В следующей таблице приведено краткое руководство по основным задачам книги VBA.

Задача Исполнение
Доступ к открытой книге с
использованием имени
Workbooks(«Пример.xlsx»)
Доступ к открытой рабочей
книге (открывшейся первой)
Workbooks(1)
Доступ к открытой рабочей
книге (открывшейся последней)
Workbooks(Workbooks.Count)
Доступ к активной книге ActiveWorkbook
Доступ к книге, содержащей
код VBA
ThisWorkbook
Объявите переменную книги Dim wk As Workbook
Назначьте переменную книги Set wk = Workbooks(«Пример.xlsx»)
Set wk = ThisWorkbook
Set wk = Workbooks(1)
Активировать книгу wk.Activate
Закрыть книгу без сохранения wk.Close SaveChanges:=False
Закройте книгу и сохраните wk.Close SaveChanges:=True
Создать новую рабочую книгу Set wk = Workbooks.Add
Открыть рабочую книгу Set wk =Workbooks.Open («C:ДокументыПример.xlsx»)
Открыть книгу только для
чтения
Set wk = Workbooks.Open («C:ДокументыПример.xlsx», ReadOnly:=True)
Проверьте существование книги If Dir(«C:ДокументыКнига1.xlsx») = «» Then
MsgBox «File does not exist.»
EndIf
Проверьте открыта ли книга Смотрите раздел «Проверить
открыта ли книга»
Перечислите все открытые
рабочие книги
For Each wk In Application.Workbooks
Debug.Print wk.FullName
Next wk
Открыть книгу с помощью
диалогового окна «Файл»
Смотрите раздел «Использование диалогового окна «Файл»
Сохранить книгу wk.Save
Сохранить копию книги wk.SaveCopyAs «C:Копия.xlsm»
Скопируйте книгу, если она
закрыта
FileCopy «C:file1.xlsx»,»C:Копия.xlsx»
Сохранить как Рабочая книга wk.SaveAs «Резервная копия.xlsx»

Начало работы с книгой VBA

Мы можем получить доступ к любой открытой книге, используя код Workbooks («Пример.xlsm»). Просто замените Пример.xlsm именем книги, которую вы хотите использовать.

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

Этот пример может показаться немного запутанным для новичка, но на самом деле он довольно прост.

Первая часть до десятичной запятой представляет собой рабочую книгу, вторая часть представляет собой рабочую таблицу, а третья — диапазон. Вот еще несколько примеров записи в ячейку

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

Взгляните на часть книги

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

Устранение неполадок в коллекции книг

Когда вы используете коллекцию Workbooks для доступа к книге, вы можете получить сообщение об ошибке:

Run-time Error 9: Subscript out of Range.

Это означает, что VBA не может найти книгу, которую вы передали в качестве параметра.

Это может произойти по следующим причинам:

  1. Рабочая книга в настоящее время закрыта.
  2. Вы написали имя неправильно.
  3. Вы создали новую рабочую книгу (например, «Книга1») и попытались получить к ней доступ, используя Workbooks («Книга1.xlsx»). Это имя не Книга1.xlsx, пока оно не будет сохранено в первый раз.
  4. (Только для Excel 2007/2010) Если вы используете два экземпляра Excel, то Workbooks () относится только к рабочим книгам, открытым в текущем экземпляре Excel.
  5. Вы передали число в качестве индекса, и оно больше, чем количество открытых книг, например Вы использовали
    Workbooks (3), и только две рабочие книги открыты.

Если вы не можете устранить ошибку, воспользуйтесь любой из функций в разделе Поиск всех открытых рабочих книг. Они будут печатать имена всех открытых рабочих книг в «Immediate Window » (Ctrl + G).

Примеры использования рабочей книги VBA

Следующие примеры показывают, что вы можете сделать с книгой.

Примечание. Чтобы попробовать этот пример, создайте две открытые книги с именами Тест1.xlsx и Тест2.xlsx.

Примечание: в примерах кода я часто использую Debug.Print. Эта функция печатает значения в Immediate Window. Для просмотра этого окна выберите View-> Immediate Window из меню (сочетание клавиш Ctrl + G)

Доступ к рабочей книге VBA по индексу

Вы также можете использовать индексный номер с книгами (). Индекс относится к порядку, в котором книга была открыта или создана.

Workbooks (1) относится к книге, которая была открыта первой. Workbooks (2) относится к рабочей книге, которая была открыта второй и так далее.

В этом примере мы использовали Workbooks.Count. Это количество рабочих книг, которые в настоящее время находятся в коллекции рабочих книг. То есть количество рабочих книг, открытых на данный момент. Таким образом, использование его в качестве индекса дает нам последнюю книгу, которая была открыта

Использование индекса не очень полезно, если вам не нужно знать порядок. По этой причине вам следует избегать его использования. Вместо этого вы должны использовать имя рабочей книги вместе с Workbooks ().

Поиск всех открытых рабочих книг

Иногда вы можете получить доступ ко всем рабочим книгам, которые открыты. Другими словами, все элементы в коллекции Workbooks ().

Вы можете сделать это, используя цикл For Each.

Вы также можете использовать стандартный цикл For для доступа ко всем открытым рабочим книгам.

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

Примечание. Оба примера читаются в порядке с первого открытого до последнего открытого. Если вы хотите читать в обратном порядке (с последнего на первое), вы можете сделать это

Открыть рабочую книгу

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

Следующий код VBA открывает книгу «Книга1.xlsm» в папке «C: Документы»

Рекомендуется проверить, действительно ли существует книга, прежде чем открывать ее. Это предотвратит ваши ошибки. Функция Dir позволяет вам легко это сделать.

Проверить открыта ли книга

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

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

Вы можете использовать эту функцию так:

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

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

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

Если вам нужно проверить, открыта ли книга в другом экземпляре Excel, вы можете использовать атрибут ReadOnly книги. Будет установлено значение true, если оно открыто в другом экземпляре.

Закрыть книгу

Закрыть книгу в Excel VBA очень просто. Вы просто вызываете метод Close рабочей книги.

Обычно, когда вы закрываете книгу в VBA, вы не хотите видеть сообщения из Excel, спрашивающие, хотите ли вы сохранить файл.

Вы можете указать, сохранять ли книгу или нет, и тогда сообщения Excel не будут появляться.

Очевидно, что вы не можете сохранить изменения в книге, которая в данный момент открыта только для чтения.

Сохранить книгу

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

Вы также можете использовать метод SaveAs

Метод WorkAs SaveAs поставляется с двенадцатью параметрами, которые позволяют вам добавить пароль, установить файл только для чтения и так далее. Вы можете увидеть детали здесь.

Вы также можете использовать VBA для сохранения книги в виде копии с помощью SaveCopyAs.

Копировать книгу

Если рабочая книга открыта, вы можете использовать два метода в приведенном выше разделе для создания копии, т.е. SaveAs и SaveCopyAs.

Если вы хотите скопировать книгу, не открывая ее, вы можете использовать FileCopy, как показано в следующем примере:

Использование диалогового окна «Файл» для открытия рабочей книги

В предыдущем разделе показано, как открыть книгу с заданным именем. Иногда вам может понадобиться, чтобы пользователь выбрал рабочую книгу. Вы можете легко использовать Windows File Dialog.

FileDialog настраивается, и вы можете использовать его так:

  1. Выберите файл.
  2. Выберите папку.
  3. Откройте файл.
  4. «Сохранить как» файл.

Если вы просто хотите, чтобы пользователь выбрал файл, вы можете использовать функцию GetOpenFilename.

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

Когда вы вызываете эту функцию, вы должны проверить, отменяет ли пользователь диалог.

В следующем примере показано, как легко вызвать функцию UserSelectWorkbook и обработать случай отмены пользователя.

Вы можете настроить диалог, изменив Title, Filters и AllowMultiSelect в функции UserSelectWorkbook.

Использование ThisWorkbook

Существует более простой способ доступа к текущей книге, чем использование Workbooks() . Вы можете использовать ключевое слово ThisWorkbook. Это относится к текущей книге, то есть к книге, содержащей код VBA.

Если наш код находится в книге, называемой МойVBA.xlsm, то ThisWorkbook и Workbooks («МойVBA.xlsm») ссылаются на одну и ту же книгу.

Использование ThisWorkbook более полезно, чем использование Workbooks (). С ThisWorkbook нам не нужно беспокоиться об имени файла. Это дает нам два преимущества:

  1. Изменение имени файла не повлияет на код
  2. Копирование кода в другую рабочую книгу не требует изменения кода

Это может показаться очень маленьким преимуществом. Реальность такова, что имена будут меняться все время. Использование ThisWorkbook означает, что ваш код будет работать нормально.

В следующем примере показаны две строки кода. Один с помощью ThisWorkbook, другой с помощью Workbooks (). Тот, который использует Workbooks, больше не будет работать, если имя МойVBA.xlsm изменится.

Использование ActiveWorkbook

ActiveWorkbook относится к книге, которая в данный момент активна. Это тот, который пользователь последний раз щелкнул.

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

Использование ActiveWorkbook также затрудняет чтение кода. Из кода может быть не очевидно, какая книга должна быть активной.

Надеюсь, я дал понять, что вам следует избегать использования ActiveWorkbook, если в этом нет необходимости. Если вы должны быть очень осторожны.

Примеры доступа к книге

Мы рассмотрели все способы доступа к книге. Следующий код показывает примеры этих способов.

Объявление переменной VBA Workbook

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

Вы можете установить переменную книги с помощью любого из методов доступа, которые мы видели.

Ниже показан тот же код без переменной рабочей книги.

В этих примерах разница несущественная. Однако, когда у вас много кода, использование переменной полезно, в частности, для рабочего листа и диапазонов, где имена имеют тенденцию быть длинными, например thisWorkbook.Worksheets («Лист1»). Range («A1»).

Вы можете назвать переменную книги как wrkRead или wrkWrite. Затем вы можете сразу увидеть, для чего используется эта книга.

Создать новую книгу

Для создания новой рабочей книги вы используете функцию добавления рабочих книг. Эта функция создает новую пустую книгу. Это то же самое, что выбрать «Новая книга» в меню «Файл Excel».

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

Когда вы создаете новую книгу, она обычно содержит три листа. Это определяется свойством Application.SheetsInNewWorkbook.

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

With и Workbook

Ключевое слово With облегчает чтение и написание кода VBA. Использование с означает, что вам нужно упомянуть только один раз. С используется с объектами. Это такие элементы, как рабочие книги, рабочие таблицы и диапазоны.

В следующем примере есть два Subs. Первый похож на код, который мы видели до сих пор. Второй использует ключевое слово With. Вы можете увидеть код гораздо понятнее во втором Sub. Ключевые слова End With обозначают конец кода раздела с помощью With.

Резюме

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

  1. Чтобы получить рабочую книгу, содержащую код, используйте ThisWorkbook.
  2. Чтобы получить любую открытую книгу, используйте Workbooks («Пример.xlsx»).
  3. Чтобы открыть книгу, используйте Set Wrk = Workbooks.Open («C: Папка Пример.xlsx»).
  4. Разрешить пользователю выбирать файл с помощью функции UserSelectWorkbook, представленной выше.
  5. Чтобы создать копию открытой книги, используйте свойство SaveAs с именем файла.
  6. Чтобы создать копию рабочей книги без открытия, используйте функцию FileCopy.
  7. Чтобы ваш код было легче читать и писать, используйте ключевое слово With.
  8. Другой способ прояснить ваш код — использовать переменные Workbook.
  9. Чтобы просмотреть все открытые рабочие книги, используйте For Every wk в Workbooks, где wk — это переменная рабочей книги.
  10. Старайтесь избегать использования ActiveWorkbook и Workbooks (Index), поскольку их ссылка на рабочую книгу носит временный характер.

Вы можете увидеть краткое руководство по теме в верхней части этой статьи

Заключение

Это был подробная статья об очень важном элементе VBA — Рабочей книги. Я надеюсь, что вы нашли ее полезной. Excel отлично справляется со многими способами выполнения подобных действий, но недостатком является то, что иногда он может привести к путанице.

Чтобы получить максимальную пользу от этой статьи, я рекомендую вам попробовать примеры. Создайте несколько книг и поиграйтесь с кодом. Внесите изменения в код и посмотрите, как эти изменения влияют на результат. Практика — лучший способ выучить VBA.

Источник

Студворк — интернет-сервис помощи студентам

Доброго времени суток всем!!!
Добросовестно 3 часа копал сеть перед тем как спросить).
Ситуёвина:
Есть Excel)….в нём открыто (ранее!! до запуска работы кода, не самим кодом!!!) более 1го файла…1.xlsx и 2.xlsx например.
Требуется убить процесс, например, только 1.xlsx, а я умею только весь(все) EXCEL.EXE

Кому интересно зачем):
Вообще я это хочу сделать для предотвращения ошибок доступа проги к файлу (База данных) — проверяет открыт ли он (может и несколько процессов висеть), убивает ТОЛЬКО его (т.е. если юзверь открыл другие доки — не трогает их) пока его совсем не станет.

Так то работает нормально (сам код закрывает), но не хочется потом иметь проблем с этим. Иногда при отладке, после завершения кода «на середине», висит несколько экземпляров процесса одного и того же файла, и потом пока вручную их не покиллишь — не будет работать. Вот это и хочу автоматизировать, т.е. мало ли что, а прога сама «готовит среду») для работы.

Что-то вроде:

Visual Basic
1
2
3
4
5
 fn = FreeFile - 1
 Do While Not fn = 0
  Close #fn
 fn = FreeFile - 1
 Loop

Только с excel и ТОЛЬКО для этого файла, без затрагивания работы пользователя с другими файлами excel. И ещё — они висят только в диспетчере, на панели не видно, т.е. с получением хэндла окна наверно не прокатит.

P.S. Понимаю, что можно и без этой перестраховки, просто точно отладить код, но уже интересно). Если что не так простите — сам я полгода самоучка). Интересует ТОЛЬКО 6.0 .NET не юзаю — не нашел на х64, да и прога уже написана.

Открыта или закрыта книга Excel? Проверяем с помощью кода VBA по краткому или полному имени файла, используя объектную переменную, цикл или оператор Open.

Проверка по краткому имени

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

Использование объектной переменной

Вариант пользовательской функция VBA Excel, предназначенной для проверки, открыта или закрыта рабочая книга, путем определения результата присвоения ссылки на нее объектной переменной. Присвоение состоялось (BookOpenClosed = True) – книга открыта, произошла ошибка и присвоение не состоялось (BookOpenClosed = False) – книга закрыта.

Function BookOpenClosed(wbName As String) As Boolean

    Dim myBook As Workbook

    On Error Resume Next

        Set myBook = Workbooks(wbName)

    BookOpenClosed = Not myBook Is Nothing

End Function

Аргумент функции:

  • wbName – краткое имя проверяемой рабочей книги.

Перебор открытых книг циклом

Этот вариант функции BookOpenClosed перебирает с помощью цикла все открытые книги Excel и проверяет их краткие имена на совпадение с кратким именем проверяемой книги. Совпадение найдено (BookOpenClosed = True) – книга открыта, совпадение не найдено (BookOpenClosed = False) – книга закрыта.

Function BookOpenClosed(wbName As String) As Boolean

    Dim myBook As Workbook

    For Each myBook In Workbooks

        If myBook.Name = wbName Then

            BookOpenClosed = True

            Exit For

        End If

    Next

End Function

В коллекцию Workbooks входят и скрытые книги, в том числе Личная книга макросов, и книга с функцией.

Проверка по полному имени

Проверка по полному имени с помощью оператора Open позволяет узнать, открыта ли рабочая книга каким-либо другим процессом: текущим экземпляром Excel, в котором открыта книга с проверяющим кодом, другим экземпляром Excel или сторонним приложением.

Function BookOpenClosed(wbFullName As String) As Boolean

    Dim ff As Integer

    ff = FreeFile

        On Error Resume Next

        Open wbFullName For Random Access Read Write Lock Read Write As #ff

        Close #ff

    BookOpenClosed = (Err.Number <> 0)

End Function

Аргумент функции:

  • wbFullName – полное имя проверяемой рабочей книги.

Эта функция открывает с помощью оператора Open файл проверяемой книги с разрешением чтения и записи (параметр access) и запретом чтения и записи, если этот файл уже открыт другим процессом (параметр lock).

Если файл уже открыт другим процессом, а указанный тип доступа (параметр access) не разрешен (параметр lock), операция открытия завершится с ошибкой, а выражение (Err.Number <> 0) возвратит значение True.

Примеры проверки состояния книги

По краткому имени

Sub Primer1()

    If BookOpenClosed(«Книга1.xlsx») Then

        MsgBox «Книга открыта»

    Else

        MsgBox «Книга закрыта»

    End If

End Sub

По полному имени

Sub Primer2()

    If BookOpenClosed(«C:Папка1Папка2Папка3Книга1.xlsx») Then

        MsgBox «Книга открыта»

    Else

        MsgBox «Книга закрыта»

    End If

End Sub


Хитрости »

4 Май 2011              93377 просмотров


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

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

Sub Check_Open_Book()
    If IsBookOpen("Книга1.xls") Then
        MsgBox "Книга открыта", vbInformation, "Сообщение"
    Else
        MsgBox "Книга закрыта", vbInformation, "Сообщение"
        'открываем книгу
        Workbooks.Open "C:Книга1.xls"
    End If
End Sub

Данная процедура вызывает функцию IsBookOpen, передавая ей в качестве параметра имя книги, «открытость» которой мы хотим проверить. Я приведу несколько вариантов самой функции IsBookOpen. Во всех вариантах действует один и тот же принцип: код любого из вариантов функции IsBookOpen необходимо скопировать и вставить в стандартный модуль. Модуль должен быть внутри той книги, в кодах которой планируется проверять открыта ли книга. Только тогда IsBookOpen будет доступна для вызова из любого кода этой же книги.
Если вдруг в момент выполнения на строке If IsBookOpen(«Книга1.xls») Then появится ошибка «Sub or function not defined» — значит функция IsBookOpen либо не была скопирована в стандартный модуль, либо она вообще не в стандартном модуле, а в модуле листа, формы или книги.


Вариант 1:

Function IsBookOpen(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 IsBookOpen = 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 IsBookOpen = True: Exit For
    End If

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

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

Либо можно использовать

Вариант 2:

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

Данный способ обращается к любой открытой книге, даже если она скрыта как PERSONAL.XLS или надстройка. Однако у данной функции есть недостаток — используется оператор On Error и если в настройках VBA(ToolsOptions -вкладка General) установлено Break on All Errors — то этот код не сработает, если книга не открыта — получим ошибку. В то время как Вариант1 с циклом по всем открытым книгам сработает без ошибок.


Вариант 3:

По просьбам читателей решил добавить код, который проверяет открыта ли книга независимо от её месторасположения и используемого приложения Excel. Книга может быть открыта другим пользователем (если книга на сервере), в другом экземпляре Excel или в этом же экземпляре Excel.

Function IsBookOpen(wbFullName As String) As Boolean
    Dim iFF As Integer, retval As Boolean
    iFF = FreeFile
    On Error Resume Next
    Open wbFullName For Random Access Read Write Lock Read Write As #iFF
    retval = (Err.Number <> 0)
    Close #iFF
    IsBookOpen = retval
End Function

Функция несколько отличается от приведенных выше — передается в неё не только имя книги, а полный путь к книге, включая имя и расширение:

Sub Test()
    MsgBox "Файл 'Книга1'" & IIf(IsBookOpen("C:Книга1.xls"), " уже открыт", " не занят")
End Sub

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

Sub Test()
    Dim sWBFullName As String
    Dim wb As Workbook
    'полный путь к проверяемой книге
    sWBFullName = "C:DocumentsКнига1.xls"
    'если книга кем-то открыта - пропускаем обработку этой книги
    'книга закрыта - вносим изменения, сохраняем, закрываем
    If IsBookOpen(sWBFullName) = False Then
        Set wb = Application.Workbooks.Open(sWBFullName)
        'изменяем значение ячейки "A1" на первом листе книги
        wb.Sheets(1).Range("A1").Value = "www.excel-vba.ru"
        ws.Close True
    End If
End Sub

При использовании функции IsBookOpen так же надо учитывать, что она может посчитать книгу открытой не только если она реально кем-то открыта, а если к ней просто нет доступа(например, заблокирован доступ со стороны администратора и т.п.).

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


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

14 ответов

3.4K

16 сентября 2003 года

T@sh

19 / / 16.07.2003

[QUOTE]Originally posted by ziv

Workbooks(«Книга1»).Close

1.8K

16 сентября 2003 года

ziv

71 / / 04.07.2003

мне неизвестно имя открываемого файла

3.4K

16 сентября 2003 года

T@sh

19 / / 16.07.2003

Цитата:

Originally posted by ziv
мне неизвестно имя открываемого файла

хм. а как ты его обрабатываешь? ты же когда к нему обращаешься как-то его обзываешь?
ну..тогда после обработки открой его. и потом то же самое только activeworkbook
это первое что в голову приходит…только как же ты с ним работаешь?
или введи переменную для определения имени файла и вместо книга1 напиши его имя.

1.8K

16 сентября 2003 года

ziv

71 / / 04.07.2003

Цитата:

Originally posted by T@sh

хм. а как ты его обрабатываешь? ты же когда к нему обращаешься как-то его обзываешь?
ну..тогда после обработки открой его. и потом то же самое только activeworkbook
это первое что в голову приходит…только как же ты с ним работаешь?
или введи переменную для определения имени файла и вместо книга1 напиши его имя.

м-даа :) программу писал под фиксированное имя открываемого файла :(

а как открываемому файлу присвоить необходимое мне имя, например «Книга1»?

3.4K

16 сентября 2003 года

T@sh

19 / / 16.07.2003

Цитата:

Originally posted by ziv

а как открываемому файлу присвоить необходимое мне имя, например «Книга1»?

хм…. А как открывается книга? Можно сделать через диалоговое окно , чтобы юзер сам выбрал что открыть:
Application.Dialogs(xlDialogOpen).Show
bookName = ActiveWorkbook.Name

а вообще проще в аську стукнись если срочно.

1.8K

16 сентября 2003 года

ziv

71 / / 04.07.2003

Цитата:

Originally posted by T@sh

хм…. А как открывается книга? Можно сделать через диалоговое окно , чтобы юзер сам выбрал что открыть:
Application.Dialogs(xlDialogOpen).Show
bookName = ActiveWorkbook.Name

а вообще проще в аську стукнись если срочно.

я делал вот так:
name = Application.GetOpenFilename

[off] а по аське ты «Марина»? [/off]

258

16 сентября 2003 года

SergeySV

1.5K / / 19.03.2003

Цитата:

Originally posted by ziv

name = Application.GetOpenFilename
Workbooks.Open name

Вот этот name уже содержит в себе полной путь к файлу — «C:aaa1.xls», если из этой строки выдернуть aaa1.xls(например через мою функцию FileWithoutDir, описание в конце), то его можно использовать при обращении к книге — Workbooks(«aaa1.xls»).Close

А можно и так, вариантов масса:

Код:

Dim sWrb as String

name = Application.GetOpenFilename
Workbooks.Open name
sWrb = ActiveWorkbook.name
….
Workbooks(sWrb).Close

и так:

Код:

Dim wWrb As Workbook

name = Application.GetOpenFilename
Workbooks.Open name
Set wWrb = ActiveWorkbook
….
wWrb.Close

Код:

Public Function FileWithoutDir(path As String) As String
  ‘ Вырезает название файла из полного пути к файлу
  Dim i%, pos%

 
On Error GoTo Err_

 
  FileWithoutDir = «»
  s = «»
  If path <> «» Then

   
    pos = InStr(1, path, «»)
    s = path
    If pos > 0 Then
      Do
        s = Right(s, Len(s) — pos)
        pos = InStr(1, s, «»)
      Loop Until pos = 0
    End If
    FileWithoutDir = s

   
  End If

 
ExitSub:
 Exit Function

 
Err_:
  MsgBox «Возникла ошибка! (в функ. FileWithoutDir)»
  Resume ExitSub

End Function

1.8K

16 сентября 2003 года

ziv

71 / / 04.07.2003

ОГРОМНОЕ ВСЕМ СПАСИБО!
РАБОТАЕТ!!!!!

459

16 сентября 2003 года

gacol

273 / / 12.02.2003

Цитата:

Originally posted by SergeySV

Вот этот name уже содержит в себе полной путь к файлу — «C:aaa1.xls», если из этой строки выдернуть aaa1.xls(например через мою функцию FileWithoutDir, описание в конце), то его можно использовать при обращении к книге — Workbooks(«aaa1.xls»).Close

А можно и так, вариантов масса:

Код:

Dim sWrb as String

name = Application.GetOpenFilename
Workbooks.Open name
sWrb = ActiveWorkbook.name
….
Workbooks(sWrb).Close

и так:

Код:

Dim wWrb As Workbook

name = Application.GetOpenFilename
Workbooks.Open name
Set wWrb = ActiveWorkbook
….
wWrb.Close

Код:

Public Function FileWithoutDir(path As String) As String
  ‘ Вырезает название файла из полного пути к файлу
  Dim i%, pos%

 
On Error GoTo Err_

 
  FileWithoutDir = «»
  s = «»
  If path <> «» Then

   
    pos = InStr(1, path, «»)
    s = path
    If pos > 0 Then
      Do
        s = Right(s, Len(s) — pos)
        pos = InStr(1, s, «»)
      Loop Until pos = 0
    End If
    FileWithoutDir = s

   
  End If

 
ExitSub:
 Exit Function

 
Err_:
  MsgBox «Возникла ошибка! (в функ. FileWithoutDir)»
  Resume ExitSub

End Function

В твоем случае наверное лучше использоватть вместо InStr() функцию InStrRev(), чтобы сразу найти правый «» в полном имени файла.

258

16 сентября 2003 года

SergeySV

1.5K / / 19.03.2003

Цитата:

Originally posted by gacol

В твоем случае наверное лучше использоватть вместо InStr() функцию InStrRev(), чтобы сразу найти правый «» в полном имени файла.

Да, согласен, грехи молодости… :-)

267

16 сентября 2003 года

Cutty Sark

1.2K / / 17.10.2002

А я вот так действую в таких случаях:

Книги в Экселе нумеруются в порядке открытия. Поэтому сразу после открытия того файла Workbooks(Workbooks.Count) показывает на него. Можно запомнить в объектную переменную, а если никаких других книг не открывается в процессе обработки — так и запоминать ничего не нужно.

3.4K

17 сентября 2003 года

T@sh

19 / / 16.07.2003

Цитата:

Originally posted by Cutty Sark
А я вот так действую в таких случаях:

Книги в Экселе нумеруются в порядке открытия. Поэтому сразу после открытия того файла Workbooks(Workbooks.Count) показывает на него. Можно запомнить в объектную переменную, а если никаких других книг не открывается в процессе обработки — так и запоминать ничего не нужно.

А если юзер вручную книгу откроетзакроет, откроет другую… и тп…. тогда как? прога начнет работать с левой книгой и делать там чего совсем ненадо…. а если указать имя, то он просто выкинет ошибку, если книга закрыта.

1.8K

17 сентября 2003 года

ziv

71 / / 04.07.2003

Цитата:

Originally posted by T@sh

А если юзер вручную книгу откроетзакроет, откроет другую… и тп…. тогда как? прога начнет работать с левой книгой и делать там чего совсем ненадо…. а если указать имя, то он просто выкинет ошибку, если книга закрыта.

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

267

17 сентября 2003 года

Cutty Sark

1.2K / / 17.10.2002

Цитата:

Originally posted by T@sh

А если юзер вручную книгу откроетзакроет, откроет другую… и тп…. тогда как? прога начнет работать с левой книгой и делать там чего совсем ненадо…. а если указать имя, то он просто выкинет ошибку, если книга закрыта.

Как это вручную? А разве это все не в ходе одного выполнения программы? Ну если вручную — так пожалуйста, запоминайте книгу в переменную, и все ок. Да что мы спорим, тут любой метод хорош, а выбор зависит от деталей.
Я обычно использую Workbooks.Count по следующим причинам:
1. Часто по ходу деятельности мне приходится открывать в Экселе хтмльки из Инета, у них такое дурацкое имя получается при открытии, возиться с ним никакой охоты нет.
2. Чтобы в ходе пошаговой отладки не задумываться над тем, что у меня там активно, я стараюсь никогда не использовать ActiveCell, ActiveWorkbook и т.д. без прямой на то нужды.

А можно — по-всякому. Вот.

На чтение 19 мин. Просмотров 14.1k.

VBA Workbook

John Naisbitt

Мы тонем в информации, но жаждем знаний

Эта статья содержит полное руководство по использованию рабочей книги VBA.

Если вы хотите использовать VBA для открытия рабочей книги, тогда откройте «Открыть рабочую книгу»

Если вы хотите использовать VBA для создания новой рабочей книги, перейдите к разделу «Создание новой рабочей книги».

Для всех
других задач VBA Workbook, ознакомьтесь с кратким руководством ниже.

Содержание

  1. Краткое руководство по книге VBA
  2. Начало работы с книгой VBA
  3. Доступ к рабочей книге VBA по индексу
  4. Поиск всех открытых рабочих книг
  5. Открыть рабочую книгу
  6. Проверить открыта ли книга
  7. Закрыть книгу
  8. Сохранить книгу
  9. Копировать книгу
  10. Использование диалогового окна «Файл» для открытия рабочей книги
  11. Использование ThisWorkbook
  12. Использование ActiveWorkbook
  13. Примеры доступа к книге
  14. Объявление переменной VBA Workbook
  15. Создать новую книгу
  16. With и Workbook
  17. Резюме
  18.  Заключение

Краткое руководство по книге VBA

В следующей таблице приведено краткое руководство по
основным задачам книги VBA.

Задача Исполнение
Доступ к открытой книге с
использованием имени
Workbooks(«Пример.xlsx»)
Доступ к открытой рабочей
книге (открывшейся первой)
Workbooks(1)
Доступ к открытой рабочей
книге (открывшейся последней)
Workbooks(Workbooks.Count)
Доступ к активной книге ActiveWorkbook
Доступ к книге, содержащей
код VBA
ThisWorkbook
Объявите переменную книги Dim wk As Workbook
Назначьте переменную книги Set wk = Workbooks(«Пример.xlsx»)
Set wk = ThisWorkbook
Set wk = Workbooks(1)
Активировать книгу wk.Activate
Закрыть книгу без сохранения wk.Close SaveChanges:=False
Закройте книгу и сохраните wk.Close SaveChanges:=True
Создать новую рабочую книгу Set wk = Workbooks.Add
Открыть рабочую книгу Set wk =Workbooks.Open («C:ДокументыПример.xlsx»)
Открыть книгу только для
чтения
Set wk = Workbooks.Open («C:ДокументыПример.xlsx», ReadOnly:=True)
Проверьте существование книги If Dir(«C:ДокументыКнига1.xlsx») = «» Then
MsgBox «File does not exist.»
EndIf
Проверьте открыта ли книга Смотрите раздел «Проверить
открыта ли книга»
Перечислите все открытые
рабочие книги
For Each wk In Application.Workbooks
    Debug.Print wk.FullName
Next wk
Открыть книгу с помощью
диалогового окна «Файл»
Смотрите раздел «Использование диалогового окна «Файл»
Сохранить книгу wk.Save
Сохранить копию книги wk.SaveCopyAs «C:Копия.xlsm»
Скопируйте книгу, если она
закрыта
FileCopy «C:file1.xlsx»,»C:Копия.xlsx»
Сохранить как Рабочая книга wk.SaveAs «Резервная копия.xlsx»

Начало работы с книгой VBA

Мы можем получить доступ к любой открытой книге, используя код Workbooks («Пример.xlsm»). Просто замените Пример.xlsm именем книги, которую вы хотите использовать.

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

Sub ZapisVYacheikuA1()

'Записывает 100 в ячейку A1 листа "Лист1" в МойVBA.xlsm
Workbooks("МойVBA.xlsm").Worksheets("Лист1").Range("A1") = 100

End Sub

Этот пример может показаться немного запутанным для новичка, но на самом деле он довольно прост.

Первая часть до десятичной запятой представляет собой
рабочую книгу, вторая часть представляет собой рабочую таблицу, а третья —
диапазон. Вот еще несколько примеров записи в ячейку

Sub ZapisiVYacheiku()

' Записывает 100 в ячейку A1 листа "Лист1" в МойVBA.xlsm
Workbooks("МойVBA.xlsm").Worksheets("Лист1").Range("A1") = 100

' Записывает «Иван» в ячейку B1 листа «Лист1» в МойVBA.xlsm
Workbooks("МойVBA.xlsm").Worksheets("Лист1").Range("B1") = "Иван"

' Записывает 100 в ячейку A1 таблицы «Счета» в МойVBA.xlsm
Workbooks("МойVBA.xlsm").Worksheets("Счета").Range("A1") = 100

' Записывает дату в ячейку D3 рабочего листа "Лист2" в Книга.xlsx
Workbooks("Книга.xlsx").Worksheets("Лист2").Range("D3") = "112019"

End Sub

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

Взгляните на часть книги

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

 Устранение неполадок в коллекции книг

Когда вы используете коллекцию Workbooks для доступа к книге, вы можете получить сообщение об ошибке:

Run-time Error 9: Subscript out of Range.

Это означает, что VBA не может найти книгу, которую вы
передали в качестве параметра.

Это может произойти по следующим причинам:

  1. Рабочая книга в настоящее время закрыта.
  2. Вы написали имя неправильно.
  3. Вы создали новую рабочую книгу (например, «Книга1») и попытались получить к ней доступ, используя Workbooks («Книга1.xlsx»). Это имя не Книга1.xlsx, пока оно не будет сохранено в первый раз.
  4. (Только для Excel 2007/2010) Если вы используете два экземпляра Excel, то Workbooks () относится только к рабочим книгам, открытым в текущем экземпляре Excel.
  5. Вы передали число в качестве индекса, и оно больше, чем количество открытых книг, например Вы использовали
    Workbooks (3), и только две рабочие книги открыты.

Если вы не можете устранить ошибку, воспользуйтесь любой из функций в разделе Поиск всех открытых рабочих книг. Они будут печатать имена всех открытых рабочих книг в «Immediate Window » (Ctrl + G).

Примеры использования рабочей книги VBA

Следующие примеры показывают, что вы можете сделать с
книгой.

Примечание. Чтобы попробовать этот пример, создайте две открытые книги с именами Тест1.xlsx и Тест2.xlsx.

Sub SvoistvaRabocheiKnigi()

    ' Печатает количество открытых рабочих книг
    Debug.Print Workbooks.Count

    ' Печатает полное название книги
    Debug.Print Workbooks("Тест1.xlsx").FullName

    ' Отображает полное имя книги в диалоговом окне сообщения.
    MsgBox Workbooks("Тест1.xlsx").FullName

    ' Печатает количество листов в Тест2.xlsx
    Debug.Print Workbooks("Тест2.xlsx").Worksheets.Count

    ' Печатает имя активного в данный момент листа Тест2.xlsx
    Debug.Print Workbooks("Тест2.xlsx").ActiveSheet.Name

    ' Закрывает книгу под названием Тест1.xlsx
    Workbooks("Tест1.xlsx").Close

    ' Закрывает книгу Тест2.xlsx и сохраняет изменения
    Workbooks("Tест2.xlsx").Close SaveChanges:=True

End Sub

Примечание: в примерах кода я часто использую Debug.Print. Эта функция печатает значения в Immediate Window. Для просмотра этого окна выберите View-> Immediate Window из меню (сочетание клавиш Ctrl + G)

ImmediateWindow

ImmediateSampeText

Доступ к рабочей книге VBA по индексу

Вы также можете использовать индексный номер с книгами ().
Индекс относится к порядку, в котором книга была открыта или создана.

Workbooks (1) относится к книге, которая была открыта первой. Workbooks (2) относится к рабочей книге, которая была открыта второй и так далее.

' Первая рабочая книга, которая была открыта
Debug.Print Workbooks(1).Name

' Третья рабочая тетрадь, которая была открыта
Debug.Print Workbooks(3).Name

' Последняя рабочая книга, которая была открыта
Debug.Print Workbooks(Workbooks.Count).Name

В этом примере мы использовали Workbooks.Count. Это количество рабочих книг, которые в настоящее время находятся в коллекции рабочих книг. То есть количество рабочих книг, открытых на данный момент. Таким образом, использование его в качестве индекса дает нам последнюю книгу, которая была открыта

Использование индекса не очень полезно, если вам не нужно знать порядок. По этой причине вам следует избегать его использования. Вместо этого вы должны использовать имя рабочей книги вместе с Workbooks ().

Поиск всех открытых рабочих книг

Иногда вы можете получить доступ ко всем рабочим книгам, которые открыты. Другими словами, все элементы в коллекции Workbooks ().

Вы можете сделать это, используя цикл For Each.

Sub PechatImeniFailaEach()

    ' Распечатывает полное имя файла всех открытых рабочих книг
    Dim wrk As Workbook
    For Each wrk In Workbooks
        Debug.Print wrk.FullName
    Next wrk

End Sub

Вы также можете использовать стандартный цикл For для доступа ко всем открытым рабочим книгам.

Sub PechatImeniFailaFor()

    ' Распечатывает полное имя файла всех открытых рабочих книг
    Dim i As Long
    For i = 1 To Workbooks.Count
        Debug.Print Workbooks(i).FullName
    Next i

End Sub

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

Примечание. Оба примера читаются в порядке с первого открытого до последнего открытого. Если вы хотите читать в обратном порядке (с последнего на первое), вы можете сделать это

Sub PechatImeniFailaForKon()

    ' Распечатывает полное имя файла всех открытых рабочих книг
    ' в обратном порядке.
    Dim i As Long
    For i = Workbooks.Count To 1 Step -1
        Debug.Print Workbooks(i).FullName
    Next i

End Sub

Открыть рабочую книгу

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

Следующий код VBA открывает книгу «Книга1.xlsm» в папке «C: Документы»

Sub OtkritKnigu()

    ' Откройте книгу и распечатайте количество листов в ней
    Workbooks.Open ("C:ДокументыКнига1.xlsm")

    Debug.Print Workbooks("Книга1.xlsm").Worksheets.Count

    ' Закройте книгу без сохранения
    Workbooks("Книга1.xlsm").Close saveChanges:=False

End Sub

Рекомендуется проверить, действительно ли существует книга,
прежде чем открывать ее. Это предотвратит ваши ошибки. Функция Dir позволяет
вам легко это сделать.

Sub OtkritKniguDir()

    If Dir("C:ДокументыКнига1.xlsm") = "" Then
        ' Файл не существует - сообщение пользователю
        MsgBox "Could not open the workbook. Please check it exists"
    Else
        ' открыть книгу и сделать что-нибудь с ней
        Workbooks.Open("C:ДокументыКнига1.xlsm").Open
    End If

End Sub

Проверить открыта ли книга

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

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

Function GetWorkbook(ByVal sFullFilename As String) As Workbook
    
    Dim sFilename As String
    sFilename = Dir(sFullFilename)
    
    On Error Resume Next
    Dim wk As Workbook
    Set wk = Workbooks(sFilename)
    
    If wk Is Nothing Then
        Set wk = Workbooks.Open(sFullFilename)
    End If
    
    On Error Goto 0
    Set GetWorkbook = wk
    
End Function

Вы можете использовать эту функцию так:

Sub PrimerOtkritiyaKnigi()

    Dim sFilename As String
    sFilename = "C:ДокументыКнига2.xlsx"

    Dim wk As Workbook
    Set wk = GetWorkbook(sFilename)
    
End Sub

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

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

' Функция для проверки, если книга уже открыта
Function IsWorkBookOpen(strBookName As String) As Boolean
    
    Dim oBk As Workbook
    
    On Error Resume Next
    Set oBk = Workbooks(strBookName)
    On Error GoTo 0
    
    If Not oBk Is Nothing Then
        IsWorkBookOpen = True
    End If
    
End Function

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

Sub PrimerIsp()

    Dim sFilename As String
    sFilename = "C:tempwritedata.xlsx"

    If IsWorkBookOpen(Dir(sFilename)) = True Then
        MsgBox "File is already open. Please close file and run macro again."
        Exit Sub
    End If
    
    ' Написать в книгу здесь
    
End Sub

Если вам нужно проверить, открыта ли книга в другом экземпляре Excel, вы можете использовать атрибут ReadOnly книги. Будет установлено значение true, если оно открыто в другом экземпляре.

Закрыть книгу

Закрыть книгу в Excel VBA очень просто. Вы просто вызываете метод Close рабочей книги.

Обычно, когда вы закрываете книгу в VBA, вы не хотите видеть
сообщения из Excel, спрашивающие, хотите ли вы сохранить файл.

Вы можете указать, сохранять ли книгу или нет, и тогда
сообщения Excel не будут появляться.

' Не сохранять изменения
wk.Close SaveChanges:= False

' Сохранить изменения
wk.Close SaveChanges:= True

Очевидно, что вы не можете сохранить изменения в книге,
которая в данный момент открыта только для чтения.

Сохранить книгу

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

Вы также можете использовать метод SaveAs

wk.SaveAs "C:Резервная копияСчета.xlsx"

Метод WorkAs SaveAs поставляется с двенадцатью параметрами, которые позволяют вам добавить пароль, установить файл только для чтения и так далее. Вы можете увидеть детали здесь.

Вы также можете использовать VBA для сохранения книги в виде копии с помощью SaveCopyAs.

Копировать книгу

Если рабочая книга открыта, вы можете использовать два метода в приведенном выше разделе для создания копии, т.е. SaveAs и SaveCopyAs.

Если вы хотите скопировать книгу, не открывая ее, вы можете использовать FileCopy, как показано в следующем примере:

Sub KopirovatKnigu()
    FileCopy "C:ДокументыДокументы.xlsm", "C:ДокументыПример копии.xlsm"
End Sub

Использование диалогового окна «Файл» для открытия рабочей книги

В предыдущем разделе показано, как открыть книгу с заданным именем. Иногда вам может понадобиться, чтобы пользователь выбрал рабочую книгу. Вы можете легко использовать Windows File Dialog.

FileDialog VBA Workbook

FileDialog настраивается, и вы можете использовать его так:

  1. Выберите файл.
  2. Выберите папку.
  3. Откройте файл.
  4. «Сохранить как» файл.

Если вы просто хотите, чтобы пользователь выбрал файл, вы можете использовать функцию GetOpenFilename.

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

Public Function UserSelectWorkbook() As String

    On Error Goto ErrorHandler

    Dim sWorkbookName As String

    Dim FD As FileDialog
    Set FD = Application.FileDialog(msoFileDialogFilePicker)

    ' Откройте диалоговое окно файла
    With FD
        ' Установить заголовок диалога
        .Title = "Please Select File"

        ' Добавить фильтр
        .Filters.Add "Excel Files", "*.xls;*.xlsx;*.xlsm"

        ' Разрешить выбор только одного файла
        .AllowMultiSelect = False

        ' Диалог дисплея
        .Show

        If .SelectedItems.Count > 0 Then
            UserSelectWorkbook = .SelectedItems(1)
        Else
            MsgBox "Selecting a file has been cancelled. "
            UserSelectWorkbook = ""
        End If
    End With

    ' Убирать
    Set FD = Nothing
Done:
    Exit Function
ErrorHandler:
    MsgBox "Error: " + Err.Description
End Function

Когда вы вызываете эту функцию, вы должны проверить, отменяет ли пользователь диалог.

В следующем примере показано, как легко вызвать функцию UserSelectWorkbook и обработать случай отмены пользователя.

Public Sub TestViborPolz()

    Dim userBook As Workbook, sFilename As String

    ' Вызовите функцию UserSelectworkbook
    sFilename = UserSelectWorkbook()

    ' Если имя файла возвращается пустым, пользователь отменил
    If sFilename <> "" Then
        ' Откройте книгу и сделайте что-нибудь с ней
        Set userBook = Workbooks.Open(sFilename)
    End If

End Sub

Вы можете настроить диалог, изменив Title, Filters и AllowMultiSelect в функции UserSelectWorkbook.

Использование ThisWorkbook

Существует более простой способ доступа к текущей книге, чем использование Workbooks() . Вы можете использовать ключевое слово ThisWorkbook. Это относится к текущей книге, то есть к книге, содержащей код VBA.

Если наш код находится в книге, называемой МойVBA.xlsm, то ThisWorkbook и Workbooks («МойVBA.xlsm») ссылаются на одну и ту же книгу.

Использование ThisWorkbook более полезно, чем использование Workbooks (). С ThisWorkbook нам не нужно беспокоиться об имени файла. Это дает нам два преимущества:

  1. Изменение имени файла не повлияет на код
  2. Копирование кода в другую рабочую книгу не
    требует изменения кода

Это может показаться очень маленьким преимуществом. Реальность такова, что имена будут меняться все время. Использование ThisWorkbook означает, что ваш код будет работать нормально.

В следующем примере показаны две строки кода. Один с помощью ThisWorkbook, другой с помощью Workbooks (). Тот, который использует Workbooks, больше не будет работать, если имя МойVBA.xlsm изменится.

Sub IzmenenieImeni()

    ' Обе строки делают одно и то же.
    Debug.Print ThisWorkbook.FullName
    Debug.Print Workbooks("МойVBA.xlsm").FullName

End Sub

Использование ActiveWorkbook

ActiveWorkbook относится к книге, которая в данный момент активна. Это тот, который пользователь последний раз щелкнул.

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

Использование ActiveWorkbook также затрудняет чтение кода. Из кода может быть не очевидно, какая книга должна быть активной.

Надеюсь, я дал понять, что вам следует избегать использования ActiveWorkbook, если в этом нет необходимости. Если вы должны быть очень осторожны.

Примеры доступа к книге

Мы рассмотрели все способы доступа к книге. Следующий код показывает примеры этих способов.

Sub PrimerDostupaKKnige()

    ' Это рабочая книга, которая уже открыта и называется МойVBA.xlsm.
    Debug.Print Workbooks("МойVBA.xlsm").FullName

    ' Рабочая книга, содержащая этот код
    Debug.Print ThisWorkbook.FullName

    ' Открытая рабочая книга, которая была открыта первой
    Debug.Print Workbooks(1).FullName

    ' Открытая рабочая книга, которая была открыта последней
    Debug.Print Workbooks(Workbooks.Count).FullName

    ' Рабочая книга, которая в настоящее время активна
    Debug.Print ActiveWorkbook.FullName

    ' Рабочая книга не указана - будет использована активная
    Debug.Print Worksheets("Лист1").Name

    ' Закрытая рабочая книга с именем Книга1.xlsm в папке 
      'C:Документы
    Workbooks.Open ("C:ДокументыКнига1.xlsm")
    Debug.Print Workbooks("Книга1.xlsm").FullName
    Workbooks("Книга1.xlsm").Close

End Sub

Объявление переменной VBA Workbook

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

Sub OtkrKnigaPerem()

    Dim wrk As Workbook
    Set wrk = Workbooks.Open("C:ДокументыКнига1.xlsm")

    ' Распечатать количество листов в каждой книге
    Debug.Print wrk.Worksheets.Count
    Debug.Print wrk.Name

    wrk.Close

End Sub

Вы можете установить переменную книги с помощью любого из
методов доступа, которые мы видели.

Ниже показан тот же код без переменной рабочей книги.

Sub OtkrKnigaNetPerem()

   Workbooks.Open ("C:ДокументыКнига1.xlsm")

   Debug.Print Workbooks("Книга2.xlsm").Worksheets.Count
   Debug.Print Workbooks("Книга2.xlsm").Name

    Workbooks("Книга2.xlsm").Close

End Sub

В этих примерах разница несущественная. Однако, когда у вас много кода, использование переменной полезно, в частности, для рабочего листа и диапазонов, где имена имеют тенденцию быть длинными, например thisWorkbook.Worksheets («Лист1»). Range («A1»).

Вы можете назвать переменную книги как wrkRead или wrkWrite. Затем вы можете сразу увидеть,
для чего используется эта книга.

Создать новую книгу

Для создания новой рабочей книги вы используете функцию добавления рабочих книг. Эта функция создает новую пустую книгу. Это то же самое, что выбрать «Новая книга» в меню «Файл Excel».

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

Sub SozdatKnigu()

    Dim wrk As Workbook
    Set wrk = Workbooks.Add

    ' Сохранить как xlsx. Это по умолчанию.
    wrk.SaveAs "C:TempПример.xlsx"

    ' Сохранить как макрокоманду
    wrk.SaveAs "C:TempПример.xlsm", xlOpenXMLWorkbookMacroEnabled

End Sub

Когда вы создаете новую книгу, она обычно содержит три листа. Это определяется свойством Application.SheetsInNewWorkbook.

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

Sub SozdatKniguMnStr()

    ' Сохраните значение SheetsInNewWorkbook, чтобы мы могли сбросить его позже
    Dim sheetCnt As Long
    sheetCnt = Application.SheetsInNewWorkbook

    ' Установите листы в новой книге, чтобы быть 7
    Application.SheetsInNewWorkbook = 7

    ' Рабочая книга будет создана из 7 листов
    Dim wrk As Workbook
    Set wrk = Workbooks.Add

    ' Показать количество листов
    Debug.Print "number of sheets: " & CStr(wrk.Worksheets.Count)

    ' Сброс к первоначальному значению
    Application.SheetsInNewWorkbook = sheetCnt

End Sub

With и Workbook

Ключевое слово With облегчает чтение и написание кода VBA.
Использование с означает, что вам нужно упомянуть только один раз. С
используется с объектами. Это такие элементы, как рабочие книги, рабочие
таблицы и диапазоны.

В следующем примере есть два Subs. Первый похож на код,
который мы видели до сих пор. Второй использует ключевое слово With. Вы можете
увидеть код гораздо понятнее во втором Sub. Ключевые слова End With обозначают
конец кода раздела с помощью With.

' Не используется ключевое слово With
Sub NeIspWith()

   Debug.Print Workbooks("Книга2.xlsm").Worksheets.Count
   Debug.Print Workbooks("Книга2.xlsm").Name
   Debug.Print Workbooks("Книга2.xlsm").Worksheets(1).Range("A1")
   Workbooks("Книга2.xlsm").Close

End Sub

' Использование With делает код легче читать
Sub IspWith()

    With Workbooks("Книга2.xlsm")
        Debug.Print .Worksheets.Count
        Debug.Print .Name
        Debug.Print .Worksheets(1).Range("A1")
        .Close
    End With

End Sub

Резюме

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

  1. Чтобы получить рабочую книгу, содержащую код, используйте ThisWorkbook.
  2. Чтобы получить любую открытую книгу, используйте Workbooks («Пример.xlsx»).
  3. Чтобы открыть книгу, используйте Set Wrk = Workbooks.Open («C: Папка Пример.xlsx»).
  4. Разрешить пользователю выбирать файл с помощью функции UserSelectWorkbook, представленной выше.
  5. Чтобы создать копию открытой книги, используйте свойство SaveAs с именем файла.
  6. Чтобы создать копию рабочей книги без открытия, используйте функцию FileCopy.
  7. Чтобы ваш код было легче читать и писать, используйте ключевое слово With.
  8. Другой способ прояснить ваш код — использовать переменные Workbook.
  9. Чтобы просмотреть все открытые рабочие книги, используйте For Every wk в Workbooks, где wk — это переменная рабочей книги.
  10. Старайтесь избегать использования ActiveWorkbook и Workbooks (Index), поскольку их ссылка на рабочую книгу носит временный характер.

Вы можете увидеть краткое руководство по теме в верхней части этой статьи

 Заключение

Это был подробная статья об очень важном элементе VBA — Рабочей книги. Я надеюсь, что вы нашли ее полезной. Excel отлично справляется со многими способами выполнения подобных действий, но недостатком является то, что иногда он может привести к путанице.

Чтобы получить максимальную пользу от этой статьи, я рекомендую вам попробовать примеры. Создайте несколько книг и поиграйтесь с кодом. Внесите изменения в код и посмотрите, как эти изменения влияют на результат. Практика — лучший способ выучить VBA.

Понравилась статья? Поделить с друзьями:
  • Excel vba запись в txt
  • Excel vba если оператор if
  • Excel vba записать ячейку как число
  • Excel vba если нет данных
  • Excel vba заменить файл