Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Microsoft Office и VBA > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail


Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы
Старый 12.08.2008, 17:58   #1
ЯИмя
Пользователь
 
Регистрация: 17.07.2008
Сообщений: 15
Стрелка Проверка на повторное открытие

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

Код:
Public Function OpenData(Path As String, Name As String, Optional HiddenMode As Boolean) As Object 

If Right(Path, 1) <> "\" Then Path = Path & "\" 
Dim XLApp As New Excel.Application 
Set OpenData = XLApp.Workbooks.Open(Path & Name) 
If HiddenMode Then OpenData.Hidden = True 
Set XLApp = Nothing 

End Function
А вот и проблемы:

1. Независимо от параметра HiddenMode рабочая книга Эксель всегда открывается в скрытом режиме. Хотя дальнейший код исправно берёт оттуда данные, записывает, сохраняет и закрывает книгу. Всё в порядке.
В принципе, неважно, в каком режиме открывается книга, лишь бы читалась программой. А вдруг понадобится эта функция в другом случае, когда книга нужна не скрытая, да и вообще, хотелось бы знать, почему так происходит.

2. Если прервать выполнение кода и не закрыть Экселевскую книгу, она, естественно, остаётся открытой, но её не видно. И, если запустить код на выполнение, открывается ещё один экземпляр этой книги.
В общем, в первый раз, когда я тестировал свой код, я на это не обращал внимания, потом комп завис и я увидел в диспетчере задач на вкладке "Процессы" штук 25-30 процессов EXCEL.EXE.
И все скрытые, так как в том же диспетчере задач, на вкладке "Приложения" - ни одного Экселя!
Так вот, как проверить в коде функции, не открыт ли уже запрашиваемый файл?

Последний раз редактировалось ЯИмя; 12.08.2008 в 18:06.
ЯИмя вне форума
Старый 12.08.2008, 18:34   #2
Pavel55
Форумчанин
 
Регистрация: 21.08.2007
Сообщений: 292
По умолчанию

Попробуйте

Код:
'Source: http://j-walk.com/ss/excel/tips/tip54.htm
Private Function WorkbookIsOpen(wbname) As Boolean
'   Returns TRUE if the workbook is open
    Dim x As Workbook
    On Error Resume Next
    Set x = Workbooks(wbname)
    If Err = 0 Then WorkbookIsOpen = True _
        Else WorkbookIsOpen = False
End Function
Pavel55 вне форума
Старый 12.08.2008, 20:49   #3
ЯИмя
Пользователь
 
Регистрация: 17.07.2008
Сообщений: 15
По умолчанию

Большое спасибо, но всё равно не работает.
В любом случае, открыт ли файл или нет, моя функция (OpenData) открывает новый экземпляр файла, и опять же в скрытом режиме.
Я сделал вот так:

Код:
Public Function OpenData(Path As String, Name As String, Optional HiddenMode As Boolean) As Object

If Right(Path, 1) <> "\" Then Path = Path & "\"
Dim XLApp As New Excel.Application
If Not WorkbookIsOpen(Name) Then
    Set OpenData = XLApp.Workbooks.Open(Path & Name)
End If
If HiddenMode Then OpenData.Hidden = True
Set XLApp = Nothing

End Function
И в любом случае, в Вашей, Pavel55, функции, Err = 9 и WorkbookIsOpen всегда = False!
Почему так?
Ведь в диспетчере задач виден Эксель, и код берёт с файла Эксель данные, то есть, ясно видно, что он открыт, но почему его не видит VB?
И почему он, чёрт возьми, всегда открывается скрытым???
ЯИмя вне форума
Старый 12.08.2008, 22:34   #4
дмидми
Форумчанин
 
Аватар для дмидми
 
Регистрация: 06.03.2008
Сообщений: 352
По умолчанию

У объекта Workbook нет свойства Hidden.

Попробуй после
Set OpenData = XLApp.Workbooks.Open(Path & Name)
вывести книгу в люди:
OpenData.Windows(1).Visible = True
дмидми вне форума
Старый 13.08.2008, 18:02   #5
ЯИмя
Пользователь
 
Регистрация: 17.07.2008
Сообщений: 15
По умолчанию

Всё правильно:
Цитата:
Сообщение от дмидми Посмотреть сообщение
У объекта Workbook нет свойства Hidden.
А у Excel.Application - есть.
Всеобщими усилиями нашли такое решение:

Код:
Public Function OpenData(Path As String, Name As String, Optional VisibleMode As Boolean) As Object

If Right(Path, 1) <> "\" Then Path = Path & "\"
If Not IsWorkbookOpened(Path & Name) Then
    Dim XLApp As New Excel.Application
    Set OpenData = XLApp.Workbooks.Open(Path & Name)
    If VisibleMode Then XLApp.Visible = True
    Set XLApp = Nothing
Else
    Set OpenData = Workbooks(Name)
End If

End Function

Function IsWorkbookOpened(ByVal FileName As String) As Boolean
    Dim FF As Integer
    FF = FreeFile
    On Error Resume Next
    Open FileName For Binary Lock Read As #FF
    IsWorkbookOpened = (Err.Number <> 0)
    On Error GoTo 0
    Close #FF
End Function
Или ещё попроще, вот такое:

Код:
Public Function OpenData(Path As String, Name As String, Optional VisibleMode As Boolean) As Object

If Right(Path, 1) <> "\" Then Path = Path & "\"
    Dim FF As Integer
    FF = FreeFile
    On Error Resume Next
    Open Path & Name For Binary Lock Read As #FF
    IsWorkbookOpened = (Err.Number <> 0)
If Err.Number = 0 Then
    On Error GoTo 0
    Close #FF
    Dim XLApp As New Excel.Application
    Set OpenData = XLApp.Workbooks.Open(Path & Name)
    If VisibleMode Then XLApp.Visible = True
    Set XLApp = Nothing
Else
    Set OpenData = Workbooks(Name)
End If
End Function
Всё работает, поздравьте меня!

Последний раз редактировалось ЯИмя; 14.08.2008 в 08:57.
ЯИмя вне форума
Закрытая тема

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Открытие формы inret Общие вопросы Delphi 3 06.05.2008 14:37
Открытие файла Messir_Leonard Win Api 2 09.04.2008 19:33
открытие файлов Ensoph Общие вопросы Delphi 5 31.03.2008 20:45
«Открытие программирования» Alesik Общие вопросы по Java, Java SE, Kotlin 0 13.09.2007 23:17
как перехватить открытие чужого приложенияпытаюсь перехватить открытие любого приложе rpy3uH Win Api 2 02.12.2006 13:12


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS