Как обойти запрос «Файл используется» при открытии файла Excel (если он используется кем-то другим) с URL-адреса SharePoint? - PullRequest
0 голосов
/ 22 октября 2019

Я работаю над проектом vba-excel, который позволяет нескольким пользователям программно загружать данные в определенный ( РЕДАКТИРОВАТЬ: защищенный паролем ) файл, расположенный в SharePoint нашей компании. Проблема заключается в том, что когда несколько пользователей начинают загрузку в одно и то же время (что не очень вероятно, но возможно), процедура загрузки выполняется только для одного пользователя, а остальным выдается следующее сообщение:

file in use prompt

Поскольку обновляемый файл должен быть открыт с разрешениями на чтение / запись, макрос не сможет выполнить загрузку.


Я безуспешно пыталсянайти код, который мог бы обойти это сообщение, чтобы макрос мог обрабатывать его программно.

Один из подходов, которые я попробовал, состоял в том, чтобы проверить, используется ли файл в настоящее время, перед его открытием:

[ myFile - строка, содержащаярасположение основного обновляемого файла (SharePoint URL)]

Приведенный ниже код в основном открывает / закрывает «myFile» в фоновом режиме и проверяет, не возникла ли какая-либо ошибка при попытке его открыть. Затем он возвращает True / False, если файл используется или нет:

On Error Resume Next
Open myFile For Binary Access Read Lock Read As #1
Close #1
fileInUse = IIf(Err.Number > 0, True, False)
On Error GoTo 0

Он работает как надо, но не при использовании URL-адресов. Результат при использовании традиционного пути DOS: число ошибок 70, когда файл используется, и 0, если нет. Результат при использовании пути URL-адреса всегда равен 75.


Предположительно, приведенный ниже код может выполнять проверку URL-адресов SharePoint, но по какой-то причине он не работает для меня:

If Workbooks.CanCheckOut(myFile) = True Then
    'Open file
Else
    'Run procedure to wait a few seconds and then try again
End If

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


Ожидаемый результат:

Если myFile используется в данный момент:

Если это не так:

myfileбудет доступен только программно, поэтому единственный раз, когда он будет недоступен, это когда другой пользователь в данный момент выполняет процедуру загрузки где-то еще, и это займет около 5 секунд.


Любые предложения или комментарииочень ценятся.

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Код, взятый из microsoft hlp, который я использую ... Определит, открыт ли файл. Если открыть, вернется TRUE

    Option Explicit
    Sub FileOpen()

        Dim MasterFile as string
        MasterFile = "your file location"    

        Dim Ret
        Ret = IsFileOpen(MasterFile)

        If Ret = True Then
            MsgBox "File is currently in use."
        Else
            MsgBox "File not in use."
        End If


    End Sub

    ' This function checks to see if a file is open or not. If the file is
    ' already open, it returns True. If the file is not open, it returns
    ' False. Otherwise, a run-time error occurs because there is
    ' some other problem accessing the file.

    Function IsFileOpen(filename As String)
        Dim filenum As Integer, errnum As Integer

        On Error Resume Next   ' Turn error checking off.
        filenum = FreeFile()   ' Get a free file number.
        ' Attempt to open the file and lock it.
        Open filename For Input Lock Read As #filenum
        Close filenum          ' Close the file.
        errnum = Err           ' Save the error number that occurred.
        On Error GoTo 0        ' Turn error checking back on.

        ' Check to see which error occurred.
        Select Case errnum

            ' No error occurred.
            ' File is NOT already open by another user.
            Case 0
             IsFileOpen = False

            ' Error number for "Permission Denied."
            ' File is already opened by another user.
            Case 70
                IsFileOpen = True

            ' Add in as many other cases' as you'd like
            Case 75                    
                IsFileOpen = True

            ' Another error occurred.
            Case Else
                Error errnum
        End Select

    End Function
0 голосов
/ 22 октября 2019

Вы можете попробовать установить Application.DisplayAlerts на False для подавления всплывающего окна. Затем проверьте Workbook.ReadOnly, чтобы убедиться, что файл открыт только для чтения. Если это так, вы можете закрыть его, а затем повторить попытку через несколько секунд. Просто убедитесь, что для DisplatAlerts установлено значение True, когда вы закончите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...