Как открывать файл excel в миф

Открытие книги Excel из кода VBA. Проверка существования книги. Создание новой книги, обращение к открытой книге и ее закрытие. Методы Open, Add и Close.

Открытие существующей книги

Существующая книга открывается из кода VBA Excel с помощью метода Open:

Workbooks.Open Filename:=«D:test1.xls»

или

Workbooks.Open («D:test1.xls»)

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

Проверка существования файла

Проверить существование файла можно с помощью функции Dir. Проверка существования книги Excel:

If Dir(«D:test1.xls») = «» Then

    MsgBox «Файл не существует»

Else

    MsgBox «Файл существует»

End If

Или, если файл (книга Excel) существует, можно сразу его открыть:

If Dir(«D:test1.xls») = «» Then

    MsgBox «Файл не существует»

Else

    Workbooks.Open Filename:=«D:test1.xls»

End If

Создание новой книги

Новая рабочая книга Excel создается в VBA с помощью метода Add:

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

Workbooks.Add

ActiveWorkbook.SaveAs Filename:=«D:test2.xls»

В кавычках указывается полный путь сохраняемого файла Excel, включая присваиваемое имя, в примере — это «test2.xls».

Обращение к открытой книге

Обращение к активной книге:

Обращение к книге с выполняемым кодом:

Обращение к книге по имени:

Workbooks(«test1.xls»)

Workbooks(«test2.xls»)

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

Открытая рабочая книга закрывается из кода VBA Excel с помощью метода Close:

Workbooks(«test1.xlsx»).Close

Если закрываемая книга редактировалась, а внесенные изменения не были сохранены, тогда при ее закрытии Excel отобразит диалоговое окно с вопросом: Вы хотите сохранить изменения в файле test1.xlsx? Чтобы файл был закрыт без сохранения изменений и вывода диалогового окна, можно воспользоваться параметром метода Close — SaveChanges:

Workbooks(«test1.xlsx»).Close  SaveChanges:=False

или

Workbooks(«test1.xlsx»).Close  (False)

Закрыть книгу Excel из кода VBA с сохранением внесенных изменений можно также с помощью параметра SaveChanges:

Workbooks(«test1.xlsx»).Close  SaveChanges:=True

или

Workbooks(«test1.xlsx»).Close (True)


Фразы для контекстного поиска: открыть книгу, открытие книги, создать книгу, создание книги, закрыть книгу, закрытие книги, открыть файл Excel, открытие файла Excel, существование книги, обратиться к открытой книге.


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

Открытие файла Excel

Set objExcel = New Excel.Application
objExcel.Visible = False
Set wb = objExcel.Workbooks.Open(fname)
Set ws = wb.Sheets(1)

В первой строке запускаем новый Excel, затем делаем его невидимым, в 3-й строке открываем файл fname. В последней строке получаем первый лист открытого excel-кого файла.

Альтернативный вариант открытия файла

Set objExcel = New Excel.Application
Set wb = objExcel.Workbooks
wb.Open fname, local:=True
Set ws = wb.Item(1).ActiveSheet

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

UpdateLinks — обновлять или нет внешние ссылки при открытии файла;
ReadOnly — открытие в режиме только для чтения;
Format — используемый при открытии разделитель (1 — символ tab, 2 — запятые, 3 — пробелы, 4 — точка с запятой, 5 — без разделителя, 6 — пользовательский разделитель, заданный в Delimiter);
Delimiter — пользовательский разделитель (в случае, если Format = 6);
Origin — тип операционной системы (xlMacintosh, xlWindows или xlMSDOS);
Local — использование в Excel языка такого же, как в открываемом файле.

Теперь можно выполнять какие-то действия с открытым файлом, просто обращаясь через wb и ws.

ws.Cells(1, 1).Value = "Test"
ws.Cells(1, 1).Font.Size = 18 ' Поменять размер шрифта
ws.Cells(1, 1).HorizontalAlignment = xlCenter ' 

Записать книгу и закрыть

wb.Save ' Записать с тем же именем
wb.SaveAs Filename:="имя_нового_файла", FileFormat:=xlOpenXMLWorkbookMacroEnabled ' Записать в новый файл
wb.Close ' Закрыть книгу

Для записи текущей книги (где находится макрос), можно использовать:

ActiveWorkbook.SaveAs 

Чтобы сохранить или перезаписать книгу Excel без вопросов, можно применить такой вариант:

Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:="c:Temp001.xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled
Application.DisplayAlerts = True

У метода SaveAs есть несколько параметров сохранения, с ними можно ознакомиться на сайте Microsoft.

Если нужно, можно закрыть книгу Excel без сохранения изменений таким образом:

wb.Close False

Visual Basic for Applications (VBA) is a frequently used utility for Microsoft applications — including Microsoft Excel, Office, PowerPoint, Word, and Publisher. As VBA is a fairly complicated language to learn, much has been written about it and its capabilities (and if you want to learn more about VBA and Excel, you can read about it here).

One of the most basic tasks you can use VBA for is to open and manipulate files, such as an Excel file. VBA open files will open the Excel file — from there you can control how it is read and written. Commonly, you would use VBA code to open the file, and then use Excel VBA macros to write to the file. 

Let’s take a deeper look into how VBA open files can be used with an Excel Workbook.

What is VBA Open Files and how does it work?

VBA is extremely similar to Visual Basic, a programming language used within the Microsoft ecosystem. It is used to create “macros.” A macro is a sequence of automated events which can fine-tune, optimize, automate, and improve your operations. The Excel VBA implementation can open files and run macros on them.

In Excel, you use VBA by inserting the code in the Visual Basic Editor. You can also choose the “Macro” button on the Developer Tab. From there, you will enter in code as though programming.

Before you start digging into VBA, you should have some understanding of programming. Programming means directing a computer to perform a certain sequence of events. Keep a few things in mind:

  • You should always test your programming thoroughly to make sure it does what you want it to do.
  • You should never implement your programming in a “live” environment with important data rather than test data.
  • You should save your work frequently and you should be prepared to restore both your programming and your data if needed.
Person wearing headphones looking at laptop screen and typing

Running the macros you program

When macros are created, they’re assigned to given keypresses. Sometimes this is a combination of keys, and sometimes it’s an extra mouse button. Regardless, they’re intended to set off an automated chain of events whenever you do the given action (whether it’s pressing a key on your keyboard, or a button on your mouse). You can also run a macro manually by selecting it.

So, when you run a macro, you have Microsoft Excel already open. The macro runs within Excel, and you will do all your VBA programming inside of that program. Likewise, you will do your Microsoft Word VBA programming inside of Microsoft Word.

Opening an Excel file with VBA

The first step to updating, modifying, and saving Excel files is to be able to open them. To open an Excel file with VBA you would program as follows:

Sub openworksheet()
	Workbooks.Open filename:= _ “filepath”
	End sub

The “sub” above is a lot like a function. It creates a small amount of code that is intended to take action. It begins with “Sub” and ends with “End Sub.”

In the above code, note that the italicized “filepath” references the full path of the workbook. Without the appropriate Workbooks.Open filename, you won’t be able to open the given file. You will also need the appropriate file type (Microsoft Excel, which is either XLS or XLSX) or the open method will fail.

Of course, the above assumes that you are always going to be opening the Workbook at the “filepath.” You might also want to open any file at all. You can create a macro that opens a dialog, through which you can select any file.

	Sub openworksheet()
	Dim Flocation as Variant
	Flocation = Application.GetOpenFileName()
	If Flocation <> false then 
	Workbooks.Open Filename:= Flocation
	End If
	End Sub

The above code prompts the user to give a file name. If the user does give a file name (the variable, Flocation is no longer false), then the program will open that file.

Also note that Flocation is just the name of the variable that’s being used. You could call it something else; in fact, you could even call it just “f.” All that’s important is that you don’t use a word that the code already uses, such as “Variant” or “Filename.”

You might also be wondering why this code is so important. After all, you can open your own files at any time. But you can bind it to a specific keypress, making it a macro. So, now, typing something like “F8” will automatically open the “open a file” dialog.

But once you’ve automatically opened a file, what’s next? Generally, opening the file is only the first step. Once you’ve opened the Excel file, you still need to be able to read and write to it.

Reading the Excel file

You’ve opened your Excel file. But what’s inside of it? Luckily for you, it’s pretty easy to start reading an Excel file once you’ve opened it with VBA.

First, you should know that when you open a file, it becomes the ActiveWorkbook, which can be referenced in code as “ActiveWorkbook.”

Let’s say you want to read the first cell of the book.

Dim contents As Integer
	contents = ActiveWorkbook.Range(“A1”).value

Now, that does assume that the cell is an Integer. You would need to change it to a String if you were reading a string, or a Date if you were reading a Date. Consequently, you need to be really familiar with the type of data you’re reading before you go any further.

Now, note that this is reading the contents of the cell into just a variable. That’s not displaying it. That’s not doing anything with it at all. If you wanted to see, perhaps, what the contents were, you would then type:

MsgBox contents

Alternatively, you could:

MsgBox ActiveWorkbook.Range(“A1”).value

Either of these options should display the value. But, of course, it’s a static value; it’s always going to display A1. So, you might need to code things a little more expressively if you’re trying to read the entirety of a document, or if you’re trying to transition one document to another.

Writing to the file

So, you have your workbook open through the power of VBA. But now you want to write to the file. Writing can be used in tandem with reading; once the Workbook is open you could do both. 

As an example, you could write a macro that would open a Workbook and copy one column to another column, by reading the data in the first column and then writing that data to the second column.

Similarly, you could write a macro that would open two Workbooks and copy data from one to another, and then save both Workbooks, and then close both Workbooks.

As mentioned, once you open a workbook with VBA, the workbook that you opened becomes the ActiveWorkbook. This also happens if you have created a new workbook within VBA.

You can then access its data through:

ActiveWorkbook.Sheets
ActiveWorbook.Cells

As an example, if you wanted to edit the cell at column 1, row 1, on Sheet 1, you would write as follows:

ActiveWorkbook.Sheets(“Sheet 1”).Cells(1,1).Value= “1”

If this is confusing, you can also use the “Range” field.

ActiveWorkbook.Sheets(“Sheet 1”).Range(“A1”).Value= “1”

The above would have the same result.  

Writing to a sheet can become very complex. Consider that, when you’re writing the macro system, you don’t know what data is in those cells. You only know their positions. You’re essentially writing to that position blindly.

Macros are frequently used to do things such as read CSV files and import that CSV information into a brand new Microsoft Excel workbook. But it takes a lot of time and a lot of testing to ensure that the data is going through correctly.

In the above case, you’re only altering range A1. But you could iterate through all the rows and columns of a workbook one by one if you were trying to fill it out line by line. As you learn more about Excel and VBA, you will learn more advanced methods of both reading and writing data.

Saving the Excel workbook file

Just like when you’re using Excel regularly, you still need to save your changes. If you have opened and changed a Workbook, save it before you close it. 

ActiveWorkbook.Save

You could even write a Macro that would save all your workbooks and close them, as follows:

For each workbook in Application.Workbooks
		workbook.Save
	Next workbook
		Application.Quit

The above code iterates through each Workbook saving it until it cannot find a Workbook anymore. Once it can no longer find a Workbook, it quits the application. This is very useful for those who want to shut down fast and have a lot of workbooks left to save.

Closing the selected file

Closing the file is just as easy as opening a workbook. In fact, it’s actually easier, because you don’t need to know the file name. VBA already knows which file it has opened.

To close the Excel file you would type:

ActiveWorkbook.Close

On the other hand, perhaps you wanted to close a specific Workbook. In that case, you would use the following:

Workbooks(“book.xlsx”).Close

This is under the assumption the book was called “book.xlsx”; you would replace the given name for your sheet. Once you have closed the Workbook, you will not be able to make any further modifications to it until you open it again.

Opening a Microsoft Excel workbook that is password protected

Sometimes you may have password-protected your workbooks. That goes into more complicated territory. Understandably, it’s not going to open if you just try to directly open it. 

But you can still open it with VBA.

Workbooks.Open(filename:= “filename”, Password:= “password”)

As you can see above, you just added the password directly into the macro. Now the file is going to open just fine.

But there’s a problem with the above, which (if you’re good with security) you already know. You just saved your password as plain text! 

Now, anyone with access to your computer could potentially open that file without knowing the password. And if you’ve been using that password for multiple files (a big no-no), they could be compromised, too.

So, VBA does provide a method of opening files that have a password. But it’s not a good method because of the above reasons. It means that your system could be compromised. If you just have a password to prevent outside intrusion (the file being sent somewhere else and opened by an outsider), this may not be a problem. But if you’re trying to protect your file internally as well as externally, it can be a major issue.

The alternative is to use the previous method of opening a file with a dialogue box. When you press a button (or otherwise launch your macro), you’ll be given a dialogue box, and you’ll be able to open whatever file you want. Your macro can then continue actions on the file after you have manually entered your password. 

Opening a read-only file

Some Microsoft Excel files don’t have a password when you open them. Instead, they are set to read-only. If they’re set to read-only, you’ll be able to open and read from them. But you won’t be able to actually write to them without a secondary password. 

ActiveWorkbook.Password = “password”

Above is the method that you would call after you’ve opened the book so that you can start to write to it. You wouldn’t include the password when opening the file, because you wouldn’t have been prompted for it then.

The benefits of using Excel VBA Open

VBA is used to automate routine, mundane tasks, such as copying large volumes of data from one book to another. Any time you’re finding yourself spending hours just copying and pasting data, or running fairly mundane calculations, a macro can help.

You can also use VBA to automate smaller tasks that you find use a lot of keypresses. If you find yourself frequently needing to open the same 10 Excel Workbooks at once, for instance, you can create a macro that will open all of them on a single keypress, and close them all, too.

While it may only save you a few minutes of time, those minutes of time add up.

Potential issues with Excel VBA Open

It’s possible to run into issues with VBA open. If you have a protected workbook, you won’t be able to open it without the password (as noted). If you don’t have the password, you aren’t going to be able to open the file.

If the selected file is read-only, you aren’t going to be able to write to it without the right permissions. If you don’t realize that the file is read-only, you could try writing to it only for the action to fail. 

And because you can’t always see what the macro is doing until you run it, you can potentially overwrite data or delete it altogether. This is why it’s always important to test your macros with test data before trying to implement it with live data.

But even so, Excel VBA open is a robust language. Most common activities with Workbooks (such as opening, closing, reading, writing, and saving) can be completed quite intuitively and often with a single line of code.

Learning more about Excel VBA

In the right hands, VBA is very powerful. If you have any automated, routine tasks in Excel, consider automating them with Excel VBA. Even better, once you learn the basics of VBA, you can also use it in other Microsoft applications such as Microsoft Word.

Still, powerful also means that mistakes can be made. Because VBA can open files and write to them, it’s also possible that it can overwrite data. This is why testing your programming is so important. 


Frequently Asked Questions:

Can a macro open a file?

The Excel Macro can be used to prompt a user to open a file or to open a specific file (given the entire filename). 

How do I open a text file in Excel VBA?

The VBA OpenTextFile method can be used to open a text file, just as the VBA Workbooks.Open method is used to open an Excel file.

How do I open a new workbook in VBA?

To open a new workbook in VBA, you would use the Workbooks.Add() VBA function. This function both creates a new workbook and prioritizes it as the active workbook.

 

deathogre

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

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

Здрасьте. Как программно открыть книгу эксель и сохранить эту книгу (объект) в глобальной переменной?

 

Юрий М

Модератор

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

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

#2

13.02.2016 13:53:37

1. Открытие нужной книги запишите макрорекордером — получите готовый код.
2.

Код
Dim Wb As Workbook
Set Wb = ActiveWorkbook
 

Hugo

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

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

#3

13.02.2016 13:53:58

Код
Set wb = Workbooks.Open(filename)
 

deathogre

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

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

Мне нужно открыть книгу из другой книги

 

Юрий М

Модератор

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

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

#5

13.02.2016 13:55:02

Цитата
deathogre написал:
Мне нужно открыть книгу из другой книги

И что?

 

deathogre

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

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

#6

13.02.2016 14:02:59

Объявил глобальную переменную в модуле ЭтаКнига

Код
Public Главнейшая As Workbook

открыл книгу в модуле АктивХ формы

Код
ChDir "\Margo123Тест"
Workbooks.Open Filename:="\Margo123Тест6.02.2016.xlsm"
Set ЭтаКнига.Главнейшая = Workbooks("\Margo123Тест6.02.2016.xlsm")

выдает ошибку на 3 строке, Run-time error 9 Subscript out of range

 

Юрий М

Модератор

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

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

Глобальную переменную в стандартный модуль — будет доступна всюду. И  модуль не нужно указывать.
Если книга уже открыта — зачем указывать путь?

 

deathogre

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

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

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

 

Юрий М

Модератор

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

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

#9

13.02.2016 14:21:54

Обращайтесь — кто мешает? )

Код
Public Wb As Workbook
Sub Макрос1()
    Workbooks.Open Filename:="D:ОтчетыСостояние ТС.xlsm"
    Set Wb = ActiveWorkbook
    MsgBox Wb.Name
End Sub
 

KL

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

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

#10

13.02.2016 14:53:27

Или даже так:

Код
Public Wb As Workbook
Sub Макрос1()
    Set Wb = Workbooks.Open (Filename:="D:ОтчетыСостояние ТС.xlsm")
    MsgBox Wb.Name
End Sub

KL

 

KL

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

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

Кстати, ChDir для открытия книги таким способом не нужен. Он нужен для функции GetOpenFileName, которая, кстати, тоже уже не нужна, т.к. уже давно есть Application.FileDialog(msoFileDialogOpen) :)

 

Юрий М

Модератор

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

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

Кирилл, а рекордер упорно пишет  ChDir ))

 

KL

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

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

Юр, ну мало ли что на заборах пишут. Рекордер еще и Select обожает :)

 

Юрий М

Модератор

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

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

#14

13.02.2016 15:16:46

))

To open a workbook using VBA, you need to use the “Workbook.Open” method and specify the path of the file (make sure to specify the full path to the workbook with name and extension file type). This method has a total of fifteen optional arguments which you can use to deal with different kinds of files.

In this tutorial, we will explore it in detail and look at an alternative method that you can use.

Steps to Open a Workbook using VBA

  1. To start the code, use the “Workbooks” object.
  2. Type a dot (.) after that and select the Open method from the list.
  3. Specify the file path in the first argument and make sure to enclose it in double quotation marks.
  4. In the end, run the code to open the workbook.
Sub vba_open_workbook()
Workbooks.Open "C:UsersDellDesktopmyFile.xlsx"
End Sub

Helpful Links: Run a Macro – Macro Recorder – Visual Basic Editor – Personal Macro Workbook

Workbook.Open Syntax

Now it’s time to look at the syntax of the method that you just have used in the above example. As I mentioned, there are fifteen arguments that you can use:

expression.Open (FileName, UpdateLinks, _
ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, _
Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad)

You won’t be using all these arguments. But a few of them are quite important and could be useful for you in the real world.

Opening a Password Protected Workbook

If you want to open a workbook that is password-protected, in that case, you can specify the password with the password argument.

Here I have a workbook on the desktop that has the password “test123” and now I want to open it and unprotect it at the same time. Following is the code that I need to use.

Workbooks.Open "C:UsersDellDesktopmyFile.xlsx", , , Password:="test123"

Opening a Workbook as Read Only

When you open a workbook as read-only you can’t make changes to the same workbook, but you need to save a copy of it.

Workbooks.Open "C:UsersDellDesktopFolder1.xlsx", , True

Open All the Workbooks from a Folder

Sub vba_open_multiple_workbooks_folder()
    Dim wb As Workbook
    Dim strFolder As String
    Dim strFile As String
        strFolder = "C:UsersDellDesktopFolder"
        strFile = Dir(strFolder & "*.xls*")
        Do While strFile <> ""
            Set wb = Workbooks.Open(strFolder & strFile)
            strFile = Dir
        Loop
End Sub

To use it as per your needs, make sure to change the folder path.

Sub vba_open_dialog()
    Dim strFile As String
    strFile = Application.GetOpenFilename()
    Workbooks.Open (strFile)
End Sub

More on VBA Workbooks

VBA Save Workbook | VBA Close Workbook | VBA Delete Workbook | VBA ThisWorkbook | VBA Rename Workbook | VBA Activate Workbook | VBA Combine Workbook | VBA Protect Workbook (Unprotect) | VBA Check IF a Workbook is Open | VBA Check IF an Excel Workbook Exists in a Folder| VBA Create New Workbook (Excel File)

  • VBA Workbook

11 / 11 / 2

Регистрация: 17.02.2011

Сообщений: 145

1

22.11.2011, 14:56. Показов 52962. Ответов 24


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

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



0



1 / 1 / 0

Регистрация: 19.09.2011

Сообщений: 51

22.11.2011, 15:03

2

Excle? Excele? Не знакомый софт. Или вы про MS Office | Excel?



0



11 / 11 / 2

Регистрация: 17.02.2011

Сообщений: 145

22.11.2011, 15:06

 [ТС]

3

excel, офис, конечно, *.xls



0



Памирыч

Почетный модератор

21371 / 9105 / 1082

Регистрация: 11.04.2010

Сообщений: 11,014

22.11.2011, 15:24

4

Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public Class Form1
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Exc As Object
        Exc = CreateObject("Excel.Application")
        Exc.Workbooks.Open("C:1.xls").Activate()
        Exc.Cells(1, 1) = "ПРИВЕТ!"
        Exc.Rows(7).Insert(Shift:=-4121)
        Exc.ActiveWorkbook.Save()
        Exc.ActiveWorkbook.Close()
        Exc.Quit()
        Exc = Nothing
    End Sub
End Class



7



11 / 11 / 2

Регистрация: 17.02.2011

Сообщений: 145

22.11.2011, 15:35

 [ТС]

5

Памирыч, а лист книги эксель где указывать?



0



Юпатов Дмитрий

1706 / 1194 / 227

Регистрация: 23.12.2010

Сообщений: 1,526

22.11.2011, 15:39

6

Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

1)Добавляем в референцы ссылку на Microsoft Excel 11 object library

далее:

VB.NET
1
2
3
4
Dim _excel as new microsoft.office.interop.excel.application
Dim _workbook as microsoft.office.interop.excel.workbook
_excel.visible=true'отображаем пустой эксель на экране
_workbook=excel.worcbooks.add()'cjplftv новую книгу на основе шаблона по-умолчанию. Если нужен конкретный шаблон, то в скобках указать полный путь к файлу, который будет шаблоном

итог: имеешь экземпляр экселя в переменной _excel и экземпляр книги _workbook. Делай с ними что хошь.
Активация нужного листа в книге:

VB.NET
1
_workbook.sheets(2).activate

активирует лист за номером 2 в книге.
Все остальное — см члены переменных _excel и _workbook. Плюс пользуйся макрорекордером, встроенным в эксель. Там синтаксис на 90% совпадет, ну разве что по мелочам поменяешь.

Еще: в самом начале мы добавили ссылку на библу экселя. Это называется «раннее связывание».
Можно было не добавлять. Тогда это позднее связывание. Тогда ситуация такая:

VB.NET
1
2
Dim _excel as object
Dim _workbook as object

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

VB.NET
1
_excel = getobject("Excel.Application")

или, если фрагмент выше в итоге останется nothing, можно создать новый

VB.NET
1
_excel = createobject("Excel.Application")

далее так же как и по первому примеру. Только нужно хорошо знать объектную модель экселя: члены не будут видны при написании кода.
Примерно так. За 100% корректность синтаксиса не ручаюсь — писал на коленке, но работаю с вордом и экселем часто, так что сильно не наопечатывался.



4



am-wrag

11 / 11 / 2

Регистрация: 17.02.2011

Сообщений: 145

24.11.2011, 14:48

 [ТС]

7

Цитата
Сообщение от Юпатов Дмитрий
Посмотреть сообщение

1)Добавляем в референцы ссылку на Microsoft Excel 11 object library

Обьясни как.
Я так понял это через

VB.NET
1
Import ...

А здесь что именно писать?

Добавлено через 6 минут
Нашол где чо, только у меня Microsoft Excel 14 object library или здесь без разницы, прсото версия поновей?

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



0



Почетный модератор

21371 / 9105 / 1082

Регистрация: 11.04.2010

Сообщений: 11,014

24.11.2011, 14:58

8

Цитата
Сообщение от am-wrag
Посмотреть сообщение

не применим для стартового изучения

Согласен, но я отказался от библ, уж больно их не охота таскать за прогой.
Насчет стартового изучения — полностью за.



0



am-wrag

11 / 11 / 2

Регистрация: 17.02.2011

Сообщений: 145

24.11.2011, 17:27

 [ТС]

9

Обьясните плиз чем отличаются обьекты

VB.NET
1
2
Dim книга As Workbook, book As _Workbook
Dim лст As Worksheet, lst As _Worksheet

Допустим просто Worksheet совершенно не подходит для работы, у него совершенно отсутвуют параметры в отличие от такогоже но с _



0



1706 / 1194 / 227

Регистрация: 23.12.2010

Сообщений: 1,526

24.11.2011, 17:52

10

Цитата
Сообщение от am-wrag
Посмотреть сообщение

меня Microsoft Excel 14 object library

это у тебя просо офис поновее. Кажется 2010.

Цитата
Сообщение от Памирыч
Посмотреть сообщение

Согласен, но я отказался от библ, уж больно их не охота таскать за прогой

В данном случае и не надо таскать библу экселя с собой. Для этого в референцах параметр «копировать локально» ставим в false и все, библа не будет добавляться в пакет установки. А работать даже перетащенная, она без установленного экселя все равно не будет. Так что на конечной машине наличие экселя — обязательно.

Цитата
Сообщение от Памирыч
Посмотреть сообщение

Насчет стартового изучения — полностью за

Конечно, но можно пойти на хитрость:
1) в начале проектирования добавляем библу, пишем код, тестим.
2) На финише типы переменных, завязанные на эту библу, меняем на object, в референцах удаляем ссылку на библу.
Вуаля! Получаем в итоге позднее связывание с удобствами проектирования раннего.



2



am-wrag

11 / 11 / 2

Регистрация: 17.02.2011

Сообщений: 145

28.11.2011, 16:27

 [ТС]

11

Почемуто после каждого сохраниения в процессах остается событие EXCEL.EXE, которое продолжает множится при последующих сохранениях.
В коде имеется

VB.NET
1
xls.ActiveWorkbook.Close() :  xls.Quit()



1



Почетный модератор

21371 / 9105 / 1082

Регистрация: 11.04.2010

Сообщений: 11,014

28.11.2011, 16:48

12

am-wrag, после закрытия программы процессы продолжают висеть?



0



Юпатов Дмитрий

1706 / 1194 / 227

Регистрация: 23.12.2010

Сообщений: 1,526

28.11.2011, 16:57

13

попробуй сделать после всего

VB.NET
1
xls.Dispose

потому как хоть ты эксель и закрыл, но переменная осталась.
Ручаться не стану, но вполне может помочь.
Однако это не очень красиво, т.к. снова использовать объект xls ты сможешь только после рестарта программы (уничтожаем саму переменную, а не значение)



1



11 / 11 / 2

Регистрация: 17.02.2011

Сообщений: 145

