Как присвоить имя книге в excel vba

Открытие книги 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, существование книги, обратиться к открытой книге.


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

maverick_77

Дата: Среда, 01.07.2015, 14:26 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 39


Репутация:

0

±

Замечаний:
20% ±


Excel 2010

Добрый день.

С помощью макроса переменной присваивается имя текущей открытой книги:
[vba]

Код

FN = Application.ActiveWorkbook.Name

[/vba]
Но тогда значение присваивается вместе с расширением .xlsm
Т.е. значение переменной FN такое: «Имя-Книги.xlsm»
Можно ли как-то присвоить только «Имя-Книги»


если нельзя, но очень хочется, то можно!

 

Ответить

RAN

Дата: Среда, 01.07.2015, 14:31 |
Сообщение № 2

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

[vba]

Код

FN = Left$(ActiveWorkbook.Name, Instrrev(ActiveWorkbook.Name,».»)-1)

[/vba]


Быть или не быть, вот в чем загвоздка!

 

Ответить

Manyasha

Дата: Среда, 01.07.2015, 14:37 |
Сообщение № 3

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

Замечаний:
0% ±


Excel 2010, 2016

Или так:[vba]

Код

FN = CreateObject(«Scripting.FileSystemObject»).GetBaseName(ActiveWorkbook.Path & «» & ActiveWorkbook.Name)

[/vba]


ЯД: 410013299366744 WM: R193491431804

 

Ответить

maverick_77

Дата: Среда, 01.07.2015, 14:44 |
Сообщение № 4

Группа: Пользователи

Ранг: Новичок

Сообщений: 39


Репутация:

0

±

Замечаний:
20% ±


Excel 2010

Manyasha, RAN, Спасибо большое!
Сработало. Вроде как надо =)

________
upd

Вариант Manyasha сработал лучше, когда изначально открываем файл из шаблона excel
Вариант RAN работал хорошо, если изначально открывать просто книгу. Но ругался почему-то если открывать шаблон excel


если нельзя, но очень хочется, то можно!

Сообщение отредактировал maverick_77Четверг, 02.07.2015, 14:00

 

Ответить

RAN

Дата: Среда, 01.07.2015, 14:49 |
Сообщение № 5

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Manyasha, если из пушки по воробьям, то
[vba]

Код

ActiveWorkbook.Path & «» & ActiveWorkbook.Name =ActiveWorkbook.FullName

[/vba]


Быть или не быть, вот в чем загвоздка!

 

Ответить

Manyasha

Дата: Среда, 01.07.2015, 15:01 |
Сообщение № 6

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

Замечаний:
0% ±


Excel 2010, 2016

RAN, смешно даже, что сама не вспомнила про него (про полное имя).
Спасибо!)


ЯД: 410013299366744 WM: R193491431804

 

Ответить

AndreTM

Дата: Среда, 01.07.2015, 17:07 |
Сообщение № 7

Группа: Друзья

Ранг: Старожил

Сообщений: 1762


Репутация:

498

±

Замечаний:
0% ±


2003 & 2010

А если без пушек, то FSO.GetBaseName() не требует указания полного пути для файла, можно просто применить эту функцию только к имени, результат будет тот же… :)


Skype: andre.tm.007
Donate: Qiwi: 9517375010

 

Ответить

maverick_77

Дата: Четверг, 02.07.2015, 14:02 |
Сообщение № 8

Группа: Пользователи

Ранг: Новичок

Сообщений: 39


Репутация:

0

±

Замечаний:
20% ±


Excel 2010

AndreTM, поясните, пожалуйста…
Вы имеете в виду сделать так:
[vba]

Код

FN = FSO.GetBaseName()

[/vba]
???


если нельзя, но очень хочется, то можно!

 

Ответить

Макрописец

Дата: Четверг, 02.07.2015, 14:05 |
Сообщение № 9

Группа: Заблокированные

Ранг: Форумчанин

Сообщений: 128


Репутация:

7

±

Замечаний:
100% ±


Excel 2010

Вы имеете в виду сделать так:

Как я понял — Да.


ТЕРПЕНИЕ И ТРУД — ВСЁ ПЕРЕТРУТ!

 

Ответить

Manyasha

Дата: Четверг, 02.07.2015, 14:56 |
Сообщение № 10

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

Замечаний:
0% ±


Excel 2010, 2016

Макрописец, а проверить не хотите прежде чем заверять в работоспособности такого варианта?
maverick_77, читаем внимательней:

применить эту функцию только

к имени

Ну и конечно же про создание FSO не забываем[vba]

Код

Set FSO = CreateObject(«Scripting.FileSystemObject»)
FN = FSO.GetBaseName(ActiveWorkbook.Name)

[/vba]
[p.s.]AndreTM, спасибо, запомню![/p.s.]


ЯД: 410013299366744 WM: R193491431804

 

Ответить

Макрописец

Дата: Четверг, 02.07.2015, 15:15 |
Сообщение № 11

Группа: Заблокированные

Ранг: Форумчанин

Сообщений: 128


Репутация:

7

±

Замечаний:
100% ±


Excel 2010

Manyasha,
Мне не на чем проверить было. Большое спасибо. Мне очень может пригодиться.


ТЕРПЕНИЕ И ТРУД — ВСЁ ПЕРЕТРУТ!

 

Ответить

китин

Дата: Четверг, 02.07.2015, 17:42 |
Сообщение № 12

Группа: Модераторы

Ранг: Экселист

Сообщений: 6973


Репутация:

1063

±

Замечаний:
0% ±


Excel 2007;2010;2016

Мне не на чем проверить было

hands


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852

Сообщение отредактировал китинЧетверг, 02.07.2015, 17:42

 

Ответить

Задача такова:
Workbooks.Add
1) Затем нужно присвоить созданной книге имя.
2) Открыть другие книги и перенести из них листы в эту созданную книгу и закрыть открытые книги из которых переносились листы.
3) Заархивировать созданную книгу.
4) Архив сохранить на диске
5) Созданную книгу удалить.

Как сделать п. 1)?

Может туплю, но неполучается!

Путей к вершине — множество. Этот один из многих!


1) Свойство Workbook.Name имеет признак read-only, потому что её (книги) именем является название файла, т.е. книгу НАДО СОХРАНИТЬ.

PS: Имя книги (т.к. оно – имя файла) может быть разным (что может привести к ошибке при обращении по имени): с расширением и без, если в настройках Винды включено их неотображение.

Знания недостаточно, необходимо применение. Желания недостаточно, необходимо действие. (с) Брюс Ли


Спасибо Шпец! Я полагал, что есть способ присвоить книге имя несохранаа ее!

Значит нет … :-

Путей к вершине — множество. Этот один из многих!


Когда-то я тоже с этим столкнулся и в виде решения выбрал смену заголовка вновь созданной Книги.


Sub New_book()

    Dim CODESRC(2) As String
CODESRC(0) = "Private Sub Workbook_Activate()"
CODESRC(1) = "    ActiveWindow.Caption = ""Здесь назовите книгу как хотите"""  'при чем у меня здесь вставленна переменная и книга называется в зависимости от данных которые содержит
CODESRC(2) = "End Sub"

    Set AppExcel = Excel.Application

    AppExcel.Visible = True

    Set wbk = AppExcel.Workbooks.Add

    Dim linecount
    linecount = AppExcel.ActiveWorkbook.VBProject.VBComponents(1).CodeModule.CountOfLines
    For i = 0 To UBound(CODESRC)
        AppExcel.ActiveWorkbook.VBProject.VBComponents(1).CodeModule.InsertLines i + linecount + 1, CODESRC(i)
    Next i

    End Sub


Два обязательных момента:
1. Разрешено доверие к проектам VBA
2. Книгу надо активировать

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

Ничто не обходится нам так дешево и не ценится так дорого, как вежливость…  Мигель Сервантес де Сааведра


Цитата: boa от 12.03.2009, 18:13
Когда-то я тоже с этим столкнулся и в виде решения выбрал смену заголовка вновь созданной Книги.

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

Уважаемый boa! Фишка в том, что по условиям проекта, нужно в созданной книге собрать некий лист, а затем переместить результаты сборки (лист) в другую книгу. Наверно непонятно, но таков путь. И Ваше решение скорее всего оптимально. Пока непроверял … Так что, огромное СПАСИБО!

Путей к вершине — множество. Этот один из многих!


Ничто не обходится нам так дешево и не ценится так дорого, как вежливость…  Мигель Сервантес де Сааведра


Спасибо boa! Буду разбиратся…

Путей к вершине — множество. Этот один из многих!


Squitty

72 / 0 / 0

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

Сообщений: 11

1

Присвоение переменной имени книги

24.06.2014, 15:54. Показов 8964. Ответов 4

Метки нет (Все метки)


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

Доброго дня.

Помогите решить проблему.

Макрос открывает файл .csv посредством обращения к Modules.
Файл открыт, но присвоить переменной имя файла не получается.

Пробовал

Visual Basic
1
2
Dim book as Workbook
Set book = Workbooks("имя книги.csv")

или

Visual Basic
1
2
3
nm = ActiveWorkbook.Name
Dim book as Workbook
Set book = Workbooks(nm)

Во втором случае проблема в том, что после отработки Modules программа автоматически возращается к ранее открытым книгам без участия Modules и присваивает nm значение других книг. Хотя когда запускается debug, нужна книга активна.

При не больших знаниях vba использовал все доступные мне способы, а в сети и на форуме ответа на вопрос не нашел.

Заранее благодарен.

Добавлено через 41 минуту

Собественно код программы, чтобы было детальнее.

Кликните здесь для просмотра всего текста

Visual Basic
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
59
60
Private Sub dwlo_Click()
 
    MsgBox ("Âûáåðèòå ôàéë c áàçîé, êîòîðóþ íåîáõîäèìî ïðåîáðàçîâàòü â ëèñò îáçâîíà")
    Dim MyPath As String
    MyPath = ThisWorkbook.Path
    ChDrive MyPath
    ChDir MyPath
    
    Application.ScreenUpdating = False
    
    filetoopen = Application.GetOpenFilename("Excel files (*.xlsx), .xlsx")
    If filetoopen <> False Then Workbooks.Open filetoopen
   
    NewN = ActiveWorkbook.Name
    Dim oBz As Workbook
    Set oBz = Workbooks(NewN)
        
    mWScript.WScriptOpen
    
    Dim oLo as Workbook
    Set oLo = Workbooks("rcvfile33.csv")
 
    Dim n As Long, z As Range, r As Long, dt As Range, pBz As Worksheet, pLo As Worksheet, k As Long, lc As Range
    
    Set pBz = oBz.Sheets("Áàçà")
    Set pLo = oLo.Sheets("rcvfile33")
    Set z = oBz.Sheets("Áàçà").Columns("C:C")
    Set dt = oLo.Sheets(1).Columns(7)
    Set lc = oLo.Sheets(1).Columns(46)
    n = WorksheetFunction.Count(z)
    k = n
    oXL.Cells(1, 1) = 1
    
    If k > 0 Then
        r = 2
        While Not r = k + 2
            pLo.Cells(r, 5) = pBz.Cells(r, 1)
            pLo.Cells(r, 4) = pBz.Cells(r, 2)
            pLo.Cells(r, 1) = pBz.Cells(r, 3)
            pLo.Cells(r, 2) = pBz.Cells(r, 5)
            pLo.Cells(r, 3) = pBz.Cells(r, 6)
            pLo.Cells(r, 8) = pBz.Cells(r, 7)
            pLo.Cells(r, 10) = pBz.Cells(r, 8)
            pLo.Cells(r, 7) = pBz.Cells(r, 9)
            pLo.Cells(r, 16) = pBz.Cells(r, 13)
            pLo.Cells(r, 11) = pBz.Cells(r, 15)
            pLo.Cells(r, 13) = pBz.Cells(r, 16)
            pLo.Cells(r, 46) = 1
        r = r + 1
        Wend
    End If
    
    oBz.Close SaveChanges:=False
    dt.NumberFormat = "m/d/yyyy"
    lc.NumberFormat = "General"
   
    MsgBox "Ôîðìèðîâàíèå ëèñòà îáçâîíà çàâåðøåíî.", vbInformation, "Ïðîöåññ çàâåðøåí"
    
    Application.ScreenUpdating = True
End Sub

Файл .csv открывается путем вызова модуля mWScript.WScriptOpen

Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Option Explicit
 
Public oXL As clXL
 
Sub WScriptOpen()
    Dim sPath As String, oShell As Object
    
    On Error Resume Next
    Set oShell = CreateObject("WScript.Shell")
    If oShell Is Nothing Then MsgBox _
        "Íà êîìïüþòåðå îòñóòñòâóåò áèáëèîòåêà Windows Script Host (WindowsSystem32wshom.ocx)": Exit Sub
    
    Set oXL = Nothing    'óáèðàåì õâîñòû ïðåäûäóùèõ âûçîâîâ
    Set oXL = New clXL
    Set oXL.XLWE = Application
 
    sPath = ThisWorkbook.Path & "rcvfile33.csv"
    oShell.Run """" & sPath & """"
End Sub

и вторая часть

Visual Basic
1
2
3
4
5
6
7
Option Explicit
 
Public WithEvents XLWE As Application
 
Private Sub XLWE_WorkbookOpen(ByVal wb As Workbook)
    MsgBox "Øàáëîí îòêðûò"
End Sub



0



KoGG

5590 / 1580 / 406

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

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

Записей в блоге: 1

24.06.2014, 16:29

2

Файл открыт, но присвоить переменной имя файла не получается.

Это разве все проблемы? Мне кажется и данные переносится не должны.
Проблема в том что файл csv открывается не сразу из Excel, а через WScriptOpen(), который вероятно создает еще один экземпляр Excel в памяти. Два экземпляра Excel не видят друг друга.

18 строку mWScript.WScriptOpen лучше заменить на

Visual Basic
1
Workbooks.Open ThisWorkbook.Path & "rcvfile33.csv"



0



Hugo121

6875 / 2807 / 533

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

Сообщений: 8,562

24.06.2014, 16:58

3

Я всё сделал бы иначе. Потому что csv лучше открывать так (только посмотрите какие там разделители полей — уверен что они будут постоянными, но могут быть не только «;»):

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub tt()
    Dim ts As Object, arrstr, i&, x&, a
    
    Set ts = CreateObject("Scripting.FileSystemObject").OpenTextFile(ThisWorkbook.Path & "rcvfile33.csv", 1)
    arrstr = Split(ts.ReadAll, vbCrLf)    'массив строк текста целиком
    ts.Close
 
    'все данные в массиве, можно его перебрать:
    For i = 0 To UBound(arrstr)
        If Len(Trim(arrstr(i))) > 0 Then
            a = Split(arrstr(i), ";")
            For x = 0 To UBound(a)
                Debug.Print i; a(x)
            Next
        End If
    Next
    
End Sub

Добавлено через 2 минуты
Или в одну строку:

Visual Basic
1
2
    arrstr = Split(CreateObject("Scripting.FileSystemObject").OpenTextFile(ThisWorkbook.Path & "rcvfile33.csv", 1).ReadAll, vbCrLf)    'массив строк текста целиком
    'все данные в массиве, можно его перебрать:

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



0



72 / 0 / 0

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

Сообщений: 11

24.06.2014, 17:11

 [ТС]

4

Hugo121, так было изначально. Но VBA при открытии csv файла не разделяет структуру с учетом разделителей. Разделить и изъять не проблема, но при сохранении файла VBA разделяет уже не «;», а просто «,». Плюс структура остается в одну строку. А программа, которая использует эту базу чувствительна и такой формат не воспринимает. Поэтому возникла необходимость для такого порядка открытия файла.

Hugo121, делится однозначно все «;». Испробую, спасибо. Но мне нужно наоборот вставить в этот файл и на сохранение файла это не повлияет, как я понимаю?!



0



6875 / 2807 / 533

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

Сообщений: 8,562

24.06.2014, 17:22

5

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

Ну или можно выгрузить полученный из файла массив на лист, чтоб было наглядно, и чтоб уже существующий код не менять полностью. Заодно на лету подправить форматы — чтоб даты были датами, а всякие ID типа «000123» не теряли ведущие нули.
В примере не нашёл сохранения результата — я бы тоже сохранял в текст циклом по массиву данных листа — а то эксель тут тоже любит своевольничать… Но если и так получалось правильно — сохраняйте как сохраняли.

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

Ну или можно выгрузить полученный из файла массив на лист, чтоб было наглядно, и чтоб уже существующий код не менять полностью. Заодно на лету подправить форматы — чтоб даты были датами, а всякие ID типа «000123» не теряли ведущие нули.
В примере не нашёл сохранения результата — я бы тоже сохранял в текст циклом по массиву данных листа — а то эксель тут тоже любит своевольничать… Но если и так получалось правильно — сохраняйте как сохраняли.



0



Home / VBA / VBA Rename Workbook (Excel File)

To RENAME an Excel file that is stored on your computer, you need to use the “NAME” statement. In this statement, you need to define the old file name and the new name that you want to apply. But there’s one thing that you need to remember the file must be closed.

Here I have an Excel file that is stored in the “Data” folder on my desktop and there in this folder “SampleFile” that I want to rename to the “myFile” and code for this would be like the following.

Name "C:UsersDellDesktopmyFolderSampleFile.xlsx" As _
"C:UsersDellDesktopmyFoldermyNewFile.xlsx"

Steps to use VBA to Rename Excel File

Now, let’s understand this line of code in detail.

rename-a-workbook-using-vba
  1. The name statement with which you need to start the code.
  2. Address of the file with the old name and file extension.
  3. “As” refers to the new name.
  4. Address of the file with the new name and file extension.

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

To make the name states a little clearer you can use variables, just like the following code.

you-can-use-a-variables
Sub vba_rename_workbook()
Dim oldName As String
Dim newName As String
oldName = "C:UsersDellDesktopmyFolderSampleFile.xlsx"
newName = "C:UsersDellDesktopmyFoldermyNewFile.xlsx"
Name oldName As newName
End Sub

More on VBA Workbooks

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

  • VBA Workbook

Понравилась статья? Поделить с друзьями:
  • Как присвоить имя диапазону ячеек excel
  • Как присвоить имя диапазона excel
  • Как присвоить имя диаграмме в excel
  • Как присвоить имя данным в excel
  • Как присвоить имя в excel 2010