Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Если файл открыт, то не открывать., VBA.
 
Здравствуйте.
Подскажите пожалуйста, как избавиться от ошибки. Если файл открыт, то не отрывать, если закрыт, то
Workbooks.Open FileName:="F:\Логистика\Книга.XLSM"
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
"on error resume next"?
Конь, просто конь.
Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.
 
1 способ
Код
Dim wb As Workbook
On Error Resume Next
Set wb = Workbooks("Книга.XLSM")
If Err Then 'книга не открыта
  Err.Clear
  Set wb = Workbooks.Open(Filename:="F:\Логистика\Книга.XLSM")
End If
On Error GoTo 0
'...

2 способ
Код
Set wb = GetObject("F:\Логистика\Книга.XLSM")
wb.Windows(1).Visible = True
Если книга не открыта, она будет открыта, но в невидимом режиме, и лучше сделать ее видимой.
Изменено: Казанский - 14 Апр 2015 10:23:31
 
Посмотрите здесь
 
Вроде ошибка исчезла, но теперь копирование на Лист "Шате-М" не происходит.
???

Скрытый текст
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Код
Set Wb = GetObject("F:\Логистика\Книга.XLSM")
Wb.Windows(1).Visible = True 
Workbooks.Open FileName:="F:\Логистика\Книга.XLSM"
Либо Open, либо GetObject
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо большое. Заработало.
:)
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Бывает GetObject() барахлит... Вдруг и неожиданно на файлах, которые (другие оттуда же) ранее открывались без проблем.
Ктоб сказал почему?
 
Тоже с этим сталкивался. Теперь всегда делаю через Workbooks.Open
 
Нет, при открытом файле "F:\Логистика\Книга.XLSM" всё-таки не работает, при закрытом полный порядок.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Как проверить открыта ли книга?
Берете оттуда функцию IsBookOpen. Далее:
Код
If IsBookOpen("Книга.XLSM")Then
    Set Wb = Workbooks("Книга.XLSM")
Else
    Set Wb = Workbooks.Open FileName:="F:\Логистика\Книга.XLSM"
EndIf
и потом уже к Wb обращаетесь. Все должно работать.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Доброе время суток
Владимир, попробуйте такой функцией определить открыт ли файл
Код
Public Function IsFileOpen(ByVal FileName As String) As Boolean
On Error GoTo errHandle
    Dim fso As Object, pStream As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set pStream = fso.OpenTextFile(FileName, 8)
    pStream.Close
    IsFileOpen = False
Exit Function
errHandle:
    IsFileOpen = True
End Function
 
IsBookOpen всё время артачится - ошибку выдаёт, чем только не обзывал - Boolean, Srting, Workbook, Name
Код
...
On Error Resume Next
    If IsBookOpen("Книга.xlsm") Then
        Set Wb = Workbooks("Книга.xlsm")
    Else
        Workbooks.Open FileName:="F:\Логистика\Книга.xlsm"""
    End If
Set Wb = GetObject("F:\Логистика\Книга.xlsm")
Wb.Windows(1).Visible = True
....
Изменено: Владимир - 14 Апр 2015 13:38:20
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Владимир, немного не так
Код
Public Sub Test()
    'если файл не открыт, то открыть его
    If Not IsFileOpen("F:\Логистика\Книга.xlsm") Then
        Workbooks.Open FileName:="F:\Логистика\Книга.xlsm"
        'иначе, по условию #1, ничего не делаем (не открываем)
    End If
End Sub
 
Никак не пойму, зачем в данном случае огород с IsFileOpen?
В #3 вполне рабочий код, и без всяких выкрутасов.
Только не надо было его кастрировать, и применять оба способа одновременно.
 
Андрей, теперь на IsFileOpen ругается. Да как же их объявить?
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
RAN, А если файл открыт в другом экземпляре Excel?
Владимир, а как ругается? Для страховки код полностью
Код
Public Function IsFileOpen(ByVal FileName As String) As Boolean
On Error GoTo errHandle
    Dim fso As Object, pStream As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set pStream = fso.OpenTextFile(FileName, 8)
    pStream.Close
    IsFileOpen = False
Exit Function
errHandle:
    IsFileOpen = True
End Function

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

с моими проверочными данными
 
Открываю с web_a  исходный файл, параллельно открыт файл "Книга.xlsm" куда копируются данные. Запускаю макрос и происходит выделение "IsFileOpen"..
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Цитата
Андрей VG написал: RAN, А если файл открыт в другом экземпляре Excel?
А если на другом компьютере? :D
Тогда без огорода никак.
Конкретизировать надо, однако.
 
Ещё вариант - перебрать все открытые книги и у каждой проверить полный путь (совпадает ли с нужным) - так не спутаете книги, если у них одинаковые названия, но лежат в разных папках (и открыта например ненужная).
 
Да это в примере он называется просто Книга, а в реальности - Что пора заказать. Этот файл у меня постоянно открыт, т.к. он является основным рабочим. Поэтому его специально закрывать, чтоб скопировать туда данные будет очень неудобно.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Вообще-то у меня нет никакой ошибки в первоначальном коде (и ранее помню не было ошибок). Проверьте путь.
 
Цитата
Владимир написал: Этот файл у меня постоянно открыт, т.к. он является основным рабочим.
Код из #3 как раз именно для этого случая.
 
Да, там не ошибка выскакивает, а предупреждение, что если есть несохранённые изменения, то они будут потеряны при переоткрытии файла. Если же его только смотрели (или сохранились) - то всё происходит молча.
 
А там на строке With Sheets("Шате-М") спотыкается.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Где там? :)
 
Код
With Wb.Sheets("Шате-М") 

или
Код
With oWb.Sheets("Шате-М"
)
В зависимости от того, в какой книге нужный лист.
 
Андрей, точно. Вот где собакин порылся. Приставку забыл.
Вот я балбес..:D

Спасибо. Теперь с открытой книгой тоже работает.
Ребята, всем спасибо.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Алексей, спасибо.
..давеча твой метод освоил.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
Страницы: 1
Читают тему (гостей: 1)