28.11.2011, 17:44

 [ТС]

14

Цитата
Сообщение от Памирыч
Посмотреть сообщение

am-wrag, после закрытия программы процессы продолжают висеть?

Когда прога закрывается процессы пропадают. Заметил тут ещё такую чтуку: сохранять позволяет в эксель токлько первый раз, затем процесс сохранения не пашет…



1



Памирыч

Почетный модератор

21371 / 9105 / 1082

Регистрация: 11.04.2010

Сообщений: 11,014

28.11.2011, 17:59

15

Работа такого кода представлена на скрине, в ходе работы программы не было ни одной ошибки:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Class Form1
    Dim appExcel As Object
    Dim I As Integer = 0
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        appExcel = CreateObject("Excel.Application")
        appExcel.Workbooks.Open("C:1.xls")
        appExcel.Visible = False
        With appExcel.ActiveSheet
            .Range("C" & I + 1).Value = "QWERTY" & I
        End With
        appExcel.Workbooks(1).Close(True)
        appExcel.Quit()
        I += 1
    End Sub
End Class

Миниатюры

Работа с excel: Открытие, чтение, запись, сохранение книги
 



5



am-wrag

11 / 11 / 2

Регистрация: 17.02.2011

Сообщений: 145

29.11.2011, 12:47

 [ТС]

16

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

Код сохранения

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub SaveOpt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveOpt.Click
        SaveF.Filter = "Excele 2003 файл настроек (*.xls)|*.xls"
        SaveF.FileName = "Opt_XAR" : SaveF.ShowDialog()
        xls = New Microsoft.Office.Interop.Excel.Application
        Try
            книга = xls.Workbooks.Open(SaveF.FileName) : книга.Activate() : b = 0
        Catch
            книга = xls.Workbooks.Add : книга.Activate() : b = 1
        End Try
        лст = книга.Sheets(1) : c = 1
        For n = 0 To main.TabControl1.TabPages.Count - 1
            For i = c To c - 1 + main.TabControl1.TabPages(n).Controls.Count / 2
                лст.Cells(i, 1) = main.TabControl1.TabPages(n).Controls("LB" & i).Text
                лст.Cells(i, 2) = main.TabControl1.TabPages(n).Controls("TB" & i).Text
            Next
            If n = 0 Then c += 20 Else c += 30
        Next
        лст.Cells(1, 4) = main.Find_name.Text
        If b = 0 Then xls.ActiveWorkbook.Save() Else xls.ActiveWorkbook.SaveAs(SaveF.FileName)
        книга.Close(True) : xls.Quit()
    End Sub

Код загрузки

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 Private Sub OpnOpt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpnOpt.Click
        table = Nothing
        table = New Data.DataTable
        table.Columns.Add("1") : table.Columns.Add("2")
        OpnF.Filter = "Файл настроек (*.xls)|*.xls"
        OpnF.FileName = "Opt_XAR"
        OpnF.ShowDialog()
        Try
            xls = New Microsoft.Office.Interop.Excel.Application
            книга = xls.Workbooks.Open(OpnF.FileName)
            лст = книга.Sheets(1)
            InX.Items.Clear() 
            For i = 1 To лст.UsedRange.Rows.Count
                InX.Items.Add(лст.Cells(i, 1).value2)
                If лст.Cells(i, 2).value2 Is Nothing Then
                Else
                    table.Rows.Add()
                    table.Rows.Item(c).Item(0) = лст.Cells(i, 1).value2
                    table.Rows.Item(c).Item(1) = лст.Cells(i, 2).value2                    
                End If
            Next
            книга.Close(True) : xls.Quit() : ind = 1            
        Catch
            ind = 0
        End Try
    End Sub

Добавлено через 1 час 48 минут
Забыл про обьявления

VB.NET
1
2
3
4
5
6
7
8
9
Imports System.Data
Imports System.IO
Imports Microsoft.Office.Interop.Excel
Public ind, x As Integer
    Dim xls As Application
    Dim книга As Workbook
    Dim лст As _Worksheet, c, b As Integer 
    Dim rng As Range
    Public table As Data.DataTable



1



ctac1412

18 / 18 / 2

Регистрация: 12.02.2013

Сообщений: 387

12.04.2016, 12:44

17

