Закрыть файл Excel на VBA
Мне нужно открыть определенный файл и, после его обработки, закрыть.
открываю файл:
name = Application.GetOpenFilename
Workbooks.Open name
а как мне его закрыть?
Workbooks("Книга1").Close
мне неизвестно имя открываемого файла
хм. а как ты его обрабатываешь? ты же когда к нему обращаешься как-то его обзываешь?
ну..тогда после обработки открой его. и потом то же самое только activeworkbook
это первое что в голову приходит...только как же ты с ним работаешь?
или введи переменную для определения имени файла и вместо книга1 напиши его имя.
хм. а как ты его обрабатываешь? ты же когда к нему обращаешься как-то его обзываешь?
ну..тогда после обработки открой его. и потом то же самое только activeworkbook
это первое что в голову приходит...только как же ты с ним работаешь?
или введи переменную для определения имени файла и вместо книга1 напиши его имя.
м-даа :) программу писал под фиксированное имя открываемого файла :(
а как открываемому файлу присвоить необходимое мне имя, например "Книга1"?
а как открываемому файлу присвоить необходимое мне имя, например "Книга1"?
хм.... А как открывается книга? Можно сделать через диалоговое окно , чтобы юзер сам выбрал что открыть:
Application.Dialogs(xlDialogOpen).Show
bookName = ActiveWorkbook.Name
а вообще проще в аську стукнись если срочно.
хм.... А как открывается книга? Можно сделать через диалоговое окно , чтобы юзер сам выбрал что открыть:
Application.Dialogs(xlDialogOpen).Show
bookName = ActiveWorkbook.Name
а вообще проще в аську стукнись если срочно.
я делал вот так:
name = Application.GetOpenFilename
[off] а по аське ты "Марина"? [/off]
name = Application.GetOpenFilename
Workbooks.Open name
Вот этот name уже содержит в себе полной путь к файлу - "C:\aaa1.xls", если из этой строки выдернуть aaa1.xls(например через мою функцию FileWithoutDir, описание в конце), то его можно использовать при обращении к книге - Workbooks("aaa1.xls").Close
А можно и так, вариантов масса:
name = Application.GetOpenFilename
Workbooks.Open name
sWrb = ActiveWorkbook.name
....
Workbooks(sWrb).Close
и так:
name = Application.GetOpenFilename
Workbooks.Open name
Set wWrb = ActiveWorkbook
....
wWrb.Close
' Вырезает название файла из полного пути к файлу
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
РАБОТАЕТ!!!!!
Вот этот name уже содержит в себе полной путь к файлу - "C:\aaa1.xls", если из этой строки выдернуть aaa1.xls(например через мою функцию FileWithoutDir, описание в конце), то его можно использовать при обращении к книге - Workbooks("aaa1.xls").Close
А можно и так, вариантов масса:
name = Application.GetOpenFilename
Workbooks.Open name
sWrb = ActiveWorkbook.name
....
Workbooks(sWrb).Close
и так:
name = Application.GetOpenFilename
Workbooks.Open name
Set wWrb = ActiveWorkbook
....
wWrb.Close
' Вырезает название файла из полного пути к файлу
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(), чтобы сразу найти правый "\" в полном имени файла.
В твоем случае наверное лучше использоватть вместо InStr() функцию InStrRev(), чтобы сразу найти правый "\" в полном имени файла.
Да, согласен, грехи молодости... :-)
Книги в Экселе нумеруются в порядке открытия. Поэтому сразу после открытия того файла Workbooks(Workbooks.Count) показывает на него. Можно запомнить в объектную переменную, а если никаких других книг не открывается в процессе обработки - так и запоминать ничего не нужно.
А я вот так действую в таких случаях:
Книги в Экселе нумеруются в порядке открытия. Поэтому сразу после открытия того файла Workbooks(Workbooks.Count) показывает на него. Можно запомнить в объектную переменную, а если никаких других книг не открывается в процессе обработки - так и запоминать ничего не нужно.
А если юзер вручную книгу откроет\закроет, откроет другую... и тп.... тогда как? прога начнет работать с левой книгой и делать там чего совсем ненадо.... а если указать имя, то он просто выкинет ошибку, если книга закрыта.
А если юзер вручную книгу откроет\закроет, откроет другую... и тп.... тогда как? прога начнет работать с левой книгой и делать там чего совсем ненадо.... а если указать имя, то он просто выкинет ошибку, если книга закрыта.
для этого необходимо отслеживать открываемые книги по их содержимому (юзер вполне способен открыть не тот файл, тем более не зная точно его имени, ориентируясь например по дате создания), в моем случае программа отслеживает открывался ли подобный файл ранее (что недопустимо) и содержит ли файл те данные, которые ей необходимы :)
А если юзер вручную книгу откроет\закроет, откроет другую... и тп.... тогда как? прога начнет работать с левой книгой и делать там чего совсем ненадо.... а если указать имя, то он просто выкинет ошибку, если книга закрыта.
Как это вручную? А разве это все не в ходе одного выполнения программы? Ну если вручную - так пожалуйста, запоминайте книгу в переменную, и все ок. Да что мы спорим, тут любой метод хорош, а выбор зависит от деталей.
Я обычно использую Workbooks.Count по следующим причинам:
1. Часто по ходу деятельности мне приходится открывать в Экселе хтмльки из Инета, у них такое дурацкое имя получается при открытии, возиться с ним никакой охоты нет.
2. Чтобы в ходе пошаговой отладки не задумываться над тем, что у меня там активно, я стараюсь никогда не использовать ActiveCell, ActiveWorkbook и т.д. без прямой на то нужды.
А можно - по-всякому. Вот.