2015-05-25 2 views
0

Использование VBA AccessVBA Access/Excel - Переключение Чтение/запись

Есть более эффективный способ сделать открытое чтение только первенствовать файл режим чтения/записи? Или проверьте, верно ли только чтение, пока не будет прочитано чтение/запись.

Я создал непрерывный цикл, который открывает и закрывает файл до тех пор, пока чтение/запись не будет активным. Однако иногда это срабатывает, иногда это не так, разочарование.

Я посмотрел в переключаясь чтения/записи также Changefileaccess даже SetAttr функции

Dim xl As Object 

Set xl = CreateObject("Excel.Application") 


Do Until xl.ActiveWorkbook.ReadOnly = False 
xl.Quit 
xl.Workbooks.Open ("C:\TEST\Test.xlsb") 
If xl.ActiveWorkbook.ReadOnly = False Then Exit Do 
Loop 

ответ

1

Несколько наблюдений:

  1. Существует вероятность того, что ваш код может войти в бесконечный цикл. Дайте некоторое время ожидания, прежде чем повторять проверку.
  2. Определите количество попыток повторного открытия кода.
  3. Не использовать CreateObject. CreateObject создает новое приложение. Используйте команду GetObject, если вы хотите работать с уже открытым файлом.
  4. Проверьте, не читается ли атрибут только перед повторным открытием файла.

Смотрите этот пример (Непроверено)

Sub Sample() 
    Dim objxlAp As Object, objxlWb As Object 
    Dim FlName As String 
    Dim NumberOfAttempt As Long 

    FlName = "C:\TEST\Test.xlsb" 

    Set objxlAp = GetObject(, "Excel.Application") 
    Set objxlWb = objxlAp.ActiveWorkbook 

    Do Until objxlWb.ReadOnly = False 
     objxlWb.Close (False) 

     If GetAttr(FlName) = vbReadOnly Then _ 
     SetAttr FlName, vbNormal 

     objxlAp.Workbooks.Open (FlName) 

     If objxlWb.ReadOnly = False Then Exit Do 

     Wait 60 '<~~ Wait for 60 seconds. Change as Applicable 
     NumberOfAttempt = NumberOfAttempt + 1 

     If NumberOfAttempt > 5 Then 
      MsgBox "Tried reopening the file 5 times. Unable to do it. Exiting the loop" 
      Exit Do 
     End If 
    Loop 
End Sub 

Private Sub Wait(ByVal nSec As Long) 
    nSec = nSec + Timer 
    While nSec > Timer 
     DoEvents 
    Wend 
End Sub 

Важное примечание: Рабочая книга может мне доступны только для чтения с помощью этих двух средств

  1. правой кнопкой мыши на файле и set attribute как ReadOnly
  2. Файл Сохранить как - Только для чтения Рекомендуется. Вышеприведенный код не для этого метода.

Мои Предположения:

Вы не в сети, где файл был открыт другим пользователем.

+0

wow спасибо за информацию, у меня есть несколько файлов, которые мне нужны, чтобы проверить, активна ли запись/запись после активного редактирования файла, сохранить закрыть .. эти файлы находятся в сети, где несколько пользователей могут получить к ним доступ – Elixir

0

Вы можете проверить с помощью GetAttr:

If ((GetAttr("C:\tmp\Test.xlsb")) And vbReadOnly) Then 
Debug.Print "Do something, file is read only" 
End If 

Может быть, это свойство перед открытым файлом?

Sub OpenRW() 

Dim wb As Workbook 

Set wb = Workbooks.Open("C:\tmp\Test.xlsb") 
Debug.Print "1. ReadOnly? " & ActiveWorkbook.ReadOnly 'read only 
wb.Close 
SetAttr "C:\tmp\Test.xlsb", vbNormal 
Set wb = Workbooks.Open("C:\tmp\Test.xlsb") 'read/write 
Debug.Print "2. ReadOnly? " & ActiveWorkbook.ReadOnly 
wb.Close 
SetAttr "C:\tmp\Test.xlsb", vbReadOnly 
Set wb = Workbooks.Open("C:\tmp\Test.xlsb") 
Debug.Print "3. ReadOnly? " & ActiveWorkbook.ReadOnly 'read only 
wb.Close 

End Sub 

Результаты:

OpenRW 
1. ReadOnly? True 
2. ReadOnly? False 
3. ReadOnly? True