Как узнать, открыт ли Excel?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Trusishka
Новичок
Новичок
 
Сообщения: 27
Зарегистрирован: 02.07.2003 (Ср) 18:40
Откуда: Раменское

Как узнать, открыт ли Excel?

Сообщение Trusishka » 12.01.2005 (Ср) 20:33

Мне нужно знать открыт кем-либо нужный мне Excel файл.

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 12.01.2005 (Ср) 21:34

Код: Выделить всё

Private Declare Function FindWindowByClass Lib "user32" _
   Alias "FindWindowA" (ByVal lpClassName As String, _
   ByVal lpWindowName As Long) As Long

Public Function IsWorBookOpen(wbName As String) As Boolean
'
On Error GoTo eRes

'//////////////////////////////////////////////////////////////////////////////////////
  Dim lRes As Long, objExcel As Object
  Dim wbCurrent As Object
'//////////////////////////////////////////////////////////////////////////////////////

lRes = FindWindowByClass("XLMAIN", 0&)

If lRes <> 0 Then
  Set objExcel = GetObject(, "Excel.Application")
Else
  IsWorBookOpen = False
  Exit Function
End If

For Each wbCurrent In objExcel.Workbooks
  If LCase(wbCurrent.Name) = LCase(wbName) Then
    IsWorBookOpen = True
    Exit Function
  End If
Next

IsWorBookOpen = False
Exit Function
eRes:
  Call Err.Raise(Err.Number, "IsWorBookOpen", Err.Description)
End Function

Private Sub Command1_Click()

  MsgBox (IsWorBookOpen("test.xls"))

End Sub



Trusishka
Новичок
Новичок
 
Сообщения: 27
Зарегистрирован: 02.07.2003 (Ср) 18:40
Откуда: Раменское

Сообщение Trusishka » 13.01.2005 (Чт) 10:40

почему-то, даже если книга открыта показывает "False" :oops:

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 13.01.2005 (Чт) 10:51

1. Какой офис?
2. Имя рабочей книги надо передавать абсолютно точно, без пути и с расширением.

Тестировалось на Office 2000. Код рабочий.

Trusishka
Новичок
Новичок
 
Сообщения: 27
Зарегистрирован: 02.07.2003 (Ср) 18:40
Откуда: Раменское

Сообщение Trusishka » 13.01.2005 (Чт) 10:56

Sedge писал(а): без пути

ура, заработало, спасибо :sunny: , я передавал с путем.
а этот код разве будет работать, если файл лежит на сети?

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 13.01.2005 (Чт) 10:59

Стоп. Тебе надо проверить открыт ли файл по сети? Если да, то конечно нет :)
Надо было точнее вопрос формулировать.

Trusishka
Новичок
Новичок
 
Сообщения: 27
Зарегистрирован: 02.07.2003 (Ср) 18:40
Откуда: Раменское

Сообщение Trusishka » 13.01.2005 (Чт) 11:02

Sedge писал(а):Стоп. Тебе надо проверить открыт ли файл по сети? Если да, то конечно нет :)
Надо было точнее вопрос формулировать.

ага, извини, мне надо по сети, чтобы можно было путь указывать. :oops:

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 13.01.2005 (Чт) 11:26

Попробуй вот это.
Код: Выделить всё
Public Function IsWorkBookOpen(wbPath As String) As Boolean
'
On Error GoTo eRes

'//////////////////////////////////////////////////////////////////////////////////////
  Dim objExcel As Object
  Dim vArray As Variant, sWBName As String
'//////////////////////////////////////////////////////////////////////////////////////

vArray = Split(wbPath, "\", , vbTextCompare)
sWBName = vArray(UBound(vArray))
Set objExcel = CreateObject("Excel.Application")
With objExcel
  .Workbooks.Open (wbPath)
  With Workbooks(sWBName)
    IsWorkBookOpen = .ReadOnly
    .Saved = True
  End With
  .Quit
End With
Set objExcel = Nothing

Exit Function
eRes:
  Call Err.Raise(Err.Number, "IsWorkBookOpen", Err.Description)
End Function

Private Sub Command1_Click()

  MsgBox IsWorkBookOpen("D:\common\test2.xls")

End Sub

Trusishka
Новичок
Новичок
 
Сообщения: 27
Зарегистрирован: 02.07.2003 (Ср) 18:40
Откуда: Раменское

Сообщение Trusishka » 13.01.2005 (Чт) 11:39

как-то косячит :oops: при нажатии на кнопку в памяти открывается невидимый файл Excel , а при втором нажатии на кнопку вылазит ошибка "out of range"

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 13.01.2005 (Чт) 12:15

Да, действительно :( Ладно, сейчас попробую разобраться...

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 13.01.2005 (Чт) 12:33

В общем выкинь все что я до этого написал. Вот оно - Дао :) :
Код: Выделить всё
Public Function IsWorkBookOpen(wbPath As String) As Boolean
'
On Error Resume Next

Open wbPath For Input Lock Read As #1
Close #1
IsWorkBookOpen = Err.Number <> 0

End Function

Trusishka
Новичок
Новичок
 
Сообщения: 27
Зарегистрирован: 02.07.2003 (Ср) 18:40
Откуда: Раменское

Сообщение Trusishka » 13.01.2005 (Чт) 13:35

:P :P :P :P свершилось чудо, друг спас жизнь друга ! Огроменное спасибо, за такое внимание к моей проблеме :P


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 15

    TopList  
cron