Памирыч, Добрый день! Очень мало инфы по exel для неопытных пользователей в интернете. Если не затрудник, не могли бы взглянуть на проблему?
с тем как записать и вывести значение + закрывание процесса я разобрался…. Но теперь не могу сдеать основное действие.
Нужно найти первую ячейку в столбике B2 по формату( любой цвет который введем, допустим черный)Найти- разукрасить в красный и выдать нам сообщение, причем ячеек может быть не 1 , что мы и спрашиваем в inputbox. В vba у меня получилось, а сюда перенести не могу….. Ошибка выскакивает на _Excel.xlFormulas, xlPart, xlByColumns..в общем уточняющих… Как верно нужно объявлять? Он пишет что они не относятся к _Excel

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        Dim _Excel As New Application 'Приложение Excel
        Dim Книга As Workbook = _Excel.Workbooks.Open("C:UsersStanislavDesktoptest.xlsx", [ReadOnly]:=False) 'Открываем книгу
        Dim Лист As Worksheet = CType(Книга.Worksheets(1), Microsoft.Office.Interop.Excel.Worksheet) 'Первый лист книги
        Try
            _Excel.Range("B1").Select()
        With _Excel.Application.FindFormat.Font
            .Name = "Calibri"
            .FontStyle = "обычный"
            .Size = 11
            .Strikethrough = False
            .Superscript = False
            .Subscript = False
 
            .Color = -1003520
            .TintAndShade = 0
        End With
        _Excel.Cells.Find(What:="", After:=_Excel.ActiveCell, LookIn:=_Excel.xlFormulas, LookAt:=
        _Excel.xlPart, SearchOrder:=_Excel.xlByColumns, SearchDirection:=_Excel.xlNext, MatchCase:=
        False, SearchFormat:=True).Activate()
        _Excel.ActiveCell.Value = "Привет"

Добавлено через 37 минут
Памирыч, нашел рабочий пример на англиццком, если поможете подогнать под мою задачу, было бы отлично…. как задать формат поиска, а не row искать.

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Imports Excel = Microsoft.Office.Interop.Excel
 
Public Class Form1
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim xlApp As New Excel.Application
        Dim xlWb As Excel.Workbook
        Dim xlsheet As Excel.Worksheet
        Dim lRow As Long = 0
 
        With xlApp
            .Visible = True
 
            '~~> Open workbook
            xlWb = .Workbooks.Open("c:Sample.xlsx")
 
            '~~> Set it to the relevant sheet
            xlsheet = xlWb.Sheets("Sheet1")
 
            With xlsheet
                '~~> Check if there is any data in the sheet
                If xlApp.WorksheetFunction.CountA(.Cells) <> 0 Then
                    lRow = .Cells.Find(What:="*", _
                                  After:=.Range("A1"), _
                                  LookAt:=Excel.XlLookAt.xlPart, _
                                  LookIn:=Excel.XlFindLookIn.xlFormulas, _
                                  SearchOrder:=Excel.XlSearchOrder.xlByRows, _
                                  SearchDirection:=Excel.XlSearchDirection.xlPrevious, _
                                  MatchCase:=False).Row
                Else
                    lRow = 1
                End If
            End With
 
            MessageBox.Show("The last row in Sheet1 which has data is " & lRow)
 
            '~~> Close workbook and quit Excel
            xlWb.Close(False)
            xlApp.Quit()
 
            '~~> Clean Up
            releaseObject(xlsheet)
            releaseObject(xlWb)
            releaseObject(xlApp)
 
        End With
    End Sub
 
    Private Sub releaseObject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub
End Class

Автор http://www.siddharthrout.com/2… rettyPhoto



1



Почетный модератор

21371 / 9105 / 1082

Регистрация: 11.04.2010

Сообщений: 11,014

12.04.2016, 13:02

18

ctac1412, Я не знаток Экселя, увы. Будет лучше, если Вы будете обращаться не к конкретным пользователям, а ко всем; не нужно указывать ники. И лучше создавать свои темы.



1



Sallivan_Bidl

0 / 0 / 0

Регистрация: 12.07.2015

Сообщений: 2

24.08.2016, 19:45

19

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

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'~~> Clean Up
            releaseObject(xlsheet)
            releaseObject(xlWb)
            releaseObject(xlApp)
 
        End With
    End Sub
 
    Private Sub releaseObject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub

Только вот этого кода почему-то было недостаточно.

VB.NET
1
2
xlApp.Quit()
xlApp=Nothing

ctac1412, Спасибо!



0



174 / 64 / 13

Регистрация: 22.12.2015

Сообщений: 2,648

06.12.2016, 11:09

20

Цитата
Сообщение от Памирыч
Посмотреть сообщение

Exc.Rows(7).Insert(Shift:=-4121)

а это для чего?



0



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

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.

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

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

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

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

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

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, чтобы узнать больше об автоматическом запуске макросов при открытии книги.

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Как открывать ссылки в word
  • Как открывать ссылки в excel
  • Как открывать программу microsoft office word
  • Как открывать отдельные окна excel 2007
  • Как открывать новую страницу в word

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии