Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
  • Avatar do usuário
#55278
Objetivamente:
Como é possível saber, com VBA, qual o nome do usuário que tem um ficheiro em excel aberto, ficheiro esse que está algures num servidor e não no disco local?

Contexto
Tenho procurado por uma função, em VBA, que me informe se um arquivo em excel esta aberto por um usuário e, em caso afirmativo, qual é o nome do usuário.

Consegui encontrar uma rotina que faz isso, porém apenas se o arquivo aberto estiver no disco local, o que não é o meu caso, segue a função citada:
Código: Selecionar todos
Function Excel_File_in_use_by(FilePath As String) As String
    Dim strTempFile As String
    Dim iPos As Integer, iRetVal As Integer
    Dim objFSO As Object, objWMIService As Object, objFileSecuritySettings As Object, objSD As Object
    iPos = InStrRev(FilePath, "\")
    strTempFile = left(FilePath, iPos - 1) & "\~$" & Mid(FilePath, iPos + 1)
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    If objFSO.FileExists(strTempFile) Then
        Set objWMIService = GetObject("winmgmts:")
        Set objFileSecuritySettings = objWMIService.Get("Win32_LogicalFileSecuritySetting='" & strTempFile & "'")
        iRetVal = objFileSecuritySettings.GetSecurityDescriptor(objSD)
        If iRetVal = 0 Then
            Excel_File_in_use_by = objSD.Owner.Name
        Else
            Excel_File_in_use_by = "unknown"
        End If
        Set objWMIService = Nothing
        Set objFileSecuritySettings = Nothing
        Set objSD = Nothing
    Else
        Excel_File_in_use_by = vbNullString
    End If
    Set objFSO = Nothing
    End Function
Eu precisava de uma função para verificar se um arquivo específico, neste caso um arquivo excel365, colocado em um servidor específico, está aberto por um usuário e, em caso afirmativo, qual é o nome do usuário.

É possível fazer isso no VBA?

Como implementar isso?
#55279
Boas experimente colar esta macro em "EsteLivro", caso tenha o excel em inglês é em "ThisWorkbook".
Código: Selecionar todos
'Cole esta macro em "EsteLivro"
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next ' ignora erros
    If Not ActiveWorkbook.ReadOnly = True Then
        Kill ThisWorkbook.Path & "\usage.log" ' elimina o ficheiro se ele existir e se possível
    End If
    
On Error GoTo 0
End Sub

Private Sub Workbook_Open()
Dim file1 As Integer
Dim strLine As String
file1 = FreeFile
    If Not ActiveWorkbook.ReadOnly = True Then
        'adiciona o nome de utilizador e a
        Open ThisWorkbook.Path & "\usage.log" For Append As #file1
        Print #file1, Environ("USERNAME") & " at " & Now()
        Close #file1
    Else
        'se alguem tiver o ficheiro aberto informa quem
        Open ThisWorkbook.Path & "\usage.log" For Input Access Read As #file1
            Do While Not EOF(file1)
               Line Input #file1, strLine
            Loop
        Close #file1
        MsgBox "O ficheiro está aberto pelo seguinte utilizador: " & strLine
    End If
End Sub
Ela irá criar um ficheiro em formato .log cada vez que alguém abrir o ficheiro, que irá conter o nome do utilizador e data e hora que foi aberto. Quando é fechado o ficheiro automaticamente ele apaga esse ficheiro .log.

Caso o ficheiro esteja aberto com outro utilizador e você abrir ele, irá aparecer uma mensagem no ecrã onde apresenta a informação que está no ficheiro .log.

Exemplo: O José abre o ficheiro, é criado um ficheiro .log com a seguinte informação :"JoseP at 27/05/2020 13:01:51",l se mais alguem tentar abrir o ficheiro enquanto o josé o tem aberto, irá aparecer no ecrã uma mensagem a dizer: "O ficheiro está aberto pelo utilizador JoseP at 27/05/2020 13:01:51".

Alguma dúvida só dizer. :D
#55364
AfonsoMira, obrigado pela sua resposta, mas não é possível implementar essa solução. Eu apenas posso ir buscar dados ao ficheiro, via VBA, não posso ter acesso nem permissão para o editar e mexer nele....nem criar "perturbações"... :D
